# HG changeset patch # User Myhailo Danylenko # Date 1255597733 -10800 # Node ID b008ac166b91dcae7aeac8efcbf338fc12b47d9e # Parent 90ecb027d1e3d36b2faa45db0c36d0010ff3057b Flags for hook handlers diff -r 90ecb027d1e3 -r b008ac166b91 mcabber/src/hooks.c --- a/mcabber/src/hooks.c Thu Oct 15 12:57:36 2009 +0300 +++ b/mcabber/src/hooks.c Thu Oct 15 12:08:53 2009 +0300 @@ -41,15 +41,17 @@ typedef struct { hk_handler_t handler; + guint32 flags; gpointer userdata; } hook_list_data_t; static GSList *hk_handler_queue = NULL; -void hk_add_handler (hk_handler_t handler, gpointer userdata) +void hk_add_handler (hk_handler_t handler, guint32 flags, gpointer userdata) { hook_list_data_t *h = g_new (hook_list_data_t, 1); h->handler = handler; + h->flags = flags; h->userdata = userdata; hk_handler_queue = g_slist_append (hk_handler_queue, h); } @@ -64,7 +66,7 @@ void hk_del_handler (hk_handler_t handler, gpointer userdata) { - hook_list_data_t h = { handler, userdata }; + hook_list_data_t h = { handler, 0, userdata }; GSList *el = g_slist_find_custom (hk_handler_queue, &h, (GCompareFunc) hk_queue_search_cb); if (el) { g_free (el->data); @@ -275,7 +277,8 @@ #endif while (h) { hook_list_data_t *data = h->data; - (data->handler) (args, data->userdata); + if (data->flags & HOOK_MESSAGE_IN) + (data->handler) (HOOK_MESSAGE_IN, args, data->userdata); h = g_slist_next (h); } } @@ -373,7 +376,8 @@ }; while (h) { hook_list_data_t *data = h->data; - (data->handler) (args, data->userdata); + if (data->flags & HOOK_MESSAGE_OUT) + (data->handler) (HOOK_MESSAGE_OUT, args, data->userdata); h = g_slist_next (h); } } @@ -470,7 +474,8 @@ ns[0] = imstatus2char[status]; while (h) { hook_list_data_t *data = h->data; - (data->handler) (args, data->userdata); + if (data->flags & HOOK_STATUS_CHANGE) + (data->handler) (HOOK_STATUS_CHANGE, args, data->userdata); h = g_slist_next (h); } } @@ -502,7 +507,8 @@ ns[0] = imstatus2char[new_status]; while (h) { hook_list_data_t *data = h->data; - (data->handler) (args, data->userdata); + if (data->flags & HOOK_MY_STATUS_CHANGE) + (data->handler) (HOOK_MY_STATUS_CHANGE, args, data->userdata); h = g_slist_next (h); } } @@ -542,7 +548,8 @@ }; while (h) { hook_list_data_t *data = h->data; - (data->handler) (args, data->userdata); + if (data->flags & HOOK_INTERNAL) + (data->handler) (HOOK_INTERNAL, args, data->userdata); h = g_slist_next (h); } } diff -r 90ecb027d1e3 -r b008ac166b91 mcabber/src/hooks.h --- a/mcabber/src/hooks.h Thu Oct 15 12:57:36 2009 +0300 +++ b/mcabber/src/hooks.h Thu Oct 15 12:08:53 2009 +0300 @@ -13,14 +13,20 @@ #ifdef MODULES_ENABLE #include +#define HOOK_MESSAGE_IN ( 0x00000001 ) +#define HOOK_MESSAGE_OUT ( 0x00000002 ) +#define HOOK_STATUS_CHANGE ( 0x00000004 ) +#define HOOK_MY_STATUS_CHANGE ( 0x00000008 ) +#define HOOK_INTERNAL ( 0x00000010 ) + typedef struct { const char *name; const char *value; } hk_arg_t; -typedef void (*hk_handler_t) (hk_arg_t *args, gpointer userdata); +typedef void (*hk_handler_t) (guint32 flags, hk_arg_t *args, gpointer userdata); -void hk_add_handler (hk_handler_t handler, gpointer userdata); +void hk_add_handler (hk_handler_t handler, guint32 flags, gpointer userdata); void hk_del_handler (hk_handler_t handler, gpointer userdata); #endif