diff options
author | Jay Berkenbilt <ejb@ql.org> | 2018-12-19 03:56:56 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2018-12-22 00:34:56 +0100 |
commit | 0776c00129fac282e2e758bf1f32474af85db50e (patch) | |
tree | 9c0b2b7b56806aa1bccdc1f4f4ab39d9b8e1252f /libqpdf/QPDFNameTreeObjectHelper.cc | |
parent | d2f397594803fa5729fab83684ce74184dd4fe38 (diff) | |
download | qpdf-0776c00129fac282e2e758bf1f32474af85db50e.tar.zst |
Add QPDFNameTreeObjectHelper
Diffstat (limited to 'libqpdf/QPDFNameTreeObjectHelper.cc')
-rw-r--r-- | libqpdf/QPDFNameTreeObjectHelper.cc | 82 |
1 files changed, 82 insertions, 0 deletions
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 <qpdf/QPDFNameTreeObjectHelper.hh> + +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<std::string, QPDFObjectHandle>::iterator i = + this->m->entries.find(name); + if (i == this->m->entries.end()) + { + return false; + } + oh = (*i).second; + return true; +} + +std::map<std::string, QPDFObjectHandle> +QPDFNameTreeObjectHelper::getAsMap() const +{ + return this->m->entries; +} |