diff options
Diffstat (limited to 'ACE/ace/Name_Request_Reply.h')
-rw-r--r-- | ACE/ace/Name_Request_Reply.h | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/ACE/ace/Name_Request_Reply.h b/ACE/ace/Name_Request_Reply.h new file mode 100644 index 00000000000..07e4b61d95b --- /dev/null +++ b/ACE/ace/Name_Request_Reply.h @@ -0,0 +1,265 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Name_Request_Reply.h + * + * $Id$ + * + * Define the format used to exchange messages between the + * ACE_Name Server and its clients. + * + * @author Gerhard Lenzer + * @author Douglas C. Schmidt + * @author Prashant Jain + */ +//============================================================================= + + +#ifndef ACE_NAME_REQUEST_REPLY_H +#define ACE_NAME_REQUEST_REPLY_H + +#include /**/ "ace/pre.h" + +#include "ace/Basic_Types.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +ACE_BEGIN_VERSIONED_NAMESPACE_DECL + +class ACE_Time_Value; + +/** + * @class ACE_Name_Request + * + * @brief Message format for delivering requests to the ACE_Name Server. + * + * This class is implemented to minimize data copying. In + * particular, all marshaling is done in situ... + */ +class ACE_Export ACE_Name_Request +{ +public: + /// Request message types. + enum Constants + { + BIND = 01, + REBIND = 02, + RESOLVE = 03, + UNBIND = 04, + LIST_NAMES = 05, + LIST_VALUES = 015, + LIST_TYPES = 025, + LIST_NAME_ENTRIES = 06, + LIST_VALUE_ENTRIES = 016, + LIST_TYPE_ENTRIES = 026, + MAX_ENUM = 11, + MAX_LIST = 3, + + // Mask for bitwise operation used for table lookup + /// Mask for lookup of operation + OP_TABLE_MASK = 07, + /// Mask for lookup of list_operation + LIST_OP_MASK = 030, + + /// Class-specific constant values. + MAX_NAME_LENGTH = MAXPATHLEN + 1 + }; + + /// Default constructor. + ACE_Name_Request (void); + + /// Create a ACE_Name_Request message. + ACE_Name_Request (ACE_INT32 msg_type, // Type of request. + const ACE_WCHAR_T name[], // + const ACE_UINT32 name_length, + const ACE_WCHAR_T value[], + const ACE_UINT32 value_length, + const char type[], + const ACE_UINT32 type_length, + ACE_Time_Value *timeout = 0); // Max time willing to wait for request. + + /// Initialize length_ in order to ensure correct byte ordering + /// before a request is sent. + void init (void); + + // = Set/get the length of the encoded/decoded message. + ACE_UINT32 length (void) const; + void length (ACE_UINT32); + + // = Set/get the type of the message. + ACE_INT32 msg_type (void) const; + void msg_type (ACE_INT32); + + // = Set/get the blocking semantics. + ACE_UINT32 block_forever (void) const; + void block_forever (ACE_UINT32); + + // = Set/get the timeout. + ACE_Time_Value timeout (void) const; + void timeout (const ACE_Time_Value timeout); + + // = Set/get the name + const ACE_WCHAR_T *name (void) const; + void name (const ACE_WCHAR_T *); + + // = Set/get the value + const ACE_WCHAR_T *value (void) const; + void value (const ACE_WCHAR_T *); + + // = Set/get the type + const char *type (void) const; + void type (const char *); + + // = Set/get the len of name + ACE_UINT32 name_len (void) const; + void name_len (ACE_UINT32); + + // = Set/get the len of value + ACE_UINT32 value_len (void) const; + void value_len (ACE_UINT32); + + // = Set/get the len of type + ACE_UINT32 type_len (void) const; + void type_len (ACE_UINT32); + + /// Encode the message before transmission. + int encode (void *&); + + /// Decode message after reception. + int decode (void); + + /// Print out the values of the message for debugging purposes. + void dump (void) const; + +private: + // = The 5 fields in the <Transfer> struct are transmitted to the server. + // The remaining 2 fields are not tranferred -- they are used only on + // the server-side to simplify lookups. + + struct Transfer + { + /// Length of entire request. + ACE_UINT32 length_; + + /// Type of the request (i.e., <BIND>, <REBIND>, <RESOLVE>, and <UNBIND>). + ACE_UINT32 msg_type_; + + /// Indicates if we should block forever. If 0, then <secTimeout_> + /// and <usecTimeout_> indicates how long we should wait. + ACE_UINT32 block_forever_; + + /// Max seconds willing to wait for name if not blocking forever. + ACE_UINT32 sec_timeout_; + + /// Max micro seconds to wait for name if not blocking forever. + ACE_UINT32 usec_timeout_; + + /// Len of name in bytes + ACE_UINT32 name_len_; + + /// Len of value in bytes + ACE_UINT32 value_len_; + + /// Len of type in bytes + ACE_UINT32 type_len_; + + /// The data portion contains the <name_> + /// followed by the <value_> + /// followed by the <type_>. + ACE_WCHAR_T data_[MAX_NAME_LENGTH + MAXPATHLEN + MAXPATHLEN + 2]; + }; + + /// Transfer buffer. + Transfer transfer_; + + /// Pointer to the beginning of the name in this->data_. + ACE_WCHAR_T *name_; + + /// Pointer to the beginning of the value in this->data_; + ACE_WCHAR_T *value_; + + /// Pointer to the beginning of the type in this->data_; + char *type_; +}; + +/** + * @class ACE_Name_Reply + * + * @brief Message format for delivering replies from the ACE_Name Server. + * + * This class is implemented to minimize data copying. In + * particular, all marshaling is done in situ... + */ +class ACE_Export ACE_Name_Reply +{ +public: + enum Constants + { + /// Class-specific constant values. + MAX_NAME_LENGTH = MAXPATHLEN + 1 + }; + + /// Default constructor. + ACE_Name_Reply (void); + + /// Create a <ACE_Name_Reply> message. + ACE_Name_Reply (ACE_UINT32 type, ACE_UINT32 err); // Type of reply. + + /// Initialize length_ in order to ensure correct byte ordering + /// before a reply is sent. + void init (void); + + // = Set/get the length of the encoded/decoded message. + ACE_UINT32 length (void) const; + void length (ACE_UINT32); + + // = Set/get the type of the message. + ACE_INT32 msg_type (void) const; + void msg_type (ACE_INT32); + + // = Set/get the status of the reply (0 == success, -1 == failure). + ACE_INT32 status (void) const; + void status (ACE_INT32); + + // = Set/get the errno of a failed reply. + ACE_UINT32 errnum (void) const; + void errnum (ACE_UINT32); + + /// Encode the message before transfer. + int encode (void *&); + + /// Decode a message after reception. + int decode (void); + + /// Print out the values of the message for debugging purposes. + void dump (void) const; + +private: + // = The 3 fields in the <Transfer> struct are transmitted to the server. + + struct Transfer + { + /// Length of entire reply. + ACE_UINT32 length_; + + /// Type of the reply, i.e., success (0) or failure (-1). + ACE_INT32 type_; + + /// Indicates why error occurred if <this->type_> == failure (-1). + /// Typical reasons include: <ETIME> (if the client timed out after + /// waiting for the name). + ACE_UINT32 errno_; + }; + + /// Transfer buffer. + Transfer transfer_; +}; + +ACE_END_VERSIONED_NAMESPACE_DECL + +#include /**/ "ace/post.h" + +#endif /* ACE_NAME_REQUEST_REPLY_H */ |