Commit 1496472e1c2f64f46d2d7d76481aef1aa3fff869
1 parent
da14ab4d
Add method QPDFValue::setChildDescription
Showing
5 changed files
with
80 additions
and
21 deletions
libqpdf/QPDFObjectHandle.cc
| @@ -36,6 +36,8 @@ | @@ -36,6 +36,8 @@ | ||
| 36 | #include <stdexcept> | 36 | #include <stdexcept> |
| 37 | #include <stdlib.h> | 37 | #include <stdlib.h> |
| 38 | 38 | ||
| 39 | +using namespace std::literals; | ||
| 40 | + | ||
| 39 | namespace | 41 | namespace |
| 40 | { | 42 | { |
| 41 | class TerminateParsing | 43 | class TerminateParsing |
| @@ -813,13 +815,9 @@ QPDFObjectHandle::getArrayItem(int n) | @@ -813,13 +815,9 @@ QPDFObjectHandle::getArrayItem(int n) | ||
| 813 | typeWarning("array", "returning null"); | 815 | typeWarning("array", "returning null"); |
| 814 | QTC::TC("qpdf", "QPDFObjectHandle array null for non-array"); | 816 | QTC::TC("qpdf", "QPDFObjectHandle array null for non-array"); |
| 815 | } | 817 | } |
| 816 | - QPDF* context = nullptr; | ||
| 817 | - std::string description; | ||
| 818 | - if (obj->getDescription(context, description)) { | ||
| 819 | - result.setObjectDescription( | ||
| 820 | - context, | ||
| 821 | - description + " -> null returned from invalid array access"); | ||
| 822 | - } | 818 | + static auto constexpr msg = |
| 819 | + " -> null returned from invalid array access"sv; | ||
| 820 | + result.obj->setChildDescription(obj, msg, ""); | ||
| 823 | } | 821 | } |
| 824 | return result; | 822 | return result; |
| 825 | } | 823 | } |
| @@ -1038,14 +1036,9 @@ QPDFObjectHandle::getKey(std::string const& key) | @@ -1038,14 +1036,9 @@ QPDFObjectHandle::getKey(std::string const& key) | ||
| 1038 | typeWarning("dictionary", "returning null for attempted key retrieval"); | 1036 | typeWarning("dictionary", "returning null for attempted key retrieval"); |
| 1039 | QTC::TC("qpdf", "QPDFObjectHandle dictionary null for getKey"); | 1037 | QTC::TC("qpdf", "QPDFObjectHandle dictionary null for getKey"); |
| 1040 | result = newNull(); | 1038 | result = newNull(); |
| 1041 | - QPDF* qpdf = nullptr; | ||
| 1042 | - std::string description; | ||
| 1043 | - if (obj->getDescription(qpdf, description)) { | ||
| 1044 | - result.setObjectDescription( | ||
| 1045 | - qpdf, | ||
| 1046 | - (description + " -> null returned from getting key " + key + | ||
| 1047 | - " from non-Dictionary")); | ||
| 1048 | - } | 1039 | + static auto constexpr msg = |
| 1040 | + " -> null returned from getting key $VD from non-Dictionary"sv; | ||
| 1041 | + result.obj->setChildDescription(obj, msg, key); | ||
| 1049 | } | 1042 | } |
| 1050 | return result; | 1043 | return result; |
| 1051 | } | 1044 | } |
libqpdf/QPDFValue.cc
| @@ -17,6 +17,7 @@ QPDFValue::getDescription() | @@ -17,6 +17,7 @@ QPDFValue::getDescription() | ||
| 17 | switch (object_description->index()) { | 17 | switch (object_description->index()) { |
| 18 | case 0: | 18 | case 0: |
| 19 | { | 19 | { |
| 20 | + // Simple template string | ||
| 20 | auto description = std::get<0>(*object_description); | 21 | auto description = std::get<0>(*object_description); |
| 21 | 22 | ||
| 22 | if (auto pos = description.find("$OG"); | 23 | if (auto pos = description.find("$OG"); |
| @@ -36,12 +37,27 @@ QPDFValue::getDescription() | @@ -36,12 +37,27 @@ QPDFValue::getDescription() | ||
| 36 | } | 37 | } |
| 37 | case 1: | 38 | case 1: |
| 38 | { | 39 | { |
| 40 | + // QPDF::JSONReactor generated description | ||
| 39 | auto j_descr = std::get<1>(*object_description); | 41 | auto j_descr = std::get<1>(*object_description); |
| 40 | return ( | 42 | return ( |
| 41 | *j_descr.input + | 43 | *j_descr.input + |
| 42 | (j_descr.object.empty() ? "" : ", " + j_descr.object) + | 44 | (j_descr.object.empty() ? "" : ", " + j_descr.object) + |
| 43 | " at offset " + std::to_string(parsed_offset)); | 45 | " at offset " + std::to_string(parsed_offset)); |
| 44 | } | 46 | } |
| 47 | + case 2: | ||
| 48 | + { | ||
| 49 | + // Child object description | ||
| 50 | + auto j_descr = std::get<2>(*object_description); | ||
| 51 | + std::string result; | ||
| 52 | + if (auto p = j_descr.parent.lock()) { | ||
| 53 | + result = p->getDescription(); | ||
| 54 | + } | ||
| 55 | + result += j_descr.static_descr; | ||
| 56 | + if (auto pos = result.find("$VD"); pos != std::string::npos) { | ||
| 57 | + result.replace(pos, 3, j_descr.var_descr); | ||
| 58 | + } | ||
| 59 | + return result; | ||
| 60 | + } | ||
| 45 | } | 61 | } |
| 46 | } else if (og.isIndirect()) { | 62 | } else if (og.isIndirect()) { |
| 47 | return "object " + og.unparse(' '); | 63 | return "object " + og.unparse(' '); |
libqpdf/QPDF_Dictionary.cc
| 1 | #include <qpdf/QPDF_Dictionary.hh> | 1 | #include <qpdf/QPDF_Dictionary.hh> |
| 2 | 2 | ||
| 3 | +#include <qpdf/QPDFObject_private.hh> | ||
| 3 | #include <qpdf/QPDF_Name.hh> | 4 | #include <qpdf/QPDF_Name.hh> |
| 4 | 5 | ||
| 6 | +using namespace std::literals; | ||
| 7 | + | ||
| 5 | QPDF_Dictionary::QPDF_Dictionary( | 8 | QPDF_Dictionary::QPDF_Dictionary( |
| 6 | std::map<std::string, QPDFObjectHandle> const& items) : | 9 | std::map<std::string, QPDFObjectHandle> const& items) : |
| 7 | QPDFValue(::ot_dictionary, "dictionary"), | 10 | QPDFValue(::ot_dictionary, "dictionary"), |
| @@ -98,10 +101,8 @@ QPDF_Dictionary::getKey(std::string const& key) | @@ -98,10 +101,8 @@ QPDF_Dictionary::getKey(std::string const& key) | ||
| 98 | return item->second; | 101 | return item->second; |
| 99 | } else { | 102 | } else { |
| 100 | auto null = QPDFObjectHandle::newNull(); | 103 | auto null = QPDFObjectHandle::newNull(); |
| 101 | - if (qpdf != nullptr) { | ||
| 102 | - null.setObjectDescription( | ||
| 103 | - qpdf, getDescription() + " -> dictionary key " + key); | ||
| 104 | - } | 104 | + static auto constexpr msg = " -> dictionary key $VD"sv; |
| 105 | + null.getObj()->setChildDescription(shared_from_this(), msg, key); | ||
| 105 | return null; | 106 | return null; |
| 106 | } | 107 | } |
| 107 | } | 108 | } |
libqpdf/qpdf/QPDFObject_private.hh
| @@ -12,6 +12,7 @@ | @@ -12,6 +12,7 @@ | ||
| 12 | #include <qpdf/Types.h> | 12 | #include <qpdf/Types.h> |
| 13 | 13 | ||
| 14 | #include <string> | 14 | #include <string> |
| 15 | +#include <string_view> | ||
| 15 | 16 | ||
| 16 | class QPDF; | 17 | class QPDF; |
| 17 | class QPDFObjectHandle; | 18 | class QPDFObjectHandle; |
| @@ -76,6 +77,25 @@ class QPDFObject | @@ -76,6 +77,25 @@ class QPDFObject | ||
| 76 | { | 77 | { |
| 77 | return value->setDescription(qpdf, description, offset); | 78 | return value->setDescription(qpdf, description, offset); |
| 78 | } | 79 | } |
| 80 | + void | ||
| 81 | + setChildDescription( | ||
| 82 | + std::shared_ptr<QPDFObject> parent, | ||
| 83 | + std::string_view const& static_descr, | ||
| 84 | + std::string var_descr) | ||
| 85 | + { | ||
| 86 | + auto qpdf = parent ? parent->value->qpdf : nullptr; | ||
| 87 | + value->setChildDescription( | ||
| 88 | + qpdf, parent->value, static_descr, var_descr); | ||
| 89 | + } | ||
| 90 | + void | ||
| 91 | + setChildDescription( | ||
| 92 | + std::shared_ptr<QPDFValue> parent, | ||
| 93 | + std::string_view const& static_descr, | ||
| 94 | + std::string var_descr) | ||
| 95 | + { | ||
| 96 | + auto qpdf = parent ? parent->qpdf : nullptr; | ||
| 97 | + value->setChildDescription(qpdf, parent, static_descr, var_descr); | ||
| 98 | + } | ||
| 79 | bool | 99 | bool |
| 80 | getDescription(QPDF*& qpdf, std::string& description) | 100 | getDescription(QPDF*& qpdf, std::string& description) |
| 81 | { | 101 | { |
libqpdf/qpdf/QPDFValue.hh
| @@ -8,13 +8,14 @@ | @@ -8,13 +8,14 @@ | ||
| 8 | #include <qpdf/Types.h> | 8 | #include <qpdf/Types.h> |
| 9 | 9 | ||
| 10 | #include <string> | 10 | #include <string> |
| 11 | +#include <string_view> | ||
| 11 | #include <variant> | 12 | #include <variant> |
| 12 | 13 | ||
| 13 | class QPDF; | 14 | class QPDF; |
| 14 | class QPDFObjectHandle; | 15 | class QPDFObjectHandle; |
| 15 | class QPDFObject; | 16 | class QPDFObject; |
| 16 | 17 | ||
| 17 | -class QPDFValue | 18 | +class QPDFValue: public std::enable_shared_from_this<QPDFValue> |
| 18 | { | 19 | { |
| 19 | friend class QPDFObject; | 20 | friend class QPDFObject; |
| 20 | 21 | ||
| @@ -38,7 +39,24 @@ class QPDFValue | @@ -38,7 +39,24 @@ class QPDFValue | ||
| 38 | std::string object; | 39 | std::string object; |
| 39 | }; | 40 | }; |
| 40 | 41 | ||
| 41 | - using Description = std::variant<std::string, JSON_Descr>; | 42 | + struct ChildDescr |
| 43 | + { | ||
| 44 | + ChildDescr( | ||
| 45 | + std::shared_ptr<QPDFValue> parent, | ||
| 46 | + std::string_view const& static_descr, | ||
| 47 | + std::string var_descr) : | ||
| 48 | + parent(parent), | ||
| 49 | + static_descr(static_descr), | ||
| 50 | + var_descr(var_descr) | ||
| 51 | + { | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | + std::weak_ptr<QPDFValue> parent; | ||
| 55 | + std::string_view const& static_descr; | ||
| 56 | + std::string var_descr; | ||
| 57 | + }; | ||
| 58 | + | ||
| 59 | + using Description = std::variant<std::string, JSON_Descr, ChildDescr>; | ||
| 42 | 60 | ||
| 43 | virtual void | 61 | virtual void |
| 44 | setDescription( | 62 | setDescription( |
| @@ -56,6 +74,17 @@ class QPDFValue | @@ -56,6 +74,17 @@ class QPDFValue | ||
| 56 | qpdf = a_qpdf; | 74 | qpdf = a_qpdf; |
| 57 | og = a_og; | 75 | og = a_og; |
| 58 | } | 76 | } |
| 77 | + void | ||
| 78 | + setChildDescription( | ||
| 79 | + QPDF* a_qpdf, | ||
| 80 | + std::shared_ptr<QPDFValue> parent, | ||
| 81 | + std::string_view const& static_descr, | ||
| 82 | + std::string var_descr) | ||
| 83 | + { | ||
| 84 | + object_description = std::make_shared<Description>( | ||
| 85 | + ChildDescr(parent, static_descr, var_descr)); | ||
| 86 | + qpdf = a_qpdf; | ||
| 87 | + } | ||
| 59 | std::string getDescription(); | 88 | std::string getDescription(); |
| 60 | bool | 89 | bool |
| 61 | hasDescription() | 90 | hasDescription() |