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,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