From 8007a84967955cea1326f492a46166ad0177677f Mon Sep 17 00:00:00 2001 From: m-holger Date: Sun, 21 Sep 2025 13:47:49 +0100 Subject: [PATCH] Refactor `QPDF::Writer`: centralize member handling, move constructor to `QPDFWriter`, and simplify resource management. --- libqpdf/QPDFWriter.cc | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- libqpdf/qpdf/QPDF_private.hh | 66 ------------------------------------------------------------------ 2 files changed, 74 insertions(+), 69 deletions(-) diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 7e8971d..e80b75f 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -258,7 +258,79 @@ Pl_stack::Popper::pop() stack = nullptr; } -class QPDFWriter::Members +// Writer class is restricted to QPDFWriter so that only it can call certain methods. +class QPDF::Writer +{ + friend class QPDFWriter; + Writer(QPDF& pdf) : + pdf(pdf) + { + } + + protected: + static void + optimize( + QPDF& qpdf, + QPDFWriter::ObjTable const& obj, + std::function skip_stream_parameters) + { + qpdf.optimize(obj, skip_stream_parameters); + } + + static void + getLinearizedParts( + QPDF& qpdf, + QPDFWriter::ObjTable const& obj, + std::vector& part4, + std::vector& part6, + std::vector& part7, + std::vector& part8, + std::vector& part9) + { + qpdf.getLinearizedParts(obj, part4, part6, part7, part8, part9); + } + + static void + generateHintStream( + QPDF& qpdf, + QPDFWriter::NewObjTable const& new_obj, + QPDFWriter::ObjTable const& obj, + std::string& hint_stream, + int& S, + int& O, + bool compressed) + { + qpdf.generateHintStream(new_obj, obj, hint_stream, S, O, compressed); + } + + static std::vector + getCompressibleObjGens(QPDF& qpdf) + { + return qpdf.getCompressibleObjVector(); + } + + static std::vector + getCompressibleObjSet(QPDF& qpdf) + { + return qpdf.getCompressibleObjSet(); + } + + static std::map const& + getXRefTable(QPDF& qpdf) + { + return qpdf.getXRefTableInternal(); + } + + static size_t + tableSize(QPDF& qpdf) + { + return qpdf.tableSize(); + } + + QPDF& pdf; +}; + +class QPDFWriter::Members: QPDF::Writer { friend class QPDFWriter; @@ -273,8 +345,8 @@ class QPDFWriter::Members enum trailer_e { t_normal, t_lin_first, t_lin_second }; Members(QPDFWriter& w, QPDF& pdf) : + QPDF::Writer(pdf), w(w), - pdf(pdf), root_og( pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen() : QPDFObjGen(-1, 0)), pipeline_stack(pipeline) @@ -409,7 +481,6 @@ class QPDFWriter::Members private: QPDFWriter& w; - QPDF& pdf; QPDFObjGen root_og{-1, 0}; char const* filename{"unspecified"}; FILE* file{nullptr}; diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index 0fba51f..55c340a 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -13,72 +13,6 @@ using namespace qpdf; -// Writer class is restricted to QPDFWriter so that only it can call certain methods. -class QPDF::Writer -{ - friend class QPDFWriter; - - private: - static void - optimize( - QPDF& qpdf, - QPDFWriter::ObjTable const& obj, - std::function skip_stream_parameters) - { - qpdf.optimize(obj, skip_stream_parameters); - } - - static void - getLinearizedParts( - QPDF& qpdf, - QPDFWriter::ObjTable const& obj, - std::vector& part4, - std::vector& part6, - std::vector& part7, - std::vector& part8, - std::vector& part9) - { - qpdf.getLinearizedParts(obj, part4, part6, part7, part8, part9); - } - - static void - generateHintStream( - QPDF& qpdf, - QPDFWriter::NewObjTable const& new_obj, - QPDFWriter::ObjTable const& obj, - std::string& hint_stream, - int& S, - int& O, - bool compressed) - { - qpdf.generateHintStream(new_obj, obj, hint_stream, S, O, compressed); - } - - static std::vector - getCompressibleObjGens(QPDF& qpdf) - { - return qpdf.getCompressibleObjVector(); - } - - static std::vector - getCompressibleObjSet(QPDF& qpdf) - { - return qpdf.getCompressibleObjSet(); - } - - static std::map const& - getXRefTable(QPDF& qpdf) - { - return qpdf.getXRefTableInternal(); - } - - static size_t - tableSize(QPDF& qpdf) - { - return qpdf.tableSize(); - } -}; - // The Resolver class is restricted to QPDFObject so that only it can resolve indirect // references. class QPDF::Resolver -- libgit2 0.21.4