diff options
Diffstat (limited to 'libqpdf/QPDF_Stream.cc')
-rw-r--r-- | libqpdf/QPDF_Stream.cc | 55 |
1 files changed, 51 insertions, 4 deletions
diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index 5e53b2ae..1f48b2c1 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -9,6 +9,7 @@ #include <qpdf/Pl_ASCII85Decoder.hh> #include <qpdf/Pl_ASCIIHexDecoder.hh> #include <qpdf/Pl_LZWDecoder.hh> +#include <qpdf/Pl_Count.hh> #include <qpdf/QTC.hh> #include <qpdf/QPDF.hh> @@ -326,6 +327,32 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool filter, pipeline->write(b.getBuffer(), b.getSize()); pipeline->finish(); } + else if (this->stream_provider.getPointer()) + { + QPDFObjectHandle::StreamDataProvider& p = + (*this->stream_provider.getPointer()); + Pl_Count count("stream provider count", pipeline); + p.provideStreamData(this->objid, this->generation, &count); + size_t actual_length = count.getCount(); + size_t desired_length = + this->stream_dict.getKey("/Length").getIntValue(); + if (actual_length == desired_length) + { + QTC::TC("qpdf", "QPDF_Stream pipe use stream provider"); + } + else + { + QTC::TC("qpdf", "QPDF_Stream provider length mismatch"); + throw std::logic_error( + "stream data provider for " + + QUtil::int_to_string(this->objid) + " " + + QUtil::int_to_string(this->generation) + + " provided " + + QUtil::int_to_string(actual_length) + + " bytes instead of expected " + + QUtil::int_to_string(desired_length) + " bytes"); + } + } else { QTC::TC("qpdf", "QPDF_Stream pipe original stream data"); @@ -339,13 +366,33 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, bool filter, void QPDF_Stream::replaceStreamData(PointerHolder<Buffer> data, - QPDFObjectHandle filter, - QPDFObjectHandle decode_parms) + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms) { this->stream_data = data; + this->stream_provider = 0; + replaceFilterData(filter, decode_parms, data.getPointer()->getSize()); +} + +void +QPDF_Stream::replaceStreamData( + PointerHolder<QPDFObjectHandle::StreamDataProvider> provider, + QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms, + size_t length) +{ + this->stream_provider = provider; + this->stream_data = 0; + replaceFilterData(filter, decode_parms, length); +} + +void +QPDF_Stream::replaceFilterData(QPDFObjectHandle const& filter, + QPDFObjectHandle const& decode_parms, + size_t length) +{ this->stream_dict.replaceOrRemoveKey("/Filter", filter); this->stream_dict.replaceOrRemoveKey("/DecodeParms", decode_parms); this->stream_dict.replaceKey("/Length", - QPDFObjectHandle::newInteger( - data.getPointer()->getSize())); + QPDFObjectHandle::newInteger(length)); } |