changeset 1623:b008ac166b91

Flags for hook handlers
author Myhailo Danylenko <isbear@ukrpost.net>
date Thu, 15 Oct 2009 12:08:53 +0300
parents 90ecb027d1e3
children a75611931642
files mcabber/src/hooks.c mcabber/src/hooks.h
diffstat 2 files changed, 22 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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