// -*- C++ -*- //============================================================================= /** * @file Name_Handler.h * * $Id$ * * @author Prashant Jain * @author Gerhard Lenzer * @author and Douglas C. Schmidt */ //============================================================================= #ifndef ACE_NAME_HANDLER_H #define ACE_NAME_HANDLER_H #include "ace/Acceptor.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "ace/SOCK_Acceptor.h" #include "ace/SString.h" #include "ace/Svc_Handler.h" #include "ace/Naming_Context.h" #include "ace/Name_Request_Reply.h" #include "ace/Null_Mutex.h" #include "ace/Singleton.h" #include "ace/svc_export.h" /** * @class Naming_Context * * @brief This helper class adds the correct default constructor to the * class so that we can use it in * . */ class Naming_Context : public ACE_Naming_Context { public: Naming_Context (void) : ACE_Naming_Context (ACE_Naming_Context::NET_LOCAL) {} }; typedef ACE_Singleton NAMING_CONTEXT; #if defined ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT template class ACE_Svc_Export ACE_Svc_Handler; #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION_EXPORT */ /** * @class ACE_Name_Handler * * @brief Product object created by . An * exchanges messages with a * object on the client-side. * * This class is the main workhorse of the . It * handles client requests to bind, rebind, resolve, and unbind * names. It also schedules and handles timeouts that are used to * support "timed waits." Clients used timed waits to bound the * amount of time they block trying to get a name. */ class ACE_Svc_Export ACE_Name_Handler : public ACE_Svc_Handler { friend class ACE_Shutup_GPlusPlus; // Turn off g++ warning public: /// Pointer to a member function of ACE_Name_Handler returning int typedef int (ACE_Name_Handler::*OPERATION) (void); /// Pointer to a member function of ACE_Naming_Context returning int typedef int (ACE_Naming_Context::*LIST_OP) (ACE_PWSTRING_SET &, const ACE_NS_WString &); /// Pointer to a member function of ACE_Name_Handler returning ACE_Name_Request typedef ACE_Name_Request (ACE_Name_Handler::*REQUEST) (ACE_NS_WString *); // = Initialization and termination. /// Default constructor. ACE_Name_Handler (ACE_Thread_Manager * = 0); /// Activate this instance of the (called by the /// ). virtual int open (void * = 0); protected: // = Helper routines for the operations exported to clients. /// Give up waiting (e.g., when a timeout occurs or a client shuts /// down unexpectedly). virtual int abandon (void); // = Low level routines for framing requests, dispatching // operations, and returning replies. /// Receive, frame, and decode the client's request. virtual int recv_request (void); /// Dispatch the appropriate operation to handle the client's /// request. virtual int dispatch (void); /// Create and send a reply to the client. virtual int send_reply (ACE_INT32 status, ACE_UINT32 errnum = 0); /// Special kind of reply virtual int send_request (ACE_Name_Request &); // = Demultiplexing hooks. /// Return the underlying . virtual ACE_HANDLE get_handle (void) const; /// Callback method invoked by the when client events /// arrive. virtual int handle_input (ACE_HANDLE); // = Timer hook. /// Enable clients to limit the amount of time they wait for a name. virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg); private: /// Table of pointers to member functions OPERATION op_table_[ACE_Name_Request::MAX_ENUM]; struct LIST_ENTRY { LIST_OP operation_; // A member function pointer that performs the appropriate // operation (e.g., LIST_NAMES, LIST_VALUES, or LIST_TYPES). REQUEST request_factory_; // A member function pointer that serves as a factory to create a // request that is passed back to the client. const char *description_; // Name of the operation we're dispatching (used for debugging). }; /// This is the table of pointers to functions that we use to /// simplify the handling of list requests. LIST_ENTRY list_table_[ACE_Name_Request::MAX_LIST]; /// Cache request from the client. ACE_Name_Request name_request_; /// Special kind of reply for resolve and listnames. ACE_Name_Request name_request_back_; /// Cache reply to the client. ACE_Name_Reply name_reply_; /// Address of client we are connected with. ACE_INET_Addr addr_; /// Ensure dynamic allocation... ~ACE_Name_Handler (void); /// Handle binds. int bind (void); /// Handle rebinds. int rebind (void); /// Handle binds and rebinds. int shared_bind (int rebind); /// Handle find requests. int resolve (void); /// Handle unbind requests. int unbind (void); /// Handle LIST_NAMES, LIST_VALUES, and LIST_TYPES requests. int lists (void); /// Handle LIST_NAME_ENTRIES, LIST_VALUE_ENTRIES, and /// LIST_TYPE_ENTRIES requests. int lists_entries (void); /// Create a name request. ACE_Name_Request name_request (ACE_NS_WString *one_name); /// Create a value request. ACE_Name_Request value_request (ACE_NS_WString *one_name); /// Create a type request. ACE_Name_Request type_request (ACE_NS_WString *one_name); }; /** * @class ACE_Name_Acceptor * * @brief This class contains the service-specific methods that can't * easily be factored into the . */ class ACE_Name_Acceptor : public ACE_Strategy_Acceptor { public: /// Dynamic linking hook. virtual int init (int argc, ACE_TCHAR *argv[]); /// Parse svc.conf arguments. int parse_args (int argc, ACE_TCHAR *argv[]); private: /// The scheduling strategy is designed for Reactive services. ACE_Schedule_All_Reactive_Strategy scheduling_strategy_; }; ACE_SVC_FACTORY_DECLARE (ACE_Name_Acceptor) #endif /* ACE_NAME_HANDLER_H */