Commit 1496472e1c2f64f46d2d7d76481aef1aa3fff869

Authored by m-holger
1 parent da14ab4d

Add method QPDFValue::setChildDescription

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&amp; key) @@ -1038,14 +1036,9 @@ QPDFObjectHandle::getKey(std::string const&amp; 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&amp; key) @@ -98,10 +101,8 @@ QPDF_Dictionary::getKey(std::string const&amp; 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()