diff options
author | Jay Berkenbilt <ejb@ql.org> | 2010-08-05 21:04:22 +0200 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2010-08-05 21:04:22 +0200 |
commit | 11df7809af7131af139be2e76f2db87128700939 (patch) | |
tree | de549eec5d64837384f60d319ce072d1455baaa8 /libqpdf/QPDF_Stream.cc | |
parent | 98765c3b5ceecb2c2540405eab1dd7ae1f02ec31 (diff) | |
download | qpdf-11df7809af7131af139be2e76f2db87128700939.tar.zst |
add pipeline-based stream data replacement function
git-svn-id: svn+q:///qpdf/trunk@990 71b93d88-0707-0410-a8cf-f5a4172ac649
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)); } |