diff options
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 56 | ||||
-rw-r--r-- | libqpdf/QPDF_Stream.cc | 4 |
2 files changed, 58 insertions, 2 deletions
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<StreamDataProvider> provider, provider, filter, decode_parms); } +class FunctionProvider: public QPDFObjectHandle::StreamDataProvider +{ + public: + FunctionProvider(std::function<void(Pipeline*)> provider) : + StreamDataProvider(false), + p1(provider), + p2(nullptr) + { + } + FunctionProvider(std::function<bool(Pipeline*, bool, bool)> 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<void(Pipeline*)> p1; + std::function<bool(Pipeline*, bool, bool)> p2; +}; + +void +QPDFObjectHandle::replaceStreamData(std::function<void(Pipeline*)> provider, + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms) +{ + assertStream(); + PointerHolder<StreamDataProvider> sdp = new FunctionProvider(provider); + dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData( + sdp, filter, decode_parms); +} + +void +QPDFObjectHandle::replaceStreamData( + std::function<bool(Pipeline*, bool, bool)> provider, + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms) +{ + assertStream(); + PointerHolder<StreamDataProvider> sdp = new FunctionProvider(provider); + dynamic_cast<QPDF_Stream*>(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( |