Start the transport/app registering code. Fix various things.
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Wed, 09 Jun 2010 04:11:26 +0200
changeset 17 24aa7414bafd
parent 16 cb085682970f
child 18 d0ddcfd31eb8
Start the transport/app registering code. Fix various things.
jingle/action-handlers.c
jingle/action-handlers.h
jingle/check.c
jingle/jingle.c
jingle/register.c
jingle/register.h
--- a/jingle/action-handlers.c	Mon Jun 07 23:04:34 2010 +0200
+++ b/jingle/action-handlers.c	Wed Jun 09 04:11:26 2010 +0200
@@ -30,6 +30,22 @@
   // a session-initiate message must contains at least one <content> element
   if (g_list_length(jn->content) < 1) {
     jingle_send_iq_error(m, "cancel", "bad-request", NULL);
+    return;
   }
-  
+
+  /*// if a session with the same jid already exists
+  if (session_find(jn) != NULL) {
+    jingle_send_iq_error(m, "cancel", "unexpected-request", "out-of-order");
+    return;
+  }*/
+
+  jingle_ack_iq(m);
 }
+
+void handle_session_terminate(LmMessage *m, JingleNode *jn)
+{
+  /*if (session_find(jn) == NULL) {
+    jingle_send_iq_error(m, "cancel", "item-not-found", "unknown-session");
+    return;
+  }*/
+}
--- a/jingle/action-handlers.h	Mon Jun 07 23:04:34 2010 +0200
+++ b/jingle/action-handlers.h	Wed Jun 09 04:11:26 2010 +0200
@@ -6,5 +6,6 @@
 
 
 void handle_session_initiate(LmMessage *m, JingleNode *jn);
+void handle_session_terminate(LmMessage *m, JingleNode *jn);
 
 #endif
--- a/jingle/check.c	Mon Jun 07 23:04:34 2010 +0200
+++ b/jingle/check.c	Wed Jun 09 04:11:26 2010 +0200
@@ -30,7 +30,6 @@
 gint index_in_array(const gchar *str, const gchar **array);
 
 
-
 const gchar *jingle_content_creator[] = {
   "initiator",
   "responder",
--- a/jingle/jingle.c	Mon Jun 07 23:04:34 2010 +0200
+++ b/jingle/jingle.c	Wed Jun 09 04:11:26 2010 +0200
@@ -65,7 +65,7 @@
   { "session-accept",    NULL },
   { "session-info",      NULL },
   { "session-initiate",  handle_session_initiate },
-  { "session-terminate", NULL },
+  { "session-terminate", handle_session_terminate },
   { "transport-accept",  NULL },
   { "transport-info",    NULL },
   { "transport-reject",  NULL },
@@ -120,8 +120,7 @@
   scr_log_print(LPRINT_DEBUG, "jingle: Received a valid jingle IQ");
 
   if (jingle_action_list[jn->action].handler == NULL) {
-    jingle_send_iq_error(message, "cancel", "feature-not-implemented",
-                         "unsupported-info");
+    jingle_send_iq_error(message, "cancel", "feature-not-implemented", NULL);
     return LM_HANDLER_RESULT_REMOVE_MESSAGE;
   }
 
--- 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 <mcabber/logprint.h>
 
+#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);
+  }
 }
--- a/jingle/register.h	Mon Jun 07 23:04:34 2010 +0200
+++ b/jingle/register.h	Wed Jun 09 04:11:26 2010 +0200
@@ -1,7 +1,22 @@
 #ifndef __JINGLE_REGISTER_H__
 #define __JINGLE_REGISTER_H__
 
-gchar* jingle_resigter_apps(const gchar* namespace);
-gchar* jingle_register_transports(const gchar* namespace);   
+#include "jingle.h"
+
+
+#define NS_JINGLE_APP_PREFIX       "urn:xmpp:jingle:app:"
+#define NS_JINGLE_TRANSPORT_PREFIX "urn:xmpp:jingle:transport:"
+
+
+typedef void (*JingleAppHandler) (JingleNode *jn, JingleContentNode *cn, gpointer *data);
+typedef void (*JingleTransportHandler) (JingleNode *jn, JingleContentNode *cn, gpointer *data);
+
+
+gboolean jingle_register_app(const gchar *xmlns,
+                             JingleAppHandler func,
+                             gpointer data);
+gboolean jingle_register_transport(const gchar *xmlns,
+                                   JingleTransportHandler func,
+                                   gpointer data);
 
 #endif