Commit decd36502b6bcd8fc22db105919a175a3de38451
1 parent
01dbae42
Refactor `replaceForeignIndirectObjects`: move logic to `ObjCopier::replace_indi…
…rect_object`, simplify object replacement, and streamline method usage.
Showing
3 changed files
with
11 additions
and
11 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -807,8 +807,6 @@ class QPDF |
| 807 | 807 | |
| 808 | 808 | // Methods to support object copying |
| 809 | 809 | void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); |
| 810 | - QPDFObjectHandle | |
| 811 | - replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); | |
| 812 | 810 | void copyStreamData(QPDFObjectHandle dest_stream, QPDFObjectHandle src_stream); |
| 813 | 811 | |
| 814 | 812 | struct HPageOffsetEntry; | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -535,7 +535,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) |
| 535 | 535 | |
| 536 | 536 | // Copy any new objects and replace the reservations. |
| 537 | 537 | for (auto& to_copy: obj_copier.to_copy) { |
| 538 | - QPDFObjectHandle copy = replaceForeignIndirectObjects(to_copy, obj_copier, true); | |
| 538 | + auto copy = obj_copier.replace_indirect_object(*this, to_copy); | |
| 539 | 539 | if (!to_copy.isStream()) { |
| 540 | 540 | QPDFObjGen og(to_copy.getObjGen()); |
| 541 | 541 | replaceReserved(obj_copier.object_map[og], copy); |
| ... | ... | @@ -606,13 +606,13 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) |
| 606 | 606 | } |
| 607 | 607 | |
| 608 | 608 | QPDFObjectHandle |
| 609 | -QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) | |
| 609 | +QPDF::ObjCopier::replace_indirect_object(QPDF& target, QPDFObjectHandle const& foreign, bool top) | |
| 610 | 610 | { |
| 611 | 611 | auto foreign_tc = foreign.getTypeCode(); |
| 612 | 612 | |
| 613 | 613 | if (!top && foreign.indirect()) { |
| 614 | - auto mapping = obj_copier.object_map.find(foreign.id_gen()); | |
| 615 | - if (mapping == obj_copier.object_map.end()) { | |
| 614 | + auto mapping = object_map.find(foreign.id_gen()); | |
| 615 | + if (mapping == object_map.end()) { | |
| 616 | 616 | // This case would occur if this is a reference to a Pages object that we didn't |
| 617 | 617 | // traverse into. |
| 618 | 618 | return QPDFObjectHandle::newNull(); |
| ... | ... | @@ -625,7 +625,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop |
| 625 | 625 | std::vector<QPDFObjectHandle> result; |
| 626 | 626 | result.reserve(array.size()); |
| 627 | 627 | for (auto const& item: array) { |
| 628 | - result.emplace_back(replaceForeignIndirectObjects(item, obj_copier, false)); | |
| 628 | + result.emplace_back(replace_indirect_object(target, item, false)); | |
| 629 | 629 | } |
| 630 | 630 | return Array(std::move(result)); |
| 631 | 631 | } |
| ... | ... | @@ -634,7 +634,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop |
| 634 | 634 | auto result = Dictionary::empty(); |
| 635 | 635 | for (auto const& [key, value]: Dictionary(foreign)) { |
| 636 | 636 | if (!value.null()) { |
| 637 | - result.replaceKey(key, replaceForeignIndirectObjects(value, obj_copier, false)); | |
| 637 | + result.replaceKey(key, replace_indirect_object(target, value, false)); | |
| 638 | 638 | } |
| 639 | 639 | } |
| 640 | 640 | return result; |
| ... | ... | @@ -642,14 +642,14 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop |
| 642 | 642 | |
| 643 | 643 | if (foreign_tc == ::ot_stream) { |
| 644 | 644 | Stream stream = foreign; |
| 645 | - Stream result = obj_copier.object_map[foreign]; | |
| 645 | + Stream result = object_map[foreign]; | |
| 646 | 646 | auto dict = result.getDict(); |
| 647 | 647 | for (auto const& [key, value]: stream.getDict()) { |
| 648 | 648 | if (!value.null()) { |
| 649 | - dict.replaceKey(key, replaceForeignIndirectObjects(value, obj_copier, false)); | |
| 649 | + dict.replaceKey(key, replace_indirect_object(target, value, false)); | |
| 650 | 650 | } |
| 651 | 651 | } |
| 652 | - copyStreamData(result, foreign); | |
| 652 | + target.copyStreamData(result, foreign); | |
| 653 | 653 | return result; |
| 654 | 654 | } |
| 655 | 655 | ... | ... |
libqpdf/qpdf/QPDF_private.hh
| ... | ... | @@ -47,6 +47,8 @@ class QPDF::ObjCache |
| 47 | 47 | class QPDF::ObjCopier |
| 48 | 48 | { |
| 49 | 49 | public: |
| 50 | + QPDFObjectHandle | |
| 51 | + replace_indirect_object(QPDF& target, QPDFObjectHandle const& oh, bool top = true); | |
| 50 | 52 | std::map<QPDFObjGen, QPDFObjectHandle> object_map; |
| 51 | 53 | std::vector<QPDFObjectHandle> to_copy; |
| 52 | 54 | QPDFObjGen::set visiting; | ... | ... |