// -*- C++ -*-

//=============================================================================
/**
 *  @file    Registry_Name_Space.h
 *
 *  @author Irfan Pyarali (irfan@cs.wustl.edu)
 */
//=============================================================================


#ifndef ACE_REGISTRY_NAME_SPACE_H
#define ACE_REGISTRY_NAME_SPACE_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_USES_WCHAR))
// This only works on Win32 platforms when ACE_USES_WCHAR is turned on

#include "ace/Registry.h"
#include "ace/Naming_Context.h"
#include "ace/Name_Space.h"

ACE_BEGIN_VERSIONED_NAMESPACE_DECL

/**
 * @class ACE_Registry_Name_Space
 *
 * @brief Interface to a Name Server Database which is maintained by
 * the Win32 Registry.  Allows to add, change, remove and
 * resolve NameBindings.
 *
 * Manages a Naming Service for a registry name space which
 * includes bindings for all contexts. All strings are stored in
 * wide character format.  A Name Binding consists of a name
 * (that's the key), a value string. There is no type string
 * support in this Name Space.
 */
class ACE_Export ACE_Registry_Name_Space : public ACE_Name_Space
{
public:

  /// Constructor
  ACE_Registry_Name_Space (void);

  /// Contacts and opens the registry on the specified server
  ACE_Registry_Name_Space (ACE_Name_Options *name_options);

  /// Destructor
  ~ACE_Registry_Name_Space (void);

  /// Contacts and opens the registry on the specified server
  int open (ACE_Name_Options *name_options);

  /// Bind a new name to a naming context (Wide character strings).
  int bind (const ACE_NS_WString &name_in,
            const ACE_NS_WString &value_in,
            const char *type_in = "");

  /**
   * Overwrite the value or type of an existing name in a
   * ACE_Name_Space or bind a new name to the context, if it didn't
   * exist yet. (Wide character strings interface).
   */
  int rebind (const ACE_NS_WString &name_in,
              const ACE_NS_WString &value_in,
              const char *type_in = "");

  /// Delete a name from a ACE_Name_Space (Wide character strings
  /// Interface).
  int unbind (const ACE_NS_WString &name_in);

  /// Get value and type of a given name binding (Wide chars).  The
  /// caller is responsible for deleting both @a value_out and @a type_out!
  int resolve (const ACE_NS_WString &name_in,
               ACE_NS_WString &value_out,
               char *&type_out);

  /// Get a set of names matching a specified pattern (wchars). Matching
  /// means the names must begin with the pattern string.
  int list_names (ACE_WSTRING_SET &set_out,
                  const ACE_NS_WString &pattern_in);

  /// Get a set of values matching a specified pattern (wchars). Matching
  /// means the values must begin with the pattern string.
  int list_values (ACE_WSTRING_SET &set_out,
                   const ACE_NS_WString &pattern_in);

  /// Get a set of types matching a specified pattern (wchars). Matching
  /// means the types must begin with the pattern string.
  int list_types (ACE_WSTRING_SET &set_out,
                  const ACE_NS_WString &pattern_in);

  /**
   * Get a set of names matching a specified pattern (wchars). Matching
   * means the names must begin with the pattern string. Returns the
   * complete binding associated each pattern match.
   */
  int list_name_entries (ACE_BINDING_SET &set,
                         const ACE_NS_WString &pattern);

  /**
   * Get a set of values matching a specified pattern (wchars). Matching
   * means the values must begin with the pattern string. Returns the
   * complete binding associated each pattern match.
   */
  int list_value_entries (ACE_BINDING_SET &set,
                          const ACE_NS_WString &pattern);

  /**
   * Get a set of types matching a specified pattern (wchars). Matching
   * means the types must begin with the pattern string. Returns the
   * complete binding associated each pattern match.
   */
  int list_type_entries (ACE_BINDING_SET &set,
                         const ACE_NS_WString &pattern);

  /// Dump the state of the object
  void dump () const;

private:

  /// current context
  ACE_Registry::Naming_Context context_;
};

ACE_END_VERSIONED_NAMESPACE_DECL

#endif /* ACE_WIN32 && ACE_USES_WCHAR */

#include /**/ "ace/post.h"

#endif /* ACE_REGISTRY_NAME_SPACE_H */
