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,8 +807,6 @@ class QPDF
807 807
808 // Methods to support object copying 808 // Methods to support object copying
809 void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top); 809 void reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top);
810 - QPDFObjectHandle  
811 - replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top);  
812 void copyStreamData(QPDFObjectHandle dest_stream, QPDFObjectHandle src_stream); 810 void copyStreamData(QPDFObjectHandle dest_stream, QPDFObjectHandle src_stream);
813 811
814 struct HPageOffsetEntry; 812 struct HPageOffsetEntry;
libqpdf/QPDF.cc
@@ -535,7 +535,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) @@ -535,7 +535,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign)
535 535
536 // Copy any new objects and replace the reservations. 536 // Copy any new objects and replace the reservations.
537 for (auto& to_copy: obj_copier.to_copy) { 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 if (!to_copy.isStream()) { 539 if (!to_copy.isStream()) {
540 QPDFObjGen og(to_copy.getObjGen()); 540 QPDFObjGen og(to_copy.getObjGen());
541 replaceReserved(obj_copier.object_map[og], copy); 541 replaceReserved(obj_copier.object_map[og], copy);
@@ -606,13 +606,13 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) @@ -606,13 +606,13 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
606 } 606 }
607 607
608 QPDFObjectHandle 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 auto foreign_tc = foreign.getTypeCode(); 611 auto foreign_tc = foreign.getTypeCode();
612 612
613 if (!top && foreign.indirect()) { 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 // This case would occur if this is a reference to a Pages object that we didn't 616 // This case would occur if this is a reference to a Pages object that we didn't
617 // traverse into. 617 // traverse into.
618 return QPDFObjectHandle::newNull(); 618 return QPDFObjectHandle::newNull();
@@ -625,7 +625,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop @@ -625,7 +625,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& obj_cop
625 std::vector<QPDFObjectHandle> result; 625 std::vector<QPDFObjectHandle> result;
626 result.reserve(array.size()); 626 result.reserve(array.size());
627 for (auto const& item: array) { 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 return Array(std::move(result)); 630 return Array(std::move(result));
631 } 631 }
@@ -634,7 +634,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_cop @@ -634,7 +634,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_cop
634 auto result = Dictionary::empty(); 634 auto result = Dictionary::empty();
635 for (auto const& [key, value]: Dictionary(foreign)) { 635 for (auto const& [key, value]: Dictionary(foreign)) {
636 if (!value.null()) { 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 return result; 640 return result;
@@ -642,14 +642,14 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_cop @@ -642,14 +642,14 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_cop
642 642
643 if (foreign_tc == ::ot_stream) { 643 if (foreign_tc == ::ot_stream) {
644 Stream stream = foreign; 644 Stream stream = foreign;
645 - Stream result = obj_copier.object_map[foreign]; 645 + Stream result = object_map[foreign];
646 auto dict = result.getDict(); 646 auto dict = result.getDict();
647 for (auto const& [key, value]: stream.getDict()) { 647 for (auto const& [key, value]: stream.getDict()) {
648 if (!value.null()) { 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 return result; 653 return result;
654 } 654 }
655 655
libqpdf/qpdf/QPDF_private.hh
@@ -47,6 +47,8 @@ class QPDF::ObjCache @@ -47,6 +47,8 @@ class QPDF::ObjCache
47 class QPDF::ObjCopier 47 class QPDF::ObjCopier
48 { 48 {
49 public: 49 public:
  50 + QPDFObjectHandle
  51 + replace_indirect_object(QPDF& target, QPDFObjectHandle const& oh, bool top = true);
50 std::map<QPDFObjGen, QPDFObjectHandle> object_map; 52 std::map<QPDFObjGen, QPDFObjectHandle> object_map;
51 std::vector<QPDFObjectHandle> to_copy; 53 std::vector<QPDFObjectHandle> to_copy;
52 QPDFObjGen::set visiting; 54 QPDFObjGen::set visiting;