#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; }