Commit 9589fad1e5bde7c51f01c0de16ac0b5ccb7051e0

Authored by m-holger
1 parent 9379b768

Reimplement QPDFObjectHandle::getJSON in terms of writeJSON

libqpdf/QPDFObjectHandle.cc
... ... @@ -1618,7 +1618,11 @@ QPDFObjectHandle::getJSON(int json_version, bool dereference_indirect)
1618 1618 } else if (!dereference()) {
1619 1619 throw std::logic_error("attempted to dereference an uninitialized QPDFObjectHandle");
1620 1620 } else {
1621   - return obj->getJSON(json_version);
  1621 + Pl_Buffer p{"json"};
  1622 + JSON::Writer jw{&p, 0};
  1623 + writeJSON(json_version, jw, dereference_indirect);
  1624 + p.finish();
  1625 + return JSON::parse(p.getString());
1622 1626 }
1623 1627 }
1624 1628  
... ...
libqpdf/QPDF_Array.cc
... ... @@ -149,38 +149,6 @@ QPDF_Array::unparse()
149 149 return result;
150 150 }
151 151  
152   -JSON
153   -QPDF_Array::getJSON(int json_version)
154   -{
155   - static const JSON j_null = JSON::makeNull();
156   - JSON j_array = JSON::makeArray();
157   - if (sp) {
158   - int next = 0;
159   - for (auto& item: sp->elements) {
160   - int key = item.first;
161   - for (int j = next; j < key; ++j) {
162   - j_array.addArrayElement(j_null);
163   - }
164   - auto og = item.second->getObjGen();
165   - j_array.addArrayElement(
166   - og.isIndirect() ? JSON::makeString(og.unparse(' ') + " R")
167   - : item.second->getJSON(json_version));
168   - next = ++key;
169   - }
170   - for (int j = next; j < sp->size; ++j) {
171   - j_array.addArrayElement(j_null);
172   - }
173   - } else {
174   - for (auto const& item: elements) {
175   - auto og = item->getObjGen();
176   - j_array.addArrayElement(
177   - og.isIndirect() ? JSON::makeString(og.unparse(' ') + " R")
178   - : item->getJSON(json_version));
179   - }
180   - }
181   - return j_array;
182   -}
183   -
184 152 void
185 153 QPDF_Array::writeJSON(int json_version, JSON::Writer& p)
186 154 {
... ...
libqpdf/QPDF_Bool.cc
... ... @@ -26,12 +26,6 @@ QPDF_Bool::unparse()
26 26 return (val ? "true" : "false");
27 27 }
28 28  
29   -JSON
30   -QPDF_Bool::getJSON(int json_version)
31   -{
32   - return JSON::makeBool(this->val);
33   -}
34   -
35 29 void
36 30 QPDF_Bool::writeJSON(int json_version, JSON::Writer& p)
37 31 {
... ...
libqpdf/QPDF_Destroyed.cc
... ... @@ -28,13 +28,6 @@ QPDF_Destroyed::unparse()
28 28 return "";
29 29 }
30 30  
31   -JSON
32   -QPDF_Destroyed::getJSON(int json_version)
33   -{
34   - throw std::logic_error("attempted to get JSON from a QPDFObjectHandle from a destroyed QPDF");
35   - return JSON::makeNull();
36   -}
37   -
38 31 void
39 32 QPDF_Destroyed::writeJSON(int json_version, JSON::Writer& p)
40 33 {
... ...
libqpdf/QPDF_Dictionary.cc
... ... @@ -68,26 +68,6 @@ QPDF_Dictionary::unparse()
68 68 return result;
69 69 }
70 70  
71   -JSON
72   -QPDF_Dictionary::getJSON(int json_version)
73   -{
74   - JSON j = JSON::makeDictionary();
75   - for (auto& iter: this->items) {
76   - if (!iter.second.isNull()) {
77   - if (json_version == 1) {
78   - j.addDictionaryMember(
79   - QPDF_Name::normalizeName(iter.first), iter.second.getJSON(json_version));
80   - } else if (auto res = QPDF_Name::analyzeJSONEncoding(iter.first); res.first) {
81   - j.addDictionaryMember(iter.first, iter.second.getJSON(json_version));
82   - } else {
83   - j.addDictionaryMember(
84   - "n:" + QPDF_Name::normalizeName(iter.first), iter.second.getJSON(json_version));
85   - }
86   - }
87   - }
88   - return j;
89   -}
90   -
91 71 void
92 72 QPDF_Dictionary::writeJSON(int json_version, JSON::Writer& p)
93 73 {
... ...
libqpdf/QPDF_InlineImage.cc
... ... @@ -26,12 +26,6 @@ QPDF_InlineImage::unparse()
26 26 return this->val;
27 27 }
28 28  
29   -JSON
30   -QPDF_InlineImage::getJSON(int json_version)
31   -{
32   - return JSON::makeNull();
33   -}
34   -
35 29 void
36 30 QPDF_InlineImage::writeJSON(int json_version, JSON::Writer& p)
37 31 {
... ...
libqpdf/QPDF_Integer.cc
... ... @@ -27,12 +27,6 @@ QPDF_Integer::unparse()
27 27 return std::to_string(this->val);
28 28 }
29 29  
30   -JSON
31   -QPDF_Integer::getJSON(int json_version)
32   -{
33   - return JSON::makeInt(this->val);
34   -}
35   -
36 30 void
37 31 QPDF_Integer::writeJSON(int json_version, JSON::Writer& p)
38 32 {
... ...
libqpdf/QPDF_Name.cc
... ... @@ -103,20 +103,6 @@ QPDF_Name::analyzeJSONEncoding(const std::string&amp; name)
103 103 return {tail == 0, !needs_escaping};
104 104 }
105 105  
106   -JSON
107   -QPDF_Name::getJSON(int json_version)
108   -{
109   - if (json_version == 1) {
110   - return JSON::makeString(normalizeName(this->name));
111   - } else {
112   - if (auto res = analyzeJSONEncoding(name); res.first) {
113   - return JSON::makeString(name);
114   - } else {
115   - return JSON::makeString("n:" + normalizeName(name));
116   - }
117   - }
118   -}
119   -
120 106 void
121 107 QPDF_Name::writeJSON(int json_version, JSON::Writer& p)
122 108 {
... ...
libqpdf/QPDF_Null.cc
... ... @@ -44,13 +44,6 @@ QPDF_Null::unparse()
44 44 return "null";
45 45 }
46 46  
47   -JSON
48   -QPDF_Null::getJSON(int json_version)
49   -{
50   - // If this is updated, QPDF_Array::getJSON must also be updated.
51   - return JSON::makeNull();
52   -}
53   -
54 47 void
55 48 QPDF_Null::writeJSON(int json_version, JSON::Writer& p)
56 49 {
... ...
libqpdf/QPDF_Operator.cc
... ... @@ -26,12 +26,6 @@ QPDF_Operator::unparse()
26 26 return val;
27 27 }
28 28  
29   -JSON
30   -QPDF_Operator::getJSON(int json_version)
31   -{
32   - return JSON::makeNull();
33   -}
34   -
35 29 void
36 30 QPDF_Operator::writeJSON(int json_version, JSON::Writer& p)
37 31 {
... ...
libqpdf/QPDF_Real.cc
... ... @@ -39,25 +39,6 @@ QPDF_Real::unparse()
39 39 return this->val;
40 40 }
41 41  
42   -JSON
43   -QPDF_Real::getJSON(int json_version)
44   -{
45   - // While PDF allows .x or -.x, JSON does not. Rather than converting from string to double and
46   - // back, just handle this as a special case for JSON.
47   - std::string result;
48   - if (this->val.length() == 0) {
49   - // Can't really happen...
50   - result = "0";
51   - } else if (this->val.at(0) == '.') {
52   - result = "0" + this->val;
53   - } else if ((this->val.length() >= 2) && (this->val.at(0) == '-') && (this->val.at(1) == '.')) {
54   - result = "-0." + this->val.substr(2);
55   - } else {
56   - result = this->val;
57   - }
58   - return JSON::makeNumber(result);
59   -}
60   -
61 42 void
62 43 QPDF_Real::writeJSON(int json_version, JSON::Writer& p)
63 44 {
... ...
libqpdf/QPDF_Reserved.cc
... ... @@ -26,13 +26,6 @@ QPDF_Reserved::unparse()
26 26 return "";
27 27 }
28 28  
29   -JSON
30   -QPDF_Reserved::getJSON(int json_version)
31   -{
32   - throw std::logic_error("QPDFObjectHandle: attempting to get JSON from a reserved object");
33   - return JSON::makeNull();
34   -}
35   -
36 29 void
37 30 QPDF_Reserved::writeJSON(int json_version, JSON::Writer& p)
38 31 {
... ...
libqpdf/QPDF_Stream.cc
... ... @@ -177,15 +177,6 @@ QPDF_Stream::unparse()
177 177 return og.unparse(' ') + " R";
178 178 }
179 179  
180   -JSON
181   -QPDF_Stream::getJSON(int json_version)
182   -{
183   - if (json_version == 1) {
184   - return this->stream_dict.getJSON(json_version);
185   - }
186   - return getStreamJSON(json_version, qpdf_sj_none, qpdf_dl_none, nullptr, "");
187   -}
188   -
189 180 void
190 181 QPDF_Stream::writeJSON(int json_version, JSON::Writer& p)
191 182 {
... ...
libqpdf/QPDF_String.cc
... ... @@ -46,35 +46,6 @@ QPDF_String::unparse()
46 46 return unparse(false);
47 47 }
48 48  
49   -JSON
50   -QPDF_String::getJSON(int json_version)
51   -{
52   - if (json_version == 1) {
53   - return JSON::makeString(getUTF8Val());
54   - }
55   - // See if we can unambiguously represent as Unicode.
56   - bool is_unicode = false;
57   - std::string result;
58   - std::string candidate = getUTF8Val();
59   - if (QUtil::is_utf16(this->val) || QUtil::is_explicit_utf8(this->val)) {
60   - is_unicode = true;
61   - result = candidate;
62   - } else if (!useHexString()) {
63   - std::string test;
64   - if (QUtil::utf8_to_pdf_doc(candidate, test, '?') && (test == this->val)) {
65   - // This is a PDF-doc string that can be losslessly encoded as Unicode.
66   - is_unicode = true;
67   - result = candidate;
68   - }
69   - }
70   - if (is_unicode) {
71   - result = "u:" + result;
72   - } else {
73   - result = "b:" + QUtil::hex_encode(this->val);
74   - }
75   - return JSON::makeString(result);
76   -}
77   -
78 49 void
79 50 QPDF_String::writeJSON(int json_version, JSON::Writer& p)
80 51 {
... ...
libqpdf/QPDF_Unresolved.cc
... ... @@ -27,13 +27,6 @@ QPDF_Unresolved::unparse()
27 27 return "";
28 28 }
29 29  
30   -JSON
31   -QPDF_Unresolved::getJSON(int json_version)
32   -{
33   - throw std::logic_error("attempted to get JSON from an unresolved QPDFObjectHandle");
34   - return JSON::makeNull();
35   -}
36   -
37 30 void
38 31 QPDF_Unresolved::writeJSON(int json_version, JSON::Writer& p)
39 32 {
... ...
libqpdf/qpdf/QPDFObject_private.hh
... ... @@ -33,11 +33,6 @@ class QPDFObject
33 33 {
34 34 return value->unparse();
35 35 }
36   - JSON
37   - getJSON(int json_version)
38   - {
39   - return value->getJSON(json_version);
40   - }
41 36 void
42 37 writeJSON(int json_version, JSON::Writer& p)
43 38 {
... ...
libqpdf/qpdf/QPDFValue.hh
... ... @@ -24,7 +24,6 @@ class QPDFValue: public std::enable_shared_from_this&lt;QPDFValue&gt;
24 24  
25 25 virtual std::shared_ptr<QPDFObject> copy(bool shallow = false) = 0;
26 26 virtual std::string unparse() = 0;
27   - virtual JSON getJSON(int json_version) = 0;
28 27 virtual void writeJSON(int json_version, JSON::Writer& p) = 0;
29 28  
30 29 struct JSON_Descr
... ...
libqpdf/qpdf/QPDF_Array.hh
... ... @@ -22,7 +22,6 @@ class QPDF_Array: public QPDFValue
22 22 create(std::vector<std::shared_ptr<QPDFObject>>&& items, bool sparse);
23 23 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
24 24 std::string unparse() override;
25   - JSON getJSON(int json_version) override;
26 25 void writeJSON(int json_version, JSON::Writer& p) override;
27 26 void disconnect() override;
28 27  
... ...
libqpdf/qpdf/QPDF_Bool.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Bool: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(bool val);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14  
16 15 bool getVal() const;
... ...
libqpdf/qpdf/QPDF_Destroyed.hh
... ... @@ -9,7 +9,6 @@ class QPDF_Destroyed: public QPDFValue
9 9 ~QPDF_Destroyed() override = default;
10 10 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
11 11 std::string unparse() override;
12   - JSON getJSON(int json_version) override;
13 12 void writeJSON(int json_version, JSON::Writer& p) override;
14 13 static std::shared_ptr<QPDFValue> getInstance();
15 14  
... ...
libqpdf/qpdf/QPDF_Dictionary.hh
... ... @@ -16,7 +16,6 @@ class QPDF_Dictionary: public QPDFValue
16 16 static std::shared_ptr<QPDFObject> create(std::map<std::string, QPDFObjectHandle>&& items);
17 17 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
18 18 std::string unparse() override;
19   - JSON getJSON(int json_version) override;
20 19 void writeJSON(int json_version, JSON::Writer& p) override;
21 20 void disconnect() override;
22 21  
... ...
libqpdf/qpdf/QPDF_InlineImage.hh
... ... @@ -10,7 +10,6 @@ class QPDF_InlineImage: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(std::string const& val);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14 std::string
16 15 getStringValue() const override
... ...
libqpdf/qpdf/QPDF_Integer.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Integer: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(long long value);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14 long long getVal() const;
16 15  
... ...
libqpdf/qpdf/QPDF_Name.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Name: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(std::string const& name);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14  
16 15 // Put # into strings with characters unsuitable for name token
... ...
libqpdf/qpdf/QPDF_Null.hh
... ... @@ -18,7 +18,6 @@ class QPDF_Null: public QPDFValue
18 18 std::string var_descr);
19 19 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
20 20 std::string unparse() override;
21   - JSON getJSON(int json_version) override;
22 21 void writeJSON(int json_version, JSON::Writer& p) override;
23 22  
24 23 private:
... ...
libqpdf/qpdf/QPDF_Operator.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Operator: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(std::string const& val);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14 std::string
16 15 getStringValue() const override
... ...
libqpdf/qpdf/QPDF_Real.hh
... ... @@ -12,7 +12,6 @@ class QPDF_Real: public QPDFValue
12 12 create(double value, int decimal_places, bool trim_trailing_zeroes);
13 13 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
14 14 std::string unparse() override;
15   - JSON getJSON(int json_version) override;
16 15 void writeJSON(int json_version, JSON::Writer& p) override;
17 16 std::string
18 17 getStringValue() const override
... ...
libqpdf/qpdf/QPDF_Reserved.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Reserved: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create();
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14  
16 15 private:
... ...
libqpdf/qpdf/QPDF_Stream.hh
... ... @@ -25,7 +25,6 @@ class QPDF_Stream: public QPDFValue
25 25 size_t length);
26 26 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
27 27 std::string unparse() override;
28   - JSON getJSON(int json_version) override;
29 28 void writeJSON(int json_version, JSON::Writer& p) override;
30 29 void setDescription(
31 30 QPDF*, std::shared_ptr<QPDFValue::Description>& description, qpdf_offset_t offset) override;
... ...
libqpdf/qpdf/QPDF_String.hh
... ... @@ -16,7 +16,6 @@ class QPDF_String: public QPDFValue
16 16 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
17 17 std::string unparse() override;
18 18 std::string unparse(bool force_binary);
19   - JSON getJSON(int json_version) override;
20 19 void writeJSON(int json_version, JSON::Writer& p) override;
21 20 std::string getUTF8Val() const;
22 21 std::string
... ...
libqpdf/qpdf/QPDF_Unresolved.hh
... ... @@ -10,7 +10,6 @@ class QPDF_Unresolved: public QPDFValue
10 10 static std::shared_ptr<QPDFObject> create(QPDF* qpdf, QPDFObjGen const& og);
11 11 std::shared_ptr<QPDFObject> copy(bool shallow = false) override;
12 12 std::string unparse() override;
13   - JSON getJSON(int json_version) override;
14 13 void writeJSON(int json_version, JSON::Writer& p) override;
15 14  
16 15 private:
... ...