aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorm-holger <m-holger@kubitscheck.org>2023-02-17 14:58:21 +0100
committerm-holger <m-holger@kubitscheck.org>2023-02-18 09:35:45 +0100
commit1496472e1c2f64f46d2d7d76481aef1aa3fff869 (patch)
tree40ed2ee4ac78c8240c36396f3fb1824d7703f952
parentda14ab4dc7b1caee1708483cf714683f7d811ca7 (diff)
downloadqpdf-1496472e1c2f64f46d2d7d76481aef1aa3fff869.tar.zst
Add method QPDFValue::setChildDescription
-rw-r--r--libqpdf/QPDFObjectHandle.cc23
-rw-r--r--libqpdf/QPDFValue.cc16
-rw-r--r--libqpdf/QPDF_Dictionary.cc9
-rw-r--r--libqpdf/qpdf/QPDFObject_private.hh20
-rw-r--r--libqpdf/qpdf/QPDFValue.hh33
5 files changed, 80 insertions, 21 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index 7a37ffc2..cbe42995 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -36,6 +36,8 @@
#include <stdexcept>
#include <stdlib.h>
+using namespace std::literals;
+
namespace
{
class TerminateParsing
@@ -813,13 +815,9 @@ QPDFObjectHandle::getArrayItem(int n)
typeWarning("array", "returning null");
QTC::TC("qpdf", "QPDFObjectHandle array null for non-array");
}
- QPDF* context = nullptr;
- std::string description;
- if (obj->getDescription(context, description)) {
- result.setObjectDescription(
- context,
- description + " -> null returned from invalid array access");
- }
+ static auto constexpr msg =
+ " -> null returned from invalid array access"sv;
+ result.obj->setChildDescription(obj, msg, "");
}
return result;
}
@@ -1038,14 +1036,9 @@ QPDFObjectHandle::getKey(std::string const& key)
typeWarning("dictionary", "returning null for attempted key retrieval");
QTC::TC("qpdf", "QPDFObjectHandle dictionary null for getKey");
result = newNull();
- QPDF* qpdf = nullptr;
- std::string description;
- if (obj->getDescription(qpdf, description)) {
- result.setObjectDescription(
- qpdf,
- (description + " -> null returned from getting key " + key +
- " from non-Dictionary"));
- }
+ static auto constexpr msg =
+ " -> null returned from getting key $VD from non-Dictionary"sv;
+ result.obj->setChildDescription(obj, msg, key);
}
return result;
}
diff --git a/libqpdf/QPDFValue.cc b/libqpdf/QPDFValue.cc
index a89afd55..30d534dc 100644
--- a/libqpdf/QPDFValue.cc
+++ b/libqpdf/QPDFValue.cc
@@ -17,6 +17,7 @@ QPDFValue::getDescription()
switch (object_description->index()) {
case 0:
{
+ // Simple template string
auto description = std::get<0>(*object_description);
if (auto pos = description.find("$OG");
@@ -36,12 +37,27 @@ QPDFValue::getDescription()
}
case 1:
{
+ // QPDF::JSONReactor generated description
auto j_descr = std::get<1>(*object_description);
return (
*j_descr.input +
(j_descr.object.empty() ? "" : ", " + j_descr.object) +
" at offset " + std::to_string(parsed_offset));
}
+ case 2:
+ {
+ // Child object description
+ auto j_descr = std::get<2>(*object_description);
+ std::string result;
+ if (auto p = j_descr.parent.lock()) {
+ result = p->getDescription();
+ }
+ result += j_descr.static_descr;
+ if (auto pos = result.find("$VD"); pos != std::string::npos) {
+ result.replace(pos, 3, j_descr.var_descr);
+ }
+ return result;
+ }
}
} else if (og.isIndirect()) {
return "object " + og.unparse(' ');
diff --git a/libqpdf/QPDF_Dictionary.cc b/libqpdf/QPDF_Dictionary.cc
index 5349a2a8..f45c00c6 100644
--- a/libqpdf/QPDF_Dictionary.cc
+++ b/libqpdf/QPDF_Dictionary.cc
@@ -1,7 +1,10 @@
#include <qpdf/QPDF_Dictionary.hh>
+#include <qpdf/QPDFObject_private.hh>
#include <qpdf/QPDF_Name.hh>
+using namespace std::literals;
+
QPDF_Dictionary::QPDF_Dictionary(
std::map<std::string, QPDFObjectHandle> const& items) :
QPDFValue(::ot_dictionary, "dictionary"),
@@ -98,10 +101,8 @@ QPDF_Dictionary::getKey(std::string const& key)
return item->second;
} else {
auto null = QPDFObjectHandle::newNull();
- if (qpdf != nullptr) {
- null.setObjectDescription(
- qpdf, getDescription() + " -> dictionary key " + key);
- }
+ static auto constexpr msg = " -> dictionary key $VD"sv;
+ null.getObj()->setChildDescription(shared_from_this(), msg, key);
return null;
}
}
diff --git a/libqpdf/qpdf/QPDFObject_private.hh b/libqpdf/qpdf/QPDFObject_private.hh
index 612949da..0dc04699 100644
--- a/libqpdf/qpdf/QPDFObject_private.hh
+++ b/libqpdf/qpdf/QPDFObject_private.hh
@@ -12,6 +12,7 @@
#include <qpdf/Types.h>
#include <string>
+#include <string_view>
class QPDF;
class QPDFObjectHandle;
@@ -76,6 +77,25 @@ class QPDFObject
{
return value->setDescription(qpdf, description, offset);
}
+ void
+ setChildDescription(
+ std::shared_ptr<QPDFObject> parent,
+ std::string_view const& static_descr,
+ std::string var_descr)
+ {
+ auto qpdf = parent ? parent->value->qpdf : nullptr;
+ value->setChildDescription(
+ qpdf, parent->value, static_descr, var_descr);
+ }
+ void
+ setChildDescription(
+ std::shared_ptr<QPDFValue> parent,
+ std::string_view const& static_descr,
+ std::string var_descr)
+ {
+ auto qpdf = parent ? parent->qpdf : nullptr;
+ value->setChildDescription(qpdf, parent, static_descr, var_descr);
+ }
bool
getDescription(QPDF*& qpdf, std::string& description)
{
diff --git a/libqpdf/qpdf/QPDFValue.hh b/libqpdf/qpdf/QPDFValue.hh
index 9a1a6df1..e8a1834f 100644
--- a/libqpdf/qpdf/QPDFValue.hh
+++ b/libqpdf/qpdf/QPDFValue.hh
@@ -8,13 +8,14 @@
#include <qpdf/Types.h>
#include <string>
+#include <string_view>
#include <variant>
class QPDF;
class QPDFObjectHandle;
class QPDFObject;
-class QPDFValue
+class QPDFValue: public std::enable_shared_from_this<QPDFValue>
{
friend class QPDFObject;
@@ -38,7 +39,24 @@ class QPDFValue
std::string object;
};
- using Description = std::variant<std::string, JSON_Descr>;
+ struct ChildDescr
+ {
+ ChildDescr(
+ std::shared_ptr<QPDFValue> parent,
+ std::string_view const& static_descr,
+ std::string var_descr) :
+ parent(parent),
+ static_descr(static_descr),
+ var_descr(var_descr)
+ {
+ }
+
+ std::weak_ptr<QPDFValue> parent;
+ std::string_view const& static_descr;
+ std::string var_descr;
+ };
+
+ using Description = std::variant<std::string, JSON_Descr, ChildDescr>;
virtual void
setDescription(
@@ -56,6 +74,17 @@ class QPDFValue
qpdf = a_qpdf;
og = a_og;
}
+ void
+ setChildDescription(
+ QPDF* a_qpdf,
+ std::shared_ptr<QPDFValue> parent,
+ std::string_view const& static_descr,
+ std::string var_descr)
+ {
+ object_description = std::make_shared<Description>(
+ ChildDescr(parent, static_descr, var_descr));
+ qpdf = a_qpdf;
+ }
std::string getDescription();
bool
hasDescription()