diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index 68d8536..43a86b4 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -775,8 +775,8 @@ class QPDF Pipeline* pipeline, bool suppress_warnings, bool will_retry); - bool pipeForeignStreamData( - std::shared_ptr, Pipeline*, bool suppress_warnings, bool will_retry); + bool + pipeForeignStreamData(ForeignStreamData&, Pipeline*, bool suppress_warnings, bool will_retry); static bool pipeStreamData( std::shared_ptr encp, std::shared_ptr file, diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 7888faf..6fb14c2 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -138,11 +138,11 @@ bool QPDF::CopiedStreamDataProvider::provideStreamData( QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) { - std::shared_ptr foreign_data = foreign_stream_data[og]; + auto foreign_data = foreign_stream_data.find(og); bool result = false; - if (foreign_data.get()) { + if (foreign_data != foreign_stream_data.end()) { result = destination_qpdf.pipeForeignStreamData( - foreign_data, pipeline, suppress_warnings, will_retry); + foreign_data->second, pipeline, suppress_warnings, will_retry); QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1); } else { auto foreign_stream = foreign_streams[og]; @@ -153,20 +153,6 @@ QPDF::CopiedStreamDataProvider::provideStreamData( return result; } -void -QPDF::CopiedStreamDataProvider::registerForeignStream( - QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream) -{ - this->foreign_streams[local_og] = foreign_stream; -} - -void -QPDF::CopiedStreamDataProvider::registerForeignStream( - QPDFObjGen const& local_og, std::shared_ptr foreign_stream) -{ - this->foreign_stream_data[local_og] = foreign_stream; -} - QPDF::StringDecrypter::StringDecrypter(QPDF* qpdf, QPDFObjGen og) : qpdf(qpdf), og(og) @@ -719,7 +705,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh) result.replaceStreamData( m->copied_stream_data_provider, dict["/Filter"], dict["/DecodeParms"]); } else { - auto foreign_stream_data = std::make_shared( + auto foreign_stream_data = ForeignStreamData( foreign_stream_qpdf.m->encp, foreign_stream_qpdf.m->file, foreign, @@ -920,23 +906,20 @@ QPDF::pipeStreamData( bool QPDF::pipeForeignStreamData( - std::shared_ptr foreign, - Pipeline* pipeline, - bool suppress_warnings, - bool will_retry) + ForeignStreamData& foreign, Pipeline* pipeline, bool suppress_warnings, bool will_retry) { - if (foreign->encp->encrypted) { + if (foreign.encp->encrypted) { QTC::TC("qpdf", "QPDF pipe foreign encrypted stream"); } return pipeStreamData( - foreign->encp, - foreign->file, + foreign.encp, + foreign.file, *this, - foreign->foreign_og, - foreign->offset, - foreign->length, - foreign->local_dict, - foreign->is_root_metadata, + foreign.foreign_og, + foreign.offset, + foreign.length, + foreign.local_dict, + foreign.is_root_metadata, pipeline, suppress_warnings, will_retry); diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index 1d8b099..f07a388 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -121,20 +121,29 @@ class QPDF::ForeignStreamData bool is_root_metadata{false}; }; -class QPDF::CopiedStreamDataProvider: public QPDFObjectHandle::StreamDataProvider +class QPDF::CopiedStreamDataProvider final: public QPDFObjectHandle::StreamDataProvider { public: CopiedStreamDataProvider(QPDF& destination_qpdf); - ~CopiedStreamDataProvider() override = default; + ~CopiedStreamDataProvider() final = default; bool provideStreamData( - QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) override; - void registerForeignStream(QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream); - void registerForeignStream(QPDFObjGen const& local_og, std::shared_ptr); + QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) final; + void + registerForeignStream(QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream) + { + foreign_streams.insert_or_assign(local_og, foreign_stream); + } + + void + registerForeignStream(QPDFObjGen local_og, ForeignStreamData foreign_stream) + { + foreign_stream_data.insert_or_assign(local_og, foreign_stream); + } private: QPDF& destination_qpdf; std::map foreign_streams; - std::map> foreign_stream_data; + std::map foreign_stream_data; }; class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter