aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf/QPDFCryptoProvider.cc
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/QPDFCryptoProvider.cc
parent34c0a880222916e324a0c383ec463f73922b3864 (diff)
downloadqpdf-2de41856a0fe2181c0adb7ac1d7cf06037113775.tar.zst
QPDFCryptoProvider: initial implementation
Diffstat (limited to 'libqpdf/QPDFCryptoProvider.cc')
-rw-r--r--libqpdf/QPDFCryptoProvider.cc76
1 files changed, 76 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;
+}