Commit 0889eba4787c103fbc204a11229a1a7244daa7de

Authored by m-holger
1 parent 95424109

Refactor `ForeignStreamData`: move to `Streams::Copier::Data`, improve encapsula…

…tion, and streamline stream registration logic.
include/qpdf/QPDF.hh
@@ -743,7 +743,6 @@ class QPDF @@ -743,7 +743,6 @@ class QPDF
743 743
744 class ObjCache; 744 class ObjCache;
745 class EncryptionParameters; 745 class EncryptionParameters;
746 - class ForeignStreamData;  
747 class StringDecrypter; 746 class StringDecrypter;
748 class ResolveRecorder; 747 class ResolveRecorder;
749 class JSONReactor; 748 class JSONReactor;
libqpdf/QPDF.cc
@@ -112,8 +112,7 @@ namespace @@ -112,8 +112,7 @@ namespace
112 }; 112 };
113 } // namespace 113 } // namespace
114 114
115 -QPDF::ForeignStreamData::ForeignStreamData(  
116 - Stream& foreign, qpdf_offset_t offset, QPDFObjectHandle local_dict) : 115 +Streams::Copier::Data::Data(Stream& foreign, qpdf_offset_t offset, QPDFObjectHandle local_dict) :
117 encp(foreign.qpdf()->m->encp), 116 encp(foreign.qpdf()->m->encp),
118 file(foreign.qpdf()->m->file), 117 file(foreign.qpdf()->m->file),
119 foreign_og(foreign.id_gen()), 118 foreign_og(foreign.id_gen()),
@@ -715,8 +714,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh) @@ -715,8 +714,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign_oh)
715 result.replaceStreamData( 714 result.replaceStreamData(
716 m->objects.streams().copier(), dict["/Filter"], dict["/DecodeParms"]); 715 m->objects.streams().copier(), dict["/Filter"], dict["/DecodeParms"]);
717 } else { 716 } else {
718 - auto foreign_stream_data = ForeignStreamData(foreign, foreign_oh.offset(), dict);  
719 - m->objects.streams().copier()->register_copy(local_og, foreign_stream_data); 717 + m->objects.streams().copier()->register_copy(local_og, foreign, foreign_oh.offset(), dict);
720 result.replaceStreamData( 718 result.replaceStreamData(
721 m->objects.streams().copier(), dict["/Filter"], dict["/DecodeParms"]); 719 m->objects.streams().copier(), dict["/Filter"], dict["/DecodeParms"]);
722 } 720 }
libqpdf/qpdf/QPDF_private.hh
@@ -89,23 +89,6 @@ class QPDF::EncryptionParameters @@ -89,23 +89,6 @@ class QPDF::EncryptionParameters
89 bool owner_password_matched{false}; 89 bool owner_password_matched{false};
90 }; 90 };
91 91
92 -class QPDF::ForeignStreamData  
93 -{  
94 - friend class QPDF;  
95 -  
96 - public:  
97 - ForeignStreamData(Stream& foreign, qpdf_offset_t offset, QPDFObjectHandle local_dict);  
98 -  
99 - private:  
100 - std::shared_ptr<EncryptionParameters> encp;  
101 - std::shared_ptr<InputSource> file;  
102 - QPDFObjGen foreign_og;  
103 - qpdf_offset_t offset;  
104 - size_t length;  
105 - QPDFObjectHandle local_dict;  
106 - bool is_root_metadata{false};  
107 -};  
108 -  
109 class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter 92 class QPDF::StringDecrypter final: public QPDFObjectHandle::StringDecrypter
110 { 93 {
111 friend class QPDF; 94 friend class QPDF;
@@ -599,6 +582,23 @@ class QPDF::Doc @@ -599,6 +582,23 @@ class QPDF::Doc
599 // local and foreign streams. 582 // local and foreign streams.
600 class Copier final: public QPDFObjectHandle::StreamDataProvider 583 class Copier final: public QPDFObjectHandle::StreamDataProvider
601 { 584 {
  585 + class Data
  586 + {
  587 + friend class Streams;
  588 +
  589 + public:
  590 + Data(Stream& foreign, qpdf_offset_t offset, QPDFObjectHandle local_dict);
  591 +
  592 + private:
  593 + std::shared_ptr<EncryptionParameters> encp;
  594 + std::shared_ptr<InputSource> file;
  595 + QPDFObjGen foreign_og;
  596 + qpdf_offset_t offset;
  597 + size_t length;
  598 + QPDFObjectHandle local_dict;
  599 + bool is_root_metadata{false};
  600 + };
  601 +
602 public: 602 public:
603 Copier() = delete; 603 Copier() = delete;
604 Copier(StreamDataProvider const&) = delete; 604 Copier(StreamDataProvider const&) = delete;
@@ -616,21 +616,25 @@ class QPDF::Doc @@ -616,21 +616,25 @@ class QPDF::Doc
616 bool will_retry) final; 616 bool will_retry) final;
617 617
618 void 618 void
619 - register_copy(QPDFObjGen local_og, QPDFObjectHandle foreign_stream) 619 + register_copy(QPDFObjGen local_og, QPDFObjectHandle const& foreign_stream)
620 { 620 {
621 copied_streams.insert_or_assign(local_og, foreign_stream); 621 copied_streams.insert_or_assign(local_og, foreign_stream);
622 } 622 }
623 623
624 void 624 void
625 - register_copy(QPDFObjGen local_og, ForeignStreamData foreign_stream) 625 + register_copy(
  626 + QPDFObjGen local_og,
  627 + Stream& foreign,
  628 + qpdf_offset_t offset,
  629 + QPDFObjectHandle const& local_dict)
626 { 630 {
627 - copied_data.insert_or_assign(local_og, foreign_stream); 631 + copied_data.insert_or_assign(local_og, Data(foreign, offset, local_dict));
628 } 632 }
629 633
630 private: 634 private:
631 Streams& streams; 635 Streams& streams;
632 std::map<QPDFObjGen, QPDFObjectHandle> copied_streams; 636 std::map<QPDFObjGen, QPDFObjectHandle> copied_streams;
633 - std::map<QPDFObjGen, ForeignStreamData> copied_data; 637 + std::map<QPDFObjGen, Data> copied_data;
634 }; 638 };
635 639
636 public: 640 public: