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,8 +775,8 @@ class QPDF | ||
| 775 | Pipeline* pipeline, | 775 | Pipeline* pipeline, |
| 776 | bool suppress_warnings, | 776 | bool suppress_warnings, |
| 777 | bool will_retry); | 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 | static bool pipeStreamData( | 780 | static bool pipeStreamData( |
| 781 | std::shared_ptr<QPDF::EncryptionParameters> encp, | 781 | std::shared_ptr<QPDF::EncryptionParameters> encp, |
| 782 | std::shared_ptr<InputSource> file, | 782 | std::shared_ptr<InputSource> file, |
libqpdf/QPDF.cc
| @@ -138,11 +138,11 @@ bool | @@ -138,11 +138,11 @@ bool | ||
| 138 | QPDF::CopiedStreamDataProvider::provideStreamData( | 138 | QPDF::CopiedStreamDataProvider::provideStreamData( |
| 139 | QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) | 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 | bool result = false; | 142 | bool result = false; |
| 143 | - if (foreign_data.get()) { | 143 | + if (foreign_data != foreign_stream_data.end()) { |
| 144 | result = destination_qpdf.pipeForeignStreamData( | 144 | result = destination_qpdf.pipeForeignStreamData( |
| 145 | - foreign_data, pipeline, suppress_warnings, will_retry); | 145 | + foreign_data->second, pipeline, suppress_warnings, will_retry); |
| 146 | QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1); | 146 | QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1); |
| 147 | } else { | 147 | } else { |
| 148 | auto foreign_stream = foreign_streams[og]; | 148 | auto foreign_stream = foreign_streams[og]; |
| @@ -153,20 +153,6 @@ QPDF::CopiedStreamDataProvider::provideStreamData( | @@ -153,20 +153,6 @@ QPDF::CopiedStreamDataProvider::provideStreamData( | ||
| 153 | return result; | 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 | QPDF::StringDecrypter::StringDecrypter(QPDF* qpdf, QPDFObjGen og) : | 156 | QPDF::StringDecrypter::StringDecrypter(QPDF* qpdf, QPDFObjGen og) : |
| 171 | qpdf(qpdf), | 157 | qpdf(qpdf), |
| 172 | og(og) | 158 | og(og) |
| @@ -719,7 +705,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh) | @@ -719,7 +705,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh) | ||
| 719 | result.replaceStreamData( | 705 | result.replaceStreamData( |
| 720 | m->copied_stream_data_provider, dict["/Filter"], dict["/DecodeParms"]); | 706 | m->copied_stream_data_provider, dict["/Filter"], dict["/DecodeParms"]); |
| 721 | } else { | 707 | } else { |
| 722 | - auto foreign_stream_data = std::make_shared<ForeignStreamData>( | 708 | + auto foreign_stream_data = ForeignStreamData( |
| 723 | foreign_stream_qpdf.m->encp, | 709 | foreign_stream_qpdf.m->encp, |
| 724 | foreign_stream_qpdf.m->file, | 710 | foreign_stream_qpdf.m->file, |
| 725 | foreign, | 711 | foreign, |
| @@ -920,23 +906,20 @@ QPDF::pipeStreamData( | @@ -920,23 +906,20 @@ QPDF::pipeStreamData( | ||
| 920 | 906 | ||
| 921 | bool | 907 | bool |
| 922 | QPDF::pipeForeignStreamData( | 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 | QTC::TC("qpdf", "QPDF pipe foreign encrypted stream"); | 912 | QTC::TC("qpdf", "QPDF pipe foreign encrypted stream"); |
| 930 | } | 913 | } |
| 931 | return pipeStreamData( | 914 | return pipeStreamData( |
| 932 | - foreign->encp, | ||
| 933 | - foreign->file, | 915 | + foreign.encp, |
| 916 | + foreign.file, | ||
| 934 | *this, | 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 | pipeline, | 923 | pipeline, |
| 941 | suppress_warnings, | 924 | suppress_warnings, |
| 942 | will_retry); | 925 | will_retry); |
libqpdf/qpdf/QPDF_private.hh
| @@ -121,20 +121,29 @@ class QPDF::ForeignStreamData | @@ -121,20 +121,29 @@ class QPDF::ForeignStreamData | ||
| 121 | bool is_root_metadata{false}; | 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 | public: | 126 | public: |
| 127 | CopiedStreamDataProvider(QPDF& destination_qpdf); | 127 | CopiedStreamDataProvider(QPDF& destination_qpdf); |
| 128 | - ~CopiedStreamDataProvider() override = default; | 128 | + ~CopiedStreamDataProvider() final = default; |
| 129 | bool provideStreamData( | 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 | private: | 143 | private: |
| 135 | QPDF& destination_qpdf; | 144 | QPDF& destination_qpdf; |
| 136 | std::map<QPDFObjGen, QPDFObjectHandle> foreign_streams; | 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 | class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter | 149 | class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter |