45 gpointer userdata; |
45 gpointer userdata; |
46 } hook_list_data_t; |
46 } hook_list_data_t; |
47 |
47 |
48 static GSList *hk_handler_queue = NULL; |
48 static GSList *hk_handler_queue = NULL; |
49 |
49 |
50 void hk_add_handler (hk_handler_t handler, guint32 flags, gpointer userdata) |
50 void hk_add_handler(hk_handler_t handler, guint32 flags, gpointer userdata) |
51 { |
51 { |
52 hook_list_data_t *h = g_new (hook_list_data_t, 1); |
52 hook_list_data_t *h = g_new(hook_list_data_t, 1); |
53 h->handler = handler; |
53 h->handler = handler; |
54 h->flags = flags; |
54 h->flags = flags; |
55 h->userdata = userdata; |
55 h->userdata = userdata; |
56 hk_handler_queue = g_slist_append (hk_handler_queue, h); |
56 hk_handler_queue = g_slist_append(hk_handler_queue, h); |
57 } |
57 } |
58 |
58 |
59 static gint hk_queue_search_cb (hook_list_data_t *a, hook_list_data_t *b) |
59 static gint hk_queue_search_cb(hook_list_data_t *a, hook_list_data_t *b) |
60 { |
60 { |
61 if (a->handler == b->handler && a->userdata == b->userdata) |
61 if (a->handler == b->handler && a->userdata == b->userdata) |
62 return 0; |
62 return 0; |
63 else |
63 else |
64 return 1; |
64 return 1; |
65 } |
65 } |
66 |
66 |
67 void hk_del_handler (hk_handler_t handler, gpointer userdata) |
67 void hk_del_handler(hk_handler_t handler, gpointer userdata) |
68 { |
68 { |
69 hook_list_data_t h = { handler, 0, userdata }; |
69 hook_list_data_t h = { handler, 0, userdata }; |
70 GSList *el = g_slist_find_custom (hk_handler_queue, &h, (GCompareFunc) hk_queue_search_cb); |
70 GSList *el = g_slist_find_custom(hk_handler_queue, &h, |
|
71 (GCompareFunc) hk_queue_search_cb); |
71 if (el) { |
72 if (el) { |
72 g_free (el->data); |
73 g_free (el->data); |
73 hk_handler_queue = g_slist_delete_link (hk_handler_queue, el); |
74 hk_handler_queue = g_slist_delete_link(hk_handler_queue, el); |
74 } |
75 } |
75 } |
76 } |
76 #endif |
77 #endif |
77 |
78 |
78 static char *extcmd; |
79 static char *extcmd; |
234 |
235 |
235 #ifdef MODULES_ENABLE |
236 #ifdef MODULES_ENABLE |
236 { |
237 { |
237 GSList *h = hk_handler_queue; |
238 GSList *h = hk_handler_queue; |
238 if (h) { |
239 if (h) { |
239 #if 0 |
|
240 hk_arg_t *args = g_new (hk_arg_t, 5); |
|
241 args[0].name = "hook"; |
|
242 args[0].value = "hook-message-in"; |
|
243 args[1].name = "jid"; |
|
244 args[1].value = bjid; |
|
245 args[2].name = "message"; |
|
246 args[2].value = wmsg; |
|
247 args[3].name = "groupchat"; |
|
248 args[3].value = is_groupchat ? "true" : "false"; |
|
249 args[4].name = NULL; |
|
250 args[4].value = NULL; |
|
251 #else |
|
252 // We can use a const array for keys/static values, so modules |
240 // We can use a const array for keys/static values, so modules |
253 // can do fast known to them args check by just comparing pointers... |
241 // can do fast known to them args check by just comparing pointers... |
254 hk_arg_t args[] = { |
242 hk_arg_t args[] = { |
255 { "hook", "hook-message-in" }, |
243 { "hook", "hook-message-in" }, |
256 { "jid", bjid }, |
244 { "jid", bjid }, |
257 { "message", wmsg }, |
245 { "message", wmsg }, |
258 { "groupchat", is_groupchat ? "true" : "false" }, |
246 { "groupchat", is_groupchat ? "true" : "false" }, |
259 { NULL, NULL }, |
247 { NULL, NULL }, |
260 }; |
248 }; |
261 #endif |
|
262 while (h) { |
249 while (h) { |
263 hook_list_data_t *data = h->data; |
250 hook_list_data_t *data = h->data; |
264 if (data->flags & HOOK_MESSAGE_IN) |
251 if (data->flags & HOOK_MESSAGE_IN) |
265 (data->handler) (HOOK_MESSAGE_IN, args, data->userdata); |
252 (data->handler) (HOOK_MESSAGE_IN, args, data->userdata); |
266 h = g_slist_next (h); |
253 h = g_slist_next (h); |