mirror of
https://github.com/qpdf/qpdf.git
synced 2024-09-27 12:39:06 +00:00
Use QPDFObjGen::set in QPDF::replaceForeignIndirectObjects
This commit is contained in:
parent
aeb66311c2
commit
5473c0956c
@ -1017,7 +1017,7 @@ class QPDF
|
|||||||
public:
|
public:
|
||||||
std::map<QPDFObjGen, QPDFObjectHandle> object_map;
|
std::map<QPDFObjGen, QPDFObjectHandle> object_map;
|
||||||
std::vector<QPDFObjectHandle> to_copy;
|
std::vector<QPDFObjectHandle> to_copy;
|
||||||
std::set<QPDFObjGen> visiting;
|
QPDFObjGen::set visiting;
|
||||||
};
|
};
|
||||||
|
|
||||||
class EncryptionParameters
|
class EncryptionParameters
|
||||||
|
@ -2176,7 +2176,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign)
|
|||||||
void
|
void
|
||||||
QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
|
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(
|
throw std::logic_error(
|
||||||
"QPDF: attempting to copy a foreign reserved object");
|
"QPDF: attempting to copy a foreign reserved object");
|
||||||
}
|
}
|
||||||
@ -2193,70 +2194,62 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
|
|||||||
|
|
||||||
if (foreign.isIndirect()) {
|
if (foreign.isIndirect()) {
|
||||||
QPDFObjGen foreign_og(foreign.getObjGen());
|
QPDFObjGen foreign_og(foreign.getObjGen());
|
||||||
if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) {
|
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");
|
QTC::TC("qpdf", "QPDF loop reserving objects");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (obj_copier.object_map.find(foreign_og) !=
|
if (!obj_copier.visiting.add(foreign_og)) {
|
||||||
obj_copier.object_map.end()) {
|
|
||||||
QTC::TC("qpdf", "QPDF already reserved object");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QTC::TC("qpdf", "QPDF copy indirect");
|
QTC::TC("qpdf", "QPDF copy indirect");
|
||||||
obj_copier.visiting.insert(foreign_og);
|
if (obj_copier.object_map.count(foreign_og) == 0) {
|
||||||
auto mapping = obj_copier.object_map.find(foreign_og);
|
|
||||||
if (mapping == obj_copier.object_map.end()) {
|
|
||||||
obj_copier.to_copy.push_back(foreign);
|
obj_copier.to_copy.push_back(foreign);
|
||||||
QPDFObjectHandle reservation;
|
obj_copier.object_map[foreign_og] = foreign.isStream()
|
||||||
if (foreign.isStream()) {
|
? newStream()
|
||||||
reservation = newStream();
|
: QPDFObjectHandle::newReserved(this);
|
||||||
} else {
|
|
||||||
reservation = QPDFObjectHandle::newReserved(this);
|
|
||||||
}
|
|
||||||
obj_copier.object_map[foreign_og] = reservation;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foreign.isArray()) {
|
if (foreign_tc == ::ot_array) {
|
||||||
QTC::TC("qpdf", "QPDF reserve array");
|
QTC::TC("qpdf", "QPDF reserve array");
|
||||||
int n = foreign.getArrayNItems();
|
int n = foreign.getArrayNItems();
|
||||||
for (int i = 0; i < n; ++i) {
|
for (int i = 0; i < n; ++i) {
|
||||||
reserveObjects(foreign.getArrayItem(i), obj_copier, false);
|
reserveObjects(foreign.getArrayItem(i), obj_copier, false);
|
||||||
}
|
}
|
||||||
} else if (foreign.isDictionary()) {
|
} else if (foreign_tc == ::ot_dictionary) {
|
||||||
QTC::TC("qpdf", "QPDF reserve dictionary");
|
QTC::TC("qpdf", "QPDF reserve dictionary");
|
||||||
for (auto const& key: foreign.getKeys()) {
|
for (auto const& key: foreign.getKeys()) {
|
||||||
reserveObjects(foreign.getKey(key), obj_copier, false);
|
reserveObjects(foreign.getKey(key), obj_copier, false);
|
||||||
}
|
}
|
||||||
} else if (foreign.isStream()) {
|
} else if (foreign_tc == ::ot_stream) {
|
||||||
QTC::TC("qpdf", "QPDF reserve stream");
|
QTC::TC("qpdf", "QPDF reserve stream");
|
||||||
reserveObjects(foreign.getDict(), obj_copier, false);
|
reserveObjects(foreign.getDict(), obj_copier, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (foreign.isIndirect()) {
|
obj_copier.visiting.erase(foreign);
|
||||||
QPDFObjGen foreign_og(foreign.getObjGen());
|
|
||||||
obj_copier.visiting.erase(foreign_og);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QPDFObjectHandle
|
QPDFObjectHandle
|
||||||
QPDF::replaceForeignIndirectObjects(
|
QPDF::replaceForeignIndirectObjects(
|
||||||
QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
|
QPDFObjectHandle foreign, ObjCopier& obj_copier, bool top)
|
||||||
{
|
{
|
||||||
|
auto foreign_tc = foreign.getTypeCode();
|
||||||
QPDFObjectHandle result;
|
QPDFObjectHandle result;
|
||||||
if ((!top) && foreign.isIndirect()) {
|
if ((!top) && foreign.isIndirect()) {
|
||||||
QTC::TC("qpdf", "QPDF replace indirect");
|
QTC::TC("qpdf", "QPDF replace indirect");
|
||||||
QPDFObjGen foreign_og(foreign.getObjGen());
|
auto mapping = obj_copier.object_map.find(foreign.getObjGen());
|
||||||
auto mapping = obj_copier.object_map.find(foreign_og);
|
|
||||||
if (mapping == obj_copier.object_map.end()) {
|
if (mapping == obj_copier.object_map.end()) {
|
||||||
// This case would occur if this is a reference to a Page
|
// This case would occur if this is a reference to a Page
|
||||||
// or Pages object that we didn't traverse into.
|
// or Pages object that we didn't traverse into.
|
||||||
QTC::TC("qpdf", "QPDF replace foreign indirect with null");
|
QTC::TC("qpdf", "QPDF replace foreign indirect with null");
|
||||||
result = QPDFObjectHandle::newNull();
|
result = QPDFObjectHandle::newNull();
|
||||||
} else {
|
} 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");
|
QTC::TC("qpdf", "QPDF replace array");
|
||||||
result = QPDFObjectHandle::newArray();
|
result = QPDFObjectHandle::newArray();
|
||||||
int n = foreign.getArrayNItems();
|
int n = foreign.getArrayNItems();
|
||||||
@ -2266,7 +2259,7 @@ QPDF::replaceForeignIndirectObjects(
|
|||||||
replaceForeignIndirectObjects(
|
replaceForeignIndirectObjects(
|
||||||
foreign.getArrayItem(i), obj_copier, false));
|
foreign.getArrayItem(i), obj_copier, false));
|
||||||
}
|
}
|
||||||
} else if (foreign.isDictionary()) {
|
} else if (foreign_tc == ::ot_dictionary) {
|
||||||
QTC::TC("qpdf", "QPDF replace dictionary");
|
QTC::TC("qpdf", "QPDF replace dictionary");
|
||||||
result = QPDFObjectHandle::newDictionary();
|
result = QPDFObjectHandle::newDictionary();
|
||||||
std::set<std::string> keys = foreign.getKeys();
|
std::set<std::string> keys = foreign.getKeys();
|
||||||
@ -2276,10 +2269,9 @@ QPDF::replaceForeignIndirectObjects(
|
|||||||
replaceForeignIndirectObjects(
|
replaceForeignIndirectObjects(
|
||||||
foreign.getKey(iter), obj_copier, false));
|
foreign.getKey(iter), obj_copier, false));
|
||||||
}
|
}
|
||||||
} else if (foreign.isStream()) {
|
} else if (foreign_tc == ::ot_stream) {
|
||||||
QTC::TC("qpdf", "QPDF replace stream");
|
QTC::TC("qpdf", "QPDF replace stream");
|
||||||
QPDFObjGen foreign_og(foreign.getObjGen());
|
result = obj_copier.object_map[foreign.getObjGen()];
|
||||||
result = obj_copier.object_map[foreign_og];
|
|
||||||
result.assertStream();
|
result.assertStream();
|
||||||
QPDFObjectHandle dict = result.getDict();
|
QPDFObjectHandle dict = result.getDict();
|
||||||
QPDFObjectHandle old_dict = foreign.getDict();
|
QPDFObjectHandle old_dict = foreign.getDict();
|
||||||
|
Loading…
Reference in New Issue
Block a user