diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index b227bb37..54af0d17 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -51,7 +50,6 @@ class BitStream; class BitWriter; class QPDFLogger; class QPDFParser; -struct JSON_Descr; class QPDF { @@ -1110,72 +1108,7 @@ class QPDF std::set::const_iterator iter; }; - class JSONReactor: public JSON::Reactor - { - public: - JSONReactor( - QPDF&, std::shared_ptr 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 is; - bool must_be_complete; - std::shared_ptr> 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_stack; - std::vector object_stack; - std::set reserved; - }; + class JSONReactor; void parse(char const* password); void inParse(bool); 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 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 is; + bool must_be_complete; + std::shared_ptr 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_stack; + std::vector object_stack; + std::set reserved; +}; + QPDF::JSONReactor::JSONReactor( QPDF& pdf, std::shared_ptr is, bool must_be_complete) : pdf(pdf), is(is), must_be_complete(must_be_complete), - descr(std::make_shared>( - JSON_Descr(std::make_shared(is->getName()), ""))), + descr(std::make_shared(QPDFValue::JSON_Descr( + std::make_shared(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(*descr); + auto j_descr = std::get(*descr); if (j_descr.object != cur_object) { descr = std::make_shared( - 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 input, std::string const& object) : - input(input), - object(object) - { - } - - std::shared_ptr 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 input, std::string const& object) : + input(input), + object(object) + { + } + + std::shared_ptr input; + std::string object; + }; + using Description = std::variant; virtual void