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,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& obj_cop | @@ -634,7 +634,7 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& 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& obj_cop | @@ -642,14 +642,14 @@ QPDF::replaceForeignIndirectObjects(QPDFObjectHandle foreign, ObjCopier& 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; |