From decd36502b6bcd8fc22db105919a175a3de38451 Mon Sep 17 00:00:00 2001 From: m-holger Date: Fri, 3 Oct 2025 19:08:48 +0100 Subject: [PATCH] Refactor `replaceForeignIndirectObjects`: move logic to `ObjCopier::replace_indirect_object`, simplify object replacement, and streamline method usage. --- include/qpdf/QPDF.hh | 2 -- libqpdf/QPDF.cc | 18 +++++++++--------- libqpdf/qpdf/QPDF_private.hh | 2 ++ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/include/qpdf/QPDF.hh b/include/qpdf/QPDF.hh index 43a86b4..c76dd06 100644 --- a/include/qpdf/QPDF.hh +++ b/include/qpdf/QPDF.hh @@ -807,8 +807,6 @@ class QPDF // Methods to support object copying void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); - QPDFObjectHandle - replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); void copyStreamData(QPDFObjectHandle dest_stream, QPDFObjectHandle src_stream); struct HPageOffsetEntry; diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 3be0913..a0fbe2c 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -535,7 +535,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) // Copy any new objects and replace the reservations. for (auto& to_copy: obj_copier.to_copy) { - QPDFObjectHandle copy = replaceForeignIndirectObjects(to_copy, obj_copier, true); + auto copy = obj_copier.replace_indirect_object(*this, to_copy); if (!to_copy.isStream()) { QPDFObjGen og(to_copy.getObjGen()); replaceReserved(obj_copier.object_map[og], copy); @@ -606,13 +606,13 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) } QPDFObjectHandle -QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) +QPDF::ObjCopier::replace_indirect_object(QPDF& target, QPDFObjectHandle const& foreign, bool top) { auto foreign_tc = foreign.getTypeCode(); if (!top && foreign.indirect()) { - auto mapping = obj_copier.object_map.find(foreign.id_gen()); - if (mapping == obj_copier.object_map.end()) { + auto mapping = object_map.find(foreign.id_gen()); + if (mapping == object_map.end()) { // This case would occur if this is a reference to a Pages object that we didn't // traverse into. return QPDFObjectHandle::newNull(); @@ -625,7 +625,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop std::vector result; result.reserve(array.size()); for (auto const& item: array) { - result.emplace_back(replaceForeignIndirectObjects(item, obj_copier, false)); + result.emplace_back(replace_indirect_object(target, item, false)); } return Array(std::move(result)); } @@ -634,7 +634,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop auto result = Dictionary::empty(); for (auto const& [key, value]: Dictionary(foreign)) { if (!value.null()) { - result.replaceKey(key, replaceForeignIndirectObjects(value, obj_copier, false)); + result.replaceKey(key, replace_indirect_object(target, value, false)); } } return result; @@ -642,14 +642,14 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop if (foreign_tc == ::ot_stream) { Stream stream = foreign; - Stream result = obj_copier.object_map[foreign]; + Stream result = object_map[foreign]; auto dict = result.getDict(); for (auto const& [key, value]: stream.getDict()) { if (!value.null()) { - dict.replaceKey(key, replaceForeignIndirectObjects(value, obj_copier, false)); + dict.replaceKey(key, replace_indirect_object(target, value, false)); } } - copyStreamData(result, foreign); + target.copyStreamData(result, foreign); return result; } diff --git a/libqpdf/qpdf/QPDF_private.hh b/libqpdf/qpdf/QPDF_private.hh index 7a0c263..fe33348 100644 --- a/libqpdf/qpdf/QPDF_private.hh +++ b/libqpdf/qpdf/QPDF_private.hh @@ -47,6 +47,8 @@ class QPDF::ObjCache class QPDF::ObjCopier { public: + QPDFObjectHandle + replace_indirect_object(QPDF& target, QPDFObjectHandle const& oh, bool top = true); std::map object_map; std::vector to_copy; QPDFObjGen::set visiting; -- libgit2 0.21.4