From 2de41856a0fe2181c0adb7ac1d7cf06037113775 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 3 Nov 2019 20:36:53 -0500 Subject: QPDFCryptoProvider: initial implementation --- libqpdf/QPDFCryptoProvider.cc | 76 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 libqpdf/QPDFCryptoProvider.cc (limited to 'libqpdf/QPDFCryptoProvider.cc') 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 +#include + +#include + +std::shared_ptr +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 +QPDFCryptoProvider::getImpl(std::string const& name) +{ + return getInstance().getImpl_internal(name); +} + +template +void +QPDFCryptoProvider::registerImpl(std::string const& name) +{ + getInstance().registerImpl_internal(name); +} + +void +QPDFCryptoProvider::setDefaultProvider(std::string const& name) +{ + getInstance().setDefaultProvider_internal(name); +} + +QPDFCryptoProvider::QPDFCryptoProvider() : + m(std::make_shared()) +{ + registerImpl_internal("native"); + setDefaultProvider_internal("native"); +} + +QPDFCryptoProvider& +QPDFCryptoProvider::getInstance() +{ + static QPDFCryptoProvider instance; + return instance; +} + +std::shared_ptr +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 +void +QPDFCryptoProvider::registerImpl_internal(std::string const& name) +{ + this->m->providers[name] = std::make_shared; + +} + +void +QPDFCryptoProvider::setDefaultProvider_internal(std::string const& name) +{ + this->m->default_provider = name; +} -- cgit v1.2.3-54-g00ecf