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