Commit 8d42eb2632ca5c2ae1200160e78116505b57f6b0
1 parent
4fe2e06b
Add scaffolding for QPDF JSON reactor
Showing
2 changed files
with
68 additions
and
11 deletions
include/qpdf/QPDF.hh
| @@ -115,22 +115,18 @@ class QPDF | @@ -115,22 +115,18 @@ class QPDF | ||
| 115 | // complete representation of a PDF. See "QPDF JSON Format" in the | 115 | // complete representation of a PDF. See "QPDF JSON Format" in the |
| 116 | // manual for details. | 116 | // manual for details. |
| 117 | QPDF_DLL | 117 | QPDF_DLL |
| 118 | - void | ||
| 119 | - createFromJSON(std::string const& json_file); | 118 | + void createFromJSON(std::string const& json_file); |
| 120 | QPDF_DLL | 119 | QPDF_DLL |
| 121 | - void | ||
| 122 | - createFromJSON(std::shared_ptr<InputSource>); | 120 | + void createFromJSON(std::shared_ptr<InputSource>); |
| 123 | 121 | ||
| 124 | // Update a PDF from an input source that contains JSON in the | 122 | // Update a PDF from an input source that contains JSON in the |
| 125 | // same format as is written by qpdf --json (version 2 or higher). | 123 | // same format as is written by qpdf --json (version 2 or higher). |
| 126 | // Objects in the PDF and not in the JSON are not modified. See | 124 | // Objects in the PDF and not in the JSON are not modified. See |
| 127 | // "QPDF JSON Format" in the manual for details. | 125 | // "QPDF JSON Format" in the manual for details. |
| 128 | QPDF_DLL | 126 | QPDF_DLL |
| 129 | - void | ||
| 130 | - updateFromJSON(std::string const& json_file); | 127 | + void updateFromJSON(std::string const& json_file); |
| 131 | QPDF_DLL | 128 | QPDF_DLL |
| 132 | - void | ||
| 133 | - updateFromJSON(std::shared_ptr<InputSource>); | 129 | + void updateFromJSON(std::shared_ptr<InputSource>); |
| 134 | 130 | ||
| 135 | // Close or otherwise release the input source. Once this has been | 131 | // Close or otherwise release the input source. Once this has been |
| 136 | // called, no other methods of qpdf can be called safely except | 132 | // called, no other methods of qpdf can be called safely except |
| @@ -999,6 +995,20 @@ class QPDF | @@ -999,6 +995,20 @@ class QPDF | ||
| 999 | }; | 995 | }; |
| 1000 | friend class ResolveRecorder; | 996 | friend class ResolveRecorder; |
| 1001 | 997 | ||
| 998 | + class JSONReactor: public JSON::Reactor | ||
| 999 | + { | ||
| 1000 | + public: | ||
| 1001 | + virtual ~JSONReactor() = default; | ||
| 1002 | + virtual void dictionaryStart() override; | ||
| 1003 | + virtual void arrayStart() override; | ||
| 1004 | + virtual void containerEnd(JSON const& value) override; | ||
| 1005 | + virtual void topLevelScalar() override; | ||
| 1006 | + virtual bool | ||
| 1007 | + dictionaryItem(std::string const& key, JSON const& value) override; | ||
| 1008 | + virtual bool arrayItem(JSON const& value) override; | ||
| 1009 | + }; | ||
| 1010 | + friend class JSONReactor; | ||
| 1011 | + | ||
| 1002 | void parse(char const* password); | 1012 | void parse(char const* password); |
| 1003 | void inParse(bool); | 1013 | void inParse(bool); |
| 1004 | void setTrailer(QPDFObjectHandle obj); | 1014 | void setTrailer(QPDFObjectHandle obj); |
| @@ -1508,6 +1518,9 @@ class QPDF | @@ -1508,6 +1518,9 @@ class QPDF | ||
| 1508 | int depth); | 1518 | int depth); |
| 1509 | void filterCompressedObjects(std::map<int, int> const& object_stream_data); | 1519 | void filterCompressedObjects(std::map<int, int> const& object_stream_data); |
| 1510 | 1520 | ||
| 1521 | + // JSON import | ||
| 1522 | + void importJSON(std::shared_ptr<InputSource>, bool must_be_complete); | ||
| 1523 | + | ||
| 1511 | // Type conversion helper methods | 1524 | // Type conversion helper methods |
| 1512 | template <typename T> | 1525 | template <typename T> |
| 1513 | static qpdf_offset_t | 1526 | static qpdf_offset_t |
libqpdf/QPDF_json.cc
| @@ -3,15 +3,53 @@ | @@ -3,15 +3,53 @@ | ||
| 3 | #include <qpdf/FileInputSource.hh> | 3 | #include <qpdf/FileInputSource.hh> |
| 4 | 4 | ||
| 5 | void | 5 | void |
| 6 | +QPDF::JSONReactor::dictionaryStart() | ||
| 7 | +{ | ||
| 8 | + // QXXXXQ | ||
| 9 | +} | ||
| 10 | + | ||
| 11 | +void | ||
| 12 | +QPDF::JSONReactor::arrayStart() | ||
| 13 | +{ | ||
| 14 | + // QXXXXQ | ||
| 15 | +} | ||
| 16 | + | ||
| 17 | +void | ||
| 18 | +QPDF::JSONReactor::containerEnd(JSON const& value) | ||
| 19 | +{ | ||
| 20 | + // QXXXXQ | ||
| 21 | +} | ||
| 22 | + | ||
| 23 | +void | ||
| 24 | +QPDF::JSONReactor::topLevelScalar() | ||
| 25 | +{ | ||
| 26 | + // QXXXXQ | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +bool | ||
| 30 | +QPDF::JSONReactor::dictionaryItem(std::string const& key, JSON const& value) | ||
| 31 | +{ | ||
| 32 | + // QXXXXQ | ||
| 33 | + return true; | ||
| 34 | +} | ||
| 35 | + | ||
| 36 | +bool | ||
| 37 | +QPDF::JSONReactor::arrayItem(JSON const& value) | ||
| 38 | +{ | ||
| 39 | + // QXXXXQ | ||
| 40 | + return true; | ||
| 41 | +} | ||
| 42 | + | ||
| 43 | +void | ||
| 6 | QPDF::createFromJSON(std::string const& json_file) | 44 | QPDF::createFromJSON(std::string const& json_file) |
| 7 | { | 45 | { |
| 8 | createFromJSON(std::make_shared<FileInputSource>(json_file.c_str())); | 46 | createFromJSON(std::make_shared<FileInputSource>(json_file.c_str())); |
| 9 | } | 47 | } |
| 10 | 48 | ||
| 11 | void | 49 | void |
| 12 | -QPDF::createFromJSON(std::shared_ptr<InputSource>) | 50 | +QPDF::createFromJSON(std::shared_ptr<InputSource> is) |
| 13 | { | 51 | { |
| 14 | - // QXXXQ | 52 | + importJSON(is, true); |
| 15 | } | 53 | } |
| 16 | 54 | ||
| 17 | void | 55 | void |
| @@ -21,7 +59,13 @@ QPDF::updateFromJSON(std::string const& json_file) | @@ -21,7 +59,13 @@ QPDF::updateFromJSON(std::string const& json_file) | ||
| 21 | } | 59 | } |
| 22 | 60 | ||
| 23 | void | 61 | void |
| 24 | -QPDF::updateFromJSON(std::shared_ptr<InputSource>) | 62 | +QPDF::updateFromJSON(std::shared_ptr<InputSource> is) |
| 63 | +{ | ||
| 64 | + importJSON(is, false); | ||
| 65 | +} | ||
| 66 | + | ||
| 67 | +void | ||
| 68 | +QPDF::importJSON(std::shared_ptr<InputSource>, bool must_be_complete) | ||
| 25 | { | 69 | { |
| 26 | // QXXXQ | 70 | // QXXXQ |
| 27 | } | 71 | } |