aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFEFStreamObjectHelper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libqpdf/QPDFEFStreamObjectHelper.cc')
-rw-r--r--libqpdf/QPDFEFStreamObjectHelper.cc193
1 files changed, 193 insertions, 0 deletions
diff --git a/libqpdf/QPDFEFStreamObjectHelper.cc b/libqpdf/QPDFEFStreamObjectHelper.cc
new file mode 100644
index 00000000..c4e64a71
--- /dev/null
+++ b/libqpdf/QPDFEFStreamObjectHelper.cc
@@ -0,0 +1,193 @@
+#include <qpdf/QPDFEFStreamObjectHelper.hh>
+#include <qpdf/QIntC.hh>
+#include <qpdf/QUtil.hh>
+#include <qpdf/Pl_Count.hh>
+#include <qpdf/Pl_MD5.hh>
+#include <qpdf/Pl_Discard.hh>
+
+QPDFEFStreamObjectHelper::QPDFEFStreamObjectHelper(
+ QPDFObjectHandle oh) :
+ QPDFObjectHelper(oh),
+ m(new Members())
+{
+}
+
+QPDFEFStreamObjectHelper::Members::Members()
+{
+}
+
+QPDFObjectHandle
+QPDFEFStreamObjectHelper::getParam(std::string const& pkey)
+{
+ auto params = this->oh.getDict().getKey("/Params");
+ if (params.isDictionary())
+ {
+ return params.getKey(pkey);
+ }
+ return QPDFObjectHandle::newNull();
+}
+
+void
+QPDFEFStreamObjectHelper::setParam(
+ std::string const& pkey, QPDFObjectHandle const& pval)
+{
+ auto params = this->oh.getDict().getKey("/Params");
+ if (! params.isDictionary())
+ {
+ params = QPDFObjectHandle::newDictionary();
+ this->oh.getDict().replaceKey("/Params", params);
+ }
+ params.replaceKey(pkey, pval);
+}
+
+std::string
+QPDFEFStreamObjectHelper::getCreationDate()
+{
+ auto val = getParam("/CreationDate");
+ if (val.isString())
+ {
+ return val.getUTF8Value();
+ }
+ return "";
+}
+
+std::string
+QPDFEFStreamObjectHelper::getModDate()
+{
+ auto val = getParam("/ModDate");
+ if (val.isString())
+ {
+ return val.getUTF8Value();
+ }
+ return "";
+}
+
+size_t
+QPDFEFStreamObjectHelper::getSize()
+{
+ auto val = getParam("/Size");
+ if (val.isInteger())
+ {
+ return QIntC::to_size(val.getUIntValueAsUInt());
+ }
+ return 0;
+}
+
+std::string
+QPDFEFStreamObjectHelper::getSubtype()
+{
+ auto val = getParam("/Subtype");
+ if (val.isName())
+ {
+ auto n = val.getName();
+ if (n.length() > 1)
+ {
+ return n.substr(1);
+ }
+ }
+ return "";
+}
+
+std::string
+QPDFEFStreamObjectHelper::getChecksum()
+{
+ auto val = getParam("/CheckSum");
+ if (val.isString())
+ {
+ return val.getStringValue();
+ }
+ return "";
+}
+
+QPDFEFStreamObjectHelper
+QPDFEFStreamObjectHelper::createEFStream(
+ QPDF& qpdf, PointerHolder<Buffer> data)
+{
+ return newFromStream(QPDFObjectHandle::newStream(&qpdf, data));
+}
+
+QPDFEFStreamObjectHelper
+QPDFEFStreamObjectHelper::createEFStream(
+ QPDF& qpdf, std::string const& data)
+{
+ return newFromStream(QPDFObjectHandle::newStream(&qpdf, data));
+}
+
+namespace QEF
+{
+ class Provider: public QPDFObjectHandle::StreamDataProvider
+ {
+ public:
+ Provider(std::function<void(Pipeline*)> provider) :
+ StreamDataProvider(false),
+ provider(provider)
+ {
+ }
+ virtual ~Provider() = default;
+ virtual void provideStreamData(int objid, int generation,
+ Pipeline* pipeline) override
+ {
+ this->provider(pipeline);
+ }
+
+ private:
+ std::function<void(Pipeline*)> provider;
+ };
+};
+
+QPDFEFStreamObjectHelper
+QPDFEFStreamObjectHelper::createEFStream(
+ QPDF& qpdf, std::function<void(Pipeline*)> provider)
+{
+ auto stream = QPDFObjectHandle::newStream(&qpdf);
+ stream.replaceStreamData(new QEF::Provider(provider),
+ QPDFObjectHandle::newNull(),
+ QPDFObjectHandle::newNull());
+ return newFromStream(stream);
+}
+
+QPDFEFStreamObjectHelper&
+QPDFEFStreamObjectHelper::setCreationDate(std::string const& date)
+{
+ setParam("/CreationDate", QPDFObjectHandle::newString(date));
+ return *this;
+}
+
+QPDFEFStreamObjectHelper&
+QPDFEFStreamObjectHelper::setModDate(std::string const& date)
+{
+ setParam("/ModDate", QPDFObjectHandle::newString(date));
+ return *this;
+}
+
+QPDFEFStreamObjectHelper&
+QPDFEFStreamObjectHelper::setSubtype(std::string const& subtype)
+{
+ setParam("/Subtype", QPDFObjectHandle::newName("/" + subtype));
+ return *this;
+}
+
+QPDFEFStreamObjectHelper
+QPDFEFStreamObjectHelper::newFromStream(QPDFObjectHandle stream)
+{
+ QPDFEFStreamObjectHelper result(stream);
+ stream.getDict().replaceKey(
+ "/Type", QPDFObjectHandle::newName("/EmbeddedFile"));
+ Pl_Discard discard;
+ Pl_MD5 md5("EF md5", &discard);
+ Pl_Count count("EF size", &md5);
+ if (! stream.pipeStreamData(&count, nullptr, 0, qpdf_dl_all))
+ {
+ stream.warnIfPossible(
+ "unable to get stream data for new embedded file stream");
+ }
+ else
+ {
+ result.setParam(
+ "/Size", QPDFObjectHandle::newInteger(count.getCount()));
+ result.setParam(
+ "/CheckSum", QPDFObjectHandle::newString(
+ QUtil::hex_decode(md5.getHexDigest())));
+ }
+ return result;
+}