From 38f45c7321a34b37d6e8346b215c17ed7f0558b9 Mon Sep 17 00:00:00 2001 From: m-holger Date: Thu, 2 Oct 2025 09:49:57 +0100 Subject: [PATCH] Refactor `ObjectHandle` to introduce `offset()` method --- include/qpdf/ObjectHandle.hh | 1 + libqpdf/QPDF.cc | 4 ++-- libqpdf/QPDFObjectHandle.cc | 2 +- libqpdf/QPDF_Stream.cc | 22 +++++++++------------- libqpdf/QPDF_json.cc | 3 +-- libqpdf/qpdf/QPDFObjectHandle_private.hh | 6 ++++++ libqpdf/qpdf/QPDFObject_private.hh | 5 ----- qpdf/qpdf.testcov | 4 ---- 8 files changed, 20 insertions(+), 27 deletions(-) diff --git a/include/qpdf/ObjectHandle.hh b/include/qpdf/ObjectHandle.hh index 0bafc31..821acaf 100644 --- a/include/qpdf/ObjectHandle.hh +++ b/include/qpdf/ObjectHandle.hh @@ -94,6 +94,7 @@ namespace qpdf inline QPDFObjGen id_gen() const; inline bool indirect() const; inline bool null() const; + inline qpdf_offset_t offset() const; inline QPDF* qpdf() const; inline qpdf_object_type_e raw_type_code() const; inline qpdf_object_type_e resolved_type_code() const; diff --git a/libqpdf/QPDF.cc b/libqpdf/QPDF.cc index 6c847fd..b3abf7a 100644 --- a/libqpdf/QPDF.cc +++ b/libqpdf/QPDF.cc @@ -567,7 +567,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) if (!obj_copier.object_map.contains(og)) { warn(damagedPDF( other.getFilename() + " object " + og.unparse(' '), - foreign.getParsedOffset(), + foreign.offset(), "unexpected reference to /Pages object while copying foreign object; replacing with " "null")); return QPDFObjectHandle::newNull(); @@ -732,7 +732,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) foreign_stream_qpdf.m->encp, foreign_stream_qpdf.m->file, foreign, - foreign.getParsedOffset(), + foreign.offset(), stream.getLength(), dict, stream.isRootMetadata()); diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 20933a3..cfbfe8d 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1690,7 +1690,7 @@ QPDFObjectHandle::parse( qpdf_offset_t QPDFObjectHandle::getParsedOffset() const { - return obj ? obj->getParsedOffset() : -1; + return offset(); } QPDFObjectHandle diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 5b2c47e..5244ac2 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -350,12 +350,11 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) if (!filtered) { throw QPDFExc( qpdf_e_unsupported, - obj->getQPDF()->getFilename(), + qpdf()->getFilename(), "", - obj->getParsedOffset(), + offset(), "getStreamData called on unfilterable stream"); } - QTC::TC("qpdf", "QPDF_Stream getStreamData"); return result; } @@ -367,12 +366,11 @@ Stream::getRawStreamData() if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { throw QPDFExc( qpdf_e_unsupported, - obj->getQPDF()->getFilename(), + qpdf()->getFilename(), "", - obj->getParsedOffset(), + offset(), "error getting raw stream data"); } - QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); return result; } @@ -579,15 +577,13 @@ Stream::pipeStreamData( s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length)); } } else { - if (obj->getParsedOffset() == 0) { - QTC::TC("qpdf", "QPDF_Stream pipe no stream data"); + if (offset() == 0) { throw std::logic_error("pipeStreamData called for stream with no data"); } - QTC::TC("qpdf", "QPDF_Stream pipe original stream data"); if (!QPDF::Doc::Streams::pipeStreamData( - obj->getQPDF(), - obj->getObjGen(), - obj->getParsedOffset(), + qpdf(), + id_gen(), + offset(), s->length, s->stream_dict, isRootMetadata(), @@ -664,7 +660,7 @@ Stream::replaceFilterData( void Stream::warn(std::string const& message) { - obj->getQPDF()->warn(qpdf_e_damaged_pdf, "", obj->getParsedOffset(), message); + qpdf()->warn(qpdf_e_damaged_pdf, "", offset(), message); } QPDFObjectHandle diff --git a/libqpdf/QPDF_json.cc b/libqpdf/QPDF_json.cc index b6f4f17..c08f86d 100644 --- a/libqpdf/QPDF_json.cc +++ b/libqpdf/QPDF_json.cc @@ -424,8 +424,7 @@ QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& val auto og = tos.object.getObjGen(); if (replacement.isIndirect() && !(replacement.isStream() && replacement.getObjGen() == og)) { error( - replacement.getParsedOffset(), - "the value of an object may not be an indirect object reference"); + replacement.offset(), "the value of an object may not be an indirect object reference"); return; } pdf.replaceObject(og, replacement); diff --git a/libqpdf/qpdf/QPDFObjectHandle_private.hh b/libqpdf/qpdf/QPDFObjectHandle_private.hh index b16232f..e6d75ff 100644 --- a/libqpdf/qpdf/QPDFObjectHandle_private.hh +++ b/libqpdf/qpdf/QPDFObjectHandle_private.hh @@ -657,6 +657,12 @@ namespace qpdf return !obj || type_code() == ::ot_null; } + inline qpdf_offset_t + BaseHandle::offset() const + { + return obj ? obj->parsed_offset : -1; + } + inline QPDF* BaseHandle::qpdf() const { diff --git a/libqpdf/qpdf/QPDFObject_private.hh b/libqpdf/qpdf/QPDFObject_private.hh index 03ccad9..6de7158 100644 --- a/libqpdf/qpdf/QPDFObject_private.hh +++ b/libqpdf/qpdf/QPDFObject_private.hh @@ -438,11 +438,6 @@ class QPDFObject parsed_offset = offset; } } - qpdf_offset_t - getParsedOffset() - { - return parsed_offset; - } QPDF* getQPDF() { diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index a03c408..9b6ec8e 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -98,16 +98,12 @@ qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 qpdf-c called qpdf_set_static_aes_IV 0 qpdf-c called qpdf_has_error 0 qpdf-c called qpdf_get_qpdf_version 0 -QPDF_Stream pipe original stream data 0 QPDF_Stream pipe replaced stream data 0 QPDF_Stream provider length mismatch 0 QPDFObjectHandle newStream 0 QPDFObjectHandle newStream with data 0 -QPDF_Stream pipe no stream data 0 QPDFObjectHandle prepend page contents 0 QPDFObjectHandle append page contents 0 -QPDF_Stream getRawStreamData 0 -QPDF_Stream getStreamData 0 qpdf-c called qpdf_read_memory 0 QPDF stream with CRNL 0 QPDFWriter copy encrypt metadata 1 -- libgit2 0.21.4