diff options
author | m-holger <m-holger@kubitscheck.org> | 2023-02-09 13:43:56 +0100 |
---|---|---|
committer | m-holger <m-holger@kubitscheck.org> | 2023-02-18 09:33:08 +0100 |
commit | da14ab4dc7b1caee1708483cf714683f7d811ca7 (patch) | |
tree | f405b14968fcf9158df4a5d15efeafe6a0e3f366 /libqpdf | |
parent | dab27c9bb35c26e30e22f2e53299ee9566cadefd (diff) | |
download | qpdf-da14ab4dc7b1caee1708483cf714683f7d811ca7.tar.zst |
Move definition of QPDF::JSONReactor into QPDF_json
Allow access to private header files when defining data members.
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDF_json.cc | 74 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDFValue.hh | 25 |
2 files changed, 83 insertions, 16 deletions
diff --git a/libqpdf/QPDF_json.cc b/libqpdf/QPDF_json.cc index fb858557..f13b9517 100644 --- a/libqpdf/QPDF_json.cc +++ b/libqpdf/QPDF_json.cc @@ -223,13 +223,79 @@ provide_data( }; } +class QPDF::JSONReactor: public JSON::Reactor +{ + public: + JSONReactor(QPDF&, std::shared_ptr<InputSource> is, bool must_be_complete); + virtual ~JSONReactor() = default; + virtual void dictionaryStart() override; + virtual void arrayStart() override; + virtual void containerEnd(JSON const& value) override; + virtual void topLevelScalar() override; + virtual bool + dictionaryItem(std::string const& key, JSON const& value) override; + virtual bool arrayItem(JSON const& value) override; + + bool anyErrors() const; + + private: + enum state_e { + st_initial, + st_top, + st_qpdf, + st_qpdf_meta, + st_objects, + st_trailer, + st_object_top, + st_stream, + st_object, + st_ignore, + }; + + void containerStart(); + void nestedState(std::string const& key, JSON const& value, state_e); + void setObjectDescription(QPDFObjectHandle& oh, JSON const& value); + QPDFObjectHandle makeObject(JSON const& value); + void error(qpdf_offset_t offset, std::string const& message); + QPDFObjectHandle reserveObject(int obj, int gen); + void replaceObject( + QPDFObjectHandle to_replace, + QPDFObjectHandle replacement, + JSON const& value); + + QPDF& pdf; + std::shared_ptr<InputSource> is; + bool must_be_complete; + std::shared_ptr<QPDFValue::Description> descr; + bool errors; + bool parse_error; + bool saw_qpdf; + bool saw_qpdf_meta; + bool saw_objects; + bool saw_json_version; + bool saw_pdf_version; + bool saw_trailer; + state_e state; + state_e next_state; + std::string cur_object; + bool saw_value; + bool saw_stream; + bool saw_dict; + bool saw_data; + bool saw_datafile; + bool this_stream_needs_data; + std::vector<state_e> state_stack; + std::vector<QPDFObjectHandle> object_stack; + std::set<QPDFObjGen> reserved; +}; + QPDF::JSONReactor::JSONReactor( QPDF& pdf, std::shared_ptr<InputSource> is, bool must_be_complete) : pdf(pdf), is(is), must_be_complete(must_be_complete), - descr(std::make_shared<std::variant<std::string, JSON_Descr>>( - JSON_Descr(std::make_shared<std::string>(is->getName()), ""))), + descr(std::make_shared<QPDFValue::Description>(QPDFValue::JSON_Descr( + std::make_shared<std::string>(is->getName()), ""))), errors(false), parse_error(false), saw_qpdf(false), @@ -679,10 +745,10 @@ QPDF::JSONReactor::arrayItem(JSON const& value) void QPDF::JSONReactor::setObjectDescription(QPDFObjectHandle& oh, JSON const& value) { - auto j_descr = std::get<JSON_Descr>(*descr); + auto j_descr = std::get<QPDFValue::JSON_Descr>(*descr); if (j_descr.object != cur_object) { descr = std::make_shared<QPDFValue::Description>( - JSON_Descr(j_descr.input, cur_object)); + QPDFValue::JSON_Descr(j_descr.input, cur_object)); } oh.getObjectPtr()->setDescription(&pdf, descr, value.getStart()); diff --git a/libqpdf/qpdf/QPDFValue.hh b/libqpdf/qpdf/QPDFValue.hh index 2e0c5e8d..9a1a6df1 100644 --- a/libqpdf/qpdf/QPDFValue.hh +++ b/libqpdf/qpdf/QPDFValue.hh @@ -14,18 +14,6 @@ class QPDF; class QPDFObjectHandle; class QPDFObject; -struct JSON_Descr -{ - JSON_Descr(std::shared_ptr<std::string> input, std::string const& object) : - input(input), - object(object) - { - } - - std::shared_ptr<std::string> input; - std::string object; -}; - class QPDFValue { friend class QPDFObject; @@ -37,6 +25,19 @@ class QPDFValue virtual std::string unparse() = 0; virtual JSON getJSON(int json_version) = 0; + struct JSON_Descr + { + JSON_Descr( + std::shared_ptr<std::string> input, std::string const& object) : + input(input), + object(object) + { + } + + std::shared_ptr<std::string> input; + std::string object; + }; + using Description = std::variant<std::string, JSON_Descr>; virtual void |