Modify the "registering" code.
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 11 Jun 2010 01:56:34 +0200
changeset 19 60a10ab26723
parent 18 d0ddcfd31eb8
child 20 72e53665328e
Modify the "registering" code. Use directly g_slist_foreach(..,g_free(),..) to free a list.
jingle-filetransfert/filetransfert.c
jingle-filetransfert/filetransfert.h
jingle/action-handlers.c
jingle/check.c
jingle/check.h
jingle/jingle.c
jingle/register.c
jingle/register.h
--- a/jingle-filetransfert/filetransfert.c	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle-filetransfert/filetransfert.c	Fri Jun 11 01:56:34 2010 +0200
@@ -27,34 +27,46 @@
 #include <mcabber/xmpp_helper.h>
 
 #include <jingle/jingle.h>
+#include <jingle/check.h>
+#include <jingle/register.h>
 
 #include "filetransfert.h"
 
 
-static void jingleft_init(void);
-static void jingleft_uninit(void);
+void jingle_ft_check();
+static void jingle_ft_init(void);
+static void jingle_ft_uninit(void);
 
 
 const gchar *deps[] = { "jingle", NULL };
 
+JingleAppFuncs funcs = {jingle_ft_check, NULL};
+
 module_info_t info_jingle_filetransfert = {
   .branch          = MCABBER_BRANCH,
   .api             = MCABBER_API_VERSION,
   .version         = PROJECT_VERSION,
   .description     = "Jingle File Transfert (XEP-0234)\n",
   .requires        = deps,
-  .init            = jingleft_init,
-  .uninit          = jingleft_uninit,
+  .init            = jingle_ft_init,
+  .uninit          = jingle_ft_uninit,
   .next            = NULL,
 };
 
 
-static void jingleft_init(void)
+void jingle_ft_check(JingleContentNode *cn, GError **err, gpointer *data)
 {
+  return;
+}
+
+static void jingle_ft_init(void)
+{
+  jingle_register_app(NS_JINGLE_APP_FT, &funcs, NULL);
   xmpp_add_feature(NS_JINGLE_APP_FT);
 }
 
-static void jingleft_uninit(void)
+static void jingle_ft_uninit(void)
 {
   xmpp_del_feature(NS_JINGLE_APP_FT);
+  jingle_unregister_app(NS_JINGLE_APP_FT);
 }
--- a/jingle-filetransfert/filetransfert.h	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle-filetransfert/filetransfert.h	Fri Jun 11 01:56:34 2010 +0200
@@ -1,6 +1,7 @@
 #ifndef __JINGLEFT_H__
 #define __JINGLEFT_H__ 1
 
-#define NS_JINGLE_APP_FT "urn:xmpp:jingle:apps:file-transfer:1"
+#define NS_JINGLE_APP_FT      "urn:xmpp:jingle:apps:file-transfer:1"
+#define NS_JINGLE_APP_FT_INFO "urn:xmpp:jingle:apps:file-transfer:info:1"
 
 #endif
--- a/jingle/action-handlers.c	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/action-handlers.c	Fri Jun 11 01:56:34 2010 +0200
@@ -21,18 +21,31 @@
 
 #include <glib.h>
 
+#include <mcabber/logprint.h>
+
 #include <jingle/jingle.h>
 #include <jingle/check.h>
 
 
 void handle_session_initiate(LmMessage *m, JingleNode *jn)
 {
+  GError *err = NULL;
+
+  if (!check_contents(jn, &err)) {
+    scr_log_print(LPRINT_DEBUG, "jingle: One of the content element was invalid (%s)",
+                  err->message);
+    jingle_send_iq_error(m, "cancel", "bad-request", NULL);
+    return;
+  }
+
   // a session-initiate message must contains at least one <content> element
   if (g_slist_length(jn->content) < 1) {
     jingle_send_iq_error(m, "cancel", "bad-request", NULL);
     return;
   }
 
+
+
   /*// if a session with the same sid already exists
   if (session_find(jn) != NULL) {
     jingle_send_iq_error(m, "cancel", "unexpected-request", "out-of-order");
--- a/jingle/check.c	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/check.c	Fri Jun 11 01:56:34 2010 +0200
@@ -145,10 +145,13 @@
     if (!g_strcmp0(child->name, "content")) {
       cn = check_content(child, err);
       if(cn == NULL) {
-        g_assert (*err != NULL);
+        if(jn->content != NULL) {
+          g_slist_foreach(jn->content, (GFunc)g_free, NULL);
+          g_slist_free(jn->content);
+        }
         return FALSE;
-	  }
-	  jn->content = g_slist_append(jn->content, cn);
+      }
+      jn->content = g_slist_append(jn->content, cn);
     }
   }
   return TRUE;
@@ -165,7 +168,7 @@
   return -1;
 }
 
-GQuark jingle_check_error_quark()
+GQuark jingle_check_error_quark(void)
 {
   return g_quark_from_string("JINGLE_CHECK_ERROR");
 }
--- a/jingle/check.h	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/check.h	Fri Jun 11 01:56:34 2010 +0200
@@ -19,6 +19,6 @@
 gboolean check_jingle(LmMessage *message, LmMessageNode *node,
                       JingleNode *jn, GError **err);
 gboolean check_contents(JingleNode *jn, GError **err);
-GQuark jingle_check_error_quark();
+GQuark jingle_check_error_quark(void);
 
 #endif
--- a/jingle/jingle.c	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/jingle.c	Fri Jun 11 01:56:34 2010 +0200
@@ -201,11 +201,7 @@
 
 void jingle_free_jinglenode(JingleNode *jn)
 {
-  GSList *entry = NULL;
-  for (entry = jn->content; entry; entry = entry->next) {
-    if (entry->data != NULL)
-      g_free((JingleContentNode*) entry->data);
-  }
+  g_slist_foreach(jn->content, (GFunc)g_free, NULL);
   g_slist_free(jn->content);
   lm_message_unref(jn->message);
   g_free(jn);
--- 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)
--- a/jingle/register.h	Wed Jun 09 22:16:21 2010 +0200
+++ b/jingle/register.h	Fri Jun 11 01:56:34 2010 +0200
@@ -8,15 +8,39 @@
 #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);
+typedef void (*JingleAppCheck) (JingleContentNode *cn, GError **err, gpointer *data);
+typedef void (*JingleAppHandle) (JingleNode *jn, JingleContentNode *cn, gpointer *data);
+typedef void (*JingleTransportCheck) (JingleContentNode *cn, GError **err, gpointer *data);
+typedef void (*JingleTransportHandle) (JingleNode *jn, JingleContentNode *cn, gpointer *data);
+
+typedef struct {
+  /* check if the description of a JingleContentNode is correct */
+  JingleAppCheck  check;
+
+  /* */
+  JingleAppHandle handle;
+
+} JingleAppFuncs;
+
+typedef struct {
+  /* check if the transport of a JingleContentNode is correct */
+  JingleAppCheck  check;
+
+  /* */
+  JingleAppHandle handle;
+  
+} JingleTransportFuncs;
 
 
-gboolean jingle_register_app(const gchar *xmlns,
-                             JingleAppHandler func,
-                             gpointer data);
-gboolean jingle_register_transport(const gchar *xmlns,
-                                   JingleTransportHandler func,
-                                   gpointer data);
+void jingle_register_app(const gchar *xmlns,
+                         JingleAppFuncs *funcs,
+                         gpointer data);
+void jingle_register_transport(const gchar *xmlns,
+                               JingleTransportFuncs *funcs,
+                               gpointer data);
+JingleAppFuncs *jingle_get_appfuncs(const gchar *xmlns);
+JingleTransportFuncs *jingle_get_transportfuncs(const gchar *xmlns);
+void jingle_unregister_app(const gchar *xmlns);
+void jingle_unregister_transport(const gchar *xmlns);
 
 #endif