Commit decd36502b6bcd8fc22db105919a175a3de38451

Authored by m-holger
1 parent 01dbae42

Refactor `replaceForeignIndirectObjects`: move logic to `ObjCopier::replace_indi…

…rect_object`, simplify object replacement, and streamline method usage.
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&amp; 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&amp; 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;
... ...