Commit 96eb96511557469d50bbd55d211ced16acc31e13

Authored by Jay Berkenbilt
1 parent 5039da0b

Use QPDFObjectHandle::getObjGen() where appropriate

In internal code and examples, replace calls to getObjectID() and
getGeneration() with calls to getObjGen() where possible.
examples/pdf-bookmarks.cc
@@ -9,7 +9,7 @@ static char const* whoami = 0; @@ -9,7 +9,7 @@ static char const* whoami = 0;
9 static enum { st_none, st_numbers, st_lines } style = st_none; 9 static enum { st_none, st_numbers, st_lines } style = st_none;
10 static bool show_open = false; 10 static bool show_open = false;
11 static bool show_targets = false; 11 static bool show_targets = false;
12 -static std::map<int, int> page_map; 12 +static std::map<QPDFObjGen, int> page_map;
13 13
14 void usage() 14 void usage()
15 { 15 {
@@ -50,7 +50,7 @@ void generate_page_map(QPDF&amp; qpdf) @@ -50,7 +50,7 @@ void generate_page_map(QPDF&amp; qpdf)
50 iter != pages.end(); ++iter) 50 iter != pages.end(); ++iter)
51 { 51 {
52 QPDFObjectHandle& oh = *iter; 52 QPDFObjectHandle& oh = *iter;
53 - page_map[oh.getObjectID()] = ++n; 53 + page_map[oh.getObjGen()] = ++n;
54 } 54 }
55 } 55 }
56 56
@@ -121,10 +121,10 @@ void extract_bookmarks(QPDFObjectHandle outlines, std::vector&lt;int&gt;&amp; numbers) @@ -121,10 +121,10 @@ void extract_bookmarks(QPDFObjectHandle outlines, std::vector&lt;int&gt;&amp; numbers)
121 if ((dest.isArray()) && (dest.getArrayNItems() > 0)) 121 if ((dest.isArray()) && (dest.getArrayNItems() > 0))
122 { 122 {
123 QPDFObjectHandle first = dest.getArrayItem(0); 123 QPDFObjectHandle first = dest.getArrayItem(0);
124 - int object_id = first.getObjectID();  
125 - if (page_map.count(object_id)) 124 + QPDFObjGen og = first.getObjGen();
  125 + if (page_map.count(og))
126 { 126 {
127 - target = QUtil::int_to_string(page_map[object_id]); 127 + target = QUtil::int_to_string(page_map[og]);
128 } 128 }
129 } 129 }
130 130
examples/pdf-invert-images.cc
@@ -34,10 +34,10 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider @@ -34,10 +34,10 @@ class ImageInverter: public QPDFObjectHandle::StreamDataProvider
34 virtual void provideStreamData(int objid, int generation, 34 virtual void provideStreamData(int objid, int generation,
35 Pipeline* pipeline); 35 Pipeline* pipeline);
36 36
37 - // Map [obj][gen] = image object  
38 - std::map<int, std::map<int, QPDFObjectHandle> > image_objects;  
39 - // Map [obj][gen] = image data  
40 - std::map<int, std::map<int, PointerHolder<Buffer> > > image_data; 37 + // Map [og] = image object
  38 + std::map<QPDFObjGen, QPDFObjectHandle> image_objects;
  39 + // Map [og] = image data
  40 + std::map<QPDFObjGen, PointerHolder<Buffer> > image_data;
41 }; 41 };
42 42
43 void 43 void
@@ -47,7 +47,8 @@ ImageInverter::provideStreamData(int objid, int generation, @@ -47,7 +47,8 @@ ImageInverter::provideStreamData(int objid, int generation,
47 // Use the object and generation number supplied to look up the 47 // Use the object and generation number supplied to look up the
48 // image data. Then invert the image data and write the inverted 48 // image data. Then invert the image data and write the inverted
49 // data to the pipeline. 49 // data to the pipeline.
50 - PointerHolder<Buffer> data = this->image_data[objid][generation]; 50 + PointerHolder<Buffer> data =
  51 + this->image_data[QPDFObjGen(objid, generation)];
51 size_t size = data->getSize(); 52 size_t size = data->getSize();
52 unsigned char* buf = data->getBuffer(); 53 unsigned char* buf = data->getBuffer();
53 unsigned char ch; 54 unsigned char ch;
@@ -120,12 +121,11 @@ int main(int argc, char* argv[]) @@ -120,12 +121,11 @@ int main(int argc, char* argv[])
120 // Store information about the images based on the 121 // Store information about the images based on the
121 // object and generation number. Recall that a single 122 // object and generation number. Recall that a single
122 // image object may be used more than once. 123 // image object may be used more than once.
123 - int objid = image.getObjectID();  
124 - int gen = image.getGeneration();  
125 - if (inv->image_objects[objid].count(gen) == 0) 124 + QPDFObjGen og = image.getObjGen();
  125 + if (inv->image_objects.count(og) == 0)
126 { 126 {
127 - inv->image_objects[objid][gen] = image;  
128 - inv->image_data[objid][gen] = image.getStreamData(); 127 + inv->image_objects[og] = image;
  128 + inv->image_data[og] = image.getStreamData();
129 129
130 // Register our stream data provider for this 130 // Register our stream data provider for this
131 // stream. Future calls to getStreamData or 131 // stream. Future calls to getStreamData or
include/qpdf/QPDF.hh
@@ -159,6 +159,8 @@ class QPDF @@ -159,6 +159,8 @@ class QPDF
159 // Retrieve an object by object ID and generation. Returns an 159 // Retrieve an object by object ID and generation. Returns an
160 // indirect reference to it. 160 // indirect reference to it.
161 QPDF_DLL 161 QPDF_DLL
  162 + QPDFObjectHandle getObjectByObjGen(QPDFObjGen const&);
  163 + QPDF_DLL
162 QPDFObjectHandle getObjectByID(int objid, int generation); 164 QPDFObjectHandle getObjectByID(int objid, int generation);
163 165
164 // Replace the object with the given object id with the given 166 // Replace the object with the given object id with the given
@@ -175,6 +177,8 @@ class QPDF @@ -175,6 +177,8 @@ class QPDF
175 // object. To replace a reserved object, call replaceReserved 177 // object. To replace a reserved object, call replaceReserved
176 // instead. 178 // instead.
177 QPDF_DLL 179 QPDF_DLL
  180 + void replaceObject(QPDFObjGen const& og, QPDFObjectHandle);
  181 + QPDF_DLL
178 void replaceObject(int objid, int generation, QPDFObjectHandle); 182 void replaceObject(int objid, int generation, QPDFObjectHandle);
179 183
180 // Swap two objects given by ID. Calling this method can have 184 // Swap two objects given by ID. Calling this method can have
@@ -189,6 +193,8 @@ class QPDF @@ -189,6 +193,8 @@ class QPDF
189 // to the swapped objects with new ones, possibly by calling 193 // to the swapped objects with new ones, possibly by calling
190 // getObjectByID. 194 // getObjectByID.
191 QPDF_DLL 195 QPDF_DLL
  196 + void swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2);
  197 + QPDF_DLL
192 void swapObjects(int objid1, int generation1, 198 void swapObjects(int objid1, int generation1,
193 int objid2, int generation2); 199 int objid2, int generation2);
194 200
@@ -623,7 +629,7 @@ class QPDF @@ -623,7 +629,7 @@ class QPDF
623 void getAllPagesInternal(QPDFObjectHandle cur_pages, 629 void getAllPagesInternal(QPDFObjectHandle cur_pages,
624 std::vector<QPDFObjectHandle>& result); 630 std::vector<QPDFObjectHandle>& result);
625 void insertPage(QPDFObjectHandle newpage, int pos); 631 void insertPage(QPDFObjectHandle newpage, int pos);
626 - int findPage(int objid, int generation); 632 + int findPage(QPDFObjGen const& og);
627 int findPage(QPDFObjectHandle& page); 633 int findPage(QPDFObjectHandle& page);
628 void flattenPagesTree(); 634 void flattenPagesTree();
629 void insertPageobjToPage(QPDFObjectHandle const& obj, int pos, 635 void insertPageobjToPage(QPDFObjectHandle const& obj, int pos,
include/qpdf/QPDFObjGen.hh
@@ -23,6 +23,8 @@ class QPDFObjGen @@ -23,6 +23,8 @@ class QPDFObjGen
23 QPDF_DLL 23 QPDF_DLL
24 bool operator<(QPDFObjGen const&) const; 24 bool operator<(QPDFObjGen const&) const;
25 QPDF_DLL 25 QPDF_DLL
  26 + bool operator==(QPDFObjGen const&) const;
  27 + QPDF_DLL
26 int getObj() const; 28 int getObj() const;
27 QPDF_DLL 29 QPDF_DLL
28 int getGen() const; 30 int getGen() const;
libqpdf/QPDF.cc
@@ -1574,12 +1574,24 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh) @@ -1574,12 +1574,24 @@ QPDF::makeIndirectObject(QPDFObjectHandle oh)
1574 } 1574 }
1575 1575
1576 QPDFObjectHandle 1576 QPDFObjectHandle
  1577 +QPDF::getObjectByObjGen(QPDFObjGen const& og)
  1578 +{
  1579 + return getObjectByID(og.getObj(), og.getGen());
  1580 +}
  1581 +
  1582 +QPDFObjectHandle
1577 QPDF::getObjectByID(int objid, int generation) 1583 QPDF::getObjectByID(int objid, int generation)
1578 { 1584 {
1579 return QPDFObjectHandle::Factory::newIndirect(this, objid, generation); 1585 return QPDFObjectHandle::Factory::newIndirect(this, objid, generation);
1580 } 1586 }
1581 1587
1582 void 1588 void
  1589 +QPDF::replaceObject(QPDFObjGen const& og, QPDFObjectHandle oh)
  1590 +{
  1591 + replaceObject(og.getObj(), og.getGen(), oh);
  1592 +}
  1593 +
  1594 +void
1583 QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh) 1595 QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh)
1584 { 1596 {
1585 if (oh.isIndirect()) 1597 if (oh.isIndirect())
@@ -1604,9 +1616,7 @@ QPDF::replaceReserved(QPDFObjectHandle reserved, @@ -1604,9 +1616,7 @@ QPDF::replaceReserved(QPDFObjectHandle reserved,
1604 { 1616 {
1605 QTC::TC("qpdf", "QPDF replaceReserved"); 1617 QTC::TC("qpdf", "QPDF replaceReserved");
1606 reserved.assertReserved(); 1618 reserved.assertReserved();
1607 - replaceObject(reserved.getObjectID(),  
1608 - reserved.getGeneration(),  
1609 - replacement); 1619 + replaceObject(reserved.getObjGen(), replacement);
1610 } 1620 }
1611 1621
1612 QPDFObjectHandle 1622 QPDFObjectHandle
@@ -1663,14 +1673,13 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page) @@ -1663,14 +1673,13 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page)
1663 replaceForeignIndirectObjects(to_copy, obj_copier, true); 1673 replaceForeignIndirectObjects(to_copy, obj_copier, true);
1664 if (! to_copy.isStream()) 1674 if (! to_copy.isStream())
1665 { 1675 {
1666 - QPDFObjGen og(to_copy.getObjectID(), to_copy.getGeneration()); 1676 + QPDFObjGen og(to_copy.getObjGen());
1667 replaceReserved(obj_copier.object_map[og], copy); 1677 replaceReserved(obj_copier.object_map[og], copy);
1668 } 1678 }
1669 } 1679 }
1670 obj_copier.to_copy.clear(); 1680 obj_copier.to_copy.clear();
1671 1681
1672 - return obj_copier.object_map[QPDFObjGen(foreign.getObjectID(),  
1673 - foreign.getGeneration())]; 1682 + return obj_copier.object_map[foreign.getObjGen()];
1674 } 1683 }
1675 1684
1676 void 1685 void
@@ -1697,7 +1706,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier, @@ -1697,7 +1706,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier,
1697 1706
1698 if (foreign.isIndirect()) 1707 if (foreign.isIndirect())
1699 { 1708 {
1700 - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); 1709 + QPDFObjGen foreign_og(foreign.getObjGen());
1701 if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end()) 1710 if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end())
1702 { 1711 {
1703 QTC::TC("qpdf", "QPDF loop reserving objects"); 1712 QTC::TC("qpdf", "QPDF loop reserving objects");
@@ -1750,7 +1759,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier, @@ -1750,7 +1759,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier,
1750 1759
1751 if (foreign.isIndirect()) 1760 if (foreign.isIndirect())
1752 { 1761 {
1753 - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); 1762 + QPDFObjGen foreign_og(foreign.getObjGen());
1754 obj_copier.visiting.erase(foreign_og); 1763 obj_copier.visiting.erase(foreign_og);
1755 } 1764 }
1756 } 1765 }
@@ -1763,7 +1772,7 @@ QPDF::replaceForeignIndirectObjects( @@ -1763,7 +1772,7 @@ QPDF::replaceForeignIndirectObjects(
1763 if ((! top) && foreign.isIndirect()) 1772 if ((! top) && foreign.isIndirect())
1764 { 1773 {
1765 QTC::TC("qpdf", "QPDF replace indirect"); 1774 QTC::TC("qpdf", "QPDF replace indirect");
1766 - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); 1775 + QPDFObjGen foreign_og(foreign.getObjGen());
1767 std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping = 1776 std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping =
1768 obj_copier.object_map.find(foreign_og); 1777 obj_copier.object_map.find(foreign_og);
1769 if (mapping == obj_copier.object_map.end()) 1778 if (mapping == obj_copier.object_map.end())
@@ -1807,7 +1816,7 @@ QPDF::replaceForeignIndirectObjects( @@ -1807,7 +1816,7 @@ QPDF::replaceForeignIndirectObjects(
1807 else if (foreign.isStream()) 1816 else if (foreign.isStream())
1808 { 1817 {
1809 QTC::TC("qpdf", "QPDF replace stream"); 1818 QTC::TC("qpdf", "QPDF replace stream");
1810 - QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration()); 1819 + QPDFObjGen foreign_og(foreign.getObjGen());
1811 result = obj_copier.object_map[foreign_og]; 1820 result = obj_copier.object_map[foreign_og];
1812 result.assertStream(); 1821 result.assertStream();
1813 QPDFObjectHandle dict = result.getDict(); 1822 QPDFObjectHandle dict = result.getDict();
@@ -1826,7 +1835,7 @@ QPDF::replaceForeignIndirectObjects( @@ -1826,7 +1835,7 @@ QPDF::replaceForeignIndirectObjects(
1826 this->copied_stream_data_provider = new CopiedStreamDataProvider(); 1835 this->copied_stream_data_provider = new CopiedStreamDataProvider();
1827 this->copied_streams = this->copied_stream_data_provider; 1836 this->copied_streams = this->copied_stream_data_provider;
1828 } 1837 }
1829 - QPDFObjGen local_og(result.getObjectID(), result.getGeneration()); 1838 + QPDFObjGen local_og(result.getObjGen());
1830 this->copied_stream_data_provider->registerForeignStream( 1839 this->copied_stream_data_provider->registerForeignStream(
1831 local_og, foreign); 1840 local_og, foreign);
1832 result.replaceStreamData(this->copied_streams, 1841 result.replaceStreamData(this->copied_streams,
@@ -1849,6 +1858,12 @@ QPDF::replaceForeignIndirectObjects( @@ -1849,6 +1858,12 @@ QPDF::replaceForeignIndirectObjects(
1849 } 1858 }
1850 1859
1851 void 1860 void
  1861 +QPDF::swapObjects(QPDFObjGen const& og1, QPDFObjGen const& og2)
  1862 +{
  1863 + swapObjects(og1.getObj(), og1.getGen(), og2.getObj(), og2.getGen());
  1864 +}
  1865 +
  1866 +void
1852 QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2) 1867 QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2)
1853 { 1868 {
1854 // Force objects to be loaded into cache; then swap them in the 1869 // Force objects to be loaded into cache; then swap them in the
@@ -2101,8 +2116,7 @@ QPDF::findAttachmentStreams() @@ -2101,8 +2116,7 @@ QPDF::findAttachmentStreams()
2101 item.getKey("/EF").getKey("/F").isStream()) 2116 item.getKey("/EF").getKey("/F").isStream())
2102 { 2117 {
2103 QPDFObjectHandle stream = item.getKey("/EF").getKey("/F"); 2118 QPDFObjectHandle stream = item.getKey("/EF").getKey("/F");
2104 - this->attachment_streams.insert(  
2105 - QPDFObjGen(stream.getObjectID(), stream.getGeneration())); 2119 + this->attachment_streams.insert(stream.getObjGen());
2106 } 2120 }
2107 } 2121 }
2108 } 2122 }
libqpdf/QPDFObjGen.cc
@@ -13,6 +13,12 @@ QPDFObjGen::operator&lt;(QPDFObjGen const&amp; rhs) const @@ -13,6 +13,12 @@ QPDFObjGen::operator&lt;(QPDFObjGen const&amp; rhs) const
13 ((this->obj == rhs.obj) && (this->gen < rhs.gen))); 13 ((this->obj == rhs.obj) && (this->gen < rhs.gen)));
14 } 14 }
15 15
  16 +bool
  17 +QPDFObjGen::operator==(QPDFObjGen const& rhs) const
  18 +{
  19 + return ((this->obj == rhs.obj) && (this->gen == rhs.gen));
  20 +}
  21 +
16 int 22 int
17 QPDFObjGen::getObj() const 23 QPDFObjGen::getObj() const
18 { 24 {
libqpdf/QPDF_linearization.cc
@@ -336,9 +336,7 @@ QPDF::readHintStream(Pipeline&amp; pl, qpdf_offset_t offset, size_t length) @@ -336,9 +336,7 @@ QPDF::readHintStream(Pipeline&amp; pl, qpdf_offset_t offset, size_t length)
336 QTC::TC("qpdf", "QPDF hint table length indirect"); 336 QTC::TC("qpdf", "QPDF hint table length indirect");
337 // Force resolution 337 // Force resolution
338 (void) length_obj.getIntValue(); 338 (void) length_obj.getIntValue();
339 - ObjCache& oc = this->obj_cache  
340 - [QPDFObjGen(length_obj.getObjectID(),  
341 - length_obj.getGeneration())]; 339 + ObjCache& oc = this->obj_cache[length_obj.getObjGen()];
342 min_end_offset = oc.end_before_space; 340 min_end_offset = oc.end_before_space;
343 max_end_offset = oc.end_after_space; 341 max_end_offset = oc.end_after_space;
344 } 342 }
@@ -499,7 +497,7 @@ QPDF::checkLinearizationInternal() @@ -499,7 +497,7 @@ QPDF::checkLinearizationInternal()
499 for (int i = 0; i < npages; ++i) 497 for (int i = 0; i < npages; ++i)
500 { 498 {
501 QPDFObjectHandle const& page = pages[i]; 499 QPDFObjectHandle const& page = pages[i];
502 - QPDFObjGen og(page.getObjectID(), page.getGeneration()); 500 + QPDFObjGen og(page.getObjGen());
503 if (this->xref_table[og].getType() == 2) 501 if (this->xref_table[og].getType() == 2)
504 { 502 {
505 errors.push_back("page dictionary for page " + 503 errors.push_back("page dictionary for page " +
@@ -582,7 +580,7 @@ QPDF::checkLinearizationInternal() @@ -582,7 +580,7 @@ QPDF::checkLinearizationInternal()
582 for (std::vector<QPDFObjectHandle>::iterator iter = this->part6.begin(); 580 for (std::vector<QPDFObjectHandle>::iterator iter = this->part6.begin();
583 iter != this->part6.end(); ++iter) 581 iter != this->part6.end(); ++iter)
584 { 582 {
585 - QPDFObjGen og((*iter).getObjectID(), (*iter).getGeneration()); 583 + QPDFObjGen og((*iter).getObjGen());
586 // All objects have to have been dereferenced to be classified. 584 // All objects have to have been dereferenced to be classified.
587 assert(this->obj_cache.count(og) > 0); 585 assert(this->obj_cache.count(og) > 0);
588 ObjCache const& oc = this->obj_cache[og]; 586 ObjCache const& oc = this->obj_cache[og];
@@ -740,7 +738,7 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors, @@ -740,7 +738,7 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors,
740 unsigned int npages = pages.size(); 738 unsigned int npages = pages.size();
741 int table_offset = adjusted_offset( 739 int table_offset = adjusted_offset(
742 this->page_offset_hints.first_page_offset); 740 this->page_offset_hints.first_page_offset);
743 - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); 741 + QPDFObjGen first_page_og(pages[0].getObjGen());
744 assert(this->xref_table.count(first_page_og) > 0); 742 assert(this->xref_table.count(first_page_og) > 0);
745 int offset = getLinearizationOffset(first_page_og); 743 int offset = getLinearizationOffset(first_page_og);
746 if (table_offset != offset) 744 if (table_offset != offset)
@@ -750,8 +748,7 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors, @@ -750,8 +748,7 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors,
750 748
751 for (unsigned int pageno = 0; pageno < npages; ++pageno) 749 for (unsigned int pageno = 0; pageno < npages; ++pageno)
752 { 750 {
753 - QPDFObjGen page_og(pages[pageno].getObjectID(),  
754 - pages[pageno].getGeneration()); 751 + QPDFObjGen page_og(pages[pageno].getObjGen());
755 int first_object = page_og.getObj(); 752 int first_object = page_og.getObj();
756 assert(this->xref_table.count(page_og) > 0); 753 assert(this->xref_table.count(page_og) > 0);
757 offset = getLinearizationOffset(page_og); 754 offset = getLinearizationOffset(page_og);
@@ -961,7 +958,7 @@ QPDF::checkHOutlines(std::list&lt;std::string&gt;&amp; warnings) @@ -961,7 +958,7 @@ QPDF::checkHOutlines(std::list&lt;std::string&gt;&amp; warnings)
961 { 958 {
962 // Check length and offset. Acrobat gets these wrong. 959 // Check length and offset. Acrobat gets these wrong.
963 QPDFObjectHandle outlines = getRoot().getKey("/Outlines"); 960 QPDFObjectHandle outlines = getRoot().getKey("/Outlines");
964 - QPDFObjGen og(outlines.getObjectID(), outlines.getGeneration()); 961 + QPDFObjGen og(outlines.getObjGen());
965 assert(this->xref_table.count(og) > 0); 962 assert(this->xref_table.count(og) > 0);
966 int offset = getLinearizationOffset(og); 963 int offset = getLinearizationOffset(og);
967 ObjUser ou(ObjUser::ou_root_key, "/Outlines"); 964 ObjUser ou(ObjUser::ou_root_key, "/Outlines");
@@ -1466,7 +1463,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data) @@ -1466,7 +1463,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1466 // will do the same. 1463 // will do the same.
1467 1464
1468 // First, place the actual first page object itself. 1465 // First, place the actual first page object itself.
1469 - QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration()); 1466 + QPDFObjGen first_page_og(pages[0].getObjGen());
1470 if (! lc_first_page_private.count(first_page_og)) 1467 if (! lc_first_page_private.count(first_page_og))
1471 { 1468 {
1472 throw std::logic_error( 1469 throw std::logic_error(
@@ -1515,7 +1512,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data) @@ -1515,7 +1512,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1515 { 1512 {
1516 // Place this page's page object 1513 // Place this page's page object
1517 1514
1518 - QPDFObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration()); 1515 + QPDFObjGen page_og(pages[i].getObjGen());
1519 if (! lc_other_page_private.count(page_og)) 1516 if (! lc_other_page_private.count(page_og))
1520 { 1517 {
1521 throw std::logic_error( 1518 throw std::logic_error(
@@ -1598,7 +1595,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data) @@ -1598,7 +1595,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1598 if (! thumb.isNull()) 1595 if (! thumb.isNull())
1599 { 1596 {
1600 // Output the thumbnail itself 1597 // Output the thumbnail itself
1601 - QPDFObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration()); 1598 + QPDFObjGen thumb_og(thumb.getObjGen());
1602 if (lc_thumbnail_private.count(thumb_og)) 1599 if (lc_thumbnail_private.count(thumb_og))
1603 { 1600 {
1604 lc_thumbnail_private.erase(thumb_og); 1601 lc_thumbnail_private.erase(thumb_og);
@@ -1753,7 +1750,7 @@ QPDF::pushOutlinesToPart( @@ -1753,7 +1750,7 @@ QPDF::pushOutlinesToPart(
1753 return; 1750 return;
1754 } 1751 }
1755 outlines = getUncompressedObject(outlines, object_stream_data); 1752 outlines = getUncompressedObject(outlines, object_stream_data);
1756 - QPDFObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration()); 1753 + QPDFObjGen outlines_og(outlines.getObjGen());
1757 QTC::TC("qpdf", "QPDF lin outlines in part", 1754 QTC::TC("qpdf", "QPDF lin outlines in part",
1758 ((&part == (&this->part6)) ? 0 1755 ((&part == (&this->part6)) ? 0
1759 : (&part == (&this->part9)) ? 1 1756 : (&part == (&this->part9)) ? 1
libqpdf/QPDF_optimization.cc
@@ -115,7 +115,7 @@ QPDF::optimize(std::map&lt;int, int&gt; const&amp; object_stream_data, @@ -115,7 +115,7 @@ QPDF::optimize(std::map&lt;int, int&gt; const&amp; object_stream_data,
115 } 115 }
116 116
117 ObjUser root_ou = ObjUser(ObjUser::ou_root); 117 ObjUser root_ou = ObjUser(ObjUser::ou_root);
118 - QPDFObjGen root_og = QPDFObjGen(root.getObjectID(), root.getGeneration()); 118 + QPDFObjGen root_og = QPDFObjGen(root.getObjGen());
119 obj_user_to_objects[root_ou].insert(root_og); 119 obj_user_to_objects[root_ou].insert(root_og);
120 object_to_obj_users[root_og].insert(root_ou); 120 object_to_obj_users[root_og].insert(root_ou);
121 121
@@ -338,7 +338,7 @@ QPDF::updateObjectMapsInternal(ObjUser const&amp; ou, QPDFObjectHandle oh, @@ -338,7 +338,7 @@ QPDF::updateObjectMapsInternal(ObjUser const&amp; ou, QPDFObjectHandle oh,
338 338
339 if (oh.isIndirect()) 339 if (oh.isIndirect())
340 { 340 {
341 - QPDFObjGen og(oh.getObjectID(), oh.getGeneration()); 341 + QPDFObjGen og(oh.getObjGen());
342 if (visited.count(og)) 342 if (visited.count(og))
343 { 343 {
344 QTC::TC("qpdf", "QPDF opt loop detected"); 344 QTC::TC("qpdf", "QPDF opt loop detected");
libqpdf/QPDF_pages.cc
@@ -127,7 +127,7 @@ void @@ -127,7 +127,7 @@ void
127 QPDF::insertPageobjToPage(QPDFObjectHandle const& obj, int pos, 127 QPDF::insertPageobjToPage(QPDFObjectHandle const& obj, int pos,
128 bool check_duplicate) 128 bool check_duplicate)
129 { 129 {
130 - QPDFObjGen og(obj.getObjectID(), obj.getGeneration()); 130 + QPDFObjGen og(obj.getObjGen());
131 if (check_duplicate) 131 if (check_duplicate)
132 { 132 {
133 if (! this->pageobj_to_pages_pos.insert(std::make_pair(og, pos)).second) 133 if (! this->pageobj_to_pages_pos.insert(std::make_pair(og, pos)).second)
@@ -214,8 +214,7 @@ QPDF::removePage(QPDFObjectHandle page) @@ -214,8 +214,7 @@ QPDF::removePage(QPDFObjectHandle page)
214 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages)); 214 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages));
215 this->all_pages.erase(this->all_pages.begin() + pos); 215 this->all_pages.erase(this->all_pages.begin() + pos);
216 assert(this->all_pages.size() == static_cast<size_t>(npages)); 216 assert(this->all_pages.size() == static_cast<size_t>(npages));
217 - this->pageobj_to_pages_pos.erase(  
218 - QPDFObjGen(page.getObjectID(), page.getGeneration())); 217 + this->pageobj_to_pages_pos.erase(page.getObjGen());
219 assert(this->pageobj_to_pages_pos.size() == static_cast<size_t>(npages)); 218 assert(this->pageobj_to_pages_pos.size() == static_cast<size_t>(npages));
220 for (int i = pos; i < npages; ++i) 219 for (int i = pos; i < npages; ++i)
221 { 220 {
@@ -253,18 +252,18 @@ int @@ -253,18 +252,18 @@ int
253 QPDF::findPage(QPDFObjectHandle& page) 252 QPDF::findPage(QPDFObjectHandle& page)
254 { 253 {
255 page.assertPageObject(); 254 page.assertPageObject();
256 - return findPage(page.getObjectID(), page.getGeneration()); 255 + return findPage(page.getObjGen());
257 } 256 }
258 257
259 int 258 int
260 -QPDF::findPage(int objid, int generation) 259 +QPDF::findPage(QPDFObjGen const& og)
261 { 260 {
262 flattenPagesTree(); 261 flattenPagesTree();
263 std::map<QPDFObjGen, int>::iterator it = 262 std::map<QPDFObjGen, int>::iterator it =
264 - this->pageobj_to_pages_pos.find(QPDFObjGen(objid, generation)); 263 + this->pageobj_to_pages_pos.find(og);
265 if (it == this->pageobj_to_pages_pos.end()) 264 if (it == this->pageobj_to_pages_pos.end())
266 { 265 {
267 - setLastObjectDescription("page object", objid, generation); 266 + setLastObjectDescription("page object", og.getObj(), og.getGen());
268 throw QPDFExc(qpdf_e_pages, this->file->getName(), 267 throw QPDFExc(qpdf_e_pages, this->file->getName(),
269 this->last_object_description, 0, 268 this->last_object_description, 0,
270 "page object not referenced in /Pages tree"); 269 "page object not referenced in /Pages tree");
qpdf/qpdf.cc
@@ -1621,8 +1621,7 @@ int main(int argc, char* argv[]) @@ -1621,8 +1621,7 @@ int main(int argc, char* argv[])
1621 { 1621 {
1622 if (selected_from_orig.count(pageno) == 0) 1622 if (selected_from_orig.count(pageno) == 0)
1623 { 1623 {
1624 - pdf.replaceObject(orig_pages[pageno].getObjectID(),  
1625 - orig_pages[pageno].getGeneration(), 1624 + pdf.replaceObject(orig_pages[pageno].getObjGen(),
1626 QPDFObjectHandle::newNull()); 1625 QPDFObjectHandle::newNull());
1627 } 1626 }
1628 } 1627 }
qpdf/test_driver.cc
@@ -659,8 +659,7 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -659,8 +659,7 @@ void runtest(int n, char const* filename1, char const* arg2)
659 " not called 4-page file"); 659 " not called 4-page file");
660 } 660 }
661 // Swap pages 2 and 3 661 // Swap pages 2 and 3
662 - pdf.swapObjects(pages[1].getObjectID(), pages[1].getGeneration(),  
663 - pages[2].getObjectID(), pages[2].getGeneration()); 662 + pdf.swapObjects(pages[1].getObjGen(), pages[2].getObjGen());
664 // Replace object and swap objects 663 // Replace object and swap objects
665 QPDFObjectHandle trailer = pdf.getTrailer(); 664 QPDFObjectHandle trailer = pdf.getTrailer();
666 QPDFObjectHandle qdict = trailer.getKey("/QDict"); 665 QPDFObjectHandle qdict = trailer.getKey("/QDict");
@@ -672,21 +671,18 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -672,21 +671,18 @@ void runtest(int n, char const* filename1, char const* arg2)
672 try 671 try
673 { 672 {
674 // Do it wrong first... 673 // Do it wrong first...
675 - pdf.replaceObject(qdict.getObjectID(), qdict.getGeneration(),  
676 - qdict); 674 + pdf.replaceObject(qdict.getObjGen(), qdict);
677 } 675 }
678 catch (std::logic_error) 676 catch (std::logic_error)
679 { 677 {
680 std::cout << "caught logic error as expected" << std::endl; 678 std::cout << "caught logic error as expected" << std::endl;
681 } 679 }
682 - pdf.replaceObject(qdict.getObjectID(), qdict.getGeneration(),  
683 - new_dict); 680 + pdf.replaceObject(qdict.getObjGen(), new_dict);
684 // Now qdict still points to the old dictionary 681 // Now qdict still points to the old dictionary
685 std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue() 682 std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue()
686 << std::endl; 683 << std::endl;
687 // Swap dict and array 684 // Swap dict and array
688 - pdf.swapObjects(qdict.getObjectID(), qdict.getGeneration(),  
689 - qarray.getObjectID(), qarray.getGeneration()); 685 + pdf.swapObjects(qdict.getObjGen(), qarray.getObjGen());
690 // Now qarray will resolve to new object but qdict is still 686 // Now qarray will resolve to new object but qdict is still
691 // the old object 687 // the old object
692 std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue() 688 std::cout << "old dict: " << qdict.getKey("/Dict").getIntValue()
@@ -694,7 +690,7 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -694,7 +690,7 @@ void runtest(int n, char const* filename1, char const* arg2)
694 std::cout << "new dict: " << qarray.getKey("/NewDict").getIntValue() 690 std::cout << "new dict: " << qarray.getKey("/NewDict").getIntValue()
695 << std::endl; 691 << std::endl;
696 // Reread qdict, now pointing to an array 692 // Reread qdict, now pointing to an array
697 - qdict = pdf.getObjectByID(qdict.getObjectID(), qdict.getGeneration()); 693 + qdict = pdf.getObjectByObjGen(qdict.getObjGen());
698 std::cout << "swapped array: " << qdict.getArrayItem(0).getName() 694 std::cout << "swapped array: " << qdict.getArrayItem(0).getName()
699 << std::endl; 695 << std::endl;
700 696
@@ -788,14 +784,14 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -788,14 +784,14 @@ void runtest(int n, char const* filename1, char const* arg2)
788 pdf.addPage(new_pages[0], true); 784 pdf.addPage(new_pages[0], true);
789 checkPageContents(pages[0], "New page 1"); 785 checkPageContents(pages[0], "New page 1");
790 pdf.addPageAt(new_pages[1], true, pages[0]); 786 pdf.addPageAt(new_pages[1], true, pages[0]);
791 - assert(pages[0].getObjectID() == new_pages[1].getObjectID()); 787 + assert(pages[0].getObjGen() == new_pages[1].getObjGen());
792 pdf.addPageAt(new_pages[2], true, pages[5]); 788 pdf.addPageAt(new_pages[2], true, pages[5]);
793 - assert(pages[5].getObjectID() == new_pages[2].getObjectID()); 789 + assert(pages[5].getObjGen() == new_pages[2].getObjGen());
794 pdf.addPageAt(new_pages[3], false, pages[5]); 790 pdf.addPageAt(new_pages[3], false, pages[5]);
795 - assert(pages[6].getObjectID() == new_pages[3].getObjectID()); 791 + assert(pages[6].getObjGen() == new_pages[3].getObjGen());
796 assert(pages.size() == 11); 792 assert(pages.size() == 11);
797 pdf.addPage(new_pages[4], false); 793 pdf.addPage(new_pages[4], false);
798 - assert(pages[11].getObjectID() == new_pages[4].getObjectID()); 794 + assert(pages[11].getObjGen() == new_pages[4].getObjGen());
799 pdf.addPageAt(new_pages[5], false, pages.back()); 795 pdf.addPageAt(new_pages[5], false, pages.back());
800 assert(pages.size() == 13); 796 assert(pages.size() == 13);
801 checkPageContents(pages[0], "New page 0"); 797 checkPageContents(pages[0], "New page 0");
@@ -835,7 +831,7 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -835,7 +831,7 @@ void runtest(int n, char const* filename1, char const* arg2)
835 assert(all_pages.size() == 10); 831 assert(all_pages.size() == 10);
836 pdf.updateAllPagesCache(); 832 pdf.updateAllPagesCache();
837 assert(all_pages.size() == 11); 833 assert(all_pages.size() == 11);
838 - assert(all_pages.back().getObjectID() == page.getObjectID()); 834 + assert(all_pages.back().getObjGen() == page.getObjGen());
839 835
840 QPDFWriter w(pdf, "a.pdf"); 836 QPDFWriter w(pdf, "a.pdf");
841 w.setStaticID(true); 837 w.setStaticID(true);
@@ -862,7 +858,7 @@ void runtest(int n, char const* filename1, char const* arg2) @@ -862,7 +858,7 @@ void runtest(int n, char const* filename1, char const* arg2)
862 pdf.removePage(page5); 858 pdf.removePage(page5);
863 pdf.addPage(page5, false); 859 pdf.addPage(page5, false);
864 assert(pages.size() == 10); 860 assert(pages.size() == 10);
865 - assert(pages.back().getObjectID() == page5.getObjectID()); 861 + assert(pages.back().getObjGen() == page5.getObjGen());
866 862
867 QPDFWriter w(pdf, "a.pdf"); 863 QPDFWriter w(pdf, "a.pdf");
868 w.setStaticID(true); 864 w.setStaticID(true);