mirror of
https://github.com/qpdf/qpdf.git
synced 2025-02-02 11:58:25 +00:00
Add method QPDFValue::setChildDescription
This commit is contained in:
parent
da14ab4dc7
commit
1496472e1c
@ -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;
|
||||
}
|
||||
|
@ -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(' ');
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user