mcabber/mcabber/hooks.c
changeset 1784 250ad919f03f
parent 1783 af3de54ef986
child 1785 5c043358ded0
equal deleted inserted replaced
1783:af3de54ef986 1784:250ad919f03f
    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);