mirror of
https://github.com/qpdf/qpdf.git
synced 2024-12-23 03:18:59 +00:00
Create an application-scope unique ID for each QPDF object
Use this instead of QPDF* as a map key for object_copiers.
This commit is contained in:
parent
e27ac682e0
commit
7588cac295
@ -1196,6 +1196,7 @@ class QPDF
|
||||
Members();
|
||||
Members(Members const&);
|
||||
|
||||
unsigned long long unique_id;
|
||||
QPDFTokenizer tokenizer;
|
||||
PointerHolder<InputSource> file;
|
||||
std::string last_object_description;
|
||||
@ -1216,7 +1217,7 @@ class QPDF
|
||||
std::map<QPDFObjGen, int> pageobj_to_pages_pos;
|
||||
bool pushed_inherited_attributes_to_pages;
|
||||
std::vector<QPDFExc> warnings;
|
||||
std::map<QPDF*, ObjCopier> object_copiers;
|
||||
std::map<unsigned long long, ObjCopier> object_copiers;
|
||||
PointerHolder<QPDFObjectHandle::StreamDataProvider> copied_streams;
|
||||
// copied_stream_data_provider is owned by copied_streams
|
||||
CopiedStreamDataProvider* copied_stream_data_provider;
|
||||
|
@ -89,6 +89,7 @@ QPDF::EncryptionParameters::EncryptionParameters() :
|
||||
}
|
||||
|
||||
QPDF::Members::Members() :
|
||||
unique_id(0),
|
||||
provided_password_is_hex_key(false),
|
||||
ignore_xref_streams(false),
|
||||
suppress_warnings(false),
|
||||
@ -113,6 +114,12 @@ QPDF::QPDF() :
|
||||
m(new Members())
|
||||
{
|
||||
m->tokenizer.allowEOF();
|
||||
// Generate a unique ID. It just has to be unique among all QPDF
|
||||
// objects allocated throughout the lifetime of this running
|
||||
// application.
|
||||
m->unique_id = static_cast<unsigned long>(QUtil::get_current_time());
|
||||
m->unique_id <<= 32;
|
||||
m->unique_id |= static_cast<unsigned long>(QUtil::random());
|
||||
}
|
||||
|
||||
QPDF::~QPDF()
|
||||
@ -2103,7 +2110,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page)
|
||||
"QPDF::copyForeign called with object from this QPDF");
|
||||
}
|
||||
|
||||
ObjCopier& obj_copier = this->m->object_copiers[other];
|
||||
ObjCopier& obj_copier = this->m->object_copiers[other->m->unique_id];
|
||||
if (! obj_copier.visiting.empty())
|
||||
{
|
||||
throw std::logic_error("obj_copier.visiting is not empty"
|
||||
|
Loading…
Reference in New Issue
Block a user