Commit c99a4eaf14bf382a2b7dea9ffc33e1798a891ff3

Authored by m-holger
1 parent c59c6a7d

Refactor `Streams::Copier`: replace `copied_streams` with `copied_providers`, st…

…reamline stream registration, and improve encapsulation.
Showing 1 changed file with 12 additions and 19 deletions
libqpdf/QPDF_Stream.cc
@@ -40,7 +40,7 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider @@ -40,7 +40,7 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider
40 friend class Streams; 40 friend class Streams;
41 41
42 public: 42 public:
43 - Data(Stream& source, QPDFObjectHandle const& dest_dict) : 43 + Data(Stream& source, Dictionary const& dest_dict) :
44 encp(source.qpdf()->m->encp), 44 encp(source.qpdf()->m->encp),
45 file(source.qpdf()->m->file), 45 file(source.qpdf()->m->file),
46 source_og(source.id_gen()), 46 source_og(source.id_gen()),
@@ -101,6 +101,7 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider @@ -101,6 +101,7 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider
101 } 101 }
102 } 102 }
103 auto stream = copied_streams.find(og); 103 auto stream = copied_streams.find(og);
  104 + qpdf_invariant(stream == copied_streams.end() || stream->second);
104 if (stream != copied_streams.end() && 105 if (stream != copied_streams.end() &&
105 stream->second.pipeStreamData( 106 stream->second.pipeStreamData(
106 pipeline, nullptr, 0, qpdf_dl_none, suppress_warnings, will_retry)) { 107 pipeline, nullptr, 0, qpdf_dl_none, suppress_warnings, will_retry)) {
@@ -110,24 +111,20 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider @@ -110,24 +111,20 @@ class Streams::Copier final: public QPDFObjectHandle::StreamDataProvider
110 } 111 }
111 112
112 void 113 void
113 - register_copy(QPDFObjGen local_og, QPDFObjectHandle const& foreign_stream) 114 + register_copy(Stream& dest, Stream& source, bool provider)
114 { 115 {
115 - copied_streams.insert_or_assign(local_og, foreign_stream);  
116 - }  
117 -  
118 - void  
119 - register_copy(  
120 - QPDFObjGen local_og,  
121 - Stream& foreign,  
122 - qpdf_offset_t offset,  
123 - QPDFObjectHandle const& local_dict)  
124 - {  
125 - copied_data.insert_or_assign(local_og, Data(foreign, local_dict)); 116 + qpdf_expect(source);
  117 + qpdf_expect(dest);
  118 + if (provider) {
  119 + copied_streams.insert_or_assign(dest, source);
  120 + } else {
  121 + copied_data.insert_or_assign(dest, Data(source, dest.getDict()));
  122 + }
126 } 123 }
127 124
128 private: 125 private:
129 Streams& streams; 126 Streams& streams;
130 - std::map<QPDFObjGen, QPDFObjectHandle> copied_streams; 127 + std::map<QPDFObjGen, Stream> copied_streams;
131 std::map<QPDFObjGen, Data> copied_data; 128 std::map<QPDFObjGen, Data> copied_data;
132 }; 129 };
133 130
@@ -327,12 +324,8 @@ Stream::copy_data_to(Stream&amp; dest) @@ -327,12 +324,8 @@ Stream::copy_data_to(Stream&amp; dest)
327 } 324 }
328 if (s->stream_data) { 325 if (s->stream_data) {
329 dest.replaceStreamData(s->stream_data, dict["/Filter"], dict["/DecodeParms"]); 326 dest.replaceStreamData(s->stream_data, dict["/Filter"], dict["/DecodeParms"]);
330 - } else if (s->stream_provider) {  
331 - // In this case, the source stream's QPDF must stay in scope.  
332 - d_streams.copier()->register_copy(dest, *this);  
333 - dest.replaceStreamData(d_streams.copier(), dict["/Filter"], dict["/DecodeParms"]);  
334 } else { 327 } else {
335 - d_streams.copier()->register_copy(dest, *this, offset(), dict); 328 + d_streams.copier()->register_copy(dest, *this, s->stream_provider.get());
336 dest.replaceStreamData(d_streams.copier(), dict["/Filter"], dict["/DecodeParms"]); 329 dest.replaceStreamData(d_streams.copier(), dict["/Filter"], dict["/DecodeParms"]);
337 } 330 }
338 } 331 }