Commit 5473c0956cdfbe2a72c048b19d9d5334e23007bf

Authored by m-holger
1 parent aeb66311

Use QPDFObjGen::set in QPDF::replaceForeignIndirectObjects

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&amp; 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();
... ...