From 99101044429c3c91bd11bdd1b26e5b6c2ceb140b Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Fri, 2 Feb 2018 18:21:34 -0500 Subject: Implement TokenFilter and refactor Pl_QPDFTokenizer Implement a TokenFilter class and refactor Pl_QPDFTokenizer to use a TokenFilter class called ContentNormalizer. Pl_QPDFTokenizer is now a general filter that passes data through a TokenFilter. --- libqpdf/QPDFObjectHandle.cc | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'libqpdf/QPDFObjectHandle.cc') diff --git a/libqpdf/QPDFObjectHandle.cc b/libqpdf/QPDFObjectHandle.cc index 51de87e1..bba95938 100644 --- a/libqpdf/QPDFObjectHandle.cc +++ b/libqpdf/QPDFObjectHandle.cc @@ -62,6 +62,50 @@ CoalesceProvider::provideStreamData(int, int, Pipeline* p) concat.manualFinish(); } +void +QPDFObjectHandle::TokenFilter::setPipeline(Pipeline* p) +{ + this->pipeline = p; +} + +void +QPDFObjectHandle::TokenFilter::write(char const* data, size_t len) +{ + if (! this->pipeline) + { + throw std::logic_error( + "TokenFilter::write called before setPipeline"); + } + if (len) + { + this->pipeline->write(QUtil::unsigned_char_pointer(data), len); + } +} + +void +QPDFObjectHandle::TokenFilter::write(std::string const& str) +{ + write(str.c_str(), str.length()); +} + +void +QPDFObjectHandle::TokenFilter::writeToken(QPDFTokenizer::Token const& token) +{ + std::string value = token.getRawValue(); + 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() { @@ -508,6 +552,13 @@ QPDFObjectHandle::getDict() return dynamic_cast(obj.getPointer())->getDict(); } +bool +QPDFObjectHandle::isDataModified() +{ + assertStream(); + return dynamic_cast(obj.getPointer())->isDataModified(); +} + void QPDFObjectHandle::replaceDict(QPDFObjectHandle new_dict) { @@ -1033,6 +1084,21 @@ QPDFObjectHandle::parseContentStream_data( } } +void +QPDFObjectHandle::addContentTokenFilter(PointerHolder filter) +{ + coalesceContentStreams(); + this->getKey("/Contents").addTokenFilter(filter); +} + +void +QPDFObjectHandle::addTokenFilter(PointerHolder filter) +{ + assertStream(); + return dynamic_cast( + obj.getPointer())->addTokenFilter(filter); +} + QPDFObjectHandle QPDFObjectHandle::parse(PointerHolder input, std::string const& object_description, -- cgit v1.2.3-54-g00ecf