2018-12-19 02:56:56 +00:00
|
|
|
#include <qpdf/QPDFNameTreeObjectHelper.hh>
|
2021-01-16 13:31:56 +00:00
|
|
|
#include <qpdf/NNTree.hh>
|
|
|
|
|
|
|
|
class NameTreeDetails: public NNTreeDetails
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual std::string const& itemsKey() const override
|
|
|
|
{
|
|
|
|
static std::string k("/Names");
|
|
|
|
return k;
|
|
|
|
}
|
|
|
|
virtual bool keyValid(QPDFObjectHandle oh) const override
|
|
|
|
{
|
|
|
|
return oh.isString();
|
|
|
|
}
|
|
|
|
virtual int compareKeys(
|
|
|
|
QPDFObjectHandle a, QPDFObjectHandle b) const override
|
|
|
|
{
|
|
|
|
if (! (keyValid(a) && keyValid(b)))
|
|
|
|
{
|
|
|
|
// We don't call this without calling keyValid first
|
|
|
|
throw std::logic_error("comparing invalid keys");
|
|
|
|
}
|
|
|
|
auto as = a.getUTF8Value();
|
|
|
|
auto bs = b.getUTF8Value();
|
|
|
|
return ((as < bs) ? -1 : (as > bs) ? 1 : 0);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
static NameTreeDetails name_tree_details;
|
2018-12-19 02:56:56 +00:00
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::Members::~Members()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-01-16 23:35:30 +00:00
|
|
|
QPDFNameTreeObjectHelper::Members::Members(
|
|
|
|
QPDFObjectHandle& oh, QPDF* q, bool auto_repair) :
|
|
|
|
impl(std::make_shared<NNTreeImpl>(name_tree_details, q, oh, auto_repair))
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(
|
|
|
|
QPDFObjectHandle oh, QPDF& q, bool auto_repair) :
|
|
|
|
QPDFObjectHelper(oh),
|
|
|
|
m(new Members(oh, &q, auto_repair))
|
2018-12-19 02:56:56 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh) :
|
|
|
|
QPDFObjectHelper(oh),
|
2021-01-16 23:35:30 +00:00
|
|
|
m(new Members(oh, nullptr, false))
|
2018-12-19 02:56:56 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2021-01-24 08:55:18 +00:00
|
|
|
QPDFNameTreeObjectHelper
|
|
|
|
QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)
|
|
|
|
{
|
|
|
|
return QPDFNameTreeObjectHelper(
|
2021-02-07 23:49:30 +00:00
|
|
|
qpdf.makeIndirectObject(
|
|
|
|
QPDFObjectHandle::parse("<< /Names [] >>")), qpdf, auto_repair);
|
2021-01-24 08:55:18 +00:00
|
|
|
}
|
|
|
|
|
2021-01-16 17:11:17 +00:00
|
|
|
QPDFNameTreeObjectHelper::iterator::iterator(
|
|
|
|
std::shared_ptr<NNTreeIterator> const& i) :
|
|
|
|
impl(i)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
QPDFNameTreeObjectHelper::iterator::valid() const
|
|
|
|
{
|
|
|
|
return impl->valid();
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator&
|
|
|
|
QPDFNameTreeObjectHelper::iterator::operator++()
|
|
|
|
{
|
|
|
|
++(*impl);
|
2021-01-25 13:05:43 +00:00
|
|
|
updateIValue();
|
2021-01-16 17:11:17 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator&
|
|
|
|
QPDFNameTreeObjectHelper::iterator::operator--()
|
|
|
|
{
|
|
|
|
--(*impl);
|
2021-01-25 13:05:43 +00:00
|
|
|
updateIValue();
|
2021-01-16 17:11:17 +00:00
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
2021-01-25 13:05:43 +00:00
|
|
|
void
|
|
|
|
QPDFNameTreeObjectHelper::iterator::updateIValue()
|
|
|
|
{
|
|
|
|
if (impl->valid())
|
|
|
|
{
|
|
|
|
auto p = *impl;
|
|
|
|
this->ivalue.first = p->first.getUTF8Value();
|
|
|
|
this->ivalue.second = p->second;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
this->ivalue.first = "";
|
|
|
|
this->ivalue.second = QPDFObjectHandle();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-16 17:11:17 +00:00
|
|
|
QPDFNameTreeObjectHelper::iterator::reference
|
|
|
|
QPDFNameTreeObjectHelper::iterator::operator*()
|
|
|
|
{
|
2021-01-25 13:05:43 +00:00
|
|
|
updateIValue();
|
|
|
|
return this->ivalue;
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator::pointer
|
|
|
|
QPDFNameTreeObjectHelper::iterator::operator->()
|
|
|
|
{
|
|
|
|
updateIValue();
|
|
|
|
return &this->ivalue;
|
2021-01-16 17:11:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
QPDFNameTreeObjectHelper::iterator::operator==(iterator const& other) const
|
|
|
|
{
|
|
|
|
return *(impl) == *(other.impl);
|
|
|
|
}
|
|
|
|
|
2021-01-24 09:16:48 +00:00
|
|
|
void
|
|
|
|
QPDFNameTreeObjectHelper::iterator::insertAfter(
|
|
|
|
std::string const& key, QPDFObjectHandle value)
|
|
|
|
{
|
|
|
|
impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value);
|
2021-01-25 13:05:43 +00:00
|
|
|
updateIValue();
|
2021-01-24 09:16:48 +00:00
|
|
|
}
|
|
|
|
|
2021-01-24 16:48:46 +00:00
|
|
|
void
|
|
|
|
QPDFNameTreeObjectHelper::iterator::remove()
|
|
|
|
{
|
|
|
|
impl->remove();
|
2021-01-25 13:05:43 +00:00
|
|
|
updateIValue();
|
2021-01-24 16:48:46 +00:00
|
|
|
}
|
|
|
|
|
2021-01-16 17:11:17 +00:00
|
|
|
QPDFNameTreeObjectHelper::iterator
|
|
|
|
QPDFNameTreeObjectHelper::begin() const
|
|
|
|
{
|
|
|
|
return iterator(std::make_shared<NNTreeIterator>(this->m->impl->begin()));
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator
|
|
|
|
QPDFNameTreeObjectHelper::end() const
|
|
|
|
{
|
|
|
|
return iterator(std::make_shared<NNTreeIterator>(this->m->impl->end()));
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator
|
|
|
|
QPDFNameTreeObjectHelper::last() const
|
|
|
|
{
|
|
|
|
return iterator(std::make_shared<NNTreeIterator>(this->m->impl->last()));
|
|
|
|
}
|
|
|
|
|
|
|
|
QPDFNameTreeObjectHelper::iterator
|
|
|
|
QPDFNameTreeObjectHelper::find(std::string const& key,
|
|
|
|
bool return_prev_if_not_found)
|
|
|
|
{
|
|
|
|
auto i = this->m->impl->find(QPDFObjectHandle::newUnicodeString(key),
|
|
|
|
return_prev_if_not_found);
|
|
|
|
return iterator(std::make_shared<NNTreeIterator>(i));
|
|
|
|
}
|
|
|
|
|
2021-01-23 23:33:55 +00:00
|
|
|
QPDFNameTreeObjectHelper::iterator
|
|
|
|
QPDFNameTreeObjectHelper::insert(std::string const& key,
|
|
|
|
QPDFObjectHandle value)
|
|
|
|
{
|
|
|
|
auto i = this->m->impl->insert(
|
|
|
|
QPDFObjectHandle::newUnicodeString(key), value);
|
|
|
|
return iterator(std::make_shared<NNTreeIterator>(i));
|
|
|
|
}
|
|
|
|
|
2021-01-24 16:48:46 +00:00
|
|
|
bool
|
|
|
|
QPDFNameTreeObjectHelper::remove(std::string const& key,
|
|
|
|
QPDFObjectHandle* value)
|
|
|
|
{
|
|
|
|
return this->m->impl->remove(
|
|
|
|
QPDFObjectHandle::newUnicodeString(key), value);
|
|
|
|
}
|
|
|
|
|
2018-12-19 02:56:56 +00:00
|
|
|
bool
|
|
|
|
QPDFNameTreeObjectHelper::hasName(std::string const& name)
|
|
|
|
{
|
2021-01-16 17:11:17 +00:00
|
|
|
auto i = find(name);
|
|
|
|
return (i != end());
|
2018-12-19 02:56:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
QPDFNameTreeObjectHelper::findObject(
|
|
|
|
std::string const& name, QPDFObjectHandle& oh)
|
|
|
|
{
|
2021-01-16 17:11:17 +00:00
|
|
|
auto i = find(name);
|
|
|
|
if (i == end())
|
2018-12-19 02:56:56 +00:00
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
2021-01-25 13:05:43 +00:00
|
|
|
oh = i->second;
|
2018-12-19 02:56:56 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2021-01-23 23:33:55 +00:00
|
|
|
void
|
|
|
|
QPDFNameTreeObjectHelper::setSplitThreshold(int t)
|
|
|
|
{
|
|
|
|
this->m->impl->setSplitThreshold(t);
|
|
|
|
}
|
|
|
|
|
2018-12-19 02:56:56 +00:00
|
|
|
std::map<std::string, QPDFObjectHandle>
|
|
|
|
QPDFNameTreeObjectHelper::getAsMap() const
|
|
|
|
{
|
2021-01-16 13:31:56 +00:00
|
|
|
std::map<std::string, QPDFObjectHandle> result;
|
2021-01-16 17:11:17 +00:00
|
|
|
result.insert(begin(), end());
|
2021-01-16 13:31:56 +00:00
|
|
|
return result;
|
2018-12-19 02:56:56 +00:00
|
|
|
}
|