diff options
author | Jay Berkenbilt <ejb@ql.org> | 2021-02-14 20:04:40 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2021-02-14 20:42:24 +0100 |
commit | efbb21673c59cfbf6a74de6866a59cb2dbb8e59f (patch) | |
tree | 37439ac43400705551107542c9e9939ee8504294 /libqpdf/QPDFObjectHandle.cc | |
parent | e2593e2efe140d47870b0c511cbf5160db080edd (diff) | |
download | qpdf-efbb21673c59cfbf6a74de6866a59cb2dbb8e59f.tar.zst |
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.
Diffstat (limited to 'libqpdf/QPDFObjectHandle.cc')
-rw-r--r-- | libqpdf/QPDFObjectHandle.cc | 56 |
1 files changed, 56 insertions, 0 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 { |