aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
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
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')
-rw-r--r--libqpdf/QPDFObjectHandle.cc15
-rw-r--r--libqpdf/QPDF_Stream.cc55
-rw-r--r--libqpdf/qpdf/QPDF_Stream.hh13
3 files changed, 75 insertions, 8 deletions
diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc
index 756f3f55..649ce3f0 100644
--- a/libqpdf/QPDFObjectHandle.cc
+++ b/libqpdf/QPDFObjectHandle.cc
@@ -354,14 +354,25 @@ QPDFObjectHandle::pipeStreamData(Pipeline* p, bool filter,
void
QPDFObjectHandle::replaceStreamData(PointerHolder<Buffer> data,
- QPDFObjectHandle filter,
- QPDFObjectHandle decode_parms)
+ QPDFObjectHandle const& filter,
+ QPDFObjectHandle const& decode_parms)
{
assertType("Stream", isStream());
dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(
data, filter, decode_parms);
}
+void
+QPDFObjectHandle::replaceStreamData(PointerHolder<StreamDataProvider> provider,
+ QPDFObjectHandle const& filter,
+ QPDFObjectHandle const& decode_parms,
+ size_t length)
+{
+ assertType("Stream", isStream());
+ dynamic_cast<QPDF_Stream*>(obj.getPointer())->replaceStreamData(
+ provider, filter, decode_parms, length);
+}
+
int
QPDFObjectHandle::getObjectID() const
{
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));
}
diff --git a/libqpdf/qpdf/QPDF_Stream.hh b/libqpdf/qpdf/QPDF_Stream.hh
index 86a585c9..1790121e 100644
--- a/libqpdf/qpdf/QPDF_Stream.hh
+++ b/libqpdf/qpdf/QPDF_Stream.hh
@@ -23,10 +23,18 @@ class QPDF_Stream: public QPDFObject
bool normalize, bool compress);
PointerHolder<Buffer> getStreamData();
void replaceStreamData(PointerHolder<Buffer> data,
- QPDFObjectHandle filter,
- QPDFObjectHandle decode_parms);
+ QPDFObjectHandle const& filter,
+ QPDFObjectHandle const& decode_parms);
+ void replaceStreamData(
+ PointerHolder<QPDFObjectHandle::StreamDataProvider> provider,
+ QPDFObjectHandle const& filter,
+ QPDFObjectHandle const& decode_parms,
+ size_t length);
private:
+ void replaceFilterData(QPDFObjectHandle const& filter,
+ QPDFObjectHandle const& decode_parms,
+ size_t length);
bool filterable(std::vector<std::string>& filters,
int& predictor, int& columns, bool& early_code_change);
@@ -37,6 +45,7 @@ class QPDF_Stream: public QPDFObject
off_t offset;
int length;
PointerHolder<Buffer> stream_data;
+ PointerHolder<QPDFObjectHandle::StreamDataProvider> stream_provider;
};
#endif // __QPDF_STREAM_HH__