jingle/register.c
changeset 19 60a10ab26723
parent 18 d0ddcfd31eb8
child 26 af14f8f5a2b6
--- a/jingle/register.c	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/register.c	Fri Jun 11 01:56:34 2010 +0200
@@ -28,80 +28,89 @@
 
 
 typedef struct {
-	gchar *xmlns;
-	JingleAppHandler handler;
-	gpointer data;
+  gchar *xmlns;
+  JingleAppFuncs *funcs;
+  gpointer data;
 } AppHandlerEntry;
 
 typedef struct {
-	gchar *xmlns;
-	JingleTransportHandler handler;
-	gpointer data;
+  gchar *xmlns;
+  JingleTransportFuncs *funcs;
+  gpointer data;
 } TransportHandlerEntry;
 
 
+static AppHandlerEntry *jingle_find_app(const gchar *xmlns);
+static TransportHandlerEntry *jingle_find_transport(const gchar *xmlns);
+
+
 GSList *jingle_app_handlers = NULL;
 GSList *jingle_transport_handlers = NULL;
 
 
-gboolean jingle_register_app(const gchar *xmlns,
-                             JingleAppHandler func,
+void jingle_register_app(const gchar *xmlns,
+                             JingleAppFuncs *funcs,
                              gpointer data)
 {
-  if (!g_str_has_prefix(xmlns, NS_JINGLE_APP_PREFIX)) return FALSE;
+  if (!g_str_has_prefix(xmlns, NS_JINGLE_APP_PREFIX)) return;
 
   AppHandlerEntry *h = g_new(AppHandlerEntry, 1);
 
-  h->xmlns   = g_strdup(xmlns);
-  h->handler = func;
-  h->data    = data;
+  h->xmlns  = g_strdup(xmlns);
+  h->funcs  = funcs;
+  h->data   = data;
 
   jingle_app_handlers = g_slist_append(jingle_app_handlers, h);
-
-  return TRUE;
 }
 
-gboolean jingle_register_transport(const gchar *xmlns,
-                                   JingleTransportHandler func,
+void jingle_register_transport(const gchar *xmlns,
+                                   JingleTransportFuncs *funcs,
                                    gpointer data)
 {
-  if (!g_str_has_prefix(xmlns, NS_JINGLE_TRANSPORT_PREFIX)) return FALSE;
+  if (!g_str_has_prefix(xmlns, NS_JINGLE_TRANSPORT_PREFIX)) return;
 
   TransportHandlerEntry *h = g_new(TransportHandlerEntry, 1);
 
-  h->xmlns   = g_strdup(xmlns);
-  h->handler = func;
-  h->data    = data;
+  h->xmlns  = g_strdup(xmlns);
+  h->funcs  = funcs;
+  h->data   = data;
 
   jingle_transport_handlers = g_slist_append(jingle_transport_handlers, h);
+}
 
-  return TRUE;
+JingleAppFuncs *jingle_get_appfuncs(const gchar *xmlns)
+{
+  AppHandlerEntry *entry;
+  return (entry = jingle_find_app(xmlns)) != NULL ? entry->funcs : NULL;
+}
+
+JingleTransportFuncs *jingle_get_transportfuncs(const gchar *xmlns)
+{
+  TransportHandlerEntry *entry;
+  return (entry = jingle_find_transport(xmlns)) != NULL ? entry->funcs : NULL;
+}
+
+/**
+ * This function should work with AppHandlerEntry and
+ * TransportHandlerEntry as long as both start with xmlns.
+ */
+static gint jingle_entry_cmp(gconstpointer a, gconstpointer b)
+{
+  return g_strcmp0(((AppHandlerEntry *) a)->xmlns, (const gchar*) b);
 }
 
 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;
+  GSList *entry = g_slist_find_custom(jingle_app_handlers, xmlns,
+                                      jingle_entry_cmp);
+  return (AppHandlerEntry *) entry;
 }
 
 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;
+  GSList *entry = g_slist_find_custom(jingle_transport_handlers, xmlns,
+                                      jingle_entry_cmp);
+  return (TransportHandlerEntry *) entry;
 }
 
 static void jingle_free_app(AppHandlerEntry *entry)