aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2018-02-16 02:45:19 +0100
committerJay Berkenbilt <ejb@ql.org>2018-02-19 03:05:47 +0100
commite410b0fe0d8c1da3e0b0e075b54f247b952389ef (patch)
tree49020a0201961e9e6e0da9b4ab7fa2a498529759 /libqpdf
parent1fdd86a04924e4ab9543133b74df3322cffbd358 (diff)
downloadqpdf-e410b0fe0d8c1da3e0b0e075b54f247b952389ef.tar.zst
Simplify TokenFilter interface
Expose Pl_QPDFTokenizer, and have it do more of the work of managing the token filter's pipeline.
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/ContentNormalizer.cc6
-rw-r--r--libqpdf/Pl_QPDFTokenizer.cc18
-rw-r--r--libqpdf/QPDFObjectHandle.cc29
-rw-r--r--libqpdf/QPDF_Stream.cc6
-rw-r--r--libqpdf/qpdf/ContentNormalizer.hh1
5 files changed, 22 insertions, 38 deletions
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 <qpdf/Pl_Buffer.hh>
#include <qpdf/Pl_Concatenate.hh>
#include <qpdf/Pl_QPDFTokenizer.hh>
-#include <qpdf/Pl_Discard.hh>
#include <qpdf/BufferInputSource.hh>
#include <qpdf/QPDFExc.hh>
@@ -65,6 +64,11 @@ CoalesceProvider::provideStreamData(int, int, Pipeline* p)
}
void
+QPDFObjectHandle::TokenFilter::handleEOF()
+{
+}
+
+void
QPDFObjectHandle::TokenFilter::setPipeline(Pipeline* p)
{
this->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)
{
@@ -98,17 +101,6 @@ QPDFObjectHandle::TokenFilter::writeToken(QPDFTokenizer::Token const& token)
}
void
-QPDFObjectHandle::TokenFilter::finish()
-{
- if (! this->pipeline)
- {
- throw std::logic_error(
- "TokenFilter::finish called before setPipeline");
- }
- this->pipeline->finish();
-}
-
-void
QPDFObjectHandle::ParserCallbacks::terminateParsing()
{
throw 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<Pipeline> 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;