Warning, file /include/cryptopp/factory.h was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006 #ifndef CRYPTOPP_OBJFACT_H
0007 #define CRYPTOPP_OBJFACT_H
0008
0009 #include "cryptlib.h"
0010 #include "misc.h"
0011 #include "stdcpp.h"
0012
0013 NAMESPACE_BEGIN(CryptoPP)
0014
0015
0016
0017 template <class AbstractClass>
0018 class ObjectFactory
0019 {
0020 public:
0021 virtual ~ObjectFactory () {}
0022 virtual AbstractClass * CreateObject() const =0;
0023 };
0024
0025
0026
0027
0028 template <class AbstractClass, class ConcreteClass>
0029 class DefaultObjectFactory : public ObjectFactory<AbstractClass>
0030 {
0031 public:
0032 AbstractClass * CreateObject() const
0033 {
0034 return new ConcreteClass;
0035 }
0036 };
0037
0038
0039
0040
0041 template <class AbstractClass, int instance=0>
0042 class ObjectFactoryRegistry
0043 {
0044 public:
0045 class FactoryNotFound : public Exception
0046 {
0047 public:
0048 FactoryNotFound(const char *name) : Exception(OTHER_ERROR, std::string("ObjectFactoryRegistry: could not find factory for algorithm ") + name) {}
0049 };
0050
0051 ~ObjectFactoryRegistry()
0052 {
0053 for (typename Map::iterator i = m_map.begin(); i != m_map.end(); ++i)
0054 {
0055 delete (ObjectFactory<AbstractClass> *)i->second;
0056 i->second = NULLPTR;
0057 }
0058 }
0059
0060 void RegisterFactory(const std::string &name, ObjectFactory<AbstractClass> *factory)
0061 {
0062 m_map[name] = factory;
0063 }
0064
0065 const ObjectFactory<AbstractClass> * GetFactory(const char *name) const
0066 {
0067 typename Map::const_iterator i = m_map.find(name);
0068 return i == m_map.end() ? NULLPTR : (ObjectFactory<AbstractClass> *)i->second;
0069 }
0070
0071 AbstractClass *CreateObject(const char *name) const
0072 {
0073 const ObjectFactory<AbstractClass> *factory = GetFactory(name);
0074 if (!factory)
0075 throw FactoryNotFound(name);
0076 return factory->CreateObject();
0077 }
0078
0079
0080
0081 std::vector<std::string> GetFactoryNames() const
0082 {
0083 std::vector<std::string> names;
0084 typename Map::const_iterator iter;
0085 for (iter = m_map.begin(); iter != m_map.end(); ++iter)
0086 names.push_back(iter->first);
0087 return names;
0088 }
0089
0090 CRYPTOPP_NOINLINE static ObjectFactoryRegistry<AbstractClass, instance> & Registry(CRYPTOPP_NOINLINE_DOTDOTDOT);
0091
0092 private:
0093
0094 typedef std::map<std::string, void *> Map;
0095 Map m_map;
0096 };
0097
0098 template <class AbstractClass, int instance>
0099 ObjectFactoryRegistry<AbstractClass, instance> & ObjectFactoryRegistry<AbstractClass, instance>::Registry(CRYPTOPP_NOINLINE_DOTDOTDOT)
0100 {
0101 static ObjectFactoryRegistry<AbstractClass, instance> s_registry;
0102 return s_registry;
0103 }
0104
0105
0106
0107
0108
0109 template <class AbstractClass, class ConcreteClass, int instance = 0>
0110 struct RegisterDefaultFactoryFor
0111 {
0112 RegisterDefaultFactoryFor(const char *name=NULLPTR)
0113 {
0114
0115 std::string n = name ? std::string(name) : std::string(ConcreteClass::StaticAlgorithmName());
0116 ObjectFactoryRegistry<AbstractClass, instance>::Registry().
0117 RegisterFactory(n, new DefaultObjectFactory<AbstractClass, ConcreteClass>);
0118 }
0119 };
0120
0121
0122
0123
0124
0125
0126
0127
0128 template <class SchemeClass>
0129 void RegisterAsymmetricCipherDefaultFactories(const char *name=NULLPTR)
0130 {
0131 RegisterDefaultFactoryFor<PK_Encryptor, typename SchemeClass::Encryptor>((const char *)name);
0132 RegisterDefaultFactoryFor<PK_Decryptor, typename SchemeClass::Decryptor>((const char *)name);
0133 }
0134
0135
0136
0137
0138
0139
0140
0141
0142 template <class SchemeClass>
0143 void RegisterSignatureSchemeDefaultFactories(const char *name=NULLPTR)
0144 {
0145 RegisterDefaultFactoryFor<PK_Signer, typename SchemeClass::Signer>((const char *)name);
0146 RegisterDefaultFactoryFor<PK_Verifier, typename SchemeClass::Verifier>((const char *)name);
0147 }
0148
0149
0150
0151
0152
0153
0154
0155
0156 template <class SchemeClass>
0157 void RegisterSymmetricCipherDefaultFactories(const char *name=NULLPTR)
0158 {
0159 RegisterDefaultFactoryFor<SymmetricCipher, typename SchemeClass::Encryption, ENCRYPTION>((const char *)name);
0160 RegisterDefaultFactoryFor<SymmetricCipher, typename SchemeClass::Decryption, DECRYPTION>((const char *)name);
0161 }
0162
0163
0164
0165
0166
0167
0168
0169
0170 template <class SchemeClass>
0171 void RegisterAuthenticatedSymmetricCipherDefaultFactories(const char *name=NULLPTR)
0172 {
0173 RegisterDefaultFactoryFor<AuthenticatedSymmetricCipher, typename SchemeClass::Encryption, ENCRYPTION>((const char *)name);
0174 RegisterDefaultFactoryFor<AuthenticatedSymmetricCipher, typename SchemeClass::Decryption, DECRYPTION>((const char *)name);
0175 }
0176
0177 NAMESPACE_END
0178
0179 #endif