Commit 88fd7ca99ab77009974584664396cb9f81aa85d4

Authored by m-holger
1 parent 39abb113

Refactor QPDF::emptyPDF

libqpdf/QPDF.cc
... ... @@ -32,67 +32,51 @@
32 32 // being static as well.
33 33 std::string const QPDF::qpdf_version(QPDF_VERSION);
34 34  
35   -static char const* EMPTY_PDF = (
36   - // force line break
37   - "%PDF-1.3\n"
38   - "1 0 obj\n"
39   - "<< /Type /Catalog /Pages 2 0 R >>\n"
40   - "endobj\n"
41   - "2 0 obj\n"
42   - "<< /Type /Pages /Kids [] /Count 0 >>\n"
43   - "endobj\n"
44   - "xref\n"
45   - "0 3\n"
46   - "0000000000 65535 f \n"
47   - "0000000009 00000 n \n"
48   - "0000000058 00000 n \n"
49   - "trailer << /Size 3 /Root 1 0 R >>\n"
50   - "startxref\n"
51   - "110\n"
52   - "%%EOF\n");
53   -
54 35 namespace
55 36 {
56   - class InvalidInputSource: public InputSource
  37 + class InvalidInputSource final: public InputSource
57 38 {
58 39 public:
59   - ~InvalidInputSource() override = default;
  40 + InvalidInputSource(std::string const& name) :
  41 + name(name)
  42 + {
  43 + }
  44 + ~InvalidInputSource() final = default;
60 45 qpdf_offset_t
61   - findAndSkipNextEOL() override
  46 + findAndSkipNextEOL() final
62 47 {
63 48 throwException();
64 49 return 0;
65 50 }
66 51 std::string const&
67   - getName() const override
  52 + getName() const final
68 53 {
69   - static std::string name("closed input source");
70 54 return name;
71 55 }
72 56 qpdf_offset_t
73   - tell() override
  57 + tell() final
74 58 {
75 59 throwException();
76 60 return 0;
77 61 }
78 62 void
79   - seek(qpdf_offset_t offset, int whence) override
  63 + seek(qpdf_offset_t offset, int whence) final
80 64 {
81 65 throwException();
82 66 }
83 67 void
84   - rewind() override
  68 + rewind() final
85 69 {
86 70 throwException();
87 71 }
88 72 size_t
89   - read(char* buffer, size_t length) override
  73 + read(char* buffer, size_t length) final
90 74 {
91 75 throwException();
92 76 return 0;
93 77 }
94 78 void
95   - unreadCh(char ch) override
  79 + unreadCh(char ch) final
96 80 {
97 81 throwException();
98 82 }
... ... @@ -105,6 +89,8 @@ namespace
105 89 "source. QPDF operations are invalid before processFile (or "
106 90 "another process method) or after closeInputSource");
107 91 }
  92 +
  93 + std::string const& name;
108 94 };
109 95 } // namespace
110 96  
... ... @@ -198,7 +184,7 @@ QPDF::EncryptionParameters::EncryptionParameters() :
198 184  
199 185 QPDF::Members::Members(QPDF& qpdf) :
200 186 log(QPDFLogger::defaultLogger()),
201   - file_sp(new InvalidInputSource()),
  187 + file_sp(new InvalidInputSource(no_input_name)),
202 188 file(file_sp.get()),
203 189 encp(new EncryptionParameters),
204 190 xref_table(qpdf, file)
... ... @@ -278,7 +264,8 @@ QPDF::processInputSource(std::shared_ptr&lt;InputSource&gt; source, char const* passwo
278 264 void
279 265 QPDF::closeInputSource()
280 266 {
281   - m->file_sp = std::shared_ptr<InputSource>(new InvalidInputSource());
  267 + m->no_input_name = "closed input source";
  268 + m->file_sp = std::shared_ptr<InputSource>(new InvalidInputSource(m->no_input_name));
282 269 m->file = m->file_sp.get();
283 270 }
284 271  
... ... @@ -291,7 +278,9 @@ QPDF::setPasswordIsHexKey(bool val)
291 278 void
292 279 QPDF::emptyPDF()
293 280 {
294   - processMemoryFile("empty PDF", EMPTY_PDF, strlen(EMPTY_PDF));
  281 + m->pdf_version = "1.3";
  282 + m->no_input_name = "empty PDF";
  283 + m->xref_table.initialize_empty();
295 284 }
296 285  
297 286 void
... ... @@ -490,6 +479,22 @@ QPDF::warn(
490 479 }
491 480  
492 481 void
  482 +QPDF::Xref_table::initialize_empty()
  483 +{
  484 + initialized_ = true;
  485 + trailer_ = QPDFObjectHandle::newDictionary();
  486 + auto rt = qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary());
  487 + auto pgs = qpdf.makeIndirectObject(QPDFObjectHandle::newDictionary());
  488 + pgs.replaceKey("/Type", QPDFObjectHandle::newName("/Pages"));
  489 + pgs.replaceKey("/Kids", QPDFObjectHandle::newArray());
  490 + pgs.replaceKey("/Count", QPDFObjectHandle::newInteger(0));
  491 + rt.replaceKey("/Type", QPDFObjectHandle::newName("/Catalog"));
  492 + rt.replaceKey("/Pages", pgs);
  493 + trailer_.replaceKey("/Root", rt);
  494 + trailer_.replaceKey("/Size", QPDFObjectHandle::newInteger(3));
  495 +}
  496 +
  497 +void
493 498 QPDF::Xref_table::initialize()
494 499 {
495 500 // PDF spec says %%EOF must be found within the last 1024 bytes of/ the file. We add an extra
... ...
libqpdf/qpdf/QPDF_private.hh
... ... @@ -15,6 +15,7 @@ class QPDF::Xref_table
15 15 }
16 16  
17 17 void initialize();
  18 + void initialize_empty();
18 19 void reconstruct(QPDFExc& e);
19 20 void show();
20 21 bool resolve();
... ... @@ -640,6 +641,8 @@ class QPDF::Members
640 641 std::shared_ptr<QPDFLogger> log;
641 642 unsigned long long unique_id{0};
642 643 QPDFTokenizer tokenizer;
  644 + // Filename to use if there is no input PDF
  645 + std::string no_input_name{"closed input source"};
643 646 // If file_sp is updated, file must also be updated.
644 647 std::shared_ptr<InputSource> file_sp;
645 648 InputSource* file;
... ...