2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-06-29 16:43:35 +00:00
qpdf/libqpdf/Pl_QPDFTokenizer.cc
Jay Berkenbilt ec9e310c9e Refactor QPDFTokenizer's inline image handling
Add a version of expectInlineImage that takes an input source and
searches for EI. This is in preparation for improving the way EI is
found. This commit just refactors the code without changing the
functionality and adds tests to make sure the old and new code behave
identically.
2019-01-31 09:26:37 -05:00

75 lines
1.8 KiB
C++

#include <qpdf/Pl_QPDFTokenizer.hh>
#include <qpdf/QTC.hh>
#include <qpdf/QUtil.hh>
#include <qpdf/BufferInputSource.hh>
#include <stdexcept>
#include <string.h>
Pl_QPDFTokenizer::Members::Members() :
filter(0),
buf("tokenizer buffer")
{
}
Pl_QPDFTokenizer::Members::~Members()
{
}
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();
}
Pl_QPDFTokenizer::~Pl_QPDFTokenizer()
{
}
void
Pl_QPDFTokenizer::write(unsigned char* data, size_t len)
{
this->m->buf.write(data, len);
}
void
Pl_QPDFTokenizer::finish()
{
this->m->buf.finish();
PointerHolder<InputSource> input =
new BufferInputSource("tokenizer data",
this->m->buf.getBuffer(), true);
while (true)
{
QPDFTokenizer::Token token = this->m->tokenizer.readToken(
input, "offset " + QUtil::int_to_string(input->tell()),
true);
this->m->filter->handleToken(token);
if (token.getType() == QPDFTokenizer::tt_eof)
{
break;
}
else if ((token.getType() == QPDFTokenizer::tt_word) &&
(token.getValue() == "ID"))
{
QTC::TC("qpdf", "Pl_QPDFTokenizer found ID");
this->m->tokenizer.expectInlineImage(input);
}
}
this->m->filter->handleEOF();
QPDFObjectHandle::TokenFilter::PipelineAccessor::setPipeline(
m->filter, 0);
Pipeline* next = this->getNext(true);
if (next)
{
next->finish();
}
}