aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDF_Stream.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2010-08-05 21:04:22 +0200
committerJay Berkenbilt <ejb@ql.org>2010-08-05 21:04:22 +0200
commit11df7809af7131af139be2e76f2db87128700939 (patch)
treede549eec5d64837384f60d319ce072d1455baaa8 /libqpdf/QPDF_Stream.cc
parent98765c3b5ceecb2c2540405eab1dd7ae1f02ec31 (diff)
downloadqpdf-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.cc55
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));
}