Commit 742cc7d87b574dea708db69cdec75e8e2b54f64a

Authored by m-holger
1 parent fa03ed38

Add temporary methods QPDF::Xref_table::size and as_map

Also, remove redundant clearing of the xref tabl during QPDF destruction.
libqpdf/QPDF.cc
... ... @@ -227,9 +227,6 @@ QPDF::~QPDF()
227 227 // are reachable from this object to release their association with this QPDF. Direct objects
228 228 // are not destroyed since they can be moved to other QPDF objects safely.
229 229  
230   - // At this point, obviously no one is still using the QPDF object, but we'll explicitly clear
231   - // the xref table anyway just to prevent any possibility of resolve() succeeding.
232   - m->xref_table.clear();
233 230 for (auto const& iter: m->obj_cache) {
234 231 iter.second.object->disconnect();
235 232 if (iter.second.object->getTypeCode() != ::ot_null) {
... ... @@ -1651,7 +1648,7 @@ QPDF::recoverStreamLength(
1651 1648 QPDFObjGen found_og;
1652 1649  
1653 1650 // Make sure this is inside this object
1654   - for (auto const& [current_og, entry]: m->xref_table) {
  1651 + for (auto const& [current_og, entry]: m->xref_table.as_map()) {
1655 1652 if (entry.getType() == 1) {
1656 1653 qpdf_offset_t obj_offset = entry.getOffset();
1657 1654 if (found_offset < obj_offset && obj_offset < end) {
... ... @@ -1984,9 +1981,8 @@ QPDF::resolveObjectsInStream(int obj_stream_number)
1984 1981 m->last_object_description += "object ";
1985 1982 for (auto const& iter: offsets) {
1986 1983 QPDFObjGen og(iter.first, 0);
1987   - auto entry = m->xref_table.find(og);
1988   - if (entry != m->xref_table.end() && entry->second.getType() == 2 &&
1989   - entry->second.getObjStreamNumber() == obj_stream_number) {
  1984 + if (m->xref_table.type(og) == 2 &&
  1985 + m->xref_table.stream_number(og.getObj()) == obj_stream_number) {
1990 1986 int offset = iter.second;
1991 1987 input->seek(offset, SEEK_SET);
1992 1988 QPDFObjectHandle oh = readObjectInStream(input, iter.first);
... ... @@ -2560,7 +2556,7 @@ QPDF::getXRefTableInternal()
2560 2556 throw std::logic_error("QPDF::getXRefTable called before parsing.");
2561 2557 }
2562 2558  
2563   - return m->xref_table;
  2559 + return m->xref_table.as_map();
2564 2560 }
2565 2561  
2566 2562 size_t
... ... @@ -2568,7 +2564,7 @@ QPDF::tableSize()
2568 2564 {
2569 2565 // If obj_cache is dense, accommodate all object in tables,else accommodate only original
2570 2566 // objects.
2571   - auto max_xref = m->xref_table.size() ? m->xref_table.crbegin()->first.getObj() : 0;
  2567 + auto max_xref = m->xref_table.size() ? m->xref_table.as_map().crbegin()->first.getObj() : 0;
2572 2568 auto max_obj = m->obj_cache.size() ? m->obj_cache.crbegin()->first.getObj() : 0;
2573 2569 auto max_id = std::numeric_limits<int>::max() - 1;
2574 2570 if (max_obj >= max_id || max_xref >= max_id) {
... ...
libqpdf/QPDF_linearization.cc
... ... @@ -486,7 +486,7 @@ QPDF::checkLinearizationInternal()
486 486 // to figure out which objects are compressed and which are uncompressed.
487 487 { // local scope
488 488 std::map<int, int> object_stream_data;
489   - for (auto const& iter: m->xref_table) {
  489 + for (auto const& iter: m->xref_table.as_map()) {
490 490 QPDFObjGen const& og = iter.first;
491 491 QPDFXRefEntry const& entry = iter.second;
492 492 if (entry.getType() == 2) {
... ...
libqpdf/qpdf/QPDF_private.hh
... ... @@ -4,7 +4,7 @@
4 4 #include <qpdf/QPDF.hh>
5 5  
6 6 // Xref_table encapsulates the pdf's xref table and trailer.
7   -class QPDF::Xref_table: public std::map<QPDFObjGen, QPDFXRefEntry>
  7 +class QPDF::Xref_table: std::map<QPDFObjGen, QPDFXRefEntry>
8 8 {
9 9 public:
10 10 Xref_table(QPDF& qpdf, InputSource* const& file) :
... ... @@ -50,6 +50,20 @@ class QPDF::Xref_table: public std::map&lt;QPDFObjGen, QPDFXRefEntry&gt;
50 50 return it == end() ? 0 : it->second.getObjStreamIndex();
51 51 }
52 52  
  53 + // Temporary access to underlying map
  54 + std::map<QPDFObjGen, QPDFXRefEntry> const&
  55 + as_map()
  56 + {
  57 + return *this;
  58 + }
  59 +
  60 + // Temporary access to underlying map size
  61 + size_t
  62 + size() const noexcept
  63 + {
  64 + return trailer ? std::map<QPDFObjGen, QPDFXRefEntry>::size() : 0;
  65 + }
  66 +
53 67 QPDFObjectHandle trailer;
54 68 bool reconstructed{false};
55 69 // Various tables are indexed by object id, with potential size id + 1
... ...