aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/ResourceFinder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/ResourceFinder.cc')
-rw-r--r--libqpdf/ResourceFinder.cc55
1 files changed, 43 insertions, 12 deletions
diff --git a/libqpdf/ResourceFinder.cc b/libqpdf/ResourceFinder.cc
index 74ba671f..6b9929e4 100644
--- a/libqpdf/ResourceFinder.cc
+++ b/libqpdf/ResourceFinder.cc
@@ -1,28 +1,53 @@
#include <qpdf/ResourceFinder.hh>
ResourceFinder::ResourceFinder() :
+ last_name_offset(0),
saw_bad(false)
{
}
void
-ResourceFinder::handleToken(QPDFTokenizer::Token const& token)
+ResourceFinder::handleObject(QPDFObjectHandle obj, size_t offset, size_t)
{
- if ((token.getType() == QPDFTokenizer::tt_word) &&
- (! this->last_name.empty()))
+ if (obj.isOperator() && (! this->last_name.empty()))
{
- this->names.insert(this->last_name);
+ static std::map<std::string, std::string> op_to_rtype = {
+ {"CS", "/ColorSpace"},
+ {"cs", "/ColorSpace"},
+ {"gs", "/ExtGState"},
+ {"Tf", "/Font"},
+ {"SCN", "/Pattern"},
+ {"scn", "/Pattern"},
+ {"BDC", "/Properties"},
+ {"DP", "/Properties"},
+ {"sh", "/Shading"},
+ {"Do", "/XObject"},
+ };
+ std::string op = obj.getOperatorValue();
+ std::string resource_type;
+ auto iter = op_to_rtype.find(op);
+ if (iter != op_to_rtype.end())
+ {
+ resource_type = iter->second;
+ }
+ if (! resource_type.empty())
+ {
+ this->names.insert(this->last_name);
+ this->names_by_resource_type[
+ resource_type][this->last_name].insert(this->last_name_offset);
+ }
}
- else if (token.getType() == QPDFTokenizer::tt_name)
+ else if (obj.isName())
{
- this->last_name =
- QPDFObjectHandle::newName(token.getValue()).getName();
+ this->last_name = obj.getName();
+ this->last_name_offset = offset;
}
- else if (token.getType() == QPDFTokenizer::tt_bad)
- {
- saw_bad = true;
- }
- writeToken(token);
+}
+
+void
+ResourceFinder::handleWarning()
+{
+ this->saw_bad = true;
}
std::set<std::string> const&
@@ -31,6 +56,12 @@ ResourceFinder::getNames() const
return this->names;
}
+std::map<std::string, std::map<std::string, std::set<size_t>>> const&
+ResourceFinder::getNamesByResourceType() const
+{
+ return this->names_by_resource_type;
+}
+
bool
ResourceFinder::sawBad() const
{