Add an enum with all <jingle> actions, remove the iq struct.
authorNicolas Cornu <nicolas.cornu@ensi-bourges.fr>
Fri, 28 May 2010 03:53:36 +0200
changeset 8 2dc0ecb57c0d
parent 7 031bfc6d1770
child 9 5b6e1cdeb02b
Add an enum with all <jingle> actions, remove the iq struct.
jingle.c
jingle.h
parse.c
parse.h
--- 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 {