Commit 38f45c7321a34b37d6e8346b215c17ed7f0558b9
1 parent
9c3deb93
Refactor `ObjectHandle` to introduce `offset()` method
Replace `getParsedOffset()` with the new `offset()` method across `QPDFObjectHandle` and related classes for consistent offset handling. Simplify logic and remove redundant `getParsedOffset()` implementation.
Showing
8 changed files
with
20 additions
and
27 deletions
include/qpdf/ObjectHandle.hh
| @@ -94,6 +94,7 @@ namespace qpdf | @@ -94,6 +94,7 @@ namespace qpdf | ||
| 94 | inline QPDFObjGen id_gen() const; | 94 | inline QPDFObjGen id_gen() const; |
| 95 | inline bool indirect() const; | 95 | inline bool indirect() const; |
| 96 | inline bool null() const; | 96 | inline bool null() const; |
| 97 | + inline qpdf_offset_t offset() const; | ||
| 97 | inline QPDF* qpdf() const; | 98 | inline QPDF* qpdf() const; |
| 98 | inline qpdf_object_type_e raw_type_code() const; | 99 | inline qpdf_object_type_e raw_type_code() const; |
| 99 | inline qpdf_object_type_e resolved_type_code() const; | 100 | inline qpdf_object_type_e resolved_type_code() const; |
libqpdf/QPDF.cc
| @@ -567,7 +567,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) | @@ -567,7 +567,7 @@ QPDF::copyForeignObject(QPDFObjectHandle foreign) | ||
| 567 | if (!obj_copier.object_map.contains(og)) { | 567 | if (!obj_copier.object_map.contains(og)) { |
| 568 | warn(damagedPDF( | 568 | warn(damagedPDF( |
| 569 | other.getFilename() + " object " + og.unparse(' '), | 569 | other.getFilename() + " object " + og.unparse(' '), |
| 570 | - foreign.getParsedOffset(), | 570 | + foreign.offset(), |
| 571 | "unexpected reference to /Pages object while copying foreign object; replacing with " | 571 | "unexpected reference to /Pages object while copying foreign object; replacing with " |
| 572 | "null")); | 572 | "null")); |
| 573 | return QPDFObjectHandle::newNull(); | 573 | return QPDFObjectHandle::newNull(); |
| @@ -732,7 +732,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) | @@ -732,7 +732,7 @@ QPDF::copyStreamData(QPDFObjectHandle result, QPDFObjectHandle foreign) | ||
| 732 | foreign_stream_qpdf.m->encp, | 732 | foreign_stream_qpdf.m->encp, |
| 733 | foreign_stream_qpdf.m->file, | 733 | foreign_stream_qpdf.m->file, |
| 734 | foreign, | 734 | foreign, |
| 735 | - foreign.getParsedOffset(), | 735 | + foreign.offset(), |
| 736 | stream.getLength(), | 736 | stream.getLength(), |
| 737 | dict, | 737 | dict, |
| 738 | stream.isRootMetadata()); | 738 | stream.isRootMetadata()); |
libqpdf/QPDFObjectHandle.cc
| @@ -1690,7 +1690,7 @@ QPDFObjectHandle::parse( | @@ -1690,7 +1690,7 @@ QPDFObjectHandle::parse( | ||
| 1690 | qpdf_offset_t | 1690 | qpdf_offset_t |
| 1691 | QPDFObjectHandle::getParsedOffset() const | 1691 | QPDFObjectHandle::getParsedOffset() const |
| 1692 | { | 1692 | { |
| 1693 | - return obj ? obj->getParsedOffset() : -1; | 1693 | + return offset(); |
| 1694 | } | 1694 | } |
| 1695 | 1695 | ||
| 1696 | QPDFObjectHandle | 1696 | QPDFObjectHandle |
libqpdf/QPDF_Stream.cc
| @@ -350,12 +350,11 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) | @@ -350,12 +350,11 @@ Stream::getStreamData(qpdf_stream_decode_level_e decode_level) | ||
| 350 | if (!filtered) { | 350 | if (!filtered) { |
| 351 | throw QPDFExc( | 351 | throw QPDFExc( |
| 352 | qpdf_e_unsupported, | 352 | qpdf_e_unsupported, |
| 353 | - obj->getQPDF()->getFilename(), | 353 | + qpdf()->getFilename(), |
| 354 | "", | 354 | "", |
| 355 | - obj->getParsedOffset(), | 355 | + offset(), |
| 356 | "getStreamData called on unfilterable stream"); | 356 | "getStreamData called on unfilterable stream"); |
| 357 | } | 357 | } |
| 358 | - QTC::TC("qpdf", "QPDF_Stream getStreamData"); | ||
| 359 | return result; | 358 | return result; |
| 360 | } | 359 | } |
| 361 | 360 | ||
| @@ -367,12 +366,11 @@ Stream::getRawStreamData() | @@ -367,12 +366,11 @@ Stream::getRawStreamData() | ||
| 367 | if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { | 366 | if (!pipeStreamData(&buf, nullptr, 0, qpdf_dl_none, false, false)) { |
| 368 | throw QPDFExc( | 367 | throw QPDFExc( |
| 369 | qpdf_e_unsupported, | 368 | qpdf_e_unsupported, |
| 370 | - obj->getQPDF()->getFilename(), | 369 | + qpdf()->getFilename(), |
| 371 | "", | 370 | "", |
| 372 | - obj->getParsedOffset(), | 371 | + offset(), |
| 373 | "error getting raw stream data"); | 372 | "error getting raw stream data"); |
| 374 | } | 373 | } |
| 375 | - QTC::TC("qpdf", "QPDF_Stream getRawStreamData"); | ||
| 376 | return result; | 374 | return result; |
| 377 | } | 375 | } |
| 378 | 376 | ||
| @@ -579,15 +577,13 @@ Stream::pipeStreamData( | @@ -579,15 +577,13 @@ Stream::pipeStreamData( | ||
| 579 | s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length)); | 577 | s->stream_dict.replaceKey("/Length", QPDFObjectHandle::newInteger(actual_length)); |
| 580 | } | 578 | } |
| 581 | } else { | 579 | } else { |
| 582 | - if (obj->getParsedOffset() == 0) { | ||
| 583 | - QTC::TC("qpdf", "QPDF_Stream pipe no stream data"); | 580 | + if (offset() == 0) { |
| 584 | throw std::logic_error("pipeStreamData called for stream with no data"); | 581 | throw std::logic_error("pipeStreamData called for stream with no data"); |
| 585 | } | 582 | } |
| 586 | - QTC::TC("qpdf", "QPDF_Stream pipe original stream data"); | ||
| 587 | if (!QPDF::Doc::Streams::pipeStreamData( | 583 | if (!QPDF::Doc::Streams::pipeStreamData( |
| 588 | - obj->getQPDF(), | ||
| 589 | - obj->getObjGen(), | ||
| 590 | - obj->getParsedOffset(), | 584 | + qpdf(), |
| 585 | + id_gen(), | ||
| 586 | + offset(), | ||
| 591 | s->length, | 587 | s->length, |
| 592 | s->stream_dict, | 588 | s->stream_dict, |
| 593 | isRootMetadata(), | 589 | isRootMetadata(), |
| @@ -664,7 +660,7 @@ Stream::replaceFilterData( | @@ -664,7 +660,7 @@ Stream::replaceFilterData( | ||
| 664 | void | 660 | void |
| 665 | Stream::warn(std::string const& message) | 661 | Stream::warn(std::string const& message) |
| 666 | { | 662 | { |
| 667 | - obj->getQPDF()->warn(qpdf_e_damaged_pdf, "", obj->getParsedOffset(), message); | 663 | + qpdf()->warn(qpdf_e_damaged_pdf, "", offset(), message); |
| 668 | } | 664 | } |
| 669 | 665 | ||
| 670 | QPDFObjectHandle | 666 | QPDFObjectHandle |
libqpdf/QPDF_json.cc
| @@ -424,8 +424,7 @@ QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& val | @@ -424,8 +424,7 @@ QPDF::JSONReactor::replaceObject(QPDFObjectHandle&& replacement, JSON const& val | ||
| 424 | auto og = tos.object.getObjGen(); | 424 | auto og = tos.object.getObjGen(); |
| 425 | if (replacement.isIndirect() && !(replacement.isStream() && replacement.getObjGen() == og)) { | 425 | if (replacement.isIndirect() && !(replacement.isStream() && replacement.getObjGen() == og)) { |
| 426 | error( | 426 | error( |
| 427 | - replacement.getParsedOffset(), | ||
| 428 | - "the value of an object may not be an indirect object reference"); | 427 | + replacement.offset(), "the value of an object may not be an indirect object reference"); |
| 429 | return; | 428 | return; |
| 430 | } | 429 | } |
| 431 | pdf.replaceObject(og, replacement); | 430 | pdf.replaceObject(og, replacement); |
libqpdf/qpdf/QPDFObjectHandle_private.hh
| @@ -657,6 +657,12 @@ namespace qpdf | @@ -657,6 +657,12 @@ namespace qpdf | ||
| 657 | return !obj || type_code() == ::ot_null; | 657 | return !obj || type_code() == ::ot_null; |
| 658 | } | 658 | } |
| 659 | 659 | ||
| 660 | + inline qpdf_offset_t | ||
| 661 | + BaseHandle::offset() const | ||
| 662 | + { | ||
| 663 | + return obj ? obj->parsed_offset : -1; | ||
| 664 | + } | ||
| 665 | + | ||
| 660 | inline QPDF* | 666 | inline QPDF* |
| 661 | BaseHandle::qpdf() const | 667 | BaseHandle::qpdf() const |
| 662 | { | 668 | { |
libqpdf/qpdf/QPDFObject_private.hh
| @@ -438,11 +438,6 @@ class QPDFObject | @@ -438,11 +438,6 @@ class QPDFObject | ||
| 438 | parsed_offset = offset; | 438 | parsed_offset = offset; |
| 439 | } | 439 | } |
| 440 | } | 440 | } |
| 441 | - qpdf_offset_t | ||
| 442 | - getParsedOffset() | ||
| 443 | - { | ||
| 444 | - return parsed_offset; | ||
| 445 | - } | ||
| 446 | QPDF* | 441 | QPDF* |
| 447 | getQPDF() | 442 | getQPDF() |
| 448 | { | 443 | { |
qpdf/qpdf.testcov
| @@ -98,16 +98,12 @@ qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 | @@ -98,16 +98,12 @@ qpdf-c called qpdf_set_r4_encryption_parameters_insecure 0 | ||
| 98 | qpdf-c called qpdf_set_static_aes_IV 0 | 98 | qpdf-c called qpdf_set_static_aes_IV 0 |
| 99 | qpdf-c called qpdf_has_error 0 | 99 | qpdf-c called qpdf_has_error 0 |
| 100 | qpdf-c called qpdf_get_qpdf_version 0 | 100 | qpdf-c called qpdf_get_qpdf_version 0 |
| 101 | -QPDF_Stream pipe original stream data 0 | ||
| 102 | QPDF_Stream pipe replaced stream data 0 | 101 | QPDF_Stream pipe replaced stream data 0 |
| 103 | QPDF_Stream provider length mismatch 0 | 102 | QPDF_Stream provider length mismatch 0 |
| 104 | QPDFObjectHandle newStream 0 | 103 | QPDFObjectHandle newStream 0 |
| 105 | QPDFObjectHandle newStream with data 0 | 104 | QPDFObjectHandle newStream with data 0 |
| 106 | -QPDF_Stream pipe no stream data 0 | ||
| 107 | QPDFObjectHandle prepend page contents 0 | 105 | QPDFObjectHandle prepend page contents 0 |
| 108 | QPDFObjectHandle append page contents 0 | 106 | QPDFObjectHandle append page contents 0 |
| 109 | -QPDF_Stream getRawStreamData 0 | ||
| 110 | -QPDF_Stream getStreamData 0 | ||
| 111 | qpdf-c called qpdf_read_memory 0 | 107 | qpdf-c called qpdf_read_memory 0 |
| 112 | QPDF stream with CRNL 0 | 108 | QPDF stream with CRNL 0 |
| 113 | QPDFWriter copy encrypt metadata 1 | 109 | QPDFWriter copy encrypt metadata 1 |