aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_json.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDF_json.cc')
-rw-r--r--libqpdf/QPDF_json.cc74
1 files changed, 70 insertions, 4 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());