Add an enum with all <jingle> actions, remove the iq struct.
--- a/jingle.c Thu May 27 05:01:33 2010 +0200
+++ b/jingle.c Fri May 28 03:53:36 2010 +0200
@@ -64,14 +64,17 @@
LmMessage *message,
gpointer user_data)
{
- //struct iq_data ii;
+ LmMessageSubType iqtype = lm_message_get_sub_type(message);
+ if (iqtype != LM_MESSAGE_SUB_TYPE_SET)
+ return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+
struct jingle_data ij;
LmMessageNode *root = lm_message_get_node(message)->children;
LmMessageNode *node = lm_message_node_get_child(root, "jingle");
- if (!node)
- return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS; // no <jingle> element found
-
+ if (!node) // no <jingle> element found
+ return LM_HANDLER_RESULT_ALLOW_MORE_HANDLERS;
+
if (g_strcmp0(lm_message_node_get_attribute(node, "xmlns"), NS_JINGLE)) {
scr_log_print(LPRINT_DEBUG, "jingle: Received a jingle IQ with an invalid namespace");
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
@@ -86,23 +89,6 @@
jingle_error_iq(message, "cancel", "feature-not-implemented", "unsupported-info");
- /*if (!strcmp(ij.action, "content-accept")) {
- } else if (!strcmp(ij.action, "content-add")) {
- } else if (!strcmp(ij.action, "content-modify")) {
- } else if (!strcmp(ij.action, "content-reject")) {
- } else if (!strcmp(ij.action, "content-remove")) {
- } else if (!strcmp(ij.action, "description-info")) {
- } else if (!strcmp(ij.action, "security-info")) {
- } else if (!strcmp(ij.action, "session-accept")) {
- } else if (!strcmp(ij.action, "session-info")) {
- } else if (!strcmp(ij.action, "session-initiate")) {
- } else if (!strcmp(ij.action, "session-terminate")) {
- } else if (!strcmp(ij.action, "transport-accept")) {
- } else if (!strcmp(ij.action, "transport-info")) {
- } else if (!strcmp(ij.action, "transport-reject")) {
- } else if (!strcmp(ij.action, "transport-replace")) {
- }*/
-
return LM_HANDLER_RESULT_REMOVE_MESSAGE;
}
@@ -113,7 +99,8 @@
* For Jingle's IQ, we have to reply with an empty "result" IQ to acknowledge
* receipt.
*/
-void jingle_ack_iq(LmMessage *m) {
+void jingle_ack_iq(LmMessage *m)
+{
LmMessage *r;
r = lm_message_new_iq_from_query(m, LM_MESSAGE_SUB_TYPE_RESULT);
@@ -180,7 +167,6 @@
{
jingle_iq_handler = lm_message_handler_new(jingle_handle_iq, NULL, NULL);
xmpp_add_feature(NS_JINGLE);
- xmpp_add_feature("urn:xmpp:jingle:apps:file-transfer:info:1"); // for debugging
connect_hid = hk_add_handler(jingle_connect_hh, HOOK_POST_CONNECT,
G_PRIORITY_DEFAULT_IDLE, NULL);
@@ -192,8 +178,6 @@
static void jingle_uninit(void)
{
xmpp_del_feature(NS_JINGLE);
- xmpp_del_feature("urn:xmpp:jingle:apps:file-transfer:info:1");
-
hk_del_handler(HOOK_POST_CONNECT, connect_hid);
hk_del_handler(HOOK_PRE_DISCONNECT, disconn_hid);
--- a/jingle.h Thu May 27 05:01:33 2010 +0200
+++ b/jingle.h Fri May 28 03:53:36 2010 +0200
@@ -9,4 +9,23 @@
void jingle_ack_iq(LmMessage *m);
+typedef enum {
+ JINGLE_UNKNOWN,
+ JINGLE_CONTENT_ACCEPT,
+ JINGLE_CONTENT_ADD,
+ JINGLE_CONTENT_MODIFY,
+ JINGLE_CONTENT_REJECT,
+ JINGLE_CONTENT_REMOVE,
+ JINGLE_DESCRIPTION_INFO,
+ JINGLE_SECURITY_INFO,
+ JINGLE_SESSION_ACCEPT,
+ JINGLE_SESSION_INFO,
+ JINGLE_SESSION_INITIATE,
+ JINGLE_SESSION_TERMINATE,
+ JINGLE_TRANSPORT_ACCEPT,
+ JINGLE_TRANSPORT_INFO,
+ JINGLE_TRANSPORT_REJECT,
+ JINGLE_TRANSPORT_REPLACE,
+} JingleAction;
+
#endif
--- a/parse.c Thu May 27 05:01:33 2010 +0200
+++ b/parse.c Fri May 28 03:53:36 2010 +0200
@@ -4,23 +4,29 @@
#include "parse.h"
#include "jingle.h"
-const gchar *jingle_actions[] = {
- "content-accept",
- "content-add",
- "content-modify",
- "content-reject",
- "content-remove",
- "description-info",
- "security-info",
- "session-accept",
- "session-info",
- "session-initiate",
- "session-terminate",
- "transport-accept",
- "transport-info",
- "transport-reject",
- "transport-replace",
- NULL
+
+static JingleAction action_from_str(const gchar* string);
+
+
+struct JingleActionStr {
+ JingleAction act;
+ const gchar *name;
+} jingle_actions_str[] = {
+ { JINGLE_CONTENT_ACCEPT, "content-accept" },
+ { JINGLE_CONTENT_ADD, "content-add" },
+ { JINGLE_CONTENT_MODIFY, "content-modify" },
+ { JINGLE_CONTENT_REJECT, "content-reject" },
+ { JINGLE_CONTENT_REMOVE, "content-remove" },
+ { JINGLE_DESCRIPTION_INFO, "description-info" },
+ { JINGLE_SECURITY_INFO, "security-info" },
+ { JINGLE_SESSION_ACCEPT, "session-accept" },
+ { JINGLE_SESSION_INFO, "session-info" },
+ { JINGLE_SESSION_INITIATE, "session-initiate" },
+ { JINGLE_SESSION_TERMINATE, "session-terminate" },
+ { JINGLE_TRANSPORT_ACCEPT, "transport-accept" },
+ { JINGLE_TRANSPORT_INFO, "transport-info" },
+ { JINGLE_TRANSPORT_REJECT, "transport-reject" },
+ { JINGLE_TRANSPORT_REPLACE, "transport-replace" },
};
const gchar *jingle_content_creator[] = {
@@ -37,25 +43,28 @@
NULL
};
+
/**
* Populate a jingle_data struct from a <jingle> element.
* Check if the element is in compliance with the XEP.
*/
-int check_jingle(LmMessageNode *node, struct jingle_data *ij)
+gint check_jingle(LmMessageNode *node, struct jingle_data *ij)
{
int nb_reason = 0;
LmMessageNode *child = NULL;
+ gchar *actionstr;
- ij->action = lm_message_node_get_attribute(node, "action");
+ actionstr = lm_message_node_get_attribute(node, "action");
ij->initiator = lm_message_node_get_attribute(node, "initiator");
ij->responder = lm_message_node_get_attribute(node, "responder");
ij->sid = lm_message_node_get_attribute(node, "sid");
- if (ij->action == NULL || ij->sid == NULL)
+ if (action == NULL || ij->sid == NULL)
return PARSE_ERROR_REQUIRED; // those elements are required
- if (!str_in_array(ij->action, jingle_actions))
- return PARSE_ERROR_RESTRICTION;
+ ij->action = action_from_str(actionstr);
+ if (ij->action == JINGLE_UNKNOWN)
+ return PARSE_ERROR_RESTRICTION;
// check childs
for (child = node->children; child; child = child->next) {
@@ -69,7 +78,7 @@
return PARSE_OK;
}
-int parse_content(LmMessageNode* node, struct content_data* ic)
+gint check_content(LmMessageNode* node, struct content_data* ic)
{
if (!strcmp(ic->name, "content"))
return PARSE_ERROR_NAME;
@@ -94,16 +103,14 @@
}
/**
- * Check if needle exists in haystack.
- * The last element of haystack must be NULL.
+ * Find the jingle_action corresponding to a string
*/
-gint str_in_array(const gchar* needle, const gchar** haystack)
+static JingleAction action_from_str(const gchar* string)
{
- const gchar* value;
- gint found = 0;
- for (value = haystack[0]; value && !found; value++)
- if (!g_strcmp0(needle, value))
- found = 1;
+ guint i, actstrlen = sizeof(jingle_actions_str)/sizeof(struct JingleActionStr);
+ for (i = 0; i < actstrlen; i++)
+ if (!g_strcmp0(jingle_actions_str[i].name, string))
+ return jingle_actions_str[i].act;
- return found;
+ return JINGLE_UNKNOWN;
}
--- a/parse.h Thu May 27 05:01:33 2010 +0200
+++ b/parse.h Fri May 28 03:53:36 2010 +0200
@@ -11,18 +11,11 @@
#define PARSE_ERROR_TOO_MANY_CHILDS 4
-struct iq_data {
- const gchar *from;
- const gchar *id;
- const gchar *to;
- const gchar *set;
-};
-
struct jingle_data {
- const gchar* action; // see jingle_action in jingle.h
+ JingleAction action;
const gchar* initiator; // optional
- const gchar* responder; // optional
- const gchar* sid; // required
+ const gchar* responder; // optional
+ const gchar* sid; // required
};
struct content_data {