diff options
author | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
---|---|---|
committer | levine <levine@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1996-10-21 21:41:34 +0000 |
commit | a5fdebc5f6375078ec1763850a4ca23ec7fe6458 (patch) | |
tree | bcf0a25c3d45a209a6e3ac37b233a4812f29c732 /ace/Event_Handler_T.h | |
download | ATCD-a5fdebc5f6375078ec1763850a4ca23ec7fe6458.tar.gz |
Initial revision
Diffstat (limited to 'ace/Event_Handler_T.h')
-rw-r--r-- | ace/Event_Handler_T.h | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/ace/Event_Handler_T.h b/ace/Event_Handler_T.h new file mode 100644 index 00000000000..c78ace07609 --- /dev/null +++ b/ace/Event_Handler_T.h @@ -0,0 +1,180 @@ +/* -*- C++ -*- */ +// $Id$ + + +// ============================================================================ +// +// = LIBRARY +// ace +// +// = FILENAME +// Event_Handler_T.h +// +// = AUTHOR +// Doug Schmidt +// +// ============================================================================ + +#if !defined (ACE_EVENT_HANDLER_T_H) +#define ACE_EVENT_HANDLER_T_H + +#include "ace/Event_Handler.h" + +#if defined (ACE_HAS_TEMPLATE_TYPEDEFS) + +template <class T> +class ACE_Export ACE_Event_Handler_T : public ACE_Event_Handler + // = TITLE + // Enable a class that doesn't inherit from the + // ACE_Event_Handler to be incorporated into the ACE_Reactor + // framework. Thanks to Greg Lavender (g.lavender@isode.com) + // for sharing this idea. + // + // = DESCRIPTION + // It is sometimes the case that an application has a hierarchy + // of operation dispatcher classes that have their own inheritance + // hierarchy but also would like to integrate with the ACE_Reactor. + // Rather than adopt a "mixin" approach, it is often cleaner to + // define a template as a subclass of ACE_Event_Handler and paramterize it + // with an operation dispatcher type. + // + // When constructing an instantiation of the ACE_Event_Handler_T object, + // a set of pointers to member functions must be provided so that + // when one of the handle_* methods is called by the ACE_Reactor, + // the appropriate method is called on the underlying operations + // object. This is done since in some cases it is useful to + // map any event that happens to the same method on an object. + // + // The ACE_Event_Handler_T template is instantiated by an operations + // object and registered with the ACE_Reactor, and it then calls the + // appropriate op_handler. So, it's basically just another + // level of indirection in event dispatching. The coupling + // betweent the ultimate handler of the event and the + // ACE_Event_Handler class is relaxed a bit by have this + // intermediate <op_handler_> object of type <T> around. The client + // object can then dynamically change the bindings for the + // various handlers so that during the life of one of the + // operation objects, it can change how it wants events to be + // handled. It just instantiates a new instance of the template + // with different bindings and reregisters this new object with + // the ACE_Reactor. +{ +public: + // = Typedefs to simplify pointer-to-member-function registration. + + // Get/set the underlying handle. + typedef ACE_HANDLE (T::*GET_HANDLE) (void) const; + typedef void (T::*SET_HANDLE) (ACE_HANDLE); + + typedef int (T::*IO_HANDLER) (ACE_HANDLE); + // Handle I/O events. + + typedef int (T::*TO_HANDLER) (const ACE_Time_Value &, const void *); + // Handle timeout events. + + typedef int (T::*CL_HANDLER) (ACE_HANDLE, ACE_Reactor_Mask); + // Handle close events. + + typedef int (T::*SIG_HANDLER) (ACE_HANDLE +#if defined(ACE_HAS_SIGINFO_T) +, siginfo_t*, ucontext_t* +#endif /* ACE_HAS_SIGINFO_T */ +); + // = Initialization and termination methods. + + ACE_Event_Handler_T (T *op_handler, + int delete_handler, + GET_HANDLE get_handle = 0, + IO_HANDLER input = 0, + CL_HANDLER close = 0, + SIG_HANDLER sig = 0, + TO_HANDLER timeout = 0, + IO_HANDLER output = 0, + SET_HANDLE set_handle = 0, + IO_HANDLER except = 0); + // Initialize the op_handler. + + ~ACE_Event_Handler_T (void); + // Close down and delete the <op_handler> + + // = Override all the ACE_Event_Handler methods and have them call + // through to the <T> operations handler. + virtual ACE_HANDLE get_handle (void) const; + virtual void set_handle (ACE_HANDLE); + virtual int handle_input (ACE_HANDLE fd = -1); + virtual int handle_output (ACE_HANDLE fd = -1); + virtual int handle_exception (ACE_HANDLE fd = -1); + virtual int handle_timeout (const ACE_Time_Value &tv, const void *arg = 0); + virtual int handle_close (ACE_HANDLE fd, ACE_Reactor_Mask close_mask); + virtual int handle_signal (ACE_HANDLE signum, siginfo_t * = 0, ucontext_t * = 0); + + // = Get/set the operations handler. + T *op_handler (void); + void op_handler (T *); + + // = Get/set the target pointer-to-member-function used for + // dispatching. + + GET_HANDLE handle_get (void); + void handle_get (GET_HANDLE); + + SET_HANDLE handle_set (void); + void handle_set (SET_HANDLE); + + IO_HANDLER input_handler (void); + void input_handler (IO_HANDLER); + + IO_HANDLER output_handler (void); + void output_handler (IO_HANDLER); + + IO_HANDLER except_handler (void); + void except_handler (IO_HANDLER); + + TO_HANDLER to_handler (void); + void to_handler (TO_HANDLER); + + CL_HANDLER cl_handler (void); + void cl_handler (CL_HANDLER); + + SIG_HANDLER sig_handler (void); + void sig_handler (SIG_HANDLER); + + void dump (void) const; + // Dump the state of an object. + + ACE_ALLOC_HOOK_DECLARE; + // Declare the dynamic allocation hooks. + +protected: + T *op_handler_; + // Pointer to the object that handles all the delegated operations. + + // = Handle input, output, and exception events. + IO_HANDLER input_handler_; + IO_HANDLER output_handler_; + IO_HANDLER except_handler_; + + TO_HANDLER to_handler_; + // Handle timeout events. + + CL_HANDLER cl_handler_; + // Handle close events. + + SIG_HANDLER sig_handler_; + // Handle signal events. + + int delete_handler_; + // Keeps track of whether we need to delete the handler in the + // destructor. + + // = Get/set underlying handle. + SET_HANDLE set_handle_; + GET_HANDLE get_handle_; +}; + +#if defined (__ACE_INLINE__) +#include "ace/Event_Handler_T.i" +#endif /* __ACE_INLINE__ */ + +#endif /* ACE_HAS_TEMPLATE_TYPEDEFS */ +#endif /* ACE_EVENT_HANDLER_H */ |