diff options
author | Jay Berkenbilt <jberkenbilt@users.noreply.github.com> | 2023-05-20 20:09:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-20 20:09:49 +0200 |
commit | a85635b839755765713eb27d767f42b357056b2e (patch) | |
tree | 369b4e49b78e54e04a0409b774a659206017addd /libqpdf/QPDF.cc | |
parent | fd17c8e3fe38a56abf50ce0edec1cde48d4f74cb (diff) | |
parent | 50bc82b4e035853bd06a9935722d6b5aec902133 (diff) | |
download | qpdf-a85635b839755765713eb27d767f42b357056b2e.tar.zst |
Merge pull request #929 from m-holger/ogguard
Add new convenience class QPDFObjGen::Guard
Diffstat (limited to 'libqpdf/QPDF.cc')
-rw-r--r-- | libqpdf/QPDF.cc | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 09221394..56a18ccd 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -2176,7 +2176,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) void QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) { - if (foreign.isReserved()) { + auto foreign_tc = foreign.getTypeCode(); + if (foreign_tc == ::ot_reserved) { throw std::logic_error( "QPDF: attempting to copy a foreign reserved object"); } @@ -2193,70 +2194,62 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) if (foreign.isIndirect()) { QPDFObjGen foreign_og(foreign.getObjGen()); - if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) { - QTC::TC("qpdf", "QPDF loop reserving objects"); + if (obj_copier.object_map.count(foreign_og) > 0) { + QTC::TC("qpdf", "QPDF already reserved object"); + if (obj_copier.visiting.count(foreign_og)) { + QTC::TC("qpdf", "QPDF loop reserving objects"); + } return; } - if (obj_copier.object_map.find(foreign_og) != - obj_copier.object_map.end()) { - QTC::TC("qpdf", "QPDF already reserved object"); + if (!obj_copier.visiting.add(foreign_og)) { return; } QTC::TC("qpdf", "QPDF copy indirect"); - obj_copier.visiting.insert(foreign_og); - auto mapping = obj_copier.object_map.find(foreign_og); - if (mapping == obj_copier.object_map.end()) { + if (obj_copier.object_map.count(foreign_og) == 0) { obj_copier.to_copy.push_back(foreign); - QPDFObjectHandle reservation; - if (foreign.isStream()) { - reservation = newStream(); - } else { - reservation = QPDFObjectHandle::newReserved(this); - } - obj_copier.object_map[foreign_og] = reservation; + obj_copier.object_map[foreign_og] = foreign.isStream() + ? newStream() + : QPDFObjectHandle::newReserved(this); } } - if (foreign.isArray()) { + if (foreign_tc == ::ot_array) { QTC::TC("qpdf", "QPDF reserve array"); int n = foreign.getArrayNItems(); for (int i = 0; i < n; ++i) { reserveObjects(foreign.getArrayItem(i), obj_copier, false); } - } else if (foreign.isDictionary()) { + } else if (foreign_tc == ::ot_dictionary) { QTC::TC("qpdf", "QPDF reserve dictionary"); for (auto const& key: foreign.getKeys()) { reserveObjects(foreign.getKey(key), obj_copier, false); } - } else if (foreign.isStream()) { + } else if (foreign_tc == ::ot_stream) { QTC::TC("qpdf", "QPDF reserve stream"); reserveObjects(foreign.getDict(), obj_copier, false); } - if (foreign.isIndirect()) { - QPDFObjGen foreign_og(foreign.getObjGen()); - obj_copier.visiting.erase(foreign_og); - } + obj_copier.visiting.erase(foreign); } QPDFObjectHandle QPDF::replaceForeignIndirectObjects( QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) { + auto foreign_tc = foreign.getTypeCode(); QPDFObjectHandle result; if ((!top) && foreign.isIndirect()) { QTC::TC("qpdf", "QPDF replace indirect"); - QPDFObjGen foreign_og(foreign.getObjGen()); - auto mapping = obj_copier.object_map.find(foreign_og); + auto mapping = obj_copier.object_map.find(foreign.getObjGen()); if (mapping == obj_copier.object_map.end()) { // This case would occur if this is a reference to a Page // or Pages object that we didn't traverse into. QTC::TC("qpdf", "QPDF replace foreign indirect with null"); result = QPDFObjectHandle::newNull(); } else { - result = obj_copier.object_map[foreign_og]; + result = mapping->second; } - } else if (foreign.isArray()) { + } else if (foreign_tc == ::ot_array) { QTC::TC("qpdf", "QPDF replace array"); result = QPDFObjectHandle::newArray(); int n = foreign.getArrayNItems(); @@ -2266,7 +2259,7 @@ QPDF::replaceForeignIndirectObjects( replaceForeignIndirectObjects( foreign.getArrayItem(i), obj_copier, false)); } - } else if (foreign.isDictionary()) { + } else if (foreign_tc == ::ot_dictionary) { QTC::TC("qpdf", "QPDF replace dictionary"); result = QPDFObjectHandle::newDictionary(); std::set<std::string> keys = foreign.getKeys(); @@ -2276,10 +2269,9 @@ QPDF::replaceForeignIndirectObjects( replaceForeignIndirectObjects( foreign.getKey(iter), obj_copier, false)); } - } else if (foreign.isStream()) { + } else if (foreign_tc == ::ot_stream) { QTC::TC("qpdf", "QPDF replace stream"); - QPDFObjGen foreign_og(foreign.getObjGen()); - result = obj_copier.object_map[foreign_og]; + result = obj_copier.object_map[foreign.getObjGen()]; result.assertStream(); QPDFObjectHandle dict = result.getDict(); QPDFObjectHandle old_dict = foreign.getDict(); @@ -2511,7 +2503,7 @@ QPDF::getCompressibleObjGens() QPDFObjectHandle encryption_dict = this->m->trailer.getKey("/Encrypt"); QPDFObjGen encryption_dict_og = encryption_dict.getObjGen(); - std::set<QPDFObjGen> visited; + QPDFObjGen::set visited; std::list<QPDFObjectHandle> queue; queue.push_front(this->m->trailer); std::vector<QPDFObjGen> result; @@ -2520,7 +2512,7 @@ QPDF::getCompressibleObjGens() queue.pop_front(); if (obj.isIndirect()) { QPDFObjGen og = obj.getObjGen(); - if (visited.count(og)) { + if (!visited.add(og)) { QTC::TC("qpdf", "QPDF loop detected traversing objects"); continue; } @@ -2532,7 +2524,6 @@ QPDF::getCompressibleObjGens() obj.hasKey("/Contents")))) { result.push_back(og); } - visited.insert(og); } if (obj.isStream()) { QPDFObjectHandle dict = obj.getDict(); |