Annotation of libwww/Library/src/HTEvent.html, revision 2.7.2.5

2.1       eric        1: <HTML>
                      2: <HEAD>
2.4       frystyk     3:   <TITLE>W3C Reference Library libwww Event Class</TITLE>
2.1       eric        4: </HEAD>
                      5: <BODY>
2.4       frystyk     6: <H1>
                      7:   The Event Class
2.3       frystyk     8: </H1>
2.1       eric        9: <PRE>
                     10: /*
                     11: **     (c) COPYRIGHT MIT 1995.
                     12: **     Please first read the full copyright statement in the file COPYRIGH.
                     13: */
2.4       frystyk    14: </PRE>
                     15: <P>
                     16: The Event Class defines any event manager to be used by libwww for handling
                     17: events. An <I>event</I> is not strictly defined as it is highly platform
                     18: dependent and hence out of scope for the Library. If you are using the libwww
                     19: pseudo threads on Unix then an event is when the&nbsp;<I>select()</I> system
                     20: call returns a notification on&nbsp;a socket descriptor, but it may as well
                     21: be an asynchronous event from the windows manager etc. If your application
                     22: is not using anything but traditional blocking sockets then you do not need
                     23: an event manager at all. In that case, libwww will block on any socket or
                     24: system call until the process can proceed.
                     25: <P>
                     26: The libwww interface to an event manager is very simple as it consists of
                     27: <B>registering</B> a <I>socket descriptor</I>, the <I>location</I> in the
                     28: program, and the <I>current state</I> when an operation (for example
                     29: <CODE>read</CODE>) would block. When the event manager at a later point in
                     30: time gets a notification that the socket has become ready, it can then call
                     31: libwww with the state saved from the registration and libwww can continue.
                     32: Second, libwww must be able to <B>unregister</B> a socket when it is not
                     33: anymore in a state where it can block. <I>Only</I> in case the application
                     34: wishes to use <I>non-blocking</I> sockets it should register methods for
                     35: handling the <B>registration</B> process as described below.
                     36: <P>
                     37: <B>Note</B>: The library <B>core</B> does <I>not</I> define any event manager
                     38: - it is considered part of the application. The library comes with a
                     39: <A HREF="HTEvntrg.html">default event manager</A> which can be initiated
2.6       frystyk    40: using the function <CODE>HTEventInit()</CODE> in <A HREF="HTInit.html">HTInit
                     41: module</A>
2.4       frystyk    42: <P>
                     43: This module is implemented by <A HREF="HTEvent.c">HTEvent.c</A>, and it is
                     44: a part of the <A HREF="http://www.w3.org/pub/WWW/Library/">W3C Reference
                     45: Library</A>.
                     46: <PRE>
2.1       eric       47: #ifndef HTEVENT_H
                     48: #define HTEVENT_H
2.2       frystyk    49: #include "sysdep.h"
                     50: 
2.7.2.4   eric       51: #if 0
2.4       frystyk    52: #define FD_NONE        0
                     53: #define FD_ALL (FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT |FD_CLOSE)
                     54: #define FD_UNREGISTER (((FD_ALL) &lt;&lt; 1) &amp; (~(FD_ALL)))
2.7.2.4   eric       55: #endif
2.4       frystyk    56: 
2.2       frystyk    57: typedef enum _HTPriority {
                     58:     HT_PRIORITY_INV = -1,
                     59:     HT_PRIORITY_OFF = 0,
                     60:     HT_PRIORITY_MIN = 1,
                     61:     HT_PRIORITY_MAX = 20
                     62: } HTPriority; 
                     63: 
2.7.2.1   eric       64: typedef enum {
2.7.2.5 ! frystyk    65:     HTEvent_READ    = (0x001 | 0 &lt;&lt; 16),
        !            66:     HTEvent_ACCEPT  = (0x002 | 0 &lt;&lt; 16),
        !            67:     HTEvent_CLOSE   = (0x004 | 0 &lt;&lt; 16),
        !            68:     HTEvent_WRITE   = (0x008 | 1 &lt;&lt; 16),
        !            69:     HTEvent_CONNECT = (0x010 | 1 &lt;&lt; 16),
        !            70:     HTEvent_OOB     = (0x020 | 2 &lt;&lt; 16),
        !            71:     HTEvent_TIMEOUT = (0x100 | 3 &lt;&lt; 16),
        !            72:     HTEvent_BEGIN   = (0x000 | 3 &lt;&lt; 16),
        !            73:     HTEvent_END     = (0x080 | 3 &lt;&lt; 16),
        !            74:     HTEvent_ALL     = 0xFFFF,
        !            75:     HTEvent_TYPES   = 4
2.7.2.3   frystyk    76: } HTEventType;
                     77: 
2.7.2.5 ! frystyk    78: #define HTEvent_BITS(type) (type & 0xFFFF)
        !            79: #define HTEvent_INDEX(type) (type >> 16)
2.1       eric       80: 
2.7.2.1   eric       81: /* Avoid circular include for HTReq->HTNet->HTHost: HTEvent blah */
                     82: typedef struct _HTEvent HTEvent;
2.1       eric       83: #include "HTReq.h"
                     84: </PRE>
2.3       frystyk    85: <H2>
2.7       eric       86:   <A NAME="eventHandlers">Event Handlers</A>
2.3       frystyk    87: </H2>
                     88: <P>
2.4       frystyk    89: A <I>location</I> is a function that can be registered by the event manager
                     90: and called at a later point in time in order to continue an operation. All
                     91: locations must be of type &nbsp;<CODE>HTEventCallback</CODE> as defined here:
2.2       frystyk    92: <PRE>
2.7.2.2   eric       93: typedef int HTEventCallback (SOCKET, void *, HTEventType);
2.2       frystyk    94: </PRE>
2.4       frystyk    95: <P>
                     96: There are many default event handlers provided with the Library. For example,
                     97: all the protocol modules such as the <A HREF="HTTP.html">HTTP client module</A>
                     98: are implemented as event handlers. In stead of using blocking sockets, this
                     99: allows a protocol module to register itself when performing an operation
                    100: that would block. When the sockets becomes ready the handler is called with
                    101: th socket in question, the request object, and the socket operation &nbsp;
2.3       frystyk   102: <H2>
2.4       frystyk   103:   Registering and Unregistering Event Handlers
2.3       frystyk   104: </H2>
                    105: <P>
2.4       frystyk   106: As mentioned above, the only interface libwww requires from an event manager
                    107: is a method to <I>register</I> an event handler when an operation would block
                    108: and <I>unregister</I> it when the operation has completed The library registers
                    109: and unregisters event handlers by calling the following two functions:
2.7.2.1   eric      110: <PRE>
2.7.2.2   eric      111: extern int HTEvent_register    (SOCKET, HTEventType, HTEvent *);
                    112: extern int HTEvent_unregister  (SOCKET, HTEventType);
2.4       frystyk   113: </PRE>
                    114: <P>
                    115: The register function contains information about which socket we are waiting
                    116: on to get ready and which operation we are waiting for (read, write, etc.),
                    117: the request object containing the current request, the event handler that
                    118: we want to be called when the socket becomes reasy, and finally the priority
                    119: by which we want the thread to be processed by the event manager. Likewise,
                    120: libwww can unregister a operation on a socket which means that libwww is
                    121: no longer waiting for this actiion to become ready.
                    122: <H2>
                    123:   Registering an Event Manager
                    124: </H2>
                    125: <P>
                    126: The Library core does not contain any event manager as it depends on whether
                    127: you want to use pseudo threads no threads, or real threads. Instead, libwww
                    128: comes with a <A HREF="HTEvntrg.html">default implementation</A> that you
                    129: may register, but you may as well implement and register your own. The register
                    130: and unregister functions above actually does nothing than looking for a
                    131: registered event manager and then passes the call on to that. You register
                    132: your own event manager by using the methods below:
2.1       eric      133: <PRE>
2.7.2.5 ! frystyk   134: struct _HTEvent {
        !           135:     HTPriority         priority;        /* Priority of this request (event) */
        !           136:     int                 millis;              /* Timeout in ms for this event */
        !           137:     HTEventCallback *  cbf;                       /* Protocol state machine */
        !           138:     void *             param;                 /* HTEvent_register parameter */
        !           139:     HTRequest *                request;
        !           140: };
        !           141: 
2.7.2.2   eric      142: typedef int HTEvent_registerCallback(SOCKET, HTEventType, HTEvent *);
                    143: typedef int HTEvent_unregisterCallback(SOCKET, HTEventType);
2.1       eric      144: 
                    145: extern void HTEvent_setRegisterCallback(HTEvent_registerCallback *);
                    146: extern void HTEvent_setUnregisterCallback(HTEvent_unregisterCallback *);
2.7.2.1   eric      147: extern BOOL HTEvent_setCallback(HTEvent * event, HTEventCallback * cbf);
2.7.2.5 ! frystyk   148: 
        !           149: extern HTEvent * HTEvent_new (HTEventCallback * cbf, void * context,
        !           150:                              HTPriority pritority, int timeoutInMillis);
        !           151: extern BOOL HTEvent_delete (HTEvent * event);
        !           152: 
2.7.2.1   eric      153: extern BOOL HTEvent_setParam(HTEvent * event, void * param);
                    154: extern BOOL HTEvent_setPriority(HTEvent * event, HTPriority priority);
2.7.2.5 ! frystyk   155: extern BOOL HTEvent_setTimeout(HTEvent * event, int timeoutInMillis);
2.1       eric      156: </PRE>
2.3       frystyk   157: <P>
2.4       frystyk   158: You can register the event manager provided together with libwww by using
2.6       frystyk   159: the <CODE>HTEventInit()</CODE> in the <A HREF="HTInit.html">HTInit module</A>
2.1       eric      160: <PRE>
                    161: #endif /* HTEVENT_H */
                    162: </PRE>
2.3       frystyk   163: <P>
                    164:   <HR>
2.1       eric      165: <ADDRESS>
2.7.2.5 ! frystyk   166:   @(#) $Id: HTEvent.html,v 2.7.2.4 1996/11/08 19:49:26 eric Exp $
2.1       eric      167: </ADDRESS>
2.3       frystyk   168: </BODY></HTML>

Webmaster