Commit 8007a84967955cea1326f492a46166ad0177677f

Authored by m-holger
1 parent 885674ab

Refactor `QPDF::Writer`: centralize member handling, move constructor to `QPDFWr…

…iter`, and simplify resource management.
libqpdf/QPDFWriter.cc
... ... @@ -258,7 +258,79 @@ Pl_stack::Popper::pop()
258 258 stack = nullptr;
259 259 }
260 260  
261   -class QPDFWriter::Members
  261 +// Writer class is restricted to QPDFWriter so that only it can call certain methods.
  262 +class QPDF::Writer
  263 +{
  264 + friend class QPDFWriter;
  265 + Writer(QPDF& pdf) :
  266 + pdf(pdf)
  267 + {
  268 + }
  269 +
  270 + protected:
  271 + static void
  272 + optimize(
  273 + QPDF& qpdf,
  274 + QPDFWriter::ObjTable const& obj,
  275 + std::function<int(QPDFObjectHandle&)> skip_stream_parameters)
  276 + {
  277 + qpdf.optimize(obj, skip_stream_parameters);
  278 + }
  279 +
  280 + static void
  281 + getLinearizedParts(
  282 + QPDF& qpdf,
  283 + QPDFWriter::ObjTable const& obj,
  284 + std::vector<QPDFObjectHandle>& part4,
  285 + std::vector<QPDFObjectHandle>& part6,
  286 + std::vector<QPDFObjectHandle>& part7,
  287 + std::vector<QPDFObjectHandle>& part8,
  288 + std::vector<QPDFObjectHandle>& part9)
  289 + {
  290 + qpdf.getLinearizedParts(obj, part4, part6, part7, part8, part9);
  291 + }
  292 +
  293 + static void
  294 + generateHintStream(
  295 + QPDF& qpdf,
  296 + QPDFWriter::NewObjTable const& new_obj,
  297 + QPDFWriter::ObjTable const& obj,
  298 + std::string& hint_stream,
  299 + int& S,
  300 + int& O,
  301 + bool compressed)
  302 + {
  303 + qpdf.generateHintStream(new_obj, obj, hint_stream, S, O, compressed);
  304 + }
  305 +
  306 + static std::vector<QPDFObjGen>
  307 + getCompressibleObjGens(QPDF& qpdf)
  308 + {
  309 + return qpdf.getCompressibleObjVector();
  310 + }
  311 +
  312 + static std::vector<bool>
  313 + getCompressibleObjSet(QPDF& qpdf)
  314 + {
  315 + return qpdf.getCompressibleObjSet();
  316 + }
  317 +
  318 + static std::map<QPDFObjGen, QPDFXRefEntry> const&
  319 + getXRefTable(QPDF& qpdf)
  320 + {
  321 + return qpdf.getXRefTableInternal();
  322 + }
  323 +
  324 + static size_t
  325 + tableSize(QPDF& qpdf)
  326 + {
  327 + return qpdf.tableSize();
  328 + }
  329 +
  330 + QPDF& pdf;
  331 +};
  332 +
  333 +class QPDFWriter::Members: QPDF::Writer
262 334 {
263 335 friend class QPDFWriter;
264 336  
... ... @@ -273,8 +345,8 @@ class QPDFWriter::Members
273 345 enum trailer_e { t_normal, t_lin_first, t_lin_second };
274 346  
275 347 Members(QPDFWriter& w, QPDF& pdf) :
  348 + QPDF::Writer(pdf),
276 349 w(w),
277   - pdf(pdf),
278 350 root_og(
279 351 pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen() : QPDFObjGen(-1, 0)),
280 352 pipeline_stack(pipeline)
... ... @@ -409,7 +481,6 @@ class QPDFWriter::Members
409 481  
410 482 private:
411 483 QPDFWriter& w;
412   - QPDF& pdf;
413 484 QPDFObjGen root_og{-1, 0};
414 485 char const* filename{"unspecified"};
415 486 FILE* file{nullptr};
... ...
libqpdf/qpdf/QPDF_private.hh
... ... @@ -13,72 +13,6 @@
13 13  
14 14 using namespace qpdf;
15 15  
16   -// Writer class is restricted to QPDFWriter so that only it can call certain methods.
17   -class QPDF::Writer
18   -{
19   - friend class QPDFWriter;
20   -
21   - private:
22   - static void
23   - optimize(
24   - QPDF& qpdf,
25   - QPDFWriter::ObjTable const& obj,
26   - std::function<int(QPDFObjectHandle&)> skip_stream_parameters)
27   - {
28   - qpdf.optimize(obj, skip_stream_parameters);
29   - }
30   -
31   - static void
32   - getLinearizedParts(
33   - QPDF& qpdf,
34   - QPDFWriter::ObjTable const& obj,
35   - std::vector<QPDFObjectHandle>& part4,
36   - std::vector<QPDFObjectHandle>& part6,
37   - std::vector<QPDFObjectHandle>& part7,
38   - std::vector<QPDFObjectHandle>& part8,
39   - std::vector<QPDFObjectHandle>& part9)
40   - {
41   - qpdf.getLinearizedParts(obj, part4, part6, part7, part8, part9);
42   - }
43   -
44   - static void
45   - generateHintStream(
46   - QPDF& qpdf,
47   - QPDFWriter::NewObjTable const& new_obj,
48   - QPDFWriter::ObjTable const& obj,
49   - std::string& hint_stream,
50   - int& S,
51   - int& O,
52   - bool compressed)
53   - {
54   - qpdf.generateHintStream(new_obj, obj, hint_stream, S, O, compressed);
55   - }
56   -
57   - static std::vector<QPDFObjGen>
58   - getCompressibleObjGens(QPDF& qpdf)
59   - {
60   - return qpdf.getCompressibleObjVector();
61   - }
62   -
63   - static std::vector<bool>
64   - getCompressibleObjSet(QPDF& qpdf)
65   - {
66   - return qpdf.getCompressibleObjSet();
67   - }
68   -
69   - static std::map<QPDFObjGen, QPDFXRefEntry> const&
70   - getXRefTable(QPDF& qpdf)
71   - {
72   - return qpdf.getXRefTableInternal();
73   - }
74   -
75   - static size_t
76   - tableSize(QPDF& qpdf)
77   - {
78   - return qpdf.tableSize();
79   - }
80   -};
81   -
82 16 // The Resolver class is restricted to QPDFObject so that only it can resolve indirect
83 17 // references.
84 18 class QPDF::Resolver
... ...