Commit 43f2fa1df8cda7a4811c67ecdf6ff002a87207d5

Authored by m-holger
1 parent 403dbd5f

Refactor `CopiedStreamDataProvider` and `pipeForeignStreamData`: remove redundan…

…t usage of `std::shared_ptr`, simplify stream data management, and enforce `final` specifier.
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
... ...