diff options
author | weidai <weidai11@users.noreply.github.com> | 2004-07-22 00:51:57 +0000 |
---|---|---|
committer | weidai <weidai11@users.noreply.github.com> | 2004-07-22 00:51:57 +0000 |
commit | 393ae4859a9d3df3c5aee304b4c65121b657f613 (patch) | |
tree | faff40f3429fb7fb70249c83afd5378f92ebdb31 /factory.h | |
parent | ad8043d50c19d94177a420fba5ef6e9fd15afff1 (diff) | |
download | cryptopp-git-393ae4859a9d3df3c5aee304b4c65121b657f613.tar.gz |
fix documentation, fix PanamaMAC, fix algorithm names
Diffstat (limited to 'factory.h')
-rw-r--r-- | factory.h | 26 |
1 files changed, 19 insertions, 7 deletions
@@ -6,6 +6,7 @@ NAMESPACE_BEGIN(CryptoPP) +//! _ template <class AbstractClass> class ObjectFactory { @@ -13,6 +14,7 @@ public: virtual AbstractClass * CreateObject() const =0; }; +//! _ template <class AbstractClass, class ConcreteClass> class DefaultObjectFactory : public ObjectFactory<AbstractClass> { @@ -24,10 +26,17 @@ public: }; +//! _ template <class AbstractClass, int instance=0> class ObjectFactoryRegistry { public: + class FactoryNotFound : public Exception + { + public: + FactoryNotFound(const char *name) : Exception(OTHER_ERROR, std::string("ObjectFactoryRegistry: could not find factory for algorithm ") + name) {} + }; + ~ObjectFactoryRegistry() { for (CPP_TYPENAME Map::iterator i = m_map.begin(); i != m_map.end(); ++i) @@ -37,7 +46,7 @@ public: } } - void RegisterFactory(const char *name, ObjectFactory<AbstractClass> *factory) + void RegisterFactory(const std::string &name, ObjectFactory<AbstractClass> *factory) { m_map[name] = factory; } @@ -51,7 +60,9 @@ public: AbstractClass *CreateObject(const char *name) const { const ObjectFactory<AbstractClass> *factory = GetFactory(name); - return factory ? factory->CreateObject() : NULL; + if (!factory) + throw FactoryNotFound(name); + return factory->CreateObject(); } // VC60 workaround: use "..." to prevent this function from being inlined @@ -72,27 +83,28 @@ ObjectFactoryRegistry<AbstractClass, instance> & ObjectFactoryRegistry<AbstractC template <class AbstractClass, class ConcreteClass, int instance = 0> struct RegisterDefaultFactoryFor { -RegisterDefaultFactoryFor(const char *name) +RegisterDefaultFactoryFor(const char *name=NULL) { - ObjectFactoryRegistry<AbstractClass, instance>::Registry().RegisterFactory(name, new DefaultObjectFactory<AbstractClass, ConcreteClass>); + ObjectFactoryRegistry<AbstractClass, instance>::Registry(). + RegisterFactory(name ? name : ConcreteClass::StaticAlgorithmName(), new DefaultObjectFactory<AbstractClass, ConcreteClass>); }}; template <class SchemeClass> -void RegisterAsymmetricCipherDefaultFactories(const char *name, SchemeClass *dummy=NULL) +void RegisterAsymmetricCipherDefaultFactories(const char *name=NULL, SchemeClass *dummy=NULL) { RegisterDefaultFactoryFor<PK_Encryptor, CPP_TYPENAME SchemeClass::Encryptor>((const char *)name); RegisterDefaultFactoryFor<PK_Decryptor, CPP_TYPENAME SchemeClass::Decryptor>((const char *)name); } template <class SchemeClass> -void RegisterSignatureSchemeDefaultFactories(const char *name, SchemeClass *dummy=NULL) +void RegisterSignatureSchemeDefaultFactories(const char *name=NULL, SchemeClass *dummy=NULL) { RegisterDefaultFactoryFor<PK_Signer, CPP_TYPENAME SchemeClass::Signer>((const char *)name); RegisterDefaultFactoryFor<PK_Verifier, CPP_TYPENAME SchemeClass::Verifier>((const char *)name); } template <class SchemeClass> -void RegisterSymmetricCipherDefaultFactories(const char *name, SchemeClass *dummy=NULL) +void RegisterSymmetricCipherDefaultFactories(const char *name=NULL, SchemeClass *dummy=NULL) { RegisterDefaultFactoryFor<SymmetricCipher, CPP_TYPENAME SchemeClass::Encryption, ENCRYPTION>((const char *)name); RegisterDefaultFactoryFor<SymmetricCipher, CPP_TYPENAME SchemeClass::Decryption, DECRYPTION>((const char *)name); |