From efbb21673c59cfbf6a74de6866a59cb2dbb8e59f Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 14 Feb 2021 14:04:40 -0500 Subject: Add functional versions of QPDFObjectHandle::replaceStreamData Also fix a bug in checking consistency of length for stream data providers. Length should not be checked or recorded if the provider says it failed to generate the data. --- libqpdf/QPDFObjectHandle.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++ libqpdf/QPDF_Stream.cc | 4 ++-- 2 files changed, 58 insertions(+), 2 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 94875e13..d4796498 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -1347,6 +1347,62 @@ QPDFObjectHandle::replaceStreamData(PointerHolder provider, provider, filter, decode_parms); } +class FunctionProvider: public QPDFObjectHandle::StreamDataProvider +{ + public: + FunctionProvider(std::function provider) : + StreamDataProvider(false), + p1(provider), + p2(nullptr) + { + } + FunctionProvider(std::function provider) : + StreamDataProvider(true), + p1(nullptr), + p2(provider) + { + } + + virtual void provideStreamData(int, int, Pipeline* pipeline) override + { + p1(pipeline); + } + + virtual bool provideStreamData(int, int, Pipeline* pipeline, + bool suppress_warnings, + bool will_retry) override + { + return p2(pipeline, suppress_warnings, will_retry); + } + + private: + std::function p1; + std::function p2; +}; + +void +QPDFObjectHandle::replaceStreamData(std::function provider, + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms) +{ + assertStream(); + PointerHolder sdp = new FunctionProvider(provider); + dynamic_cast(obj.getPointer())->replaceStreamData( + sdp, filter, decode_parms); +} + +void +QPDFObjectHandle::replaceStreamData( + std::function provider, + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms) +{ + assertStream(); + PointerHolder sdp = new FunctionProvider(provider); + dynamic_cast(obj.getPointer())->replaceStreamData( + sdp, filter, decode_parms); +} + QPDFObjGen QPDFObjectHandle::getObjGen() const { diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index b05137df..bc3b1b56 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -533,7 +533,7 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool* filterp, } qpdf_offset_t actual_length = count.getCount(); qpdf_offset_t desired_length = 0; - if (this->stream_dict.hasKey("/Length")) + if (success && this->stream_dict.hasKey("/Length")) { desired_length = this->stream_dict.getKey("/Length").getIntValue(); if (actual_length == desired_length) @@ -555,7 +555,7 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool* filterp, QUtil::int_to_string(desired_length) + " bytes"); } } - else + else if (success) { QTC::TC("qpdf", "QPDF_Stream provider length not provided"); this->stream_dict.replaceKey( -- cgit v1.2.3-54-g00ecf