[Telepathy-commits] [telepathy-gabble/master] JingleSession: use enum->string->enum functions instead of table lookup

Senko Rasic senko at phyrexia.lan
Tue Dec 2 04:34:02 PST 2008


---
 src/jingle-content.c |   56 ++++++++++++++-----
 src/jingle-factory.h |   12 ++--
 src/jingle-session.c |  152 +++++++++++++++++++++++++-------------------------
 src/jingle-session.h |    3 -
 4 files changed, 124 insertions(+), 99 deletions(-)

diff --git a/src/jingle-content.c b/src/jingle-content.c
index 8255ee8..02197b5 100644
--- a/src/jingle-content.c
+++ b/src/jingle-content.c
@@ -90,13 +90,6 @@ struct _GabbleJingleContentPrivate
 
 /* lookup tables */
 
-static const gchar *content_senders_table[] = {
-  "initiator",
-  "responder",
-  "both",
-  NULL
-};
-
 G_DEFINE_TYPE(GabbleJingleContent, gabble_jingle_content, G_TYPE_OBJECT);
 
 static void new_transport_candidates_cb (GabbleJingleTransportIface *trans,
@@ -404,6 +397,42 @@ gabble_jingle_content_class_init (GabbleJingleContentClass *cls)
     G_TYPE_NONE, 0);
 }
 
+static JingleContentSenders
+parse_senders (const gchar *txt)
+{
+  if (txt == NULL)
+      return JINGLE_CONTENT_SENDERS_NONE;
+
+  if (!tp_strdiff (txt, "initiator"))
+      return JINGLE_CONTENT_SENDERS_INITIATOR;
+  else if (!tp_strdiff (txt, "responder"))
+      return JINGLE_CONTENT_SENDERS_RESPONDER;
+  else if (!tp_strdiff (txt, "both"))
+      return JINGLE_CONTENT_SENDERS_BOTH;
+
+  return JINGLE_CONTENT_SENDERS_NONE;
+}
+
+static const gchar *
+produce_senders (JingleContentSenders senders)
+{
+  switch (senders) {
+    case JINGLE_CONTENT_SENDERS_INITIATOR:
+      return "initiator";
+    case JINGLE_CONTENT_SENDERS_RESPONDER:
+      return "responder";
+    case JINGLE_CONTENT_SENDERS_BOTH:
+      return "both";
+    default:
+      DEBUG ("invalid content senders %u", senders);
+      g_assert_not_reached ();
+  }
+
+  /* to make gcc not complain */
+  return NULL;
+}
+
+
 #define SET_BAD_REQ(txt...) g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, txt)
 #define SET_OUT_ORDER(txt) g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_JINGLE_OUT_OF_ORDER, txt)
 #define SET_CONFLICT(txt...) g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_CONFLICT, txt)
@@ -528,7 +557,7 @@ gabble_jingle_content_parse_add (GabbleJingleContent *c,
 
   priv->created_by_us = FALSE;
   priv->created_by_initiator = (!tp_strdiff (creator, "initiator"));
-  priv->senders = _string_to_enum (content_senders_table, senders);
+  priv->senders = parse_senders (senders);
   if (priv->senders == JINGLE_CONTENT_SENDERS_NONE)
     {
       SET_BAD_REQ ("invalid content senders");
@@ -620,8 +649,8 @@ gabble_jingle_content_parse_accept (GabbleJingleContent *c,
     }
   else
     {
-      DEBUG ("changing senders from %s to %s", _enum_to_string(content_senders_table, priv->senders), senders);
-      priv->senders = _string_to_enum (content_senders_table, senders);
+      DEBUG ("changing senders from %s to %s", produce_senders (priv->senders), senders);
+      priv->senders = parse_senders (senders);
       if (priv->senders == JINGLE_CONTENT_SENDERS_NONE)
         {
           SET_BAD_REQ ("invalid content senders");
@@ -667,13 +696,13 @@ gabble_jingle_content_produce_node (GabbleJingleContent *c,
     {
       DEBUG ("creator: %s", priv->creator);
       DEBUG ("name: %s", priv->name);
-      DEBUG ("senders: %s", _enum_to_string (content_senders_table, priv->senders));
+      DEBUG ("senders: %s", produce_senders (priv->senders));
 
       content_node = lm_message_node_add_child (parent, "content", NULL);
       lm_message_node_set_attributes (content_node,
           "creator", priv->created_by_initiator ? "initiator" : "responder",
           "name", priv->name,
-          "senders", _enum_to_string (content_senders_table, priv->senders),
+          "senders", produce_senders (priv->senders),
           NULL);
       DEBUG ("created new content node %p", content_node);
     }
@@ -695,8 +724,7 @@ gabble_jingle_content_update_senders (GabbleJingleContent *c,
   GabbleJingleContentPrivate *priv = GABBLE_JINGLE_CONTENT_GET_PRIVATE (c);
   JingleContentSenders senders;
 
-  senders = _string_to_enum (content_senders_table,
-      lm_message_node_get_attribute (content_node, "senders"));
+  senders = parse_senders (lm_message_node_get_attribute (content_node, "senders"));
 
   if (senders == JINGLE_CONTENT_SENDERS_NONE)
     {
diff --git a/src/jingle-factory.h b/src/jingle-factory.h
index ca2aa74..df84f54 100644
--- a/src/jingle-factory.h
+++ b/src/jingle-factory.h
@@ -51,8 +51,8 @@ typedef enum {
 } JingleState;
 
 typedef enum {
-  JINGLE_ACTION_UNKNOWN = -1,
-  JINGLE_ACTION_CONTENT_ACCEPT = 0,
+  JINGLE_ACTION_UNKNOWN,
+  JINGLE_ACTION_CONTENT_ACCEPT,
   JINGLE_ACTION_CONTENT_ADD,
   JINGLE_ACTION_CONTENT_MODIFY,
   JINGLE_ACTION_CONTENT_REMOVE,
@@ -67,15 +67,15 @@ typedef enum {
 } JingleAction;
 
 typedef enum {
-  JINGLE_CONTENT_SENDERS_NONE = -1,
-  JINGLE_CONTENT_SENDERS_INITIATOR = 0,
+  JINGLE_CONTENT_SENDERS_NONE,
+  JINGLE_CONTENT_SENDERS_INITIATOR,
   JINGLE_CONTENT_SENDERS_RESPONDER,
   JINGLE_CONTENT_SENDERS_BOTH
 } JingleContentSenders;
 
 typedef enum {
-  JINGLE_TRANSPORT_UNKNOWN = -1,
-  JINGLE_TRANSPORT_GOOGLE_P2P = 0,
+  JINGLE_TRANSPORT_UNKNOWN,
+  JINGLE_TRANSPORT_GOOGLE_P2P,
   JINGLE_TRANSPORT_RAW_UDP,
   JINGLE_TRANSPORT_ICE
 } JingleTransportType;
diff --git a/src/jingle-session.c b/src/jingle-session.c
index 5bed855..ac130b1 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -88,24 +88,6 @@ struct _GabbleJingleSessionPrivate
 #define GABBLE_JINGLE_SESSION_GET_PRIVATE(o)\
   ((GabbleJingleSessionPrivate *) ((o)->priv))
 
-/* lookup tables */
-
-static const gchar *action_table[] = {
-  "content-accept",
-  "content-add",
-  "content-modify",
-  "content-remove",
-  "content-replace",
-  "content-reject",
-  "session-accept",
-  "session-info",
-  "session-initiate",
-  "session-terminate",
-  "transport-info",
-  "transport-accept",
-  NULL
-};
-
 #define DEFAULT_SESSION_TIMEOUT 60000
 
 typedef struct {
@@ -380,72 +362,88 @@ typedef void (*HandlerFunc)(GabbleJingleSession *sess,
 typedef void (*ContentHandlerFunc)(GabbleJingleSession *sess,
   GabbleJingleContent *c, LmMessageNode *content_node, GError **error);
 
-const gchar *
-_enum_to_string (const gchar **table, gint val)
-{
-  return table[val];
-}
-
-gint
-_string_to_enum (const gchar **table, const gchar *val)
+static JingleAction
+parse_action (const gchar *txt)
 {
-  gint i;
+  if (txt == NULL)
+      return JINGLE_ACTION_UNKNOWN;
 
-  if (val == NULL)
-    return -1;
+  DEBUG ("with %s", txt);
 
-  for (i = 0; table[i] != NULL; i++)
+  /* synonyms, best deal with them right now */
+  if (!tp_strdiff (txt, "initiate") ||
+      !tp_strdiff (txt, "session-initiate"))
     {
-      if (!tp_strdiff (val, table[i]))
-        return i;
+        DEBUG ("it's initiate");
+        return JINGLE_ACTION_SESSION_INITIATE;
     }
-
-  return -1;
-}
-
-static JingleAction
-parse_action (const gchar *txt)
-{
-  /* synonyms, best deal with them right now */
-  if (!tp_strdiff (txt, "initiate"))
-    txt = "session-initiate";
-  else if (!tp_strdiff (txt, "terminate"))
-    txt = "session-terminate";
-  else if (!tp_strdiff (txt, "accept"))
-    txt = "session-accept";
-  else if (!tp_strdiff (txt, "reject"))
-    txt = "session-terminate";
-  else if (!tp_strdiff (txt, "candidates"))
-    txt = "transport-info";
-
-  return (JingleAction) _string_to_enum (action_table, txt);
+  else if (!tp_strdiff (txt, "terminate") ||
+      !tp_strdiff (txt, "session-terminate") ||
+      !tp_strdiff (txt, "reject"))
+        return JINGLE_ACTION_SESSION_TERMINATE;
+  else if (!tp_strdiff (txt, "accept") ||
+      !tp_strdiff (txt, "session-accept"))
+        return JINGLE_ACTION_SESSION_ACCEPT;
+  else if (!tp_strdiff (txt, "candidates") ||
+      !tp_strdiff (txt, "transport-info"))
+        return JINGLE_ACTION_TRANSPORT_INFO;
+  else if (!tp_strdiff (txt, "content-accept"))
+      return JINGLE_ACTION_CONTENT_ACCEPT;
+  else if (!tp_strdiff (txt, "content-add"))
+      return JINGLE_ACTION_CONTENT_ADD;
+  else if (!tp_strdiff (txt, "content-modify"))
+      return JINGLE_ACTION_CONTENT_MODIFY;
+  else if (!tp_strdiff (txt, "content-replace"))
+      return JINGLE_ACTION_CONTENT_REPLACE;
+  else if (!tp_strdiff (txt, "content-reject"))
+      return JINGLE_ACTION_CONTENT_REJECT;
+  else if (!tp_strdiff (txt, "session-info"))
+      return JINGLE_ACTION_SESSION_INFO;
+  else if (!tp_strdiff (txt, "transport-accept"))
+      return JINGLE_ACTION_TRANSPORT_ACCEPT;
+
+  return JINGLE_ACTION_UNKNOWN;
 }
 
 static const gchar *
-produce_action (JingleAction act, JingleDialect dialect)
+produce_action (JingleAction action, JingleDialect dialect)
 {
-  g_assert (act != JINGLE_ACTION_UNKNOWN);
-
-  if ((dialect == JINGLE_DIALECT_GTALK3) || (dialect == JINGLE_DIALECT_GTALK4))
-    {
-      switch (act) {
-        case JINGLE_ACTION_SESSION_INITIATE:
-          return "initiate";
-        case JINGLE_ACTION_SESSION_TERMINATE:
-          return "terminate";
-        case JINGLE_ACTION_SESSION_ACCEPT:
-          return "accept";
-        case JINGLE_ACTION_TRANSPORT_INFO:
-          if (dialect == JINGLE_DIALECT_GTALK3)
-              return "candidates";
-          else
-              break;
-        default:
-          return _enum_to_string (action_table, act);
-      }
-    }
+  gboolean gmode = (dialect == JINGLE_DIALECT_GTALK3) ||
+      (dialect == JINGLE_DIALECT_GTALK4);
+
+  switch (action) {
+    case JINGLE_ACTION_SESSION_INITIATE:
+      return (gmode) ? "initiate" : "session-initiate";
+    case JINGLE_ACTION_SESSION_TERMINATE:
+      return (gmode) ? "terminate" : "session-terminate";
+    case JINGLE_ACTION_SESSION_ACCEPT:
+      return (gmode) ? "accept" : "session-accept";
+    case JINGLE_ACTION_TRANSPORT_INFO:
+      return (dialect == JINGLE_DIALECT_GTALK3) ?
+        "candidates" : "transport-info";
+    case JINGLE_ACTION_CONTENT_ACCEPT:
+      return "content-accept";
+    case JINGLE_ACTION_CONTENT_ADD:
+      return "content-add";
+    case JINGLE_ACTION_CONTENT_MODIFY:
+      return "content-modify";
+    case JINGLE_ACTION_CONTENT_REMOVE:
+      return "content-remove";
+    case JINGLE_ACTION_CONTENT_REPLACE:
+      return "content-replace";
+    case JINGLE_ACTION_CONTENT_REJECT:
+      return "content-reject";
+    case JINGLE_ACTION_SESSION_INFO:
+      return "session-info";
+    case JINGLE_ACTION_TRANSPORT_ACCEPT:
+      return "transport-accept";
+    default:
+      DEBUG ("unknown action %u", action);
+      g_assert_not_reached ();
+  }
 
-  return _enum_to_string (action_table, act);
+  /* to make gcc not complain */
+  return NULL;
 }
 
 static gboolean
@@ -889,6 +887,7 @@ on_transport_accept (GabbleJingleSession *sess, LmMessageNode *node,
 
 
 static HandlerFunc handlers[] = {
+  NULL, /* for unknown action */
   on_content_accept,
   on_content_add,
   on_content_modify,
@@ -1006,6 +1005,7 @@ gabble_jingle_session_parse (GabbleJingleSession *sess, LmMessage *message, GErr
     }
 
   action = parse_action (actxt);
+  DEBUG ("action '%s' parsed as %u", actxt, action);
   if (action == JINGLE_ACTION_UNKNOWN)
     {
       SET_BAD_REQ ("unknown session action");
@@ -1036,8 +1036,8 @@ gabble_jingle_session_parse (GabbleJingleSession *sess, LmMessage *message, GErr
 
   priv = GABBLE_JINGLE_SESSION_GET_PRIVATE (sess);
 
-  DEBUG("jingle action '%s' from '%s' in session '%s' dialect %u", actxt, from,
-      sid, dialect);
+  DEBUG("jingle action '%s' from '%s' in session '%s' dialect %u state %u", actxt, from,
+      sid, dialect, priv->state);
 
   contact_repo = tp_base_connection_get_handles (
       (TpBaseConnection *) priv->conn, TP_HANDLE_TYPE_CONTACT);
diff --git a/src/jingle-session.h b/src/jingle-session.h
index fc57920..17e8f84 100644
--- a/src/jingle-session.h
+++ b/src/jingle-session.h
@@ -82,9 +82,6 @@ const gchar *gabble_jingle_session_parse (GabbleJingleSession *sess,
 LmMessage *gabble_jingle_session_new_message (GabbleJingleSession *sess,
     JingleAction action, LmMessageNode **sess_node);
 
-const gchar *_enum_to_string (const gchar **table, gint val);
-gint _string_to_enum (const gchar **table, const gchar *val);
-
 void gabble_jingle_session_accept (GabbleJingleSession *sess);
 void gabble_jingle_session_terminate (GabbleJingleSession *sess);
 void gabble_jingle_session_remove_content (GabbleJingleSession *sess,
-- 
1.5.6.5




More information about the Telepathy-commits mailing list