diff mcabber/src/hooks.c @ 1623:b008ac166b91

Flags for hook handlers
author Myhailo Danylenko <isbear@ukrpost.net>
date Thu, 15 Oct 2009 12:08:53 +0300
parents f9bf561e54d0
children cd67b29e04e3
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);
       }
     }