diff options
author | Jay Berkenbilt <ejb@ql.org> | 2019-11-04 02:36:53 +0100 |
---|---|---|
committer | Jay Berkenbilt <ejb@ql.org> | 2019-11-09 14:18:02 +0100 |
commit | 2de41856a0fe2181c0adb7ac1d7cf06037113775 (patch) | |
tree | 2768dc66dddd7a81b8911abf4387a74c4544b0c1 /libqpdf | |
parent | 34c0a880222916e324a0c383ec463f73922b3864 (diff) | |
download | qpdf-2de41856a0fe2181c0adb7ac1d7cf06037113775.tar.zst |
QPDFCryptoProvider: initial implementation
Diffstat (limited to 'libqpdf')
-rw-r--r-- | libqpdf/QPDFCryptoProvider.cc | 76 | ||||
-rw-r--r-- | libqpdf/QPDFCrypto_native.cc | 1 | ||||
-rw-r--r-- | libqpdf/build.mk | 2 | ||||
-rw-r--r-- | libqpdf/qpdf/QPDFCrypto_native.hh | 16 |
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 |