]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/socketengine.h
Deduplicate mode unregistering code in ModuleManager::DoSafeUnload() and extract...
[user/henk/code/inspircd.git] / include / socketengine.h
index f30289913b8b929008c08281e02c57cc12759e11..c0026bfc6f2513335b0af7ba3853a12d017cff6b 100644 (file)
 #define IOV_MAX 1024
 #endif
 
-/** Types of event an EventHandler may receive.
- * EVENT_READ is a readable file descriptor,
- * and EVENT_WRITE is a writeable file descriptor.
- * EVENT_ERROR can always occur, and indicates
- * a write error or read error on the socket,
- * e.g. EOF condition or broken pipe.
- */
-enum EventType
-{
-       /** Read event */
-       EVENT_READ      =       0,
-       /** Write event */
-       EVENT_WRITE     =       1,
-       /** Error event */
-       EVENT_ERROR     =       2
-};
-
 /**
  * Event mask for SocketEngine events
  */
@@ -101,7 +84,7 @@ enum EventMask
         * EINPROGRESS. An event MAY be sent at any time that writes will not
         * block.
         *
-        * Before calling HandleEvent, a socket engine MAY change the state of
+        * Before calling OnEventHandler*(), a socket engine MAY change the state of
         * the FD back to FD_WANT_EDGE_WRITE if it is simpler (for example, if a
         * one-shot notification was registered). If further writes are needed,
         * it is the responsibility of the event handler to change the state to
@@ -115,7 +98,7 @@ enum EventMask
         */
        FD_WANT_EDGE_WRITE = 0x80,
        /** Request a one-shot poll-style write notification. The socket will
-        * return to the FD_WANT_NO_WRITE state before HandleEvent is called.
+        * return to the FD_WANT_NO_WRITE state before OnEventHandler*() is called.
         */
        FD_WANT_SINGLE_WRITE = 0x100,
 
@@ -123,17 +106,17 @@ enum EventMask
        FD_WANT_WRITE_MASK = 0x1F0,
 
        /** Add a trial read. During the next DispatchEvents invocation, this
-        * will call HandleEvent with EVENT_READ unless reads are known to be
+        * will call OnEventHandlerRead() unless reads are known to be
         * blocking.
         */
        FD_ADD_TRIAL_READ  = 0x1000,
        /** Assert that reads are known to block. This cancels FD_ADD_TRIAL_READ.
-        * Reset by SE before running EVENT_READ
+        * Reset by SE before running OnEventHandlerRead().
         */
        FD_READ_WILL_BLOCK = 0x2000,
 
        /** Add a trial write. During the next DispatchEvents invocation, this
-        * will call HandleEvent with EVENT_WRITE unless writes are known to be
+        * will call OnEventHandlerWrite() unless writes are known to be
         * blocking.
         *
         * This could be used to group several writes together into a single
@@ -142,7 +125,7 @@ enum EventMask
         */
        FD_ADD_TRIAL_WRITE = 0x4000,
        /** Assert that writes are known to block. This cancels FD_ADD_TRIAL_WRITE.
-        * Reset by SE before running EVENT_WRITE
+        * Reset by SE before running OnEventHandlerWrite().
         */
        FD_WRITE_WILL_BLOCK = 0x8000,
 
@@ -153,17 +136,14 @@ enum EventMask
 /** This class is a basic I/O handler class.
  * Any object which wishes to receive basic I/O events
  * from the socketengine must derive from this class and
- * implement the HandleEvent() method. The derived class
+ * implement the OnEventHandler*() methods. The derived class
  * must then be added to SocketEngine using the method
  * SocketEngine::AddFd(), after which point the derived
- * class will receive events to its HandleEvent() method.
- * The derived class should also implement one of Readable()
- * and Writeable(). In the current implementation, only
- * Readable() is used. If this returns true, the socketengine
- * inserts a readable socket. If it is false, the socketengine
- * inserts a writeable socket. The derived class should never
- * change the value this function returns without first
- * deleting the socket from the socket engine. The only
+ * class will receive events to its OnEventHandler*() methods.
+ * The event mask passed to SocketEngine::AddFd() determines
+ * what events the EventHandler gets notified about and with
+ * what semantics. SocketEngine::ChangeEventMask() can be
+ * called to update the event mask later. The only
  * requirement beyond this for an event handler is that it
  * must have a file descriptor. What this file descriptor
  * is actually attached to is completely up to you.
@@ -207,16 +187,20 @@ class CoreExport EventHandler : public classbase
         */
        virtual ~EventHandler() {}
 
-       /** Process an I/O event.
-        * You MUST implement this function in your derived
-        * class, and it will be called whenever read or write
-        * events are received.
-        * @param et either one of EVENT_READ for read events,
-        * EVENT_WRITE for write events and EVENT_ERROR for
-        * error events.
-        * @param errornum The error code which goes with an EVENT_ERROR.
+       /** Called by the socket engine in case of a read event
+        */
+       virtual void OnEventHandlerRead() = 0;
+
+       /** Called by the socket engine in case of a write event.
+        * The default implementation does nothing.
+        */
+       virtual void OnEventHandlerWrite();
+
+       /** Called by the socket engine in case of an error event.
+        * The default implementation does nothing.
+        * @param errornum Error code
         */
-       virtual void HandleEvent(EventType et, int errornum = 0) = 0;
+       virtual void OnEventHandlerError(int errornum);
 
        friend class SocketEngine;
 };
@@ -341,7 +325,7 @@ public:
        /** Add an EventHandler object to the engine.  Use AddFd to add a file
         * descriptor to the engine and have the socket engine monitor it. You
         * must provide an object derived from EventHandler which implements
-        * HandleEvent().
+        * the required OnEventHandler*() methods.
         * @param eh An event handling object to add
         * @param event_mask The initial event mask for the object
         */
@@ -400,8 +384,7 @@ public:
         * this doesn't wait long, only a couple of milliseconds. It returns the
         * number of events which occurred during this call.  This method will
         * dispatch events to their handlers by calling their
-        * EventHandler::HandleEvent() methods with the necessary EventType
-        * value.
+        * EventHandler::OnEventHandler*() methods.
         * @return The number of events which have occured.
         */
        static int DispatchEvents();