From e410b0fe0d8c1da3e0b0e075b54f247b952389ef Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Thu, 15 Feb 2018 20:45:19 -0500 Subject: Simplify TokenFilter interface Expose Pl_QPDFTokenizer, and have it do more of the work of managing the token filter's pipeline. --- libqpdf/ContentNormalizer.cc | 6 ------ libqpdf/Pl_QPDFTokenizer.cc | 18 +++++++++++++----- libqpdf/QPDFObjectHandle.cc | 29 +++++++---------------------- libqpdf/QPDF_Stream.cc | 6 ++---- libqpdf/qpdf/ContentNormalizer.hh | 1 - 5 files changed, 22 insertions(+), 38 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/ContentNormalizer.cc b/libqpdf/ContentNormalizer.cc index f85ab829..83754937 100644 --- a/libqpdf/ContentNormalizer.cc +++ b/libqpdf/ContentNormalizer.cc @@ -82,12 +82,6 @@ ContentNormalizer::handleToken(QPDFTokenizer::Token const& token) } } -void -ContentNormalizer::handleEOF() -{ - finish(); -} - bool ContentNormalizer::anyBadTokens() const { diff --git a/libqpdf/Pl_QPDFTokenizer.cc b/libqpdf/Pl_QPDFTokenizer.cc index 4fc37767..577c5cc7 100644 --- a/libqpdf/Pl_QPDFTokenizer.cc +++ b/libqpdf/Pl_QPDFTokenizer.cc @@ -15,14 +15,15 @@ Pl_QPDFTokenizer::Members::~Members() { } -Pl_QPDFTokenizer::Pl_QPDFTokenizer( - char const* identifier, - QPDFObjectHandle::TokenFilter* filter) - : - Pipeline(identifier, 0), +Pl_QPDFTokenizer::Pl_QPDFTokenizer(char const* identifier, + QPDFObjectHandle::TokenFilter* filter, + Pipeline* next) : + Pipeline(identifier, next), m(new Members) { m->filter = filter; + QPDFObjectHandle::TokenFilter::PipelineAccessor::setPipeline( + m->filter, next); m->tokenizer.allowEOF(); m->tokenizer.includeIgnorable(); } @@ -88,4 +89,11 @@ Pl_QPDFTokenizer::finish() } this->m->filter->handleEOF(); + QPDFObjectHandle::TokenFilter::PipelineAccessor::setPipeline( + m->filter, 0); + Pipeline* next = this->getNext(true); + if (next) + { + next->finish(); + } } diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 5d7b0bb9..195442ca 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -16,7 +16,6 @@ #include #include #include -#include #include #include @@ -64,6 +63,11 @@ CoalesceProvider::provideStreamData(int, int, Pipeline* p) concat.manualFinish(); } +void +QPDFObjectHandle::TokenFilter::handleEOF() +{ +} + void QPDFObjectHandle::TokenFilter::setPipeline(Pipeline* p) { @@ -75,8 +79,7 @@ QPDFObjectHandle::TokenFilter::write(char const* data, size_t len) { if (! this->pipeline) { - throw std::logic_error( - "TokenFilter::write called before setPipeline"); + return; } if (len) { @@ -97,17 +100,6 @@ QPDFObjectHandle::TokenFilter::writeToken(QPDFTokenizer::Token const& token) write(value.c_str(), value.length()); } -void -QPDFObjectHandle::TokenFilter::finish() -{ - if (! this->pipeline) - { - throw std::logic_error( - "TokenFilter::finish called before setPipeline"); - } - this->pipeline->finish(); -} - void QPDFObjectHandle::ParserCallbacks::terminateParsing() { @@ -1007,14 +999,7 @@ QPDFObjectHandle::filterPageContents(TokenFilter* filter, Pipeline* next) std::string description = "token filter for page object " + QUtil::int_to_string(this->objid) + " " + QUtil::int_to_string(this->generation); - Pl_QPDFTokenizer token_pipeline(description.c_str(), filter); - PointerHolder next_p; - if (next == 0) - { - next_p = new Pl_Discard(); - next = next_p.getPointer(); - } - filter->setPipeline(next); + Pl_QPDFTokenizer token_pipeline(description.c_str(), filter, next); this->pipePageContents(&token_pipeline); } diff --git a/libqpdf/QPDF_Stream.cc b/libqpdf/QPDF_Stream.cc index bb1e24e6..7b84d10c 100644 --- a/libqpdf/QPDF_Stream.cc +++ b/libqpdf/QPDF_Stream.cc @@ -459,9 +459,8 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, if (encode_flags & qpdf_ef_normalize) { normalizer = new ContentNormalizer(); - normalizer->setPipeline(pipeline); pipeline = new Pl_QPDFTokenizer( - "normalizer", normalizer.getPointer()); + "normalizer", normalizer.getPointer(), pipeline); to_delete.push_back(pipeline); } @@ -470,9 +469,8 @@ QPDF_Stream::pipeStreamData(Pipeline* pipeline, this->token_filters.rbegin(); iter != this->token_filters.rend(); ++iter) { - (*iter)->setPipeline(pipeline); pipeline = new Pl_QPDFTokenizer( - "token filter", (*iter).getPointer()); + "token filter", (*iter).getPointer(), pipeline); to_delete.push_back(pipeline); } diff --git a/libqpdf/qpdf/ContentNormalizer.hh b/libqpdf/qpdf/ContentNormalizer.hh index 89b28f3a..0d505a37 100644 --- a/libqpdf/qpdf/ContentNormalizer.hh +++ b/libqpdf/qpdf/ContentNormalizer.hh @@ -9,7 +9,6 @@ class ContentNormalizer: public QPDFObjectHandle::TokenFilter ContentNormalizer(); virtual ~ContentNormalizer(); virtual void handleToken(QPDFTokenizer::Token const&); - virtual void handleEOF(); bool anyBadTokens() const; bool lastTokenWasBad() const; -- cgit v1.2.3-54-g00ecf