Commit 9589fad1e5bde7c51f01c0de16ac0b5ccb7051e0
1 parent
9379b768
Reimplement QPDFObjectHandle::getJSON in terms of writeJSON
Showing
31 changed files
with
5 additions
and
196 deletions
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
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
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& 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
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
libqpdf/qpdf/QPDFValue.hh
| ... | ... | @@ -24,7 +24,6 @@ class QPDFValue: public std::enable_shared_from_this<QPDFValue> |
| 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: | ... | ... |