From 0776c00129fac282e2e758bf1f32474af85db50e Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Tue, 18 Dec 2018 21:56:56 -0500 Subject: Add QPDFNameTreeObjectHelper --- libqpdf/QPDFNameTreeObjectHelper.cc | 82 +++++++++++++++++++++++++++++++++++++ libqpdf/build.mk | 1 + 2 files changed, 83 insertions(+) create mode 100644 libqpdf/QPDFNameTreeObjectHelper.cc (limited to 'libqpdf') diff --git a/libqpdf/QPDFNameTreeObjectHelper.cc b/libqpdf/QPDFNameTreeObjectHelper.cc new file mode 100644 index 00000000..4eb0fb15 --- /dev/null +++ b/libqpdf/QPDFNameTreeObjectHelper.cc @@ -0,0 +1,82 @@ +#include + +QPDFNameTreeObjectHelper::Members::~Members() +{ +} + +QPDFNameTreeObjectHelper::Members::Members() +{ +} + +QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh) : + QPDFObjectHelper(oh), + m(new Members()) +{ + updateMap(oh); +} + +QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() +{ +} + +void +QPDFNameTreeObjectHelper::updateMap(QPDFObjectHandle oh) +{ + if (this->m->seen.count(oh.getObjGen())) + { + return; + } + this->m->seen.insert(oh.getObjGen()); + QPDFObjectHandle names = oh.getKey("/Names"); + if (names.isArray()) + { + size_t nitems = names.getArrayNItems(); + size_t i = 0; + while (i < nitems - 1) + { + QPDFObjectHandle name = names.getArrayItem(i); + if (name.isString()) + { + ++i; + QPDFObjectHandle obj = names.getArrayItem(i); + this->m->entries[name.getUTF8Value()] = obj; + } + ++i; + } + } + QPDFObjectHandle kids = oh.getKey("/Kids"); + if (kids.isArray()) + { + size_t nitems = kids.getArrayNItems(); + for (size_t i = 0; i < nitems; ++i) + { + updateMap(kids.getArrayItem(i)); + } + } +} + +bool +QPDFNameTreeObjectHelper::hasName(std::string const& name) +{ + return this->m->entries.count(name) != 0; +} + +bool +QPDFNameTreeObjectHelper::findObject( + std::string const& name, QPDFObjectHandle& oh) +{ + std::map::iterator i = + this->m->entries.find(name); + if (i == this->m->entries.end()) + { + return false; + } + oh = (*i).second; + return true; +} + +std::map +QPDFNameTreeObjectHelper::getAsMap() const +{ + return this->m->entries; +} diff --git a/libqpdf/build.mk b/libqpdf/build.mk index 8a2030d1..6ad23a02 100644 --- a/libqpdf/build.mk +++ b/libqpdf/build.mk @@ -40,6 +40,7 @@ SRCS_libqpdf = \ libqpdf/QPDFAnnotationObjectHelper.cc \ libqpdf/QPDFExc.cc \ libqpdf/QPDFFormFieldObjectHelper.cc \ + libqpdf/QPDFNameTreeObjectHelper.cc \ libqpdf/QPDFNumberTreeObjectHelper.cc \ libqpdf/QPDFObjGen.cc \ libqpdf/QPDFObject.cc \ -- cgit v1.2.3-54-g00ecf