From 2a2eebcaea2b27bc86390dac2ee27ad5620f5eda Mon Sep 17 00:00:00 2001 From: m-holger Date: Tue, 2 Aug 2022 16:20:24 +0100 Subject: Modify newIndirect to set QPDFObjectHandle::obj --- libqpdf/QPDF.cc | 23 +++++++++++++++++------ libqpdf/QPDFObjectHandle.cc | 15 +++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 7b357b13..191d98f3 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1463,8 +1463,7 @@ QPDF::getAllObjects() fixDanglingReferences(true); std::vector result; for (auto const& iter: this->m->obj_cache) { - QPDFObjGen const& og = iter.first; - result.push_back(getObjectByObjGen(og)); + result.push_back(newIndirect(iter.first, iter.second.object)); } return result; } @@ -2128,6 +2127,15 @@ QPDF::resolveObjectsInStream(int obj_stream_number) } } +QPDFObjectHandle +QPDF::newIndirect(QPDFObjGen const& og, std::shared_ptr const& obj) +{ + if (!obj->hasDescription()) { + obj->setDescription(this, "object " + og.unparse(' ')); + } + return QPDFObjectHandle::Factory::newIndirect(this, og, obj); +} + QPDFObjectHandle QPDF::makeIndirectObject(QPDFObjectHandle oh) { @@ -2137,9 +2145,9 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) "max object id is too high to create new objects"); } QPDFObjGen next(max_objid + 1, 0); - this->m->obj_cache[next] = + m->obj_cache[next] = ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); - return QPDFObjectHandle::Factory::newIndirect(this, next); + return newIndirect(next, m->obj_cache[next].object); } QPDFObjectHandle @@ -2148,8 +2156,10 @@ QPDF::reserveObjectIfNotExists(QPDFObjGen const& og) if ((!m->obj_cache.count(og)) && (!m->xref_table.count(og))) { resolve(og); m->obj_cache[og].object = QPDF_Reserved::create(); + return newIndirect(og, m->obj_cache[og].object); + } else { + return getObject(og); } - return getObject(og); } QPDFObjectHandle @@ -2162,7 +2172,8 @@ QPDF::reserveStream(QPDFObjGen const& og) QPDFObjectHandle QPDF::getObject(QPDFObjGen const& og) { - return QPDFObjectHandle::Factory::newIndirect(this, og); + auto obj = (og.getObj() != 0) ? resolve(og) : QPDF_Null::create(); + return newIndirect(og, obj); } QPDFObjectHandle diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 8c98c87b..f872e984 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -240,13 +241,6 @@ QPDFObjectHandle::QPDFObjectHandle() : { } -QPDFObjectHandle::QPDFObjectHandle(QPDF* qpdf, QPDFObjGen const& og) : - initialized(true), - qpdf(qpdf), - og(og) -{ -} - QPDFObjectHandle::QPDFObjectHandle(std::shared_ptr const& data) : initialized(true), qpdf(nullptr), @@ -1953,7 +1947,7 @@ QPDFObjectHandle::newIndirect(QPDF* qpdf, QPDFObjGen const& og) return newNull(); } - return QPDFObjectHandle(qpdf, og); + return QPDFObjectHandle(qpdf, og, QPDF_Unresolved::create()); } QPDFObjectHandle @@ -2553,10 +2547,11 @@ QPDFObjectHandle::dereference() if (!this->initialized) { return false; } - if (this->obj() == nullptr || + if ((this->obj->getTypeCode() == QPDFObject::ot_unresolved) || (getObjectID() && QPDF::Resolver::objectChanged(this->qpdf, getObjGen(), this->obj))) { - obj = QPDF::Resolver::resolve(this->qpdf, getObjGen()); + this->obj = QPDF::Resolver::resolve(this->qpdf, getObjGen()); + } return true; } -- cgit v1.2.3-54-g00ecf