From 96eb96511557469d50bbd55d211ced16acc31e13 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 14 Jun 2013 11:58:37 -0400 Subject: Use QPDFObjectHandle::getObjGen() where appropriate In internal code and examples, replace calls to getObjectID() and getGeneration() with calls to getObjGen() where possible. --- libqpdf/QPDF.cc | 40 +++++++++++++++++++++++++++------------- libqpdf/QPDFObjGen.cc | 6 ++++++ libqpdf/QPDF_linearization.cc | 23 ++++++++++------------- libqpdf/QPDF_optimization.cc | 4 ++-- libqpdf/QPDF_pages.cc | 13 ++++++------- 5 files changed, 51 insertions(+), 35 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 053aeaa8..5c5e0e79 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -1573,12 +1573,24 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) this, next.getObj(), next.getGen()); } +QPDFObjectHandle +QPDF::getObjectByObjGen(QPDFObjGen const& og) +{ + return getObjectByID(og.getObj(), og.getGen()); +} + QPDFObjectHandle QPDF::getObjectByID(int objid, int generation) { return QPDFObjectHandle::Factory::newIndirect(this, objid, generation); } +void +QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh) +{ + replaceObject(og.getObj(), og.getGen(), oh); +} + void QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh) { @@ -1604,9 +1616,7 @@ QPDF::replaceReserved(QPDFObjectHandle reserved, { QTC::TC("qpdf", "QPDF replaceReserved"); reserved.assertReserved(); - replaceObject(reserved.getObjectID(), - reserved.getGeneration(), - replacement); + replaceObject(reserved.getObjGen(), replacement); } QPDFObjectHandle @@ -1663,14 +1673,13 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) replaceForeignIndirectObjects(to_copy, obj_copier, true); if (! to_copy.isStream()) { - QPDFObjGen og(to_copy.getObjectID(), to_copy.getGeneration()); + QPDFObjGen og(to_copy.getObjGen()); replaceReserved(obj_copier.object_map[og], copy); } } obj_copier.to_copy.clear(); - return obj_copier.object_map[QPDFObjGen(foreign.getObjectID(), - foreign.getGeneration())]; + return obj_copier.object_map[foreign.getObjGen()]; } void @@ -1697,7 +1706,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, if (foreign.isIndirect()) { - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjGen()); if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) { QTC::TC("qpdf", "QPDF loop reserving objects"); @@ -1750,7 +1759,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier& obj_copier, if (foreign.isIndirect()) { - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjGen()); obj_copier.visiting.erase(foreign_og); } } @@ -1763,7 +1772,7 @@ QPDF::replaceForeignIndirectObjects( if ((! top) && foreign.isIndirect()) { QTC::TC("qpdf", "QPDF replace indirect"); - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjGen()); std::map::iterator mapping = obj_copier.object_map.find(foreign_og); if (mapping == obj_copier.object_map.end()) @@ -1807,7 +1816,7 @@ QPDF::replaceForeignIndirectObjects( else if (foreign.isStream()) { QTC::TC("qpdf", "QPDF replace stream"); - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); + QPDFObjGen foreign_og(foreign.getObjGen()); result = obj_copier.object_map[foreign_og]; result.assertStream(); QPDFObjectHandle dict = result.getDict(); @@ -1826,7 +1835,7 @@ QPDF::replaceForeignIndirectObjects( this->copied_stream_data_provider = new CopiedStreamDataProvider(); this->copied_streams = this->copied_stream_data_provider; } - QPDFObjGen local_og(result.getObjectID(), result.getGeneration()); + QPDFObjGen local_og(result.getObjGen()); this->copied_stream_data_provider->registerForeignStream( local_og, foreign); result.replaceStreamData(this->copied_streams, @@ -1848,6 +1857,12 @@ QPDF::replaceForeignIndirectObjects( return result; } +void +QPDF::swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2) +{ + swapObjects(og1.getObj(), og1.getGen(), og2.getObj(), og2.getGen()); +} + void QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2) { @@ -2101,8 +2116,7 @@ QPDF::findAttachmentStreams() item.getKey("/EF").getKey("/F").isStream()) { QPDFObjectHandle stream = item.getKey("/EF").getKey("/F"); - this->attachment_streams.insert( - QPDFObjGen(stream.getObjectID(), stream.getGeneration())); + this->attachment_streams.insert(stream.getObjGen()); } } } diff --git a/libqpdf/QPDFObjGen.cc b/libqpdf/QPDFObjGen.cc index e43a0aea..817e660e 100644 --- a/libqpdf/QPDFObjGen.cc +++ b/libqpdf/QPDFObjGen.cc @@ -13,6 +13,12 @@ QPDFObjGen::operator<(QPDFObjGen const& rhs) const ((this->obj == rhs.obj) && (this->gen < rhs.gen))); } +bool +QPDFObjGen::operator==(QPDFObjGen const& rhs) const +{ + return ((this->obj == rhs.obj) && (this->gen == rhs.gen)); +} + int QPDFObjGen::getObj() const { diff --git a/libqpdf/QPDF_linearization.cc b/libqpdf/QPDF_linearization.cc index fc57c115..4b1f5c09 100644 --- a/libqpdf/QPDF_linearization.cc +++ b/libqpdf/QPDF_linearization.cc @@ -336,9 +336,7 @@ QPDF::readHintStream(Pipeline& pl, qpdf_offset_t offset, size_t length) QTC::TC("qpdf", "QPDF hint table length indirect"); // Force resolution (void) length_obj.getIntValue(); - ObjCache& oc = this->obj_cache - [QPDFObjGen(length_obj.getObjectID(), - length_obj.getGeneration())]; + ObjCache& oc = this->obj_cache[length_obj.getObjGen()]; min_end_offset = oc.end_before_space; max_end_offset = oc.end_after_space; } @@ -499,7 +497,7 @@ QPDF::checkLinearizationInternal() for (int i = 0; i < npages; ++i) { QPDFObjectHandle const& page = pages[i]; - QPDFObjGen og(page.getObjectID(), page.getGeneration()); + QPDFObjGen og(page.getObjGen()); if (this->xref_table[og].getType() == 2) { errors.push_back("page dictionary for page " + @@ -582,7 +580,7 @@ QPDF::checkLinearizationInternal() for (std::vector::iterator iter = this->part6.begin(); iter != this->part6.end(); ++iter) { - QPDFObjGen og((*iter).getObjectID(), (*iter).getGeneration()); + QPDFObjGen og((*iter).getObjGen()); // All objects have to have been dereferenced to be classified. assert(this->obj_cache.count(og) > 0); ObjCache const& oc = this->obj_cache[og]; @@ -740,7 +738,7 @@ QPDF::checkHPageOffset(std::list& errors, unsigned int npages = pages.size(); int table_offset = adjusted_offset( this->page_offset_hints.first_page_offset); - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); + QPDFObjGen first_page_og(pages[0].getObjGen()); assert(this->xref_table.count(first_page_og) > 0); int offset = getLinearizationOffset(first_page_og); if (table_offset != offset) @@ -750,8 +748,7 @@ QPDF::checkHPageOffset(std::list& errors, for (unsigned int pageno = 0; pageno < npages; ++pageno) { - QPDFObjGen page_og(pages[pageno].getObjectID(), - pages[pageno].getGeneration()); + QPDFObjGen page_og(pages[pageno].getObjGen()); int first_object = page_og.getObj(); assert(this->xref_table.count(page_og) > 0); offset = getLinearizationOffset(page_og); @@ -961,7 +958,7 @@ QPDF::checkHOutlines(std::list& warnings) { // Check length and offset. Acrobat gets these wrong. QPDFObjectHandle outlines = getRoot().getKey("/Outlines"); - QPDFObjGen og(outlines.getObjectID(), outlines.getGeneration()); + QPDFObjGen og(outlines.getObjGen()); assert(this->xref_table.count(og) > 0); int offset = getLinearizationOffset(og); ObjUser ou(ObjUser::ou_root_key, "/Outlines"); @@ -1466,7 +1463,7 @@ QPDF::calculateLinearizationData(std::map const& object_stream_data) // will do the same. // First, place the actual first page object itself. - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); + QPDFObjGen first_page_og(pages[0].getObjGen()); if (! lc_first_page_private.count(first_page_og)) { throw std::logic_error( @@ -1515,7 +1512,7 @@ QPDF::calculateLinearizationData(std::map const& object_stream_data) { // Place this page's page object - QPDFObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration()); + QPDFObjGen page_og(pages[i].getObjGen()); if (! lc_other_page_private.count(page_og)) { throw std::logic_error( @@ -1598,7 +1595,7 @@ QPDF::calculateLinearizationData(std::map const& object_stream_data) if (! thumb.isNull()) { // Output the thumbnail itself - QPDFObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration()); + QPDFObjGen thumb_og(thumb.getObjGen()); if (lc_thumbnail_private.count(thumb_og)) { lc_thumbnail_private.erase(thumb_og); @@ -1753,7 +1750,7 @@ QPDF::pushOutlinesToPart( return; } outlines = getUncompressedObject(outlines, object_stream_data); - QPDFObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration()); + QPDFObjGen outlines_og(outlines.getObjGen()); QTC::TC("qpdf", "QPDF lin outlines in part", ((&part == (&this->part6)) ? 0 : (&part == (&this->part9)) ? 1 diff --git a/libqpdf/QPDF_optimization.cc b/libqpdf/QPDF_optimization.cc index 271c6610..0286fdb9 100644 --- a/libqpdf/QPDF_optimization.cc +++ b/libqpdf/QPDF_optimization.cc @@ -115,7 +115,7 @@ QPDF::optimize(std::map const& object_stream_data, } ObjUser root_ou = ObjUser(ObjUser::ou_root); - QPDFObjGen root_og = QPDFObjGen(root.getObjectID(), root.getGeneration()); + QPDFObjGen root_og = QPDFObjGen(root.getObjGen()); obj_user_to_objects[root_ou].insert(root_og); object_to_obj_users[root_og].insert(root_ou); @@ -338,7 +338,7 @@ QPDF::updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh, if (oh.isIndirect()) { - QPDFObjGen og(oh.getObjectID(), oh.getGeneration()); + QPDFObjGen og(oh.getObjGen()); if (visited.count(og)) { QTC::TC("qpdf", "QPDF opt loop detected"); diff --git a/libqpdf/QPDF_pages.cc b/libqpdf/QPDF_pages.cc index 4f1525e7..0604cd40 100644 --- a/libqpdf/QPDF_pages.cc +++ b/libqpdf/QPDF_pages.cc @@ -127,7 +127,7 @@ void QPDF::insertPageobjToPage(QPDFObjectHandle const& obj, int pos, bool check_duplicate) { - QPDFObjGen og(obj.getObjectID(), obj.getGeneration()); + QPDFObjGen og(obj.getObjGen()); if (check_duplicate) { if (! this->pageobj_to_pages_pos.insert(std::make_pair(og, pos)).second) @@ -214,8 +214,7 @@ QPDF::removePage(QPDFObjectHandle page) pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); this->all_pages.erase(this->all_pages.begin() + pos); assert(this->all_pages.size() == static_cast(npages)); - this->pageobj_to_pages_pos.erase( - QPDFObjGen(page.getObjectID(), page.getGeneration())); + this->pageobj_to_pages_pos.erase(page.getObjGen()); assert(this->pageobj_to_pages_pos.size() == static_cast(npages)); for (int i = pos; i < npages; ++i) { @@ -253,18 +252,18 @@ int QPDF::findPage(QPDFObjectHandle& page) { page.assertPageObject(); - return findPage(page.getObjectID(), page.getGeneration()); + return findPage(page.getObjGen()); } int -QPDF::findPage(int objid, int generation) +QPDF::findPage(QPDFObjGen const& og) { flattenPagesTree(); std::map::iterator it = - this->pageobj_to_pages_pos.find(QPDFObjGen(objid, generation)); + this->pageobj_to_pages_pos.find(og); if (it == this->pageobj_to_pages_pos.end()) { - setLastObjectDescription("page object", objid, generation); + setLastObjectDescription("page object", og.getObj(), og.getGen()); throw QPDFExc(qpdf_e_pages, this->file->getName(), this->last_object_description, 0, "page object not referenced in /Pages tree"); -- cgit v1.2.3-54-g00ecf