From d88231e01ec3083fa99363efcd5b049fb1663a6c Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 14 Jun 2013 11:22:04 -0400 Subject: Promote QPDF::ObjGen to top-level object QPDFObjGen --- libqpdf/QPDF.cc | 122 +++++++++++++++++++++++++------------------------------- 1 file changed, 55 insertions(+), 67 deletions(-) (limited to 'libqpdf/QPDF.cc') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 3458d6cc..053aeaa8 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -39,32 +39,18 @@ static char const* EMPTY_PDF = "110\n" "%%EOF\n"; - -QPDF::ObjGen::ObjGen(int o = 0, int g = 0) : - obj(o), - gen(g) -{ -} - -bool -QPDF::ObjGen::operator<(ObjGen const& rhs) const -{ - return ((this->obj < rhs.obj) || - ((this->obj == rhs.obj) && (this->gen < rhs.gen))); -} - void QPDF::CopiedStreamDataProvider::provideStreamData( int objid, int generation, Pipeline* pipeline) { QPDFObjectHandle foreign_stream = - this->foreign_streams[ObjGen(objid, generation)]; + this->foreign_streams[QPDFObjGen(objid, generation)]; foreign_stream.pipeStreamData(pipeline, false, false, false); } void QPDF::CopiedStreamDataProvider::registerForeignStream( - ObjGen const& local_og, QPDFObjectHandle foreign_stream) + QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream) { this->foreign_streams[local_og] = foreign_stream; } @@ -128,7 +114,8 @@ QPDF::~QPDF() // have the effect of undoing any modifications that may have been // made to any of the objects. this->xref_table.clear(); - for (std::map::iterator iter = this->obj_cache.begin(); + for (std::map::iterator iter = + this->obj_cache.begin(); iter != obj_cache.end(); ++iter) { QPDFObject::ObjAccessor::releaseResolved( @@ -354,8 +341,8 @@ QPDF::reconstruct_xref(QPDFExc& e) "Attempting to reconstruct cross-reference table")); // Delete all references to type 1 (uncompressed) objects - std::set to_delete; - for (std::map::iterator iter = + std::set to_delete; + for (std::map::iterator iter = this->xref_table.begin(); iter != this->xref_table.end(); ++iter) { @@ -364,7 +351,7 @@ QPDF::reconstruct_xref(QPDFExc& e) to_delete.insert((*iter).first); } } - for (std::set::iterator iter = to_delete.begin(); + for (std::set::iterator iter = to_delete.begin(); iter != to_delete.end(); ++iter) { this->xref_table.erase(*iter); @@ -464,7 +451,7 @@ QPDF::read_xref(qpdf_offset_t xref_offset) int max_obj = 0; if (! xref_table.empty()) { - max_obj = (*(xref_table.rbegin())).first.obj; + max_obj = (*(xref_table.rbegin())).first.getObj(); } if (! this->deleted_objects.empty()) { @@ -491,7 +478,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) PCRE xref_first_re("^\\s*(\\d+)\\s+(\\d+)"); PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])[ \r\n]{2}$)"); - std::vector deleted_items; + std::vector deleted_items; this->file->seek(xref_offset, SEEK_SET); bool done = false; @@ -538,7 +525,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) { // Save deleted items until after we've checked the // XRefStm, if any. - deleted_items.push_back(ObjGen(i, f2)); + deleted_items.push_back(QPDFObjGen(i, f2)); } else { @@ -615,11 +602,11 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset) } // Handle any deleted items now that we've read the /XRefStm. - for (std::vector::iterator iter = deleted_items.begin(); + for (std::vector::iterator iter = deleted_items.begin(); iter != deleted_items.end(); ++iter) { - ObjGen& og = *iter; - insertXrefEntry(og.obj, 0, 0, og.gen); + QPDFObjGen& og = *iter; + insertXrefEntry(og.getObj(), 0, 0, og.getGen()); } if (cur_trailer.hasKey("/Prev")) @@ -874,7 +861,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite) // object. Disregard this one. { // private scope int gen = (f0 == 2 ? 0 : f2); - ObjGen og(obj, gen); + QPDFObjGen og(obj, gen); if (this->xref_table.count(og)) { if (overwrite) @@ -904,11 +891,11 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite) case 1: // f2 is generation QTC::TC("qpdf", "QPDF xref gen > 0", ((f2 > 0) ? 1 : 0)); - this->xref_table[ObjGen(obj, f2)] = QPDFXRefEntry(f0, f1, f2); + this->xref_table[QPDFObjGen(obj, f2)] = QPDFXRefEntry(f0, f1, f2); break; case 2: - this->xref_table[ObjGen(obj, 0)] = QPDFXRefEntry(f0, f1, f2); + this->xref_table[QPDFObjGen(obj, 0)] = QPDFXRefEntry(f0, f1, f2); break; default: @@ -923,13 +910,13 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite) void QPDF::showXRefTable() { - for (std::map::iterator iter = + for (std::map::iterator iter = this->xref_table.begin(); iter != this->xref_table.end(); ++iter) { - ObjGen const& og = (*iter).first; + QPDFObjGen const& og = (*iter).first; QPDFXRefEntry const& entry = (*iter).second; - *out_stream << og.obj << "/" << og.gen << ": "; + *out_stream << og.getObj() << "/" << og.getGen() << ": "; switch (entry.getType()) { case 1: @@ -1213,14 +1200,14 @@ QPDF::recoverStreamLength(PointerHolder input, if (length) { int this_obj_offset = 0; - ObjGen this_obj(0, 0); + QPDFObjGen this_obj(0, 0); // Make sure this is inside this object - for (std::map::iterator iter = + for (std::map::iterator iter = this->xref_table.begin(); iter != this->xref_table.end(); ++iter) { - ObjGen const& og = (*iter).first; + QPDFObjGen const& og = (*iter).first; QPDFXRefEntry const& entry = (*iter).second; if (entry.getType() == 1) { @@ -1235,8 +1222,8 @@ QPDF::recoverStreamLength(PointerHolder input, } } if (this_obj_offset && - (this_obj.obj == objid) && - (this_obj.gen == generation)) + (this_obj.getObj() == objid) && + (this_obj.getGen() == generation)) { // Well, we found endstream\nendobj within the space // allowed for this object, so we're probably in good @@ -1330,7 +1317,7 @@ QPDF::readObjectAtOffset(bool try_recovery, { // Try again after reconstructing xref table reconstruct_xref(e); - ObjGen og(exp_objid, exp_generation); + QPDFObjGen og(exp_objid, exp_generation); if (this->xref_table.count(og) && (this->xref_table[og].getType() == 1)) { @@ -1375,7 +1362,7 @@ QPDF::readObjectAtOffset(bool try_recovery, "expected endobj")); } - ObjGen og(objid, generation); + QPDFObjGen og(objid, generation); if (! this->obj_cache.count(og)) { // Store the object in the cache here so it gets cached @@ -1425,7 +1412,7 @@ QPDF::resolve(int objid, int generation) // Check object cache before checking xref table. This allows us // to insert things into the object cache that don't actually // exist in the file. - ObjGen og(objid, generation); + QPDFObjGen og(objid, generation); if (! this->obj_cache.count(og)) { if (! this->xref_table.count(og)) @@ -1482,7 +1469,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) // For linearization data in the object, use the data from the // object stream for the objects in the stream. - ObjGen stream_og(obj_stream_number, 0); + QPDFObjGen stream_og(obj_stream_number, 0); qpdf_offset_t end_before_space = this->obj_cache[stream_og].end_before_space; qpdf_offset_t end_after_space = @@ -1548,7 +1535,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number) iter != offsets.end(); ++iter) { int obj = (*iter).first; - ObjGen og(obj, 0); + QPDFObjGen og(obj, 0); QPDFXRefEntry const& entry = this->xref_table[og]; if ((entry.getType() == 2) && (entry.getObjStreamNumber() == obj_stream_number)) @@ -1570,19 +1557,20 @@ QPDF::resolveObjectsInStream(int obj_stream_number) QPDFObjectHandle QPDF::makeIndirectObject(QPDFObjectHandle oh) { - ObjGen o1(0, 0); + QPDFObjGen o1(0, 0); if (! this->obj_cache.empty()) { o1 = (*(this->obj_cache.rbegin())).first; } - ObjGen o2 = (*(this->xref_table.rbegin())).first; + QPDFObjGen o2 = (*(this->xref_table.rbegin())).first; QTC::TC("qpdf", "QPDF indirect last obj from xref", - (o2.obj > o1.obj) ? 1 : 0); - int max_objid = std::max(o1.obj, o2.obj); - ObjGen next(max_objid + 1, 0); + (o2.getObj() > o1.getObj()) ? 1 : 0); + int max_objid = std::max(o1.getObj(), o2.getObj()); + QPDFObjGen next(max_objid + 1, 0); this->obj_cache[next] = ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); - return QPDFObjectHandle::Factory::newIndirect(this, next.obj, next.gen); + return QPDFObjectHandle::Factory::newIndirect( + this, next.getObj(), next.getGen()); } QPDFObjectHandle @@ -1605,7 +1593,7 @@ QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh) resolve(objid, generation); // Replace the object in the object cache - ObjGen og(objid, generation); + QPDFObjGen og(objid, generation); this->obj_cache[og] = ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1); } @@ -1653,8 +1641,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) // Make sure we have an object in this file for every referenced // object in the old file. obj_copier.object_map maps foreign - // ObjGen to local objects. For everything new that we have to - // copy, the local object will be a reservation, unless it is a + // QPDFObjGen to local objects. For everything new that we have + // to copy, the local object will be a reservation, unless it is a // stream, in which case the local object will already be a // stream. reserveObjects(foreign, obj_copier, true); @@ -1675,14 +1663,14 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) replaceForeignIndirectObjects(to_copy, obj_copier, true); if (! to_copy.isStream()) { - ObjGen og(to_copy.getObjectID(), to_copy.getGeneration()); + QPDFObjGen og(to_copy.getObjectID(), to_copy.getGeneration()); replaceReserved(obj_copier.object_map[og], copy); } } obj_copier.to_copy.clear(); - return obj_copier.object_map[ObjGen(foreign.getObjectID(), - foreign.getGeneration())]; + return obj_copier.object_map[QPDFObjGen(foreign.getObjectID(), + foreign.getGeneration())]; } void @@ -1709,7 +1697,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, if (foreign.isIndirect()) { - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) { QTC::TC("qpdf", "QPDF loop reserving objects"); @@ -1717,7 +1705,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, } QTC::TC("qpdf", "QPDF copy indirect"); obj_copier.visiting.insert(foreign_og); - std::map::iterator mapping = + std::map::iterator mapping = obj_copier.object_map.find(foreign_og); if (mapping == obj_copier.object_map.end()) { @@ -1762,7 +1750,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, if (foreign.isIndirect()) { - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); obj_copier.visiting.erase(foreign_og); } } @@ -1775,8 +1763,8 @@ QPDF::replaceForeignIndirectObjects( if ((! top) && foreign.isIndirect()) { QTC::TC("qpdf", "QPDF replace indirect"); - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); - std::map::iterator mapping = + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + std::map::iterator mapping = obj_copier.object_map.find(foreign_og); if (mapping == obj_copier.object_map.end()) { @@ -1819,7 +1807,7 @@ QPDF::replaceForeignIndirectObjects( else if (foreign.isStream()) { QTC::TC("qpdf", "QPDF replace stream"); - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); result = obj_copier.object_map[foreign_og]; result.assertStream(); QPDFObjectHandle dict = result.getDict(); @@ -1838,7 +1826,7 @@ QPDF::replaceForeignIndirectObjects( this->copied_stream_data_provider = new CopiedStreamDataProvider(); this->copied_streams = this->copied_stream_data_provider; } - ObjGen local_og(result.getObjectID(), result.getGeneration()); + QPDFObjGen local_og(result.getObjectID(), result.getGeneration()); this->copied_stream_data_provider->registerForeignStream( local_og, foreign); result.replaceStreamData(this->copied_streams, @@ -1867,8 +1855,8 @@ QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2) // cache. resolve(objid1, generation1); resolve(objid2, generation2); - ObjGen og1(objid1, generation1); - ObjGen og2(objid2, generation2); + QPDFObjGen og1(objid1, generation1); + QPDFObjGen og2(objid2, generation2); ObjCache t = this->obj_cache[og1]; this->obj_cache[og1] = this->obj_cache[og2]; this->obj_cache[og2] = t; @@ -1925,15 +1913,15 @@ QPDF::getRoot() void QPDF::getObjectStreamData(std::map& omap) { - for (std::map::iterator iter = + for (std::map::iterator iter = this->xref_table.begin(); iter != this->xref_table.end(); ++iter) { - ObjGen const& og = (*iter).first; + QPDFObjGen const& og = (*iter).first; QPDFXRefEntry const& entry = (*iter).second; if (entry.getType() == 2) { - omap[og.obj] = entry.getObjStreamNumber(); + omap[og.getObj()] = entry.getObjStreamNumber(); } } } @@ -2114,7 +2102,7 @@ QPDF::findAttachmentStreams() { QPDFObjectHandle stream = item.getKey("/EF").getKey("/F"); this->attachment_streams.insert( - ObjGen(stream.getObjectID(), stream.getGeneration())); + QPDFObjGen(stream.getObjectID(), stream.getGeneration())); } } } -- cgit v1.2.3-54-g00ecf