aboutsummaryrefslogtreecommitdiffstats
path: root/qpdf
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 /qpdf
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 'qpdf')
-rw-r--r--qpdf/qpdf.testcov2
-rw-r--r--qpdf/qtest/qpdf.test2
-rw-r--r--qpdf/qtest/qpdf/test8.out2
-rw-r--r--qpdf/test_driver.cc53
4 files changed, 56 insertions, 3 deletions
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index c90fcba4..c880188e 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -176,3 +176,5 @@ qpdf-c called qpdf_has_error 0
qpdf-c called qpdf_get_qpdf_version 0
QPDF_Stream pipe original stream data 0
QPDF_Stream pipe replaced stream data 0
+QPDF_Stream pipe use stream provider 0
+QPDF_Stream provider length mismatch 0
diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test
index 69c4776e..6768ebd4 100644
--- a/qpdf/qtest/qpdf.test
+++ b/qpdf/qtest/qpdf.test
@@ -107,7 +107,7 @@ $td->runtest("check output",
$td->runtest("replace stream data compressed",
{$td->COMMAND => "test_driver 8 qstream.pdf"},
- {$td->STRING => "test 8 done\n", $td->EXIT_STATUS => 0},
+ {$td->FILE => "test8.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("check output",
{$td->FILE => "a.pdf"},
diff --git a/qpdf/qtest/qpdf/test8.out b/qpdf/qtest/qpdf/test8.out
new file mode 100644
index 00000000..0311b389
--- /dev/null
+++ b/qpdf/qtest/qpdf/test8.out
@@ -0,0 +1,2 @@
+exception: stream data provider for 7 0 provided 29 bytes instead of expected 28 bytes
+test 8 done
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index db6a0619..e9739e92 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -23,6 +23,39 @@ void usage()
exit(2);
}
+class Provider: public QPDFObjectHandle::StreamDataProvider
+{
+ public:
+ Provider(PointerHolder<Buffer> b) :
+ b(b),
+ bad_length(false)
+ {
+ }
+ virtual ~Provider()
+ {
+ }
+ virtual void provideStreamData(int objid, int generation,
+ Pipeline* p)
+ {
+ p->write(b.getPointer()->getBuffer(),
+ b.getPointer()->getSize());
+ if (this->bad_length)
+ {
+ unsigned char ch = ' ';
+ p->write(&ch, 1);
+ }
+ p->finish();
+ }
+ void badLength(bool v)
+ {
+ this->bad_length = v;
+ }
+
+ private:
+ PointerHolder<Buffer> b;
+ bool bad_length;
+};
+
void runtest(int n, char const* filename)
{
QPDF pdf;
@@ -341,9 +374,25 @@ void runtest(int n, char const* filename)
p2.write((unsigned char*)"new data for stream\n", 20); // no null!
p2.finish();
PointerHolder<Buffer> b = p1.getBuffer();
+ // This is a bogus way to use StreamDataProvider, but it does
+ // adequately test its functionality.
+ Provider* provider = new Provider(b);
+ PointerHolder<QPDFObjectHandle::StreamDataProvider> p = provider;
qstream.replaceStreamData(
- b, QPDFObjectHandle::newName("/FlateDecode"),
- QPDFObjectHandle::newNull());
+ p, QPDFObjectHandle::newName("/FlateDecode"),
+ QPDFObjectHandle::newNull(),
+ b.getPointer()->getSize());
+ provider->badLength(true);
+ try
+ {
+ qstream.getStreamData();
+ std::cout << "oops -- getStreamData didn't throw" << std::endl;
+ }
+ catch (std::logic_error const& e)
+ {
+ std::cout << "exception: " << e.what() << std::endl;
+ }
+ provider->badLength(false);
QPDFWriter w(pdf, "a.pdf");
w.setStaticID(true);
w.setStreamDataMode(qpdf_s_preserve);