aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFEFStreamObjectHelper.cc
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-02-09 00:07:21 +0100
committerJay Berkenbilt <ejb@ql.org>2021-02-10 12:57:37 +0100
commitad34b9c278608dfdcfdbe7402acb3a6dd04c3d0e (patch)
tree5ba96898c85ae2106b44abe5120c49e4cb7b81e5 /libqpdf/QPDFEFStreamObjectHelper.cc
parentbf0e6eb3022bf2fde5623a0a3d151c07f5e82945 (diff)
downloadqpdf-ad34b9c278608dfdcfdbe7402acb3a6dd04c3d0e.tar.zst
Implement helpers for file attachments
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;
+}