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

2.1       eric        1: <HTML>
                      2: <HEAD>
2.13      frystyk     3:   <TITLE>W3C Sample Code 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
2.17      frystyk    39: <A HREF="HTEvtLst.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
2.16      frystyk    44: a part of the <A HREF="http://www.w3.org/Library/">W3C Sample Code Library</A>.
2.4       frystyk    45: <PRE>
2.1       eric       46: #ifndef HTEVENT_H
                     47: #define HTEVENT_H
2.14      frystyk    48: #include "wwwsys.h"
2.18    ! vbancrof   49: 
        !            50: #ifdef __cplusplus
        !            51: extern "C" { 
        !            52: #endif 
        !            53: 
2.11      eric       54: #ifdef IN_EVENT
                     55: typedef struct _HTTimer HTTimer;
                     56: #endif
2.2       frystyk    57: 
                     58: typedef enum _HTPriority {
                     59:     HT_PRIORITY_INV = -1,
                     60:     HT_PRIORITY_OFF = 0,
                     61:     HT_PRIORITY_MIN = 1,
                     62:     HT_PRIORITY_MAX = 20
                     63: } HTPriority; 
                     64: 
2.10      eric       65: #define HTEVENT_INDEX 0x10
2.8       frystyk    66: typedef enum {
2.9       eric       67: #ifdef WWW_WIN_ASYNC
2.10      eric       68:     HTEvent_READ    = (0x001 | 0 &lt;&lt; HTEVENT_INDEX),
                     69:     HTEvent_WRITE   = (0x002 | 1 &lt;&lt; HTEVENT_INDEX),
                     70:     HTEvent_OOB     = (0x004 | 2 &lt;&lt; HTEVENT_INDEX),
                     71:     HTEvent_ACCEPT  = (0x008 | 3 &lt;&lt; HTEVENT_INDEX),
                     72:     HTEvent_CONNECT = (0x010 | 4 &lt;&lt; HTEVENT_INDEX),
                     73:     HTEvent_CLOSE   = (0x020 | 5 &lt;&lt; HTEVENT_INDEX),
2.9       eric       74:     HTEvent_TYPES   = 6,       /* winsock has seperate events for all of these */
2.10      eric       75: #define HTEVENT_TYPES  6 /* use in constructing the fake event below */
2.9       eric       76: #else /* WWW_WIN_ASYNC */
2.10      eric       77:     HTEvent_READ    = (0x001 | 0 &lt;&lt; HTEVENT_INDEX),
                     78:     HTEvent_ACCEPT  = (0x002 | 0 &lt;&lt; HTEVENT_INDEX),
                     79:     HTEvent_CLOSE   = (0x004 | 0 &lt;&lt; HTEVENT_INDEX),
                     80:     HTEvent_WRITE   = (0x008 | 1 &lt;&lt; HTEVENT_INDEX),
                     81:     HTEvent_CONNECT = (0x010 | 1 &lt;&lt; HTEVENT_INDEX),
                     82:     HTEvent_OOB     = (0x020 | 2 &lt;&lt; HTEVENT_INDEX),
2.9       eric       83:     HTEvent_TYPES   = 3,       /* only READ, WRITE, and OOB are real types */
2.10      eric       84: #define HTEVENT_TYPES  3 /* use in constructing the fake event below */
2.9       eric       85: #endif /* !WWW_WIN_ASYNC */
2.10      eric       86:     /*
                     87:     ** fake events - these don't correspond to event manager events, but they
                     88:     ** are usefull for communicating with the protocol modules
                     89:     */
                     90:     HTEvent_TIMEOUT = (0x040 | HTEVENT_TYPES &lt;&lt; HTEVENT_INDEX),
                     91:     HTEvent_BEGIN   = (0x000 | HTEVENT_TYPES &lt;&lt; HTEVENT_INDEX),
                     92:     HTEvent_END     = (0x080 | HTEVENT_TYPES &lt;&lt; HTEVENT_INDEX),
                     93:     HTEvent_FLUSH   = (0x100 | HTEVENT_TYPES &lt;&lt; HTEVENT_INDEX),
                     94:     HTEvent_RESET   = (0x200 | HTEVENT_TYPES &lt;&lt; HTEVENT_INDEX),
2.9       eric       95:     HTEvent_ALL     = 0xFFFF
2.8       frystyk    96: } HTEventType;
2.1       eric       97: 
2.16      frystyk    98: #define HTEvent_BITS(type) (type &amp; 0xFFFF)
                     99: #define HTEvent_INDEX(type) (type &gt;&gt; HTEVENT_INDEX)
2.8       frystyk   100: 
2.11      eric      101: #define HT_EVENT_INITIALIZER \
                    102:     {HTEvent_READ, "HTEvent_READ"}, \
                    103:     {HTEvent_ACCEPT, "HTEvent_ACCEPT"}, \
                    104:     {HTEvent_CLOSE, "HTEvent_CLOSE"}, \
                    105:     {HTEvent_WRITE, "HTEvent_WRITE"}, \
                    106:     {HTEvent_CONNECT, "HTEvent_CONNECT"}, \
                    107:     {HTEvent_OOB, "HTEvent_OOB"}, \
                    108:     {HTEvent_TIMEOUT, "HTEvent_TIMEOUT"}, \
                    109:     {HTEvent_BEGIN, "HTEvent_BEGIN"}, \
                    110:     {HTEvent_END, "HTEvent_END"}, \
                    111:     {HTEvent_FLUSH, "HTEvent_FLUSH"}, \
                    112:     {HTEvent_RESET, "HTEvent_RESET"}
                    113: 
                    114: extern char * HTEvent_type2str(HTEventType type);
2.12      frystyk   115: </PRE>
2.3       frystyk   116: <H2>
2.7       eric      117:   <A NAME="eventHandlers">Event Handlers</A>
2.3       frystyk   118: </H2>
                    119: <P>
2.4       frystyk   120: A <I>location</I> is a function that can be registered by the event manager
                    121: and called at a later point in time in order to continue an operation. All
                    122: locations must be of type &nbsp;<CODE>HTEventCallback</CODE> as defined here:
2.2       frystyk   123: <PRE>
2.8       frystyk   124: typedef int HTEventCallback (SOCKET, void *, HTEventType);
2.12      frystyk   125: typedef struct _HTEvent HTEvent;
                    126: 
2.16      frystyk   127: /* Avoid circular include for HTReq-&gt;HTNet-&gt;HTHost: HTEvent blah */
2.12      frystyk   128: #include "HTReq.h"
2.2       frystyk   129: </PRE>
2.4       frystyk   130: <P>
                    131: There are many default event handlers provided with the Library. For example,
                    132: all the protocol modules such as the <A HREF="HTTP.html">HTTP client module</A>
                    133: are implemented as event handlers. In stead of using blocking sockets, this
                    134: allows a protocol module to register itself when performing an operation
                    135: that would block. When the sockets becomes ready the handler is called with
                    136: th socket in question, the request object, and the socket operation &nbsp;
2.3       frystyk   137: <H2>
2.17      frystyk   138:   Registering and Unregistering Events
2.3       frystyk   139: </H2>
                    140: <P>
2.4       frystyk   141: As mentioned above, the only interface libwww requires from an event manager
2.17      frystyk   142: is a method to <I>register</I> an event when an operation would block and
                    143: <I>unregister</I> it when the operation has completed The library registers
                    144: and unregisters events by calling the following two functions:
2.8       frystyk   145: <PRE>
                    146: extern int HTEvent_register    (SOCKET, HTEventType, HTEvent *);
                    147: extern int HTEvent_unregister  (SOCKET, HTEventType);
2.4       frystyk   148: </PRE>
                    149: <P>
                    150: The register function contains information about which socket we are waiting
                    151: on to get ready and which operation we are waiting for (read, write, etc.),
                    152: the request object containing the current request, the event handler that
                    153: we want to be called when the socket becomes reasy, and finally the priority
                    154: by which we want the thread to be processed by the event manager. Likewise,
                    155: libwww can unregister a operation on a socket which means that libwww is
                    156: no longer waiting for this actiion to become ready.
                    157: <H2>
                    158:   Registering an Event Manager
                    159: </H2>
                    160: <P>
2.17      frystyk   161: Libwww core does not contain any event manager as it depends on whether you
                    162: want to use pseudo threads no threads, or real threads. Instead, libwww comes
                    163: with a <A HREF="HTEvtLst.html">default implementation</A> that you may register,
                    164: but you may as well implement and register your own. The register and unregister
                    165: functions above actually does nothing than looking for a registered event
                    166: manager and then passes the call on to that. You register your own event
                    167: manager by using the methods below:
2.1       eric      168: <PRE>
2.8       frystyk   169: typedef int HTEvent_registerCallback(SOCKET, HTEventType, HTEvent *);
                    170: typedef int HTEvent_unregisterCallback(SOCKET, HTEventType);
2.1       eric      171: 
                    172: extern void HTEvent_setRegisterCallback(HTEvent_registerCallback *);
                    173: extern void HTEvent_setUnregisterCallback(HTEvent_unregisterCallback *);
2.17      frystyk   174: </PRE>
                    175: <H3>
                    176:   Has Register and Unregister Callbacks been setup?
                    177: </H3>
                    178: <P>
                    179: Replies YES if both an <TT>HTEvent_setRegisterCallback</TT> and
                    180: <TT>HTEvent_setUnregisterCallback</TT> have been called with non NULL callbacks.
                    181: <PRE>
                    182: extern BOOL HTEvent_isCallbacksRegistered(void);
                    183: </PRE>
                    184: <H2>
                    185:   Create and Delete Events
                    186: </H2>
                    187: <PRE>
2.8       frystyk   188: extern HTEvent * HTEvent_new (HTEventCallback * cbf, void * context,
                    189:                              HTPriority pritority, int timeoutInMillis);
                    190: extern BOOL HTEvent_delete (HTEvent * event);
2.17      frystyk   191: </PRE>
                    192: <H3>
                    193:   Event Timeouts, Priorities, Callbacks, and Contexts
                    194: </H3>
                    195: <P>
                    196: Normally, these are set when creating the event.
                    197: <PRE>
2.8       frystyk   198: extern BOOL HTEvent_setParam(HTEvent * event, void * param);
                    199: extern BOOL HTEvent_setPriority(HTEvent * event, HTPriority priority);
                    200: extern BOOL HTEvent_setTimeout(HTEvent * event, int timeoutInMillis);
2.17      frystyk   201: extern BOOL HTEvent_setCallback(HTEvent * event, HTEventCallback * cbf);
                    202: </PRE>
                    203: <H2>
                    204:   The Raw Event Type
                    205: </H2>
                    206: <P>
                    207: Don't use this directly, use the methods above instead.
                    208: <PRE>
                    209: struct _HTEvent {
                    210:     HTPriority         priority;        /* Priority of this request (event) */
                    211:     int                 millis;              /* Timeout in ms for this event */
                    212: #ifdef IN_EVENT
                    213:     HTTimer *          timer;
                    214: #endif
                    215:     HTEventCallback *  cbf;                       /* Protocol state machine */
                    216:     void *             param;                 /* HTEvent_register parameter */
                    217:     HTRequest *                request;
                    218: };
2.1       eric      219: </PRE>
2.3       frystyk   220: <P>
2.4       frystyk   221: You can register the event manager provided together with libwww by using
2.6       frystyk   222: the <CODE>HTEventInit()</CODE> in the <A HREF="HTInit.html">HTInit module</A>
2.1       eric      223: <PRE>
2.18    ! vbancrof  224: #ifdef __cplusplus
        !           225: }
        !           226: #endif
        !           227: 
2.1       eric      228: #endif /* HTEVENT_H */
                    229: </PRE>
2.3       frystyk   230: <P>
                    231:   <HR>
2.1       eric      232: <ADDRESS>
2.18    ! vbancrof  233:   @(#) $Id: HTEvent.html,v 2.17 1998/08/10 02:42:12 frystyk Exp $
2.1       eric      234: </ADDRESS>
2.3       frystyk   235: </BODY></HTML>

Webmaster