aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2019-11-04 02:36:53 +0100
committerJay Berkenbilt <ejb@ql.org>2019-11-09 14:18:02 +0100
commit2de41856a0fe2181c0adb7ac1d7cf06037113775 (patch)
tree2768dc66dddd7a81b8911abf4387a74c4544b0c1 /libqpdf
parent34c0a880222916e324a0c383ec463f73922b3864 (diff)
downloadqpdf-2de41856a0fe2181c0adb7ac1d7cf06037113775.tar.zst
QPDFCryptoProvider: initial implementation
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFCryptoProvider.cc76
-rw-r--r--libqpdf/QPDFCrypto_native.cc1
-rw-r--r--libqpdf/build.mk2
-rw-r--r--libqpdf/qpdf/QPDFCrypto_native.hh16
4 files changed, 95 insertions, 0 deletions
diff --git a/libqpdf/QPDFCryptoProvider.cc b/libqpdf/QPDFCryptoProvider.cc
new file mode 100644
index 00000000..8d795534
--- /dev/null
+++ b/libqpdf/QPDFCryptoProvider.cc
@@ -0,0 +1,76 @@
+#include <qpdf/QPDFCryptoProvider.hh>
+#include <stdexcept>
+
+#include <qpdf/QPDFCrypto_native.hh>
+
+std::shared_ptr<QPDFCryptoImpl>
+QPDFCryptoProvider::getImpl()
+{
+ QPDFCryptoProvider& p = getInstance();
+ if (p.m->default_provider.empty())
+ {
+ throw std::logic_error(
+ "QPDFCryptoProvider::getImpl called with no default provider.");
+ }
+ return p.getImpl_internal(p.m->default_provider);
+}
+
+std::shared_ptr<QPDFCryptoImpl>
+QPDFCryptoProvider::getImpl(std::string const& name)
+{
+ return getInstance().getImpl_internal(name);
+}
+
+template<typename T>
+void
+QPDFCryptoProvider::registerImpl(std::string const& name)
+{
+ getInstance().registerImpl_internal<T>(name);
+}
+
+void
+QPDFCryptoProvider::setDefaultProvider(std::string const& name)
+{
+ getInstance().setDefaultProvider_internal(name);
+}
+
+QPDFCryptoProvider::QPDFCryptoProvider() :
+ m(std::make_shared<Members>())
+{
+ registerImpl_internal<QPDFCrypto_native>("native");
+ setDefaultProvider_internal("native");
+}
+
+QPDFCryptoProvider&
+QPDFCryptoProvider::getInstance()
+{
+ static QPDFCryptoProvider instance;
+ return instance;
+}
+
+std::shared_ptr<QPDFCryptoImpl>
+QPDFCryptoProvider::getImpl_internal(std::string const& name) const
+{
+ auto iter = this->m->providers.find(name);
+ if (iter == this->m->providers.end())
+ {
+ throw std::logic_error(
+ "QPDFCryptoProvider requested unknown implementation \"" +
+ name + "\"");
+ }
+ return this->m->providers[name]();
+}
+
+template<typename T>
+void
+QPDFCryptoProvider::registerImpl_internal(std::string const& name)
+{
+ this->m->providers[name] = std::make_shared<T>;
+
+}
+
+void
+QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name)
+{
+ this->m->default_provider = name;
+}
diff --git a/libqpdf/QPDFCrypto_native.cc b/libqpdf/QPDFCrypto_native.cc
new file mode 100644
index 00000000..ab9fd3a2
--- /dev/null
+++ b/libqpdf/QPDFCrypto_native.cc
@@ -0,0 +1 @@
+#include <qpdf/QPDFCrypto_native.hh>
diff --git a/libqpdf/build.mk b/libqpdf/build.mk
index 1da6c1a1..d2bcd8c5 100644
--- a/libqpdf/build.mk
+++ b/libqpdf/build.mk
@@ -39,6 +39,8 @@ SRCS_libqpdf = \
libqpdf/QPDF.cc \
libqpdf/QPDFAcroFormDocumentHelper.cc \
libqpdf/QPDFAnnotationObjectHelper.cc \
+ libqpdf/QPDFCryptoProvider.cc \
+ libqpdf/QPDFCrypto_native.cc \
libqpdf/QPDFExc.cc \
libqpdf/QPDFFormFieldObjectHelper.cc \
libqpdf/QPDFMatrix.cc \
diff --git a/libqpdf/qpdf/QPDFCrypto_native.hh b/libqpdf/qpdf/QPDFCrypto_native.hh
new file mode 100644
index 00000000..785d6c6f
--- /dev/null
+++ b/libqpdf/qpdf/QPDFCrypto_native.hh
@@ -0,0 +1,16 @@
+#ifndef QPDFCRYPTO_NATIVE_HH
+#define QPDFCRYPTO_NATIVE_HH
+
+#include <qpdf/DLL.h>
+#include <qpdf/QPDFCryptoImpl.hh>
+
+class QPDFCrypto_native: public QPDFCryptoImpl
+{
+ public:
+ QPDFCrypto_native() = default;
+
+ QPDF_DLL
+ virtual ~QPDFCrypto_native() = default;
+};
+
+#endif // QPDFCRYPTO_NATIVE_HH