--- 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);
}
}
--- 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 <glib.h>
+#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