Modify the "registering" code.
Use directly g_slist_foreach(..,g_free(),..) to free a list.
--- 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