[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