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,7 +258,79 @@ Pl_stack::Popper::pop()
258 stack = nullptr; 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 friend class QPDFWriter; 335 friend class QPDFWriter;
264 336
@@ -273,8 +345,8 @@ class QPDFWriter::Members @@ -273,8 +345,8 @@ class QPDFWriter::Members
273 enum trailer_e { t_normal, t_lin_first, t_lin_second }; 345 enum trailer_e { t_normal, t_lin_first, t_lin_second };
274 346
275 Members(QPDFWriter& w, QPDF& pdf) : 347 Members(QPDFWriter& w, QPDF& pdf) :
  348 + QPDF::Writer(pdf),
276 w(w), 349 w(w),
277 - pdf(pdf),  
278 root_og( 350 root_og(
279 pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen() : QPDFObjGen(-1, 0)), 351 pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen() : QPDFObjGen(-1, 0)),
280 pipeline_stack(pipeline) 352 pipeline_stack(pipeline)
@@ -409,7 +481,6 @@ class QPDFWriter::Members @@ -409,7 +481,6 @@ class QPDFWriter::Members
409 481
410 private: 482 private:
411 QPDFWriter& w; 483 QPDFWriter& w;
412 - QPDF& pdf;  
413 QPDFObjGen root_og{-1, 0}; 484 QPDFObjGen root_og{-1, 0};
414 char const* filename{"unspecified"}; 485 char const* filename{"unspecified"};
415 FILE* file{nullptr}; 486 FILE* file{nullptr};
libqpdf/qpdf/QPDF_private.hh
@@ -13,72 +13,6 @@ @@ -13,72 +13,6 @@
13 13
14 using namespace qpdf; 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 // The Resolver class is restricted to QPDFObject so that only it can resolve indirect 16 // The Resolver class is restricted to QPDFObject so that only it can resolve indirect
83 // references. 17 // references.
84 class QPDF::Resolver 18 class QPDF::Resolver