Commit 43f2fa1df8cda7a4811c67ecdf6ff002a87207d5
1 parent
403dbd5f
Refactor `CopiedStreamDataProvider` and `pipeForeignStreamData`: remove redundan…
…t usage of `std::shared_ptr`, simplify stream data management, and enforce `final` specifier.
Showing
3 changed files
with
30 additions
and
38 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -775,8 +775,8 @@ class QPDF |
| 775 | 775 | Pipeline* pipeline, |
| 776 | 776 | bool suppress_warnings, |
| 777 | 777 | bool will_retry); |
| 778 | - bool pipeForeignStreamData( | |
| 779 | - std::shared_ptr<ForeignStreamData>, Pipeline*, bool suppress_warnings, bool will_retry); | |
| 778 | + bool | |
| 779 | + pipeForeignStreamData(ForeignStreamData&, Pipeline*, bool suppress_warnings, bool will_retry); | |
| 780 | 780 | static bool pipeStreamData( |
| 781 | 781 | std::shared_ptr<QPDF::EncryptionParameters> encp, |
| 782 | 782 | std::shared_ptr<InputSource> file, | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -138,11 +138,11 @@ bool |
| 138 | 138 | QPDF::CopiedStreamDataProvider::provideStreamData( |
| 139 | 139 | QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) |
| 140 | 140 | { |
| 141 | - std::shared_ptr<ForeignStreamData> foreign_data = foreign_stream_data[og]; | |
| 141 | + auto foreign_data = foreign_stream_data.find(og); | |
| 142 | 142 | bool result = false; |
| 143 | - if (foreign_data.get()) { | |
| 143 | + if (foreign_data != foreign_stream_data.end()) { | |
| 144 | 144 | result = destination_qpdf.pipeForeignStreamData( |
| 145 | - foreign_data, pipeline, suppress_warnings, will_retry); | |
| 145 | + foreign_data->second, pipeline, suppress_warnings, will_retry); | |
| 146 | 146 | QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1); |
| 147 | 147 | } else { |
| 148 | 148 | auto foreign_stream = foreign_streams[og]; |
| ... | ... | @@ -153,20 +153,6 @@ QPDF::CopiedStreamDataProvider::provideStreamData( |
| 153 | 153 | return result; |
| 154 | 154 | } |
| 155 | 155 | |
| 156 | -void | |
| 157 | -QPDF::CopiedStreamDataProvider::registerForeignStream( | |
| 158 | - QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream) | |
| 159 | -{ | |
| 160 | - this->foreign_streams[local_og] = foreign_stream; | |
| 161 | -} | |
| 162 | - | |
| 163 | -void | |
| 164 | -QPDF::CopiedStreamDataProvider::registerForeignStream( | |
| 165 | - QPDFObjGen const& local_og, std::shared_ptr<ForeignStreamData> foreign_stream) | |
| 166 | -{ | |
| 167 | - this->foreign_stream_data[local_og] = foreign_stream; | |
| 168 | -} | |
| 169 | - | |
| 170 | 156 | QPDF::StringDecrypter::StringDecrypter(QPDF* qpdf, QPDFObjGen og) : |
| 171 | 157 | qpdf(qpdf), |
| 172 | 158 | og(og) |
| ... | ... | @@ -719,7 +705,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh) |
| 719 | 705 | result.replaceStreamData( |
| 720 | 706 | m->copied_stream_data_provider, dict["/Filter"], dict["/DecodeParms"]); |
| 721 | 707 | } else { |
| 722 | - auto foreign_stream_data = std::make_shared<ForeignStreamData>( | |
| 708 | + auto foreign_stream_data = ForeignStreamData( | |
| 723 | 709 | foreign_stream_qpdf.m->encp, |
| 724 | 710 | foreign_stream_qpdf.m->file, |
| 725 | 711 | foreign, |
| ... | ... | @@ -920,23 +906,20 @@ QPDF::pipeStreamData( |
| 920 | 906 | |
| 921 | 907 | bool |
| 922 | 908 | QPDF::pipeForeignStreamData( |
| 923 | - std::shared_ptr<ForeignStreamData> foreign, | |
| 924 | - Pipeline* pipeline, | |
| 925 | - bool suppress_warnings, | |
| 926 | - bool will_retry) | |
| 909 | + ForeignStreamData& foreign, Pipeline* pipeline, bool suppress_warnings, bool will_retry) | |
| 927 | 910 | { |
| 928 | - if (foreign->encp->encrypted) { | |
| 911 | + if (foreign.encp->encrypted) { | |
| 929 | 912 | QTC::TC("qpdf", "QPDF pipe foreign encrypted stream"); |
| 930 | 913 | } |
| 931 | 914 | return pipeStreamData( |
| 932 | - foreign->encp, | |
| 933 | - foreign->file, | |
| 915 | + foreign.encp, | |
| 916 | + foreign.file, | |
| 934 | 917 | *this, |
| 935 | - foreign->foreign_og, | |
| 936 | - foreign->offset, | |
| 937 | - foreign->length, | |
| 938 | - foreign->local_dict, | |
| 939 | - foreign->is_root_metadata, | |
| 918 | + foreign.foreign_og, | |
| 919 | + foreign.offset, | |
| 920 | + foreign.length, | |
| 921 | + foreign.local_dict, | |
| 922 | + foreign.is_root_metadata, | |
| 940 | 923 | pipeline, |
| 941 | 924 | suppress_warnings, |
| 942 | 925 | will_retry); | ... | ... |
libqpdf/qpdf/QPDF_private.hh
| ... | ... | @@ -121,20 +121,29 @@ class QPDF::ForeignStreamData |
| 121 | 121 | bool is_root_metadata{false}; |
| 122 | 122 | }; |
| 123 | 123 | |
| 124 | -class QPDF::CopiedStreamDataProvider: public QPDFObjectHandle::StreamDataProvider | |
| 124 | +class QPDF::CopiedStreamDataProvider final: public QPDFObjectHandle::StreamDataProvider | |
| 125 | 125 | { |
| 126 | 126 | public: |
| 127 | 127 | CopiedStreamDataProvider(QPDF& destination_qpdf); |
| 128 | - ~CopiedStreamDataProvider() override = default; | |
| 128 | + ~CopiedStreamDataProvider() final = default; | |
| 129 | 129 | bool provideStreamData( |
| 130 | - QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) override; | |
| 131 | - void registerForeignStream(QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream); | |
| 132 | - void registerForeignStream(QPDFObjGen const& local_og, std::shared_ptr<ForeignStreamData>); | |
| 130 | + QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) final; | |
| 131 | + void | |
| 132 | + registerForeignStream(QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream) | |
| 133 | + { | |
| 134 | + foreign_streams.insert_or_assign(local_og, foreign_stream); | |
| 135 | + } | |
| 136 | + | |
| 137 | + void | |
| 138 | + registerForeignStream(QPDFObjGen local_og, ForeignStreamData foreign_stream) | |
| 139 | + { | |
| 140 | + foreign_stream_data.insert_or_assign(local_og, foreign_stream); | |
| 141 | + } | |
| 133 | 142 | |
| 134 | 143 | private: |
| 135 | 144 | QPDF& destination_qpdf; |
| 136 | 145 | std::map<QPDFObjGen, QPDFObjectHandle> foreign_streams; |
| 137 | - std::map<QPDFObjGen, std::shared_ptr<ForeignStreamData>> foreign_stream_data; | |
| 146 | + std::map<QPDFObjGen, ForeignStreamData> foreign_stream_data; | |
| 138 | 147 | }; |
| 139 | 148 | |
| 140 | 149 | class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter | ... | ... |