diff options
author | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
---|---|---|
committer | William R. Otte <wotte@dre.vanderbilt.edu> | 2008-03-04 14:51:23 +0000 |
commit | 99aa8c60282c7b8072eb35eb9ac815702f5bf586 (patch) | |
tree | bda96bf8c3a4c2875a083d7b16720533c8ffeaf4 /ACE/ace/Registry.h | |
parent | c4078c377d74290ebe4e66da0b4975da91732376 (diff) | |
download | ATCD-99aa8c60282c7b8072eb35eb9ac815702f5bf586.tar.gz |
undoing accidental deletion
Diffstat (limited to 'ACE/ace/Registry.h')
-rw-r--r-- | ACE/ace/Registry.h | 559 |
1 files changed, 559 insertions, 0 deletions
diff --git a/ACE/ace/Registry.h b/ACE/ace/Registry.h new file mode 100644 index 00000000000..e7a882ee357 --- /dev/null +++ b/ACE/ace/Registry.h @@ -0,0 +1,559 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Registry.h + * + * $Id$ + * + * @author Irfan Pyarali (irfan@cs.wustl.edu) + */ +//============================================================================= + + +#ifndef ACE_REGISTRY_H +#define ACE_REGISTRY_H +#include /**/ "ace/pre.h" + +#include /**/ "ace/config-all.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#if defined (ACE_WIN32) && !defined (ACE_LACKS_WIN32_REGISTRY) +// This only works on registry-capable Win32 platforms. + +#include "ace/Containers.h" +#include "ace/SString.h" + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +/** + * @class ACE_Registry + * + * @brief A Name Server implementation + * + * The registry interface is inspired by the interface + * specified in the CORBA Naming Service Specification. + * The implementation is done through Win32 <Reg*> functions. + * Other than providing an OO wrapper for the Win32 <Reg*> + * functions, ACE_Registry provides an abstraction for iteration + * over the elements of the Registry. + */ +class ACE_Export ACE_Registry +{ +public: + + /// International string + struct ACE_Export Name_Component + { + ACE_TString id_; + ACE_TString kind_; + + bool operator== (const Name_Component &rhs) const; + bool operator!= (const Name_Component &rhs) const; + // Comparison + }; + // The <id_> field is used, + // but the <kind_> field is currently ignored + + /// A Name is an ordered collections of components (ids) + typedef ACE_Unbounded_Set<Name_Component> Name; + + /// Separator for components in a name + static const ACE_TCHAR STRING_SEPARATOR[]; + + /// Convert a @a name to a @c string + static ACE_TString make_string (const Name &name); + + /// Convert a @a string to a @c name + static Name make_name (const ACE_TString &string); + + /// There are two types of bindings + enum Binding_Type {INVALID, OBJECT, CONTEXT}; + + struct ACE_Export Binding + { + /// Empty (default) constructor + Binding (void); + + /// Constructor + /// (Name version) + Binding (const Name &binding_name, + Binding_Type binding_type); + + /// Constructor + /// (String version) + Binding (const ACE_TString &binding_name, + Binding_Type binding_type); + + bool operator== (const Binding &rhs) const; + bool operator!= (const Binding &rhs) const; + // Comparison + + /// Name accessor + /// (Name version) + void name (Name &name); + + /// Set Name (String version) + void name (ACE_TString &name); + + /// Get Name (String version) + ACE_TString name (void); + + /// Type accessor + Binding_Type type (void); + + private: + /// A binding has a name + ACE_TString name_; + + /// .... and a type + Binding_Type type_; + }; + + /// A list of bindings + typedef ACE_Unbounded_Set<Binding> Binding_List; + + // Forward declaration of iterator + class Binding_Iterator; + + /** + * @class Object + * + * @brief An object representation + * + * In CORBA, all objects inherit from (CORBA::Object). + * For the registry, this is used as a wrapper for an + * instance of a built-in data type. + * Think about an object as being similar to a file + * in a file system. + */ + class ACE_Export Object + { + public: + /// Default constructor + Object (void *data = 0, + u_long size = 0, + u_long type = REG_NONE); + + /// Set data + void data (void *data); + + /// Get data + void *data (void) const; + + /// Set size + void size (u_long size); + + /// Get size + u_long size (void) const; + + /// Set type + void type (u_long type); + + /// Get type + u_long type (void) const; + + private: + /// Pointer to data + void *data_; + + /// Size of the data + u_long size_; + + /// Type of data + u_long type_; + }; + + /** + * @class Naming_Context + * + * @brief An context representation + * + * Think about a context as being similar to a directory + * in a file system. + */ + class ACE_Export Naming_Context + { + public: + /// Friend factory + friend class ACE_Predefined_Naming_Contexts; + + enum { + /// Max sizes of names + /// (Not too sure about this value) + MAX_OBJECT_NAME_SIZE = BUFSIZ, + + /// Max size of context name + MAX_CONTEXT_NAME_SIZE = MAXPATHLEN + 1 + }; + + /// Empty constructor: keys will be NULL + Naming_Context (void); + + /// Constructor: key_ will be set to @a key + Naming_Context (const HKEY &key); + + /// Destructor will call <Naming_Context::close>. + ~Naming_Context (void); + + // The following interfaces are for objects + + /** + * Insert @a object with @a name into @c this context. + * This will fail if @a name already exists + * (Name version) + */ + int bind_new (const Name &name, + const Object &object); + + /** + * Insert @a object with @a name into @c this context + * This will fail if @a name already exists + * (String version) + */ + int bind_new (const ACE_TString &name, + const Object &object); + + /** + * Insert or update @a object with @a name into @c this context + * This will not fail if @a name already exists + * (Name version) + */ + int bind (const Name &name, + const Object &object); + + /** + * Insert or update <object> with @a name into @c this context + * This will not fail if @a name already exists + * (String version) + */ + int bind (const ACE_TString &name, + const Object &object); + + /// Update <object> with @a name in @c this context + /// (Name version) + int rebind (const Name &name, + const Object &object); + + /// Update <object> with @a name in @c this context + int rebind (const ACE_TString &name, + const Object &object); + + /// Find <object> with @a name in @c this context + /// (Name version) + int resolve (const Name &name, + Object &object); + + /// Find <object> with @a name in @c this context + int resolve (const ACE_TString &name, + Object &object); + + /// Delete object with @a name in @c this context + /// (Name version) + int unbind (const Name &name); + + /// Delete object with @a name in @c this context + int unbind (const ACE_TString &name); + + + // The following interfaces are for Naming Context + + /// Create new @c naming_context + int new_context (Naming_Context &naming_context); + + /** + * Insert <naming_context> with @a name relative to @c this context + * This will fail if @a name already exists + * (Name version) + */ + int bind_new_context (const Name &name, + Naming_Context &naming_context, + u_long persistence = REG_OPTION_NON_VOLATILE, + u_long security_access = KEY_ALL_ACCESS, + LPSECURITY_ATTRIBUTES security_attributes = 0); + + /// Insert <naming_context> with @a name relative to @c this context + /// This will fail if @a name already exists + int bind_new_context (const ACE_TString &name, + Naming_Context &naming_context, + u_long persistence = REG_OPTION_NON_VOLATILE, + u_long security_access = KEY_ALL_ACCESS, + LPSECURITY_ATTRIBUTES security_attributes = 0); + + /** + * Insert or update <naming_context> with @a name relative to @c this context + * This will not fail if @a name already exists + * (Name version) + */ + int bind_context (const Name &name, + /* const */ Naming_Context &naming_context, + u_long persistence = REG_OPTION_NON_VOLATILE, + u_long security_access = KEY_ALL_ACCESS, + LPSECURITY_ATTRIBUTES security_attributes = 0); + + /// Insert or update <naming_context> with @a name relative to @c this context + /// This will not fail if @a name already exists + int bind_context (const ACE_TString &name, + /* const */ Naming_Context &naming_context, + u_long persistence = REG_OPTION_NON_VOLATILE, + u_long security_access = KEY_ALL_ACCESS, + LPSECURITY_ATTRIBUTES security_attributes = 0); + + /// Rename <naming_context> to @a name + /// (Name version) + int rebind_context (const Name &name, + /* const */ Naming_Context &naming_context); + + /// Rename <naming_context> to @a name + int rebind_context (const ACE_TString &name, + /* const */ Naming_Context &naming_context); + + /// Find <naming_context> with @a name in @c this context + /// (Name version) + int resolve_context (const Name &name, + Naming_Context &naming_context, + u_long security_access = KEY_ALL_ACCESS); + + /// Find <naming_context> with @a name in @c this context + int resolve_context (const ACE_TString &name, + Naming_Context &naming_context, + u_long security_access = KEY_ALL_ACCESS); + + /// Remove naming_context with @a name from @c this context + /// (Name version) + int unbind_context (const Name &name); + + /// Remove naming_context with @a name from @c this context + int unbind_context (const ACE_TString &name); + + /// Same as <unbind_context> with @c this as naming_context + int destroy (void); + + /** + * listing function: iterator creator + * This is useful when there are many objects and contexts + * in @c this context and you only want to look at a few entries + * at a time + */ + int list (u_long how_many, + Binding_List &list, + Binding_Iterator &iterator); + + /// listing function: iterator creator + /// This gives back a listing of all entries in @c this context. + int list (Binding_List &list); + + // Some other necessary functions which are + // not part of the CORBA interface + + /// Sync content of context to disk + int flush (void); + + /// Close the handle of the context + /// @note <close> does not call <flush> + int close (void); + + // Accessors + + /// Get key + HKEY key (void); + + // void parent (HKEY parent); + /// Get parent + HKEY parent (void); + + /// Get name + /// (Name version) + void name (Name &name); + + /// Set name (String version) + void name (ACE_TString &name); + + /// Get name (String version) + ACE_TString name (void); + + protected: + /// Set key + void key (HKEY key); + + /// Set parent + void parent (HKEY parent); + + /// Set name + /// (Name version) + void name (const Name &name); + + /// Set name + /// (String version) + void name (const ACE_TString &name); + + private: + /// Disallow copy constructors + Naming_Context (const Naming_Context &rhs); + + /// Disallow assignment + const Naming_Context &operator= (const Naming_Context &rhs); + + /// Key for self + HKEY key_; + + /// Key for parent + HKEY parent_key_; + + /// Name of self + ACE_TString name_; + }; + + /** + * @class Binding_Iterator + * + * @brief An iterator + * + * Useful when iteratorating over a few entries at a time + */ + class ACE_Export Binding_Iterator + { + public: + /// Friend factory + friend class Naming_Context; + + /// Default constructor + Binding_Iterator (void); + + /// Next entry + int next_one (Binding &binding); + + /// Next <how_many> entries + int next_n (u_long how_many, + Binding_List &list); + + /// Cleanup + int destroy (void); + + /// Reset the internal state of the iterator + void reset (void); + + /// Get naming_context that the iterator is iterating over + Naming_Context &naming_context (void); + + private: + + /// Set naming_context that the iterator is iterating over + void naming_context (Naming_Context& naming_context); + + /// Reference to context + Naming_Context *naming_context_; + + public: + // This should really be private + // But the compiler is broken + + /** + * @class Iteration_State + * + * Base class for state + */ + class ACE_Export Iteration_State + { + public: + /// Constructor + Iteration_State (); + + /// Set the iterator reference. + void iterator (Binding_Iterator *iterator); + + /// Next <how_many> entries + virtual int next_n (u_long how_many, + Binding_List &list) = 0; + + /// Reset state + void reset (void); + + protected: + /// Pointer to parent iterator + Binding_Iterator *parent_; + + u_long index_; + }; + + private: + class ACE_Export Object_Iteration : public Iteration_State + { + /// Next <how_many> entries + int next_n (u_long how_many, + Binding_List &list); + }; + + class ACE_Export Context_Iteration : public Iteration_State + { + public: + /// Next @a how_many entries + int next_n (u_long how_many, + Binding_List &list); + }; + + class ACE_Export Iteration_Complete : public Iteration_State + { + public: + /// Next @a how_many entries + int next_n (u_long how_many, + Binding_List &list); + }; + + /// Friend states + friend class Iteration_State; + friend class Object_Iteration; + friend class Context_Iteration; + friend class Iteration_Complete; + + /// Instances of all states + Object_Iteration object_iteration_; + Context_Iteration context_iteration_; + Iteration_Complete iteration_complete_; + + /// Pointer to current state + Iteration_State *current_enumeration_; + + /// Set current_enumeration + void current_enumeration (Iteration_State& current_enumeration); + + /// Get current_enumeration + Iteration_State ¤t_enumeration (void); + }; +}; + +/** + * @class ACE_Predefined_Naming_Contexts + * + * @brief A factory for predefined registries, which exist by default + * on Win32 platforms + * + * This factory can connect to both local and remote + * predefined registries. + */ +class ACE_Export ACE_Predefined_Naming_Contexts +{ +public: + /** + * Factory method for connecting to predefined registries. This + * method works for both remote and local machines. However, for + * remote machines, HKEY_CLASSES_ROOT and HKEY_CURRENT_USER types + * are not allowed + */ + static int connect (ACE_Registry::Naming_Context &naming_context, + HKEY predefined = HKEY_LOCAL_MACHINE, + const ACE_TCHAR *machine_name = 0); + +private: + /// Check if @a machine_name is the local host + static int is_local_host (const ACE_TCHAR *machine_name); +}; + +ACE_END_VERSIONED_NAMESPACE_DECL + +#endif /* ACE_WIN32 && !ACE_LACKS_WIN32_REGISTRY */ +#include /**/ "ace/post.h" +#endif /* ACE_REGISTRY_H */ |