Commit d88231e01ec3083fa99363efcd5b049fb1663a6c

Authored by Jay Berkenbilt
1 parent 690d6031

Promote QPDF::ObjGen to top-level object QPDFObjGen

ChangeLog
  1 +2013-06-14 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Add new QPDFObjGen object to represent an object ID/generation
  4 + pair.
  5 +
1 6 2013-04-14 Jay Berkenbilt <ejb@ql.org>
2 7  
3 8 * 4.1.0: release
... ...
include/qpdf/QPDF.hh
... ... @@ -17,6 +17,7 @@
17 17 #include <list>
18 18 #include <iostream>
19 19  
  20 +#include <qpdf/QPDFObjGen.hh>
20 21 #include <qpdf/QPDFXRefEntry.hh>
21 22 #include <qpdf/QPDFObjectHandle.hh>
22 23 #include <qpdf/QPDFTokenizer.hh>
... ... @@ -519,17 +520,6 @@ class QPDF
519 520 private:
520 521 static std::string qpdf_version;
521 522  
522   - class ObjGen
523   - {
524   - public:
525   - ObjGen();
526   - ObjGen(int obj, int gen);
527   - bool operator<(ObjGen const&) const;
528   -
529   - int obj;
530   - int gen;
531   - };
532   -
533 523 class ObjCache
534 524 {
535 525 public:
... ... @@ -555,9 +545,9 @@ class QPDF
555 545 class ObjCopier
556 546 {
557 547 public:
558   - std::map<ObjGen, QPDFObjectHandle> object_map;
  548 + std::map<QPDFObjGen, QPDFObjectHandle> object_map;
559 549 std::vector<QPDFObjectHandle> to_copy;
560   - std::set<ObjGen> visiting;
  550 + std::set<QPDFObjGen> visiting;
561 551 };
562 552  
563 553 class CopiedStreamDataProvider: public QPDFObjectHandle::StreamDataProvider
... ... @@ -568,11 +558,11 @@ class QPDF
568 558 }
569 559 virtual void provideStreamData(int objid, int generation,
570 560 Pipeline* pipeline);
571   - void registerForeignStream(ObjGen const& local_og,
  561 + void registerForeignStream(QPDFObjGen const& local_og,
572 562 QPDFObjectHandle foreign_stream);
573 563  
574 564 private:
575   - std::map<ObjGen, QPDFObjectHandle> foreign_streams;
  565 + std::map<QPDFObjGen, QPDFObjectHandle> foreign_streams;
576 566 };
577 567  
578 568 class StringDecrypter: public QPDFObjectHandle::StringDecrypter
... ... @@ -932,7 +922,7 @@ class QPDF
932 922 void readHSharedObject(BitStream);
933 923 void readHGeneric(BitStream, HGeneric&);
934 924 qpdf_offset_t maxEnd(ObjUser const& ou);
935   - qpdf_offset_t getLinearizationOffset(ObjGen const&);
  925 + qpdf_offset_t getLinearizationOffset(QPDFObjGen const&);
936 926 QPDFObjectHandle getUncompressedObject(
937 927 QPDFObjectHandle&, std::map<int, int> const& object_stream_data);
938 928 int lengthNextN(int first_object, int n,
... ... @@ -950,12 +940,12 @@ class QPDF
950 940 void dumpHSharedObject();
951 941 void dumpHGeneric(HGeneric&);
952 942 int adjusted_offset(int offset);
953   - QPDFObjectHandle objGenToIndirect(ObjGen const&);
  943 + QPDFObjectHandle objGenToIndirect(QPDFObjGen const&);
954 944 void calculateLinearizationData(
955 945 std::map<int, int> const& object_stream_data);
956 946 void pushOutlinesToPart(
957 947 std::vector<QPDFObjectHandle>& part,
958   - std::set<ObjGen>& lc_outlines,
  948 + std::set<QPDFObjGen>& lc_outlines,
959 949 std::map<int, int> const& object_stream_data);
960 950 int outputLengthNextN(
961 951 int in_object, int n,
... ... @@ -989,7 +979,7 @@ class QPDF
989 979 bool allow_changes, bool warn_skipped_keys);
990 980 void updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh);
991 981 void updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh,
992   - std::set<ObjGen>& visited, bool top);
  982 + std::set<QPDFObjGen>& visited, bool top);
993 983 void filterCompressedObjects(std::map<int, int> const& object_stream_data);
994 984  
995 985  
... ... @@ -1017,19 +1007,19 @@ class QPDF
1017 1007 int cached_key_objid;
1018 1008 int cached_key_generation;
1019 1009 std::string pdf_version;
1020   - std::map<ObjGen, QPDFXRefEntry> xref_table;
  1010 + std::map<QPDFObjGen, QPDFXRefEntry> xref_table;
1021 1011 std::set<int> deleted_objects;
1022   - std::map<ObjGen, ObjCache> obj_cache;
  1012 + std::map<QPDFObjGen, ObjCache> obj_cache;
1023 1013 QPDFObjectHandle trailer;
1024 1014 std::vector<QPDFObjectHandle> all_pages;
1025   - std::map<ObjGen, int> pageobj_to_pages_pos;
  1015 + std::map<QPDFObjGen, int> pageobj_to_pages_pos;
1026 1016 bool pushed_inherited_attributes_to_pages;
1027 1017 std::vector<QPDFExc> warnings;
1028 1018 std::map<QPDF*, ObjCopier> object_copiers;
1029 1019 PointerHolder<QPDFObjectHandle::StreamDataProvider> copied_streams;
1030 1020 // copied_stream_data_provider is owned by copied_streams
1031 1021 CopiedStreamDataProvider* copied_stream_data_provider;
1032   - std::set<ObjGen> attachment_streams;
  1022 + std::set<QPDFObjGen> attachment_streams;
1033 1023  
1034 1024 // Linearization data
1035 1025 qpdf_offset_t first_xref_item_offset; // actual value from file
... ... @@ -1061,8 +1051,8 @@ class QPDF
1061 1051 std::vector<QPDFObjectHandle> part9;
1062 1052  
1063 1053 // Optimization data
1064   - std::map<ObjUser, std::set<ObjGen> > obj_user_to_objects;
1065   - std::map<ObjGen, std::set<ObjUser> > object_to_obj_users;
  1054 + std::map<ObjUser, std::set<QPDFObjGen> > obj_user_to_objects;
  1055 + std::map<QPDFObjGen, std::set<ObjUser> > object_to_obj_users;
1066 1056 };
1067 1057  
1068 1058 #endif // __QPDF_HH__
... ...
include/qpdf/QPDFObjGen.hh 0 โ†’ 100644
  1 +// Copyright (c) 2005-2013 Jay Berkenbilt
  2 +//
  3 +// This file is part of qpdf. This software may be distributed under
  4 +// the terms of version 2 of the Artistic License which may be found
  5 +// in the source distribution. It is provided "as is" without express
  6 +// or implied warranty.
  7 +
  8 +#ifndef __QPDFOBJGEN_HH__
  9 +#define __QPDFOBJGEN_HH__
  10 +
  11 +#include <qpdf/DLL.h>
  12 +
  13 +// This class represents an object ID and generation pair. It is
  14 +// suitable to use as a key in a map or set.
  15 +
  16 +class QPDFObjGen
  17 +{
  18 + public:
  19 + QPDF_DLL
  20 + QPDFObjGen();
  21 + QPDF_DLL
  22 + QPDFObjGen(int obj, int gen);
  23 + QPDF_DLL
  24 + bool operator<(QPDFObjGen const&) const;
  25 + QPDF_DLL
  26 + int getObj() const;
  27 + QPDF_DLL
  28 + int getGen() const;
  29 +
  30 + private:
  31 + int obj;
  32 + int gen;
  33 +};
  34 +
  35 +#endif // __QPDFOBJGEN_HH__
... ...
libqpdf/QPDF.cc
... ... @@ -39,32 +39,18 @@ static char const* EMPTY_PDF =
39 39 "110\n"
40 40 "%%EOF\n";
41 41  
42   -
43   -QPDF::ObjGen::ObjGen(int o = 0, int g = 0) :
44   - obj(o),
45   - gen(g)
46   -{
47   -}
48   -
49   -bool
50   -QPDF::ObjGen::operator<(ObjGen const& rhs) const
51   -{
52   - return ((this->obj < rhs.obj) ||
53   - ((this->obj == rhs.obj) && (this->gen < rhs.gen)));
54   -}
55   -
56 42 void
57 43 QPDF::CopiedStreamDataProvider::provideStreamData(
58 44 int objid, int generation, Pipeline* pipeline)
59 45 {
60 46 QPDFObjectHandle foreign_stream =
61   - this->foreign_streams[ObjGen(objid, generation)];
  47 + this->foreign_streams[QPDFObjGen(objid, generation)];
62 48 foreign_stream.pipeStreamData(pipeline, false, false, false);
63 49 }
64 50  
65 51 void
66 52 QPDF::CopiedStreamDataProvider::registerForeignStream(
67   - ObjGen const& local_og, QPDFObjectHandle foreign_stream)
  53 + QPDFObjGen const& local_og, QPDFObjectHandle foreign_stream)
68 54 {
69 55 this->foreign_streams[local_og] = foreign_stream;
70 56 }
... ... @@ -128,7 +114,8 @@ QPDF::~QPDF()
128 114 // have the effect of undoing any modifications that may have been
129 115 // made to any of the objects.
130 116 this->xref_table.clear();
131   - for (std::map<ObjGen, ObjCache>::iterator iter = this->obj_cache.begin();
  117 + for (std::map<QPDFObjGen, ObjCache>::iterator iter =
  118 + this->obj_cache.begin();
132 119 iter != obj_cache.end(); ++iter)
133 120 {
134 121 QPDFObject::ObjAccessor::releaseResolved(
... ... @@ -354,8 +341,8 @@ QPDF::reconstruct_xref(QPDFExc&amp; e)
354 341 "Attempting to reconstruct cross-reference table"));
355 342  
356 343 // Delete all references to type 1 (uncompressed) objects
357   - std::set<ObjGen> to_delete;
358   - for (std::map<ObjGen, QPDFXRefEntry>::iterator iter =
  344 + std::set<QPDFObjGen> to_delete;
  345 + for (std::map<QPDFObjGen, QPDFXRefEntry>::iterator iter =
359 346 this->xref_table.begin();
360 347 iter != this->xref_table.end(); ++iter)
361 348 {
... ... @@ -364,7 +351,7 @@ QPDF::reconstruct_xref(QPDFExc&amp; e)
364 351 to_delete.insert((*iter).first);
365 352 }
366 353 }
367   - for (std::set<ObjGen>::iterator iter = to_delete.begin();
  354 + for (std::set<QPDFObjGen>::iterator iter = to_delete.begin();
368 355 iter != to_delete.end(); ++iter)
369 356 {
370 357 this->xref_table.erase(*iter);
... ... @@ -464,7 +451,7 @@ QPDF::read_xref(qpdf_offset_t xref_offset)
464 451 int max_obj = 0;
465 452 if (! xref_table.empty())
466 453 {
467   - max_obj = (*(xref_table.rbegin())).first.obj;
  454 + max_obj = (*(xref_table.rbegin())).first.getObj();
468 455 }
469 456 if (! this->deleted_objects.empty())
470 457 {
... ... @@ -491,7 +478,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
491 478 PCRE xref_first_re("^\\s*(\\d+)\\s+(\\d+)");
492 479 PCRE xref_entry_re("(?s:(^\\d{10}) (\\d{5}) ([fn])[ \r\n]{2}$)");
493 480  
494   - std::vector<ObjGen> deleted_items;
  481 + std::vector<QPDFObjGen> deleted_items;
495 482  
496 483 this->file->seek(xref_offset, SEEK_SET);
497 484 bool done = false;
... ... @@ -538,7 +525,7 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
538 525 {
539 526 // Save deleted items until after we've checked the
540 527 // XRefStm, if any.
541   - deleted_items.push_back(ObjGen(i, f2));
  528 + deleted_items.push_back(QPDFObjGen(i, f2));
542 529 }
543 530 else
544 531 {
... ... @@ -615,11 +602,11 @@ QPDF::read_xrefTable(qpdf_offset_t xref_offset)
615 602 }
616 603  
617 604 // Handle any deleted items now that we've read the /XRefStm.
618   - for (std::vector<ObjGen>::iterator iter = deleted_items.begin();
  605 + for (std::vector<QPDFObjGen>::iterator iter = deleted_items.begin();
619 606 iter != deleted_items.end(); ++iter)
620 607 {
621   - ObjGen& og = *iter;
622   - insertXrefEntry(og.obj, 0, 0, og.gen);
  608 + QPDFObjGen& og = *iter;
  609 + insertXrefEntry(og.getObj(), 0, 0, og.getGen());
623 610 }
624 611  
625 612 if (cur_trailer.hasKey("/Prev"))
... ... @@ -874,7 +861,7 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite)
874 861 // object. Disregard this one.
875 862 { // private scope
876 863 int gen = (f0 == 2 ? 0 : f2);
877   - ObjGen og(obj, gen);
  864 + QPDFObjGen og(obj, gen);
878 865 if (this->xref_table.count(og))
879 866 {
880 867 if (overwrite)
... ... @@ -904,11 +891,11 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite)
904 891 case 1:
905 892 // f2 is generation
906 893 QTC::TC("qpdf", "QPDF xref gen > 0", ((f2 > 0) ? 1 : 0));
907   - this->xref_table[ObjGen(obj, f2)] = QPDFXRefEntry(f0, f1, f2);
  894 + this->xref_table[QPDFObjGen(obj, f2)] = QPDFXRefEntry(f0, f1, f2);
908 895 break;
909 896  
910 897 case 2:
911   - this->xref_table[ObjGen(obj, 0)] = QPDFXRefEntry(f0, f1, f2);
  898 + this->xref_table[QPDFObjGen(obj, 0)] = QPDFXRefEntry(f0, f1, f2);
912 899 break;
913 900  
914 901 default:
... ... @@ -923,13 +910,13 @@ QPDF::insertXrefEntry(int obj, int f0, qpdf_offset_t f1, int f2, bool overwrite)
923 910 void
924 911 QPDF::showXRefTable()
925 912 {
926   - for (std::map<ObjGen, QPDFXRefEntry>::iterator iter =
  913 + for (std::map<QPDFObjGen, QPDFXRefEntry>::iterator iter =
927 914 this->xref_table.begin();
928 915 iter != this->xref_table.end(); ++iter)
929 916 {
930   - ObjGen const& og = (*iter).first;
  917 + QPDFObjGen const& og = (*iter).first;
931 918 QPDFXRefEntry const& entry = (*iter).second;
932   - *out_stream << og.obj << "/" << og.gen << ": ";
  919 + *out_stream << og.getObj() << "/" << og.getGen() << ": ";
933 920 switch (entry.getType())
934 921 {
935 922 case 1:
... ... @@ -1213,14 +1200,14 @@ QPDF::recoverStreamLength(PointerHolder&lt;InputSource&gt; input,
1213 1200 if (length)
1214 1201 {
1215 1202 int this_obj_offset = 0;
1216   - ObjGen this_obj(0, 0);
  1203 + QPDFObjGen this_obj(0, 0);
1217 1204  
1218 1205 // Make sure this is inside this object
1219   - for (std::map<ObjGen, QPDFXRefEntry>::iterator iter =
  1206 + for (std::map<QPDFObjGen, QPDFXRefEntry>::iterator iter =
1220 1207 this->xref_table.begin();
1221 1208 iter != this->xref_table.end(); ++iter)
1222 1209 {
1223   - ObjGen const& og = (*iter).first;
  1210 + QPDFObjGen const& og = (*iter).first;
1224 1211 QPDFXRefEntry const& entry = (*iter).second;
1225 1212 if (entry.getType() == 1)
1226 1213 {
... ... @@ -1235,8 +1222,8 @@ QPDF::recoverStreamLength(PointerHolder&lt;InputSource&gt; input,
1235 1222 }
1236 1223 }
1237 1224 if (this_obj_offset &&
1238   - (this_obj.obj == objid) &&
1239   - (this_obj.gen == generation))
  1225 + (this_obj.getObj() == objid) &&
  1226 + (this_obj.getGen() == generation))
1240 1227 {
1241 1228 // Well, we found endstream\nendobj within the space
1242 1229 // allowed for this object, so we're probably in good
... ... @@ -1330,7 +1317,7 @@ QPDF::readObjectAtOffset(bool try_recovery,
1330 1317 {
1331 1318 // Try again after reconstructing xref table
1332 1319 reconstruct_xref(e);
1333   - ObjGen og(exp_objid, exp_generation);
  1320 + QPDFObjGen og(exp_objid, exp_generation);
1334 1321 if (this->xref_table.count(og) &&
1335 1322 (this->xref_table[og].getType() == 1))
1336 1323 {
... ... @@ -1375,7 +1362,7 @@ QPDF::readObjectAtOffset(bool try_recovery,
1375 1362 "expected endobj"));
1376 1363 }
1377 1364  
1378   - ObjGen og(objid, generation);
  1365 + QPDFObjGen og(objid, generation);
1379 1366 if (! this->obj_cache.count(og))
1380 1367 {
1381 1368 // Store the object in the cache here so it gets cached
... ... @@ -1425,7 +1412,7 @@ QPDF::resolve(int objid, int generation)
1425 1412 // Check object cache before checking xref table. This allows us
1426 1413 // to insert things into the object cache that don't actually
1427 1414 // exist in the file.
1428   - ObjGen og(objid, generation);
  1415 + QPDFObjGen og(objid, generation);
1429 1416 if (! this->obj_cache.count(og))
1430 1417 {
1431 1418 if (! this->xref_table.count(og))
... ... @@ -1482,7 +1469,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1482 1469  
1483 1470 // For linearization data in the object, use the data from the
1484 1471 // object stream for the objects in the stream.
1485   - ObjGen stream_og(obj_stream_number, 0);
  1472 + QPDFObjGen stream_og(obj_stream_number, 0);
1486 1473 qpdf_offset_t end_before_space =
1487 1474 this->obj_cache[stream_og].end_before_space;
1488 1475 qpdf_offset_t end_after_space =
... ... @@ -1548,7 +1535,7 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1548 1535 iter != offsets.end(); ++iter)
1549 1536 {
1550 1537 int obj = (*iter).first;
1551   - ObjGen og(obj, 0);
  1538 + QPDFObjGen og(obj, 0);
1552 1539 QPDFXRefEntry const& entry = this->xref_table[og];
1553 1540 if ((entry.getType() == 2) &&
1554 1541 (entry.getObjStreamNumber() == obj_stream_number))
... ... @@ -1570,19 +1557,20 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1570 1557 QPDFObjectHandle
1571 1558 QPDF::makeIndirectObject(QPDFObjectHandle oh)
1572 1559 {
1573   - ObjGen o1(0, 0);
  1560 + QPDFObjGen o1(0, 0);
1574 1561 if (! this->obj_cache.empty())
1575 1562 {
1576 1563 o1 = (*(this->obj_cache.rbegin())).first;
1577 1564 }
1578   - ObjGen o2 = (*(this->xref_table.rbegin())).first;
  1565 + QPDFObjGen o2 = (*(this->xref_table.rbegin())).first;
1579 1566 QTC::TC("qpdf", "QPDF indirect last obj from xref",
1580   - (o2.obj > o1.obj) ? 1 : 0);
1581   - int max_objid = std::max(o1.obj, o2.obj);
1582   - ObjGen next(max_objid + 1, 0);
  1567 + (o2.getObj() > o1.getObj()) ? 1 : 0);
  1568 + int max_objid = std::max(o1.getObj(), o2.getObj());
  1569 + QPDFObjGen next(max_objid + 1, 0);
1583 1570 this->obj_cache[next] =
1584 1571 ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1);
1585   - return QPDFObjectHandle::Factory::newIndirect(this, next.obj, next.gen);
  1572 + return QPDFObjectHandle::Factory::newIndirect(
  1573 + this, next.getObj(), next.getGen());
1586 1574 }
1587 1575  
1588 1576 QPDFObjectHandle
... ... @@ -1605,7 +1593,7 @@ QPDF::replaceObject(int objid, int generation, QPDFObjectHandle oh)
1605 1593 resolve(objid, generation);
1606 1594  
1607 1595 // Replace the object in the object cache
1608   - ObjGen og(objid, generation);
  1596 + QPDFObjGen og(objid, generation);
1609 1597 this->obj_cache[og] =
1610 1598 ObjCache(QPDFObjectHandle::ObjAccessor::getObject(oh), -1, -1);
1611 1599 }
... ... @@ -1653,8 +1641,8 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page)
1653 1641  
1654 1642 // Make sure we have an object in this file for every referenced
1655 1643 // object in the old file. obj_copier.object_map maps foreign
1656   - // ObjGen to local objects. For everything new that we have to
1657   - // copy, the local object will be a reservation, unless it is a
  1644 + // QPDFObjGen to local objects. For everything new that we have
  1645 + // to copy, the local object will be a reservation, unless it is a
1658 1646 // stream, in which case the local object will already be a
1659 1647 // stream.
1660 1648 reserveObjects(foreign, obj_copier, true);
... ... @@ -1675,14 +1663,14 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign, bool allow_page)
1675 1663 replaceForeignIndirectObjects(to_copy, obj_copier, true);
1676 1664 if (! to_copy.isStream())
1677 1665 {
1678   - ObjGen og(to_copy.getObjectID(), to_copy.getGeneration());
  1666 + QPDFObjGen og(to_copy.getObjectID(), to_copy.getGeneration());
1679 1667 replaceReserved(obj_copier.object_map[og], copy);
1680 1668 }
1681 1669 }
1682 1670 obj_copier.to_copy.clear();
1683 1671  
1684   - return obj_copier.object_map[ObjGen(foreign.getObjectID(),
1685   - foreign.getGeneration())];
  1672 + return obj_copier.object_map[QPDFObjGen(foreign.getObjectID(),
  1673 + foreign.getGeneration())];
1686 1674 }
1687 1675  
1688 1676 void
... ... @@ -1709,7 +1697,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier,
1709 1697  
1710 1698 if (foreign.isIndirect())
1711 1699 {
1712   - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
  1700 + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
1713 1701 if (obj_copier.visiting.find(foreign_og) != obj_copier.visiting.end())
1714 1702 {
1715 1703 QTC::TC("qpdf", "QPDF loop reserving objects");
... ... @@ -1717,7 +1705,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier,
1717 1705 }
1718 1706 QTC::TC("qpdf", "QPDF copy indirect");
1719 1707 obj_copier.visiting.insert(foreign_og);
1720   - std::map<ObjGen, QPDFObjectHandle>::iterator mapping =
  1708 + std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping =
1721 1709 obj_copier.object_map.find(foreign_og);
1722 1710 if (mapping == obj_copier.object_map.end())
1723 1711 {
... ... @@ -1762,7 +1750,7 @@ QPDF::reserveObjects(QPDFObjectHandle foreign, ObjCopier&amp; obj_copier,
1762 1750  
1763 1751 if (foreign.isIndirect())
1764 1752 {
1765   - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
  1753 + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
1766 1754 obj_copier.visiting.erase(foreign_og);
1767 1755 }
1768 1756 }
... ... @@ -1775,8 +1763,8 @@ QPDF::replaceForeignIndirectObjects(
1775 1763 if ((! top) && foreign.isIndirect())
1776 1764 {
1777 1765 QTC::TC("qpdf", "QPDF replace indirect");
1778   - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
1779   - std::map<ObjGen, QPDFObjectHandle>::iterator mapping =
  1766 + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
  1767 + std::map<QPDFObjGen, QPDFObjectHandle>::iterator mapping =
1780 1768 obj_copier.object_map.find(foreign_og);
1781 1769 if (mapping == obj_copier.object_map.end())
1782 1770 {
... ... @@ -1819,7 +1807,7 @@ QPDF::replaceForeignIndirectObjects(
1819 1807 else if (foreign.isStream())
1820 1808 {
1821 1809 QTC::TC("qpdf", "QPDF replace stream");
1822   - ObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
  1810 + QPDFObjGen foreign_og(foreign.getObjectID(), foreign.getGeneration());
1823 1811 result = obj_copier.object_map[foreign_og];
1824 1812 result.assertStream();
1825 1813 QPDFObjectHandle dict = result.getDict();
... ... @@ -1838,7 +1826,7 @@ QPDF::replaceForeignIndirectObjects(
1838 1826 this->copied_stream_data_provider = new CopiedStreamDataProvider();
1839 1827 this->copied_streams = this->copied_stream_data_provider;
1840 1828 }
1841   - ObjGen local_og(result.getObjectID(), result.getGeneration());
  1829 + QPDFObjGen local_og(result.getObjectID(), result.getGeneration());
1842 1830 this->copied_stream_data_provider->registerForeignStream(
1843 1831 local_og, foreign);
1844 1832 result.replaceStreamData(this->copied_streams,
... ... @@ -1867,8 +1855,8 @@ QPDF::swapObjects(int objid1, int generation1, int objid2, int generation2)
1867 1855 // cache.
1868 1856 resolve(objid1, generation1);
1869 1857 resolve(objid2, generation2);
1870   - ObjGen og1(objid1, generation1);
1871   - ObjGen og2(objid2, generation2);
  1858 + QPDFObjGen og1(objid1, generation1);
  1859 + QPDFObjGen og2(objid2, generation2);
1872 1860 ObjCache t = this->obj_cache[og1];
1873 1861 this->obj_cache[og1] = this->obj_cache[og2];
1874 1862 this->obj_cache[og2] = t;
... ... @@ -1925,15 +1913,15 @@ QPDF::getRoot()
1925 1913 void
1926 1914 QPDF::getObjectStreamData(std::map<int, int>& omap)
1927 1915 {
1928   - for (std::map<ObjGen, QPDFXRefEntry>::iterator iter =
  1916 + for (std::map<QPDFObjGen, QPDFXRefEntry>::iterator iter =
1929 1917 this->xref_table.begin();
1930 1918 iter != this->xref_table.end(); ++iter)
1931 1919 {
1932   - ObjGen const& og = (*iter).first;
  1920 + QPDFObjGen const& og = (*iter).first;
1933 1921 QPDFXRefEntry const& entry = (*iter).second;
1934 1922 if (entry.getType() == 2)
1935 1923 {
1936   - omap[og.obj] = entry.getObjStreamNumber();
  1924 + omap[og.getObj()] = entry.getObjStreamNumber();
1937 1925 }
1938 1926 }
1939 1927 }
... ... @@ -2114,7 +2102,7 @@ QPDF::findAttachmentStreams()
2114 2102 {
2115 2103 QPDFObjectHandle stream = item.getKey("/EF").getKey("/F");
2116 2104 this->attachment_streams.insert(
2117   - ObjGen(stream.getObjectID(), stream.getGeneration()));
  2105 + QPDFObjGen(stream.getObjectID(), stream.getGeneration()));
2118 2106 }
2119 2107 }
2120 2108 }
... ...
libqpdf/QPDFObjGen.cc 0 โ†’ 100644
  1 +#include <qpdf/QPDFObjGen.hh>
  2 +
  3 +QPDFObjGen::QPDFObjGen(int o = 0, int g = 0) :
  4 + obj(o),
  5 + gen(g)
  6 +{
  7 +}
  8 +
  9 +bool
  10 +QPDFObjGen::operator<(QPDFObjGen const& rhs) const
  11 +{
  12 + return ((this->obj < rhs.obj) ||
  13 + ((this->obj == rhs.obj) && (this->gen < rhs.gen)));
  14 +}
  15 +
  16 +int
  17 +QPDFObjGen::getObj() const
  18 +{
  19 + return this->obj;
  20 +}
  21 +
  22 +int
  23 +QPDFObjGen::getGen() const
  24 +{
  25 + return this->gen;
  26 +}
... ...
libqpdf/QPDF_encryption.cc
... ... @@ -1202,7 +1202,7 @@ QPDF::decryptStream(Pipeline*&amp; pipeline, int objid, int generation,
1202 1202 else
1203 1203 {
1204 1204 if (this->attachment_streams.count(
1205   - ObjGen(objid, generation)) > 0)
  1205 + QPDFObjGen(objid, generation)) > 0)
1206 1206 {
1207 1207 method = this->cf_file;
1208 1208 }
... ...
libqpdf/QPDF_linearization.cc
... ... @@ -312,7 +312,7 @@ QPDF::readHintStream(Pipeline&amp; pl, qpdf_offset_t offset, size_t length)
312 312 int gen;
313 313 QPDFObjectHandle H = readObjectAtOffset(
314 314 false, offset, "linearization hint stream", -1, 0, obj, gen);
315   - ObjCache& oc = this->obj_cache[ObjGen(obj, gen)];
  315 + ObjCache& oc = this->obj_cache[QPDFObjGen(obj, gen)];
316 316 qpdf_offset_t min_end_offset = oc.end_before_space;
317 317 qpdf_offset_t max_end_offset = oc.end_after_space;
318 318 if (! H.isStream())
... ... @@ -337,8 +337,8 @@ QPDF::readHintStream(Pipeline&amp; pl, qpdf_offset_t offset, size_t length)
337 337 // Force resolution
338 338 (void) length_obj.getIntValue();
339 339 ObjCache& oc = this->obj_cache
340   - [ObjGen(length_obj.getObjectID(),
341   - length_obj.getGeneration())];
  340 + [QPDFObjGen(length_obj.getObjectID(),
  341 + length_obj.getGeneration())];
342 342 min_end_offset = oc.end_before_space;
343 343 max_end_offset = oc.end_after_space;
344 344 }
... ... @@ -499,7 +499,7 @@ QPDF::checkLinearizationInternal()
499 499 for (int i = 0; i < npages; ++i)
500 500 {
501 501 QPDFObjectHandle const& page = pages[i];
502   - ObjGen og(page.getObjectID(), page.getGeneration());
  502 + QPDFObjGen og(page.getObjectID(), page.getGeneration());
503 503 if (this->xref_table[og].getType() == 2)
504 504 {
505 505 errors.push_back("page dictionary for page " +
... ... @@ -550,15 +550,15 @@ QPDF::checkLinearizationInternal()
550 550 // uncompressed.
551 551 { // local scope
552 552 std::map<int, int> object_stream_data;
553   - for (std::map<ObjGen, QPDFXRefEntry>::const_iterator iter =
  553 + for (std::map<QPDFObjGen, QPDFXRefEntry>::const_iterator iter =
554 554 this->xref_table.begin();
555 555 iter != this->xref_table.end(); ++iter)
556 556 {
557   - ObjGen const& og = (*iter).first;
  557 + QPDFObjGen const& og = (*iter).first;
558 558 QPDFXRefEntry const& entry = (*iter).second;
559 559 if (entry.getType() == 2)
560 560 {
561   - object_stream_data[og.obj] = entry.getObjStreamNumber();
  561 + object_stream_data[og.getObj()] = entry.getObjStreamNumber();
562 562 }
563 563 }
564 564 optimize(object_stream_data, false);
... ... @@ -582,7 +582,7 @@ QPDF::checkLinearizationInternal()
582 582 for (std::vector<QPDFObjectHandle>::iterator iter = this->part6.begin();
583 583 iter != this->part6.end(); ++iter)
584 584 {
585   - ObjGen og((*iter).getObjectID(), (*iter).getGeneration());
  585 + QPDFObjGen og((*iter).getObjectID(), (*iter).getGeneration());
586 586 // All objects have to have been dereferenced to be classified.
587 587 assert(this->obj_cache.count(og) > 0);
588 588 ObjCache const& oc = this->obj_cache[og];
... ... @@ -637,12 +637,12 @@ qpdf_offset_t
637 637 QPDF::maxEnd(ObjUser const& ou)
638 638 {
639 639 assert(this->obj_user_to_objects.count(ou) > 0);
640   - std::set<ObjGen> const& ogs = this->obj_user_to_objects[ou];
  640 + std::set<QPDFObjGen> const& ogs = this->obj_user_to_objects[ou];
641 641 qpdf_offset_t end = 0;
642   - for (std::set<ObjGen>::const_iterator iter = ogs.begin();
  642 + for (std::set<QPDFObjGen>::const_iterator iter = ogs.begin();
643 643 iter != ogs.end(); ++iter)
644 644 {
645   - ObjGen const& og = *iter;
  645 + QPDFObjGen const& og = *iter;
646 646 assert(this->obj_cache.count(og) > 0);
647 647 end = std::max(end, this->obj_cache[og].end_after_space);
648 648 }
... ... @@ -650,7 +650,7 @@ QPDF::maxEnd(ObjUser const&amp; ou)
650 650 }
651 651  
652 652 qpdf_offset_t
653   -QPDF::getLinearizationOffset(ObjGen const& og)
  653 +QPDF::getLinearizationOffset(QPDFObjGen const& og)
654 654 {
655 655 QPDFXRefEntry entry = this->xref_table[og];
656 656 qpdf_offset_t result = 0;
... ... @@ -663,7 +663,8 @@ QPDF::getLinearizationOffset(ObjGen const&amp; og)
663 663 case 2:
664 664 // For compressed objects, return the offset of the object
665 665 // stream that contains them.
666   - result = getLinearizationOffset(ObjGen(entry.getObjStreamNumber(), 0));
  666 + result = getLinearizationOffset(
  667 + QPDFObjGen(entry.getObjStreamNumber(), 0));
667 668 break;
668 669  
669 670 default:
... ... @@ -685,7 +686,7 @@ QPDF::getUncompressedObject(QPDFObjectHandle&amp; obj,
685 686 else
686 687 {
687 688 int repl = (*(object_stream_data.find(obj.getObjectID()))).second;
688   - return objGenToIndirect(ObjGen(repl, 0));
  689 + return objGenToIndirect(QPDFObjGen(repl, 0));
689 690 }
690 691 }
691 692  
... ... @@ -696,7 +697,7 @@ QPDF::lengthNextN(int first_object, int n,
696 697 int length = 0;
697 698 for (int i = 0; i < n; ++i)
698 699 {
699   - ObjGen og(first_object + i, 0);
  700 + QPDFObjGen og(first_object + i, 0);
700 701 if (this->xref_table.count(og) == 0)
701 702 {
702 703 errors.push_back(
... ... @@ -739,7 +740,7 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors,
739 740 unsigned int npages = pages.size();
740 741 int table_offset = adjusted_offset(
741 742 this->page_offset_hints.first_page_offset);
742   - ObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration());
  743 + QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration());
743 744 assert(this->xref_table.count(first_page_og) > 0);
744 745 int offset = getLinearizationOffset(first_page_og);
745 746 if (table_offset != offset)
... ... @@ -749,9 +750,9 @@ QPDF::checkHPageOffset(std::list&lt;std::string&gt;&amp; errors,
749 750  
750 751 for (unsigned int pageno = 0; pageno < npages; ++pageno)
751 752 {
752   - ObjGen page_og(pages[pageno].getObjectID(),
753   - pages[pageno].getGeneration());
754   - int first_object = page_og.obj;
  753 + QPDFObjGen page_og(pages[pageno].getObjectID(),
  754 + pages[pageno].getGeneration());
  755 + int first_object = page_og.getObj();
755 756 assert(this->xref_table.count(page_og) > 0);
756 757 offset = getLinearizationOffset(page_og);
757 758  
... ... @@ -906,7 +907,7 @@ QPDF::checkHSharedObject(std::list&lt;std::string&gt;&amp; errors,
906 907  
907 908 cur_object = so.first_shared_obj;
908 909  
909   - ObjGen og(cur_object, 0);
  910 + QPDFObjGen og(cur_object, 0);
910 911 assert(this->xref_table.count(og) > 0);
911 912 int offset = getLinearizationOffset(og);
912 913 int h_offset = adjusted_offset(so.first_shared_offset);
... ... @@ -960,7 +961,7 @@ QPDF::checkHOutlines(std::list&lt;std::string&gt;&amp; warnings)
960 961 {
961 962 // Check length and offset. Acrobat gets these wrong.
962 963 QPDFObjectHandle outlines = getRoot().getKey("/Outlines");
963   - ObjGen og(outlines.getObjectID(), outlines.getGeneration());
  964 + QPDFObjGen og(outlines.getObjectID(), outlines.getGeneration());
964 965 assert(this->xref_table.count(og) > 0);
965 966 int offset = getLinearizationOffset(og);
966 967 ObjUser ou(ObjUser::ou_root_key, "/Outlines");
... ... @@ -1170,9 +1171,9 @@ QPDF::dumpHGeneric(HGeneric&amp; t)
1170 1171 }
1171 1172  
1172 1173 QPDFObjectHandle
1173   -QPDF::objGenToIndirect(ObjGen const& og)
  1174 +QPDF::objGenToIndirect(QPDFObjGen const& og)
1174 1175 {
1175   - return getObjectByID(og.obj, og.gen);
  1176 + return getObjectByID(og.getObj(), og.getGen());
1176 1177 }
1177 1178  
1178 1179 void
... ... @@ -1280,22 +1281,22 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1280 1281 open_document_keys.insert("/OpenAction");
1281 1282 open_document_keys.insert("/AcroForm");
1282 1283  
1283   - std::set<ObjGen> lc_open_document;
1284   - std::set<ObjGen> lc_first_page_private;
1285   - std::set<ObjGen> lc_first_page_shared;
1286   - std::set<ObjGen> lc_other_page_private;
1287   - std::set<ObjGen> lc_other_page_shared;
1288   - std::set<ObjGen> lc_thumbnail_private;
1289   - std::set<ObjGen> lc_thumbnail_shared;
1290   - std::set<ObjGen> lc_other;
1291   - std::set<ObjGen> lc_outlines;
1292   - std::set<ObjGen> lc_root;
1293   -
1294   - for (std::map<ObjGen, std::set<ObjUser> >::iterator oiter =
  1284 + std::set<QPDFObjGen> lc_open_document;
  1285 + std::set<QPDFObjGen> lc_first_page_private;
  1286 + std::set<QPDFObjGen> lc_first_page_shared;
  1287 + std::set<QPDFObjGen> lc_other_page_private;
  1288 + std::set<QPDFObjGen> lc_other_page_shared;
  1289 + std::set<QPDFObjGen> lc_thumbnail_private;
  1290 + std::set<QPDFObjGen> lc_thumbnail_shared;
  1291 + std::set<QPDFObjGen> lc_other;
  1292 + std::set<QPDFObjGen> lc_outlines;
  1293 + std::set<QPDFObjGen> lc_root;
  1294 +
  1295 + for (std::map<QPDFObjGen, std::set<ObjUser> >::iterator oiter =
1295 1296 this->object_to_obj_users.begin();
1296 1297 oiter != this->object_to_obj_users.end(); ++oiter)
1297 1298 {
1298   - ObjGen const& og = (*oiter).first;
  1299 + QPDFObjGen const& og = (*oiter).first;
1299 1300  
1300 1301 std::set<ObjUser>& ous = (*oiter).second;
1301 1302  
... ... @@ -1414,10 +1415,10 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1414 1415 // optimizing this by going straight into the vector, we'll leave
1415 1416 // these phases separate for now. That way, this section can be
1416 1417 // concerned only with ordering, and the above section can be
1417   - // considered only with categorization. Note that sets of ObjGens
1418   - // are sorted by ObjGen. In a linearized file, objects appear in
1419   - // sequence with the possible exception of hints tables which we
1420   - // won't see here anyway. That means that running
  1418 + // considered only with categorization. Note that sets of
  1419 + // QPDFObjGens are sorted by QPDFObjGen. In a linearized file,
  1420 + // objects appear in sequence with the possible exception of hints
  1421 + // tables which we won't see here anyway. That means that running
1421 1422 // calculateLinearizationData() on a linearized file should give
1422 1423 // results identical to the original file ordering.
1423 1424  
... ... @@ -1452,7 +1453,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1452 1453  
1453 1454 assert(lc_root.size() == 1);
1454 1455 this->part4.push_back(objGenToIndirect(*(lc_root.begin())));
1455   - for (std::set<ObjGen>::iterator iter = lc_open_document.begin();
  1456 + for (std::set<QPDFObjGen>::iterator iter = lc_open_document.begin();
1456 1457 iter != lc_open_document.end(); ++iter)
1457 1458 {
1458 1459 this->part4.push_back(objGenToIndirect(*iter));
... ... @@ -1465,7 +1466,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1465 1466 // will do the same.
1466 1467  
1467 1468 // First, place the actual first page object itself.
1468   - ObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration());
  1469 + QPDFObjGen first_page_og(pages[0].getObjectID(), pages[0].getGeneration());
1469 1470 if (! lc_first_page_private.count(first_page_og))
1470 1471 {
1471 1472 throw std::logic_error(
... ... @@ -1481,13 +1482,13 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1481 1482 // groups private and shared objects contiguously for the sake of
1482 1483 // hint tables.
1483 1484  
1484   - for (std::set<ObjGen>::iterator iter = lc_first_page_private.begin();
  1485 + for (std::set<QPDFObjGen>::iterator iter = lc_first_page_private.begin();
1485 1486 iter != lc_first_page_private.end(); ++iter)
1486 1487 {
1487 1488 this->part6.push_back(objGenToIndirect(*iter));
1488 1489 }
1489 1490  
1490   - for (std::set<ObjGen>::iterator iter = lc_first_page_shared.begin();
  1491 + for (std::set<QPDFObjGen>::iterator iter = lc_first_page_shared.begin();
1491 1492 iter != lc_first_page_shared.end(); ++iter)
1492 1493 {
1493 1494 this->part6.push_back(objGenToIndirect(*iter));
... ... @@ -1514,7 +1515,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1514 1515 {
1515 1516 // Place this page's page object
1516 1517  
1517   - ObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration());
  1518 + QPDFObjGen page_og(pages[i].getObjectID(), pages[i].getGeneration());
1518 1519 if (! lc_other_page_private.count(page_og))
1519 1520 {
1520 1521 throw std::logic_error(
... ... @@ -1532,11 +1533,11 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1532 1533  
1533 1534 ObjUser ou(ObjUser::ou_page, i);
1534 1535 assert(this->obj_user_to_objects.count(ou) > 0);
1535   - std::set<ObjGen> ogs = this->obj_user_to_objects[ou];
1536   - for (std::set<ObjGen>::iterator iter = ogs.begin();
  1536 + std::set<QPDFObjGen> ogs = this->obj_user_to_objects[ou];
  1537 + for (std::set<QPDFObjGen>::iterator iter = ogs.begin();
1537 1538 iter != ogs.end(); ++iter)
1538 1539 {
1539   - ObjGen const& og = (*iter);
  1540 + QPDFObjGen const& og = (*iter);
1540 1541 if (lc_other_page_private.count(og))
1541 1542 {
1542 1543 lc_other_page_private.erase(og);
... ... @@ -1557,7 +1558,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1557 1558 // Part 8: other pages' shared objects
1558 1559  
1559 1560 // Order is unimportant.
1560   - for (std::set<ObjGen>::iterator iter = lc_other_page_shared.begin();
  1561 + for (std::set<QPDFObjGen>::iterator iter = lc_other_page_shared.begin();
1561 1562 iter != lc_other_page_shared.end(); ++iter)
1562 1563 {
1563 1564 this->part8.push_back(objGenToIndirect(*iter));
... ... @@ -1573,13 +1574,13 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1573 1574 // arbitrary order.
1574 1575  
1575 1576 // Place the pages tree.
1576   - std::set<ObjGen> pages_ogs =
  1577 + std::set<QPDFObjGen> pages_ogs =
1577 1578 this->obj_user_to_objects[ObjUser(ObjUser::ou_root_key, "/Pages")];
1578 1579 assert(! pages_ogs.empty());
1579   - for (std::set<ObjGen>::iterator iter = pages_ogs.begin();
  1580 + for (std::set<QPDFObjGen>::iterator iter = pages_ogs.begin();
1580 1581 iter != pages_ogs.end(); ++iter)
1581 1582 {
1582   - ObjGen const& og = *iter;
  1583 + QPDFObjGen const& og = *iter;
1583 1584 if (lc_other.count(og))
1584 1585 {
1585 1586 lc_other.erase(og);
... ... @@ -1597,7 +1598,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1597 1598 if (! thumb.isNull())
1598 1599 {
1599 1600 // Output the thumbnail itself
1600   - ObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration());
  1601 + QPDFObjGen thumb_og(thumb.getObjectID(), thumb.getGeneration());
1601 1602 if (lc_thumbnail_private.count(thumb_og))
1602 1603 {
1603 1604 lc_thumbnail_private.erase(thumb_og);
... ... @@ -1612,12 +1613,12 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1612 1613 // having been in some set other than
1613 1614 // lc_thumbnail_private.
1614 1615 }
1615   - std::set<ObjGen>& ogs =
  1616 + std::set<QPDFObjGen>& ogs =
1616 1617 this->obj_user_to_objects[ObjUser(ObjUser::ou_thumb, i)];
1617   - for (std::set<ObjGen>::iterator iter = ogs.begin();
  1618 + for (std::set<QPDFObjGen>::iterator iter = ogs.begin();
1618 1619 iter != ogs.end(); ++iter)
1619 1620 {
1620   - ObjGen const& og = *iter;
  1621 + QPDFObjGen const& og = *iter;
1621 1622 if (lc_thumbnail_private.count(og))
1622 1623 {
1623 1624 lc_thumbnail_private.erase(og);
... ... @@ -1635,7 +1636,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1635 1636 }
1636 1637  
1637 1638 // Place shared thumbnail objects
1638   - for (std::set<ObjGen>::iterator iter = lc_thumbnail_shared.begin();
  1639 + for (std::set<QPDFObjGen>::iterator iter = lc_thumbnail_shared.begin();
1639 1640 iter != lc_thumbnail_shared.end(); ++iter)
1640 1641 {
1641 1642 this->part9.push_back(objGenToIndirect(*iter));
... ... @@ -1648,7 +1649,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1648 1649 }
1649 1650  
1650 1651 // Place all remaining objects
1651   - for (std::set<ObjGen>::iterator iter = lc_other.begin();
  1652 + for (std::set<QPDFObjGen>::iterator iter = lc_other.begin();
1652 1653 iter != lc_other.end(); ++iter)
1653 1654 {
1654 1655 this->part9.push_back(objGenToIndirect(*iter));
... ... @@ -1723,15 +1724,15 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1723 1724 CHPageOffsetEntry& pe = this->c_page_offset_data.entries[i];
1724 1725 ObjUser ou(ObjUser::ou_page, i);
1725 1726 assert(this->obj_user_to_objects.count(ou) > 0);
1726   - std::set<ObjGen> const& ogs = this->obj_user_to_objects[ou];
1727   - for (std::set<ObjGen>::const_iterator iter = ogs.begin();
  1727 + std::set<QPDFObjGen> const& ogs = this->obj_user_to_objects[ou];
  1728 + for (std::set<QPDFObjGen>::const_iterator iter = ogs.begin();
1728 1729 iter != ogs.end(); ++iter)
1729 1730 {
1730   - ObjGen const& og = *iter;
  1731 + QPDFObjGen const& og = *iter;
1731 1732 if ((this->object_to_obj_users[og].size() > 1) &&
1732   - (obj_to_index.count(og.obj) > 0))
  1733 + (obj_to_index.count(og.getObj()) > 0))
1733 1734 {
1734   - int idx = obj_to_index[og.obj];
  1735 + int idx = obj_to_index[og.getObj()];
1735 1736 ++pe.nshared_objects;
1736 1737 pe.shared_identifiers.push_back(idx);
1737 1738 }
... ... @@ -1742,7 +1743,7 @@ QPDF::calculateLinearizationData(std::map&lt;int, int&gt; const&amp; object_stream_data)
1742 1743 void
1743 1744 QPDF::pushOutlinesToPart(
1744 1745 std::vector<QPDFObjectHandle>& part,
1745   - std::set<ObjGen>& lc_outlines,
  1746 + std::set<QPDFObjGen>& lc_outlines,
1746 1747 std::map<int, int> const& object_stream_data)
1747 1748 {
1748 1749 QPDFObjectHandle root = getRoot();
... ... @@ -1752,16 +1753,16 @@ QPDF::pushOutlinesToPart(
1752 1753 return;
1753 1754 }
1754 1755 outlines = getUncompressedObject(outlines, object_stream_data);
1755   - ObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration());
  1756 + QPDFObjGen outlines_og(outlines.getObjectID(), outlines.getGeneration());
1756 1757 QTC::TC("qpdf", "QPDF lin outlines in part",
1757 1758 ((&part == (&this->part6)) ? 0
1758 1759 : (&part == (&this->part9)) ? 1
1759 1760 : 9999)); // can't happen
1760   - this->c_outline_data.first_object = outlines_og.obj;
  1761 + this->c_outline_data.first_object = outlines_og.getObj();
1761 1762 this->c_outline_data.nobjects = 1;
1762 1763 lc_outlines.erase(outlines_og);
1763 1764 part.push_back(outlines);
1764   - for (std::set<ObjGen>::iterator iter = lc_outlines.begin();
  1765 + for (std::set<QPDFObjGen>::iterator iter = lc_outlines.begin();
1765 1766 iter != lc_outlines.end(); ++iter)
1766 1767 {
1767 1768 part.push_back(objGenToIndirect(*iter));
... ...
libqpdf/QPDF_optimization.cc
... ... @@ -115,7 +115,7 @@ QPDF::optimize(std::map&lt;int, int&gt; const&amp; object_stream_data,
115 115 }
116 116  
117 117 ObjUser root_ou = ObjUser(ObjUser::ou_root);
118   - ObjGen root_og = ObjGen(root.getObjectID(), root.getGeneration());
  118 + QPDFObjGen root_og = QPDFObjGen(root.getObjectID(), root.getGeneration());
119 119 obj_user_to_objects[root_ou].insert(root_og);
120 120 object_to_obj_users[root_og].insert(root_ou);
121 121  
... ... @@ -310,13 +310,13 @@ QPDF::pushInheritedAttributesToPageInternal(
310 310 void
311 311 QPDF::updateObjectMaps(ObjUser const& ou, QPDFObjectHandle oh)
312 312 {
313   - std::set<ObjGen> visited;
  313 + std::set<QPDFObjGen> visited;
314 314 updateObjectMapsInternal(ou, oh, visited, true);
315 315 }
316 316  
317 317 void
318 318 QPDF::updateObjectMapsInternal(ObjUser const& ou, QPDFObjectHandle oh,
319   - std::set<ObjGen>& visited, bool top)
  319 + std::set<QPDFObjGen>& visited, bool top)
320 320 {
321 321 // Traverse the object tree from this point taking care to avoid
322 322 // crossing page boundaries.
... ... @@ -338,7 +338,7 @@ QPDF::updateObjectMapsInternal(ObjUser const&amp; ou, QPDFObjectHandle oh,
338 338  
339 339 if (oh.isIndirect())
340 340 {
341   - ObjGen og(oh.getObjectID(), oh.getGeneration());
  341 + QPDFObjGen og(oh.getObjectID(), oh.getGeneration());
342 342 if (visited.count(og))
343 343 {
344 344 QTC::TC("qpdf", "QPDF opt loop detected");
... ... @@ -403,51 +403,51 @@ QPDF::filterCompressedObjects(std::map&lt;int, int&gt; const&amp; object_stream_data)
403 403 // user of a compressed object, then it is really a user of the
404 404 // object stream that contains it.
405 405  
406   - std::map<ObjUser, std::set<ObjGen> > t_obj_user_to_objects;
407   - std::map<ObjGen, std::set<ObjUser> > t_object_to_obj_users;
  406 + std::map<ObjUser, std::set<QPDFObjGen> > t_obj_user_to_objects;
  407 + std::map<QPDFObjGen, std::set<ObjUser> > t_object_to_obj_users;
408 408  
409   - for (std::map<ObjUser, std::set<ObjGen> >::iterator i1 =
  409 + for (std::map<ObjUser, std::set<QPDFObjGen> >::iterator i1 =
410 410 this->obj_user_to_objects.begin();
411 411 i1 != this->obj_user_to_objects.end(); ++i1)
412 412 {
413 413 ObjUser const& ou = (*i1).first;
414   - std::set<ObjGen> const& objects = (*i1).second;
415   - for (std::set<ObjGen>::const_iterator i2 = objects.begin();
  414 + std::set<QPDFObjGen> const& objects = (*i1).second;
  415 + for (std::set<QPDFObjGen>::const_iterator i2 = objects.begin();
416 416 i2 != objects.end(); ++i2)
417 417 {
418   - ObjGen const& og = (*i2);
  418 + QPDFObjGen const& og = (*i2);
419 419 std::map<int, int>::const_iterator i3 =
420   - object_stream_data.find(og.obj);
  420 + object_stream_data.find(og.getObj());
421 421 if (i3 == object_stream_data.end())
422 422 {
423 423 t_obj_user_to_objects[ou].insert(og);
424 424 }
425 425 else
426 426 {
427   - t_obj_user_to_objects[ou].insert(ObjGen((*i3).second, 0));
  427 + t_obj_user_to_objects[ou].insert(QPDFObjGen((*i3).second, 0));
428 428 }
429 429 }
430 430 }
431 431  
432   - for (std::map<ObjGen, std::set<ObjUser> >::iterator i1 =
  432 + for (std::map<QPDFObjGen, std::set<ObjUser> >::iterator i1 =
433 433 this->object_to_obj_users.begin();
434 434 i1 != this->object_to_obj_users.end(); ++i1)
435 435 {
436   - ObjGen const& og = (*i1).first;
  436 + QPDFObjGen const& og = (*i1).first;
437 437 std::set<ObjUser> const& objusers = (*i1).second;
438 438 for (std::set<ObjUser>::const_iterator i2 = objusers.begin();
439 439 i2 != objusers.end(); ++i2)
440 440 {
441 441 ObjUser const& ou = (*i2);
442 442 std::map<int, int>::const_iterator i3 =
443   - object_stream_data.find(og.obj);
  443 + object_stream_data.find(og.getObj());
444 444 if (i3 == object_stream_data.end())
445 445 {
446 446 t_object_to_obj_users[og].insert(ou);
447 447 }
448 448 else
449 449 {
450   - t_object_to_obj_users[ObjGen((*i3).second, 0)].insert(ou);
  450 + t_object_to_obj_users[QPDFObjGen((*i3).second, 0)].insert(ou);
451 451 }
452 452 }
453 453 }
... ...
libqpdf/QPDF_pages.cc
... ... @@ -127,7 +127,7 @@ void
127 127 QPDF::insertPageobjToPage(QPDFObjectHandle const& obj, int pos,
128 128 bool check_duplicate)
129 129 {
130   - ObjGen og(obj.getObjectID(), obj.getGeneration());
  130 + QPDFObjGen og(obj.getObjectID(), obj.getGeneration());
131 131 if (check_duplicate)
132 132 {
133 133 if (! this->pageobj_to_pages_pos.insert(std::make_pair(og, pos)).second)
... ... @@ -135,7 +135,7 @@ QPDF::insertPageobjToPage(QPDFObjectHandle const&amp; obj, int pos,
135 135 QTC::TC("qpdf", "QPDF duplicate page reference");
136 136 setLastObjectDescription("page " + QUtil::int_to_string(pos) +
137 137 " (numbered from zero)",
138   - og.obj, og.gen);
  138 + og.getObj(), og.getGen());
139 139 throw QPDFExc(qpdf_e_pages, this->file->getName(),
140 140 this->last_object_description, 0,
141 141 "duplicate page reference found;"
... ... @@ -215,7 +215,7 @@ QPDF::removePage(QPDFObjectHandle page)
215 215 this->all_pages.erase(this->all_pages.begin() + pos);
216 216 assert(this->all_pages.size() == static_cast<size_t>(npages));
217 217 this->pageobj_to_pages_pos.erase(
218   - ObjGen(page.getObjectID(), page.getGeneration()));
  218 + QPDFObjGen(page.getObjectID(), page.getGeneration()));
219 219 assert(this->pageobj_to_pages_pos.size() == static_cast<size_t>(npages));
220 220 for (int i = pos; i < npages; ++i)
221 221 {
... ... @@ -260,8 +260,8 @@ int
260 260 QPDF::findPage(int objid, int generation)
261 261 {
262 262 flattenPagesTree();
263   - std::map<ObjGen, int>::iterator it =
264   - this->pageobj_to_pages_pos.find(ObjGen(objid, generation));
  263 + std::map<QPDFObjGen, int>::iterator it =
  264 + this->pageobj_to_pages_pos.find(QPDFObjGen(objid, generation));
265 265 if (it == this->pageobj_to_pages_pos.end())
266 266 {
267 267 setLastObjectDescription("page object", objid, generation);
... ...
libqpdf/build.mk
... ... @@ -32,6 +32,7 @@ SRCS_libqpdf = \
32 32 libqpdf/Pl_StdioFile.cc \
33 33 libqpdf/QPDF.cc \
34 34 libqpdf/QPDFExc.cc \
  35 + libqpdf/QPDFObjGen.cc \
35 36 libqpdf/QPDFObject.cc \
36 37 libqpdf/QPDFObjectHandle.cc \
37 38 libqpdf/QPDFTokenizer.cc \
... ...