aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFNameTreeObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-12-19 03:56:56 +0100
committerJay Berkenbilt <ejb@ql.org>2018-12-22 00:34:56 +0100
commit0776c00129fac282e2e758bf1f32474af85db50e (patch)
tree9c0b2b7b56806aa1bccdc1f4f4ab39d9b8e1252f /libqpdf/QPDFNameTreeObjectHelper.cc
parentd2f397594803fa5729fab83684ce74184dd4fe38 (diff)
downloadqpdf-0776c00129fac282e2e758bf1f32474af85db50e.tar.zst
Add QPDFNameTreeObjectHelper
Diffstat (limited to 'libqpdf/QPDFNameTreeObjectHelper.cc')
-rw-r--r--libqpdf/QPDFNameTreeObjectHelper.cc82
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;
+}