Commit 3c6654b3a30fc9cb7317f30a9fecdb28fb437750

Authored by m-holger
1 parent eadfa25b

Refactor `StreamDataProvider`: replace `destination_qpdf` with `Streams`, improv…

…e encapsulation, and streamline foreign stream handling.
libqpdf/QPDF.cc
@@ -124,9 +124,9 @@ QPDF::ForeignStreamData::ForeignStreamData( @@ -124,9 +124,9 @@ QPDF::ForeignStreamData::ForeignStreamData(
124 { 124 {
125 } 125 }
126 126
127 -Streams::Copier::Copier(QPDF& qpdf) : 127 +Streams::Copier::Copier(Streams& streams) :
128 QPDFObjectHandle::StreamDataProvider(true), 128 QPDFObjectHandle::StreamDataProvider(true),
129 - qpdf(qpdf) 129 + streams(streams)
130 { 130 {
131 } 131 }
132 132
@@ -134,15 +134,15 @@ bool @@ -134,15 +134,15 @@ bool
134 Streams::Copier::provideStreamData( 134 Streams::Copier::provideStreamData(
135 QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry) 135 QPDFObjGen const& og, Pipeline* pipeline, bool suppress_warnings, bool will_retry)
136 { 136 {
137 - auto foreign_data = copied_data.find(og); 137 + auto data = copied_data.find(og);
138 bool result = false; 138 bool result = false;
139 - if (foreign_data != copied_data.end()) {  
140 - result = qpdf.pipeForeignStreamData(  
141 - foreign_data->second, pipeline, suppress_warnings, will_retry); 139 + if (data != copied_data.end()) {
  140 + result = streams.qpdf().pipeForeignStreamData(
  141 + data->second, pipeline, suppress_warnings, will_retry);
142 QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1); 142 QTC::TC("qpdf", "QPDF copy foreign with data", result ? 0 : 1);
143 } else { 143 } else {
144 - auto foreign_stream = copied_streams[og];  
145 - result = foreign_stream.pipeStreamData( 144 + auto stream = copied_streams[og];
  145 + result = stream.pipeStreamData(
146 pipeline, nullptr, 0, qpdf_dl_none, suppress_warnings, will_retry); 146 pipeline, nullptr, 0, qpdf_dl_none, suppress_warnings, will_retry);
147 QTC::TC("qpdf", "QPDF copy foreign with foreign_stream", result ? 0 : 1); 147 QTC::TC("qpdf", "QPDF copy foreign with foreign_stream", result ? 0 : 1);
148 } 148 }
libqpdf/qpdf/QPDF_private.hh
@@ -606,7 +606,7 @@ class QPDF::Doc @@ -606,7 +606,7 @@ class QPDF::Doc
606 Copier& operator=(StreamDataProvider const&) = delete; 606 Copier& operator=(StreamDataProvider const&) = delete;
607 Copier& operator=(StreamDataProvider&&) = delete; 607 Copier& operator=(StreamDataProvider&&) = delete;
608 608
609 - Copier(QPDF& qpdf); 609 + Copier(Streams& streams);
610 ~Copier() final = default; 610 ~Copier() final = default;
611 611
612 bool provideStreamData( 612 bool provideStreamData(
@@ -628,14 +628,15 @@ class QPDF::Doc @@ -628,14 +628,15 @@ class QPDF::Doc
628 } 628 }
629 629
630 private: 630 private:
631 - QPDF& qpdf; 631 + Streams& streams;
632 std::map<QPDFObjGen, QPDFObjectHandle> copied_streams; 632 std::map<QPDFObjGen, QPDFObjectHandle> copied_streams;
633 std::map<QPDFObjGen, ForeignStreamData> copied_data; 633 std::map<QPDFObjGen, ForeignStreamData> copied_data;
634 }; 634 };
635 635
636 public: 636 public:
637 Streams(QPDF& qpdf) : 637 Streams(QPDF& qpdf) :
638 - qpdf(qpdf) 638 + qpdf_(qpdf),
  639 + copier_(std::make_shared<Copier>(*this))
639 { 640 {
640 } 641 }
641 642
@@ -676,17 +677,20 @@ class QPDF::Doc @@ -676,17 +677,20 @@ class QPDF::Doc
676 qpdf->copyStreamData(dest, src); 677 qpdf->copyStreamData(dest, src);
677 } 678 }
678 679
  680 + QPDF&
  681 + qpdf() const
  682 + {
  683 + return qpdf_;
  684 + }
  685 +
679 std::shared_ptr<Copier>& 686 std::shared_ptr<Copier>&
680 copier() 687 copier()
681 { 688 {
682 - if (!copier_) {  
683 - copier_ = std::make_shared<Copier>(qpdf);  
684 - }  
685 return copier_; 689 return copier_;
686 } 690 }
687 691
688 private: 692 private:
689 - QPDF& qpdf; 693 + QPDF& qpdf_;
690 694
691 std::shared_ptr<Copier> copier_; 695 std::shared_ptr<Copier> copier_;
692 }; 696 };