diff -r cb085682970f -r 24aa7414bafd jingle/register.c --- a/jingle/register.c Mon Jun 07 23:04:34 2010 +0200 +++ b/jingle/register.c Wed Jun 09 04:11:26 2010 +0200 @@ -23,44 +23,113 @@ #include +#include "register.h" #include "jingle.h" -GHashTable *hk_jingle_apps_handler_hash = NULL; -GHashTable *hk_jingle_transports_handler_hash = NULL; + +typedef struct { + gchar *xmlns; + JingleAppHandler handler; + gpointer data; +} AppHandlerEntry; -gchar* jingle_register_apps(const gchar* namespace) +typedef struct { + gchar *xmlns; + JingleTransportHandler handler; + gpointer data; +} TransportHandlerEntry; + + +GSList *jingle_app_handlers = NULL; +GSList *jingle_transport_handlers = NULL; + + +gboolean jingle_register_app(const gchar *xmlns, + JingleAppHandler func, + gpointer data) { - gchar* hookname = NULL; + if (!g_str_has_prefix(xmlns, NS_JINGLE_APP_PREFIX)) return FALSE; - if (!hk_jingle_apps_handler_hash) { - hk_jingle_apps_handler_hash = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free); - if (!hk_jingle_apps_handler_hash) { - scr_log_print(LPRINT_LOGNORM, "Couldn't create hook hash table for jingle apps!"); - return NULL; - } - } + AppHandlerEntry *h = g_new(AppHandlerEntry, 1); + + h->xmlns = g_strdup(xmlns); + h->handler = func; + h->data = data; + + jingle_app_handlers = g_slist_append(jingle_app_handlers, h); + + return TRUE; +} - hookname = g_strdup_printf("%s%s", "hook_jingle_apps_", namespace); +gboolean jingle_register_transport(const gchar *xmlns, + JingleTransportHandler func, + gpointer data) +{ + if (!g_str_has_prefix(xmlns, NS_JINGLE_TRANSPORT_PREFIX)) return FALSE; + + TransportHandlerEntry *h = g_new(TransportHandlerEntry, 1); - g_hash_table_insert(hk_jingle_apps_handler_hash, g_strdup(namespace), hookname); + h->xmlns = g_strdup(xmlns); + h->handler = func; + h->data = data; - return hookname; + jingle_transport_handlers = g_slist_append(jingle_transport_handlers, h); + + return TRUE; } -gchar* jingle_register_transports(const gchar* namespace) { - gchar* hookname = NULL; +static AppHandlerEntry *jingle_find_app(const gchar *xmlns) +{ + GSList *tmpl; + AppHandlerEntry *entry; + + for (tmpl = jingle_app_handlers; tmpl; tmpl = tmpl->next) { + entry = (AppHandlerEntry *)tmpl->data; + if (!g_strcmp0(entry->xmlns, xmlns)) + return entry; + } + return NULL; +} + +static TransportHandlerEntry *jingle_find_transport(const gchar *xmlns) +{ + GSList *tmpl; + TransportHandlerEntry *entry; + + for (tmpl = jingle_transport_handlers; tmpl; tmpl = tmpl->next) { + entry = (TransportHandlerEntry *)tmpl->data; + if (!g_strcmp0(entry->xmlns, xmlns)) + return entry; + } + return NULL; +} - if (!hk_jingle_transports_handler_hash) { - hk_jingle_transports_handler_hash = g_hash_table_new_full(&g_str_hash, &g_str_equal, &g_free, &g_free); - if (!hk_jingle_transports_handler_hash) { - scr_log_print(LPRINT_LOGNORM, "Couldn't create hook hash table for jingle transports!"); - return NULL; - } +static void jingle_free_app(AppHandlerEntry *entry) +{ + g_free(entry->xmlns); + g_free(entry); +} + +static void jingle_free_transport(TransportHandlerEntry *entry) +{ + g_free(entry->xmlns); + g_free(entry); +} + +void jingle_unregister_app(const gchar *xmlns) +{ + AppHandlerEntry *entry = jingle_find_app(xmlns); + if (entry) { + jingle_free_app(entry); + jingle_app_handlers = g_slist_remove(jingle_app_handlers, entry); } - - hookname = g_strdup_printf("%s%s", "hook_jingle_transports_", namespace); +} - g_hash_table_insert(hk_jingle_transports_handler_hash, g_strdup(namespace), hookname); - - return hookname; +void jingle_unregister_transport(const gchar *xmlns) +{ + TransportHandlerEntry *entry = jingle_find_transport(xmlns); + if (entry) { + jingle_free_transport(entry); + jingle_transport_handlers = g_slist_remove(jingle_app_handlers, entry); + } }