1 /*				    				     HTEvntrg.c
2 **	EVENT DISPATCHER
3 **
4 **	(c) COPYRIGHT MIT 1996.
5 **	Please first read the full copyright statement in the file COPYRIGH.
6 **      @(#) $Id$
7 **
8 **	The event dispatcher allows applications to register their own event
9 **	models. They may register the standard HTEventrg methods from
10 **	HTEventrg.c, of implement their functionality with their on methods.
11 **
12 ** Authors:
13 **	EGP	Eric Gordon Prud'hommeuax
14 ** Bugs
15 **
16 */
17 
18 /* Implementation dependent include files */
19 #include "wwwsys.h"
20 #include "WWWUtil.h"
21 #include "HTEvent.h"					 /* Implemented here */
22 
23 PRIVATE HTEvent_registerCallback * RegisterCBF = NULL;
24 PRIVATE HTEvent_unregisterCallback * UnregisterCBF = NULL;
25 
26 /* ------------------------------------------------------------------------- */
27 
HTEvent_setRegisterCallback(HTEvent_registerCallback * registerCBF)28 PUBLIC void HTEvent_setRegisterCallback(HTEvent_registerCallback * registerCBF)
29 {
30     HTTRACE(CORE_TRACE, "Event....... registering %p\n" _ registerCBF);
31     RegisterCBF = registerCBF;
32 }
33 
HTEvent_setUnregisterCallback(HTEvent_unregisterCallback * unregisterCBF)34 PUBLIC void HTEvent_setUnregisterCallback(HTEvent_unregisterCallback * unregisterCBF)
35 {
36     HTTRACE(CORE_TRACE, "Event....... registering %p\n" _ unregisterCBF);
37     UnregisterCBF = unregisterCBF;
38 }
39 
HTEvent_isCallbacksRegistered(void)40 PUBLIC BOOL HTEvent_isCallbacksRegistered (void)
41 {
42     return (RegisterCBF && UnregisterCBF);
43 }
44 
HTEvent_unregister(SOCKET s,HTEventType type)45 PUBLIC int HTEvent_unregister (SOCKET s, HTEventType type)
46 {
47     if (!UnregisterCBF) {
48 	HTTRACE(CORE_TRACE, "Event....... No handler registered\n");
49         return -1;
50     }
51     return (*UnregisterCBF)(s, type);
52 }
53 
HTEvent_register(SOCKET s,HTEventType type,HTEvent * event)54 PUBLIC int HTEvent_register(SOCKET s, HTEventType type, HTEvent * event)
55 {
56     if (!RegisterCBF) {
57 	HTTRACE(CORE_TRACE, "Event....... No handler registered\n");
58         return -1;
59     }
60     return (*RegisterCBF)(s, type, event);
61 }
62 
HTEvent_setCallback(HTEvent * event,HTEventCallback * cbf)63 PUBLIC BOOL HTEvent_setCallback(HTEvent * event, HTEventCallback * cbf)
64 {
65     if (!event) return NO;
66     event->cbf = cbf;
67     return YES;
68 }
69 
HTEvent_new(HTEventCallback * cbf,void * context,HTPriority priority,int millis)70 PUBLIC HTEvent * HTEvent_new (HTEventCallback * cbf, void * context,
71 			      HTPriority priority, int millis)
72 {
73     if (cbf) {
74 	HTEvent * me;
75 	if ((me = (HTEvent *) HT_CALLOC(1, sizeof(HTEvent))) == NULL)
76 	    HT_OUTOFMEM("HTEvent_new");
77 	me->cbf = cbf;
78 	me->param = context;
79 	me->priority = priority;
80 	me->millis = millis;
81 	HTTRACE(CORE_TRACE, "Event....... Created event %p with context %p, priority %d, and timeout %d\n" _
82 		    me _ context _ priority _ millis);
83 	return me;
84     }
85     return NULL;
86 }
87 
HTEvent_delete(HTEvent * me)88 PUBLIC BOOL HTEvent_delete (HTEvent * me)
89 {
90     if (me) {
91 	HT_FREE(me);
92 	HTTRACE(CORE_TRACE, "Event....... Deleted event %p\n" _ me);
93 	return YES;
94     }
95     return NO;
96 }
97 
HTEvent_setParam(HTEvent * event,void * param)98 PUBLIC BOOL HTEvent_setParam(HTEvent * event, void * param)
99 {
100     if (!event) return NO;
101     event->param = param;
102     return YES;
103 }
104 
HTEvent_setPriority(HTEvent * event,HTPriority priority)105 PUBLIC BOOL HTEvent_setPriority(HTEvent * event, HTPriority priority)
106 {
107     if (!event) return NO;
108     event->priority = priority;
109     return YES;
110 }
111 
HTEvent_setTimeout(HTEvent * event,int timeout)112 PUBLIC BOOL HTEvent_setTimeout(HTEvent * event, int timeout)
113 {
114     if (event) {
115 	event->millis = timeout;
116 	return YES;
117     }
118     return NO;
119 }
120 
HTEvent_type2str(HTEventType type)121 PUBLIC char * HTEvent_type2str(HTEventType type)
122 {
123     int i;
124     static char space[20]; /* in case we have to sprintf type */
125     static struct {int type; char * str;} match[] = {HT_EVENT_INITIALIZER};
126     for (i = 0; i < sizeof(match)/sizeof(match[0]); i++)
127 	if (match[i].type == type)
128 	    return match[i].str;
129     sprintf(space, "0x%x", type);
130     return space;
131 }
132 
133