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 /qpdf | |
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 'qpdf')
-rw-r--r-- | qpdf/qpdf.testcov | 2 | ||||
-rw-r--r-- | qpdf/qtest/qpdf.test | 2 | ||||
-rw-r--r-- | qpdf/qtest/qpdf/test8.out | 2 | ||||
-rw-r--r-- | qpdf/test_driver.cc | 53 |
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); |