Commit c5b728f87bceddf98f5de5fa3a1a81ab2fe823ff

Authored by m-holger
1 parent afb09d2e

Introduce `QPDF::Doc` to encapsulate document-level operations

Add `QPDF::Doc` as an inner class to manage document-level functionality. Update memory management in `QPDF::Members` to include `Doc` and ensure proper initialization. Add `QPDF::doc()` method for internal access. Refactor constructors accordingly.
include/qpdf/QPDF.hh
@@ -794,6 +794,7 @@ class QPDF @@ -794,6 +794,7 @@ class QPDF
794 794
795 // End of the public API. The following classes and methods are for qpdf internal use only. 795 // End of the public API. The following classes and methods are for qpdf internal use only.
796 796
  797 + class Doc;
797 class Writer; 798 class Writer;
798 class Resolver; 799 class Resolver;
799 class StreamCopier; 800 class StreamCopier;
@@ -807,6 +808,7 @@ class QPDF @@ -807,6 +808,7 @@ class QPDF
807 inline QPDFOutlineDocumentHelper& outlines(); 808 inline QPDFOutlineDocumentHelper& outlines();
808 inline QPDFPageDocumentHelper& pages(); 809 inline QPDFPageDocumentHelper& pages();
809 inline QPDFPageLabelDocumentHelper& page_labels(); 810 inline QPDFPageLabelDocumentHelper& page_labels();
  811 + inline Doc& doc();
810 812
811 // For testing only -- do not add to DLL 813 // For testing only -- do not add to DLL
812 static bool test_json_validators(); 814 static bool test_json_validators();
libqpdf/QPDF.cc
@@ -178,7 +178,8 @@ QPDF::QPDFVersion() @@ -178,7 +178,8 @@ QPDF::QPDFVersion()
178 return QPDF::qpdf_version; 178 return QPDF::qpdf_version;
179 } 179 }
180 180
181 -QPDF::Members::Members() : 181 +QPDF::Members::Members(QPDF& qpdf) :
  182 + doc(qpdf, *this),
182 log(QPDFLogger::defaultLogger()), 183 log(QPDFLogger::defaultLogger()),
183 file(new InvalidInputSource()), 184 file(new InvalidInputSource()),
184 encp(new EncryptionParameters) 185 encp(new EncryptionParameters)
@@ -186,7 +187,7 @@ QPDF::Members::Members() : @@ -186,7 +187,7 @@ QPDF::Members::Members() :
186 } 187 }
187 188
188 QPDF::QPDF() : 189 QPDF::QPDF() :
189 - m(std::make_unique<Members>()) 190 + m(std::make_unique<Members>(*this))
190 { 191 {
191 m->tokenizer.allowEOF(); 192 m->tokenizer.allowEOF();
192 // Generate a unique ID. It just has to be unique among all QPDF objects allocated throughout 193 // Generate a unique ID. It just has to be unique among all QPDF objects allocated throughout
libqpdf/qpdf/QPDF_private.hh
@@ -405,17 +405,43 @@ class QPDF::PatternFinder final: public InputSource::Finder @@ -405,17 +405,43 @@ class QPDF::PatternFinder final: public InputSource::Finder
405 bool (QPDF::*checker)(); 405 bool (QPDF::*checker)();
406 }; 406 };
407 407
  408 +// This class is used to represent a PDF document.
  409 +//
  410 +// The main function of the QPDF class is to represent a PDF document. Doc is the implementation
  411 +// class for this aspect of QPDF.
  412 +class QPDF::Doc
  413 +{
  414 + public:
  415 + Doc() = delete;
  416 + Doc(Doc const&) = delete;
  417 + Doc(Doc&&) = delete;
  418 + Doc& operator=(Doc const&) = delete;
  419 + Doc& operator=(Doc&&) = delete;
  420 + ~Doc() = default;
  421 +
  422 + Doc(QPDF& qpdf, QPDF::Members& m) :
  423 + qpdf(qpdf),
  424 + m(m)
  425 + {
  426 + }
  427 +
  428 + private:
  429 + QPDF& qpdf;
  430 + QPDF::Members& m;
  431 +};
  432 +
408 class QPDF::Members 433 class QPDF::Members
409 { 434 {
410 friend class QPDF; 435 friend class QPDF;
411 friend class ResolveRecorder; 436 friend class ResolveRecorder;
412 437
413 public: 438 public:
414 - Members(); 439 + Members(QPDF& qpdf);
415 Members(Members const&) = delete; 440 Members(Members const&) = delete;
416 ~Members() = default; 441 ~Members() = default;
417 442
418 private: 443 private:
  444 + Doc doc;
419 std::shared_ptr<QPDFLogger> log; 445 std::shared_ptr<QPDFLogger> log;
420 unsigned long long unique_id{0}; 446 unsigned long long unique_id{0};
421 qpdf::Tokenizer tokenizer; 447 qpdf::Tokenizer tokenizer;
@@ -562,6 +588,12 @@ QPDF::page_labels() @@ -562,6 +588,12 @@ QPDF::page_labels()
562 return *m->page_labels; 588 return *m->page_labels;
563 } 589 }
564 590
  591 +inline QPDF::Doc&
  592 +QPDF::doc()
  593 +{
  594 + return m->doc;
  595 +}
  596 +
565 // Throw a generic exception for unusual error conditions that do not be covered during CI testing. 597 // Throw a generic exception for unusual error conditions that do not be covered during CI testing.
566 inline void 598 inline void
567 QPDF::no_ci_stop_if(bool condition, std::string const& message, std::string const& context) 599 QPDF::no_ci_stop_if(bool condition, std::string const& message, std::string const& context)