Start the transport/app registering code. Fix various things.
--- 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