Commit 5473c0956cdfbe2a72c048b19d9d5334e23007bf
1 parent
aeb66311
Use QPDFObjGen::set in QPDF::replaceForeignIndirectObjects
Showing
2 changed files
with
24 additions
and
32 deletions
include/qpdf/QPDF.hh
| ... | ... | @@ -1017,7 +1017,7 @@ class QPDF |
| 1017 | 1017 | public: |
| 1018 | 1018 | std::map<QPDFObjGen, QPDFObjectHandle> object_map; |
| 1019 | 1019 | std::vector<QPDFObjectHandle> to_copy; |
| 1020 | - std::set<QPDFObjGen> visiting; | |
| 1020 | + QPDFObjGen::set visiting; | |
| 1021 | 1021 | }; |
| 1022 | 1022 | |
| 1023 | 1023 | class EncryptionParameters | ... | ... |
libqpdf/QPDF.cc
| ... | ... | @@ -2176,7 +2176,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) |
| 2176 | 2176 | void |
| 2177 | 2177 | QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) |
| 2178 | 2178 | { |
| 2179 | - if (foreign.isReserved()) { | |
| 2179 | + auto foreign_tc = foreign.getTypeCode(); | |
| 2180 | + if (foreign_tc == ::ot_reserved) { | |
| 2180 | 2181 | throw std::logic_error( |
| 2181 | 2182 | "QPDF: attempting to copy a foreign reserved object"); |
| 2182 | 2183 | } |
| ... | ... | @@ -2193,70 +2194,62 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) |
| 2193 | 2194 | |
| 2194 | 2195 | if (foreign.isIndirect()) { |
| 2195 | 2196 | QPDFObjGen foreign_og(foreign.getObjGen()); |
| 2196 | - if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) { | |
| 2197 | - QTC::TC("qpdf", "QPDF loop reserving objects"); | |
| 2197 | + if (obj_copier.object_map.count(foreign_og) > 0) { | |
| 2198 | + QTC::TC("qpdf", "QPDF already reserved object"); | |
| 2199 | + if (obj_copier.visiting.count(foreign_og)) { | |
| 2200 | + QTC::TC("qpdf", "QPDF loop reserving objects"); | |
| 2201 | + } | |
| 2198 | 2202 | return; |
| 2199 | 2203 | } |
| 2200 | - if (obj_copier.object_map.find(foreign_og) != | |
| 2201 | - obj_copier.object_map.end()) { | |
| 2202 | - QTC::TC("qpdf", "QPDF already reserved object"); | |
| 2204 | + if (!obj_copier.visiting.add(foreign_og)) { | |
| 2203 | 2205 | return; |
| 2204 | 2206 | } |
| 2205 | 2207 | QTC::TC("qpdf", "QPDF copy indirect"); |
| 2206 | - obj_copier.visiting.insert(foreign_og); | |
| 2207 | - auto mapping = obj_copier.object_map.find(foreign_og); | |
| 2208 | - if (mapping == obj_copier.object_map.end()) { | |
| 2208 | + if (obj_copier.object_map.count(foreign_og) == 0) { | |
| 2209 | 2209 | obj_copier.to_copy.push_back(foreign); |
| 2210 | - QPDFObjectHandle reservation; | |
| 2211 | - if (foreign.isStream()) { | |
| 2212 | - reservation = newStream(); | |
| 2213 | - } else { | |
| 2214 | - reservation = QPDFObjectHandle::newReserved(this); | |
| 2215 | - } | |
| 2216 | - obj_copier.object_map[foreign_og] = reservation; | |
| 2210 | + obj_copier.object_map[foreign_og] = foreign.isStream() | |
| 2211 | + ? newStream() | |
| 2212 | + : QPDFObjectHandle::newReserved(this); | |
| 2217 | 2213 | } |
| 2218 | 2214 | } |
| 2219 | 2215 | |
| 2220 | - if (foreign.isArray()) { | |
| 2216 | + if (foreign_tc == ::ot_array) { | |
| 2221 | 2217 | QTC::TC("qpdf", "QPDF reserve array"); |
| 2222 | 2218 | int n = foreign.getArrayNItems(); |
| 2223 | 2219 | for (int i = 0; i < n; ++i) { |
| 2224 | 2220 | reserveObjects(foreign.getArrayItem(i), obj_copier, false); |
| 2225 | 2221 | } |
| 2226 | - } else if (foreign.isDictionary()) { | |
| 2222 | + } else if (foreign_tc == ::ot_dictionary) { | |
| 2227 | 2223 | QTC::TC("qpdf", "QPDF reserve dictionary"); |
| 2228 | 2224 | for (auto const& key: foreign.getKeys()) { |
| 2229 | 2225 | reserveObjects(foreign.getKey(key), obj_copier, false); |
| 2230 | 2226 | } |
| 2231 | - } else if (foreign.isStream()) { | |
| 2227 | + } else if (foreign_tc == ::ot_stream) { | |
| 2232 | 2228 | QTC::TC("qpdf", "QPDF reserve stream"); |
| 2233 | 2229 | reserveObjects(foreign.getDict(), obj_copier, false); |
| 2234 | 2230 | } |
| 2235 | 2231 | |
| 2236 | - if (foreign.isIndirect()) { | |
| 2237 | - QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 2238 | - obj_copier.visiting.erase(foreign_og); | |
| 2239 | - } | |
| 2232 | + obj_copier.visiting.erase(foreign); | |
| 2240 | 2233 | } |
| 2241 | 2234 | |
| 2242 | 2235 | QPDFObjectHandle |
| 2243 | 2236 | QPDF::replaceForeignIndirectObjects( |
| 2244 | 2237 | QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top) |
| 2245 | 2238 | { |
| 2239 | + auto foreign_tc = foreign.getTypeCode(); | |
| 2246 | 2240 | QPDFObjectHandle result; |
| 2247 | 2241 | if ((!top) && foreign.isIndirect()) { |
| 2248 | 2242 | QTC::TC("qpdf", "QPDF replace indirect"); |
| 2249 | - QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 2250 | - auto mapping = obj_copier.object_map.find(foreign_og); | |
| 2243 | + auto mapping = obj_copier.object_map.find(foreign.getObjGen()); | |
| 2251 | 2244 | if (mapping == obj_copier.object_map.end()) { |
| 2252 | 2245 | // This case would occur if this is a reference to a Page |
| 2253 | 2246 | // or Pages object that we didn't traverse into. |
| 2254 | 2247 | QTC::TC("qpdf", "QPDF replace foreign indirect with null"); |
| 2255 | 2248 | result = QPDFObjectHandle::newNull(); |
| 2256 | 2249 | } else { |
| 2257 | - result = obj_copier.object_map[foreign_og]; | |
| 2250 | + result = mapping->second; | |
| 2258 | 2251 | } |
| 2259 | - } else if (foreign.isArray()) { | |
| 2252 | + } else if (foreign_tc == ::ot_array) { | |
| 2260 | 2253 | QTC::TC("qpdf", "QPDF replace array"); |
| 2261 | 2254 | result = QPDFObjectHandle::newArray(); |
| 2262 | 2255 | int n = foreign.getArrayNItems(); |
| ... | ... | @@ -2266,7 +2259,7 @@ QPDF::replaceForeignIndirectObjects( |
| 2266 | 2259 | replaceForeignIndirectObjects( |
| 2267 | 2260 | foreign.getArrayItem(i), obj_copier, false)); |
| 2268 | 2261 | } |
| 2269 | - } else if (foreign.isDictionary()) { | |
| 2262 | + } else if (foreign_tc == ::ot_dictionary) { | |
| 2270 | 2263 | QTC::TC("qpdf", "QPDF replace dictionary"); |
| 2271 | 2264 | result = QPDFObjectHandle::newDictionary(); |
| 2272 | 2265 | std::set<std::string> keys = foreign.getKeys(); |
| ... | ... | @@ -2276,10 +2269,9 @@ QPDF::replaceForeignIndirectObjects( |
| 2276 | 2269 | replaceForeignIndirectObjects( |
| 2277 | 2270 | foreign.getKey(iter), obj_copier, false)); |
| 2278 | 2271 | } |
| 2279 | - } else if (foreign.isStream()) { | |
| 2272 | + } else if (foreign_tc == ::ot_stream) { | |
| 2280 | 2273 | QTC::TC("qpdf", "QPDF replace stream"); |
| 2281 | - QPDFObjGen foreign_og(foreign.getObjGen()); | |
| 2282 | - result = obj_copier.object_map[foreign_og]; | |
| 2274 | + result = obj_copier.object_map[foreign.getObjGen()]; | |
| 2283 | 2275 | result.assertStream(); |
| 2284 | 2276 | QPDFObjectHandle dict = result.getDict(); |
| 2285 | 2277 | QPDFObjectHandle old_dict = foreign.getDict(); | ... | ... |