[telepathy-gabble/master] Handle call state-related session-info

Will Thompson will.thompson at collabora.co.uk
Wed Apr 1 08:29:00 PDT 2009


---
 src/jingle-media-rtp.c |   72 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/jingle-media-rtp.h |   10 ++++++
 2 files changed, 82 insertions(+), 0 deletions(-)

diff --git a/src/jingle-media-rtp.c b/src/jingle-media-rtp.c
index 4666388..bccf926 100644
--- a/src/jingle-media-rtp.c
+++ b/src/jingle-media-rtp.c
@@ -57,6 +57,7 @@ static guint signals[LAST_SIGNAL] = {0};
 enum
 {
   PROP_MEDIA_TYPE = 1,
+  PROP_REMOTE_STATE,
   LAST_PROPERTY
 };
 
@@ -76,6 +77,7 @@ struct _GabbleJingleMediaRtpPrivate
 
   GList *remote_codecs;
   JingleMediaType media_type;
+  JingleRtpRemoteState remote_state;
   gboolean dispose_has_run;
 };
 
@@ -186,6 +188,8 @@ gabble_jingle_media_rtp_get_property (GObject *object,
     case PROP_MEDIA_TYPE:
       g_value_set_uint (value, priv->media_type);
       break;
+    case PROP_REMOTE_STATE:
+      g_value_set_uint (value, priv->remote_state);
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
@@ -215,6 +219,11 @@ static void parse_description (GabbleJingleContent *content,
     LmMessageNode *desc_node, GError **error);
 static void produce_description (GabbleJingleContent *obj,
     LmMessageNode *content_node);
+static gboolean gabble_jingle_media_rtp_handle_info (
+    GabbleJingleContent *content,
+    LmMessageNode *payload,
+    gboolean *handled,
+    GError **error);
 
 static void
 gabble_jingle_media_rtp_class_init (GabbleJingleMediaRtpClass *cls)
@@ -231,6 +240,7 @@ gabble_jingle_media_rtp_class_init (GabbleJingleMediaRtpClass *cls)
 
   content_class->parse_description = parse_description;
   content_class->produce_description = produce_description;
+  content_class->handle_info = gabble_jingle_media_rtp_handle_info;
 
   param_spec = g_param_spec_uint ("media-type", "RTP media type",
       "Media type.",
@@ -239,6 +249,14 @@ gabble_jingle_media_rtp_class_init (GabbleJingleMediaRtpClass *cls)
       G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB);
   g_object_class_install_property (object_class, PROP_MEDIA_TYPE, param_spec);
 
+  param_spec = g_param_spec_uint ("remote-state", "Remote state",
+      "Whether the peer is muted, has us on hold, is ringing, or is active on "
+      "this content",
+      JINGLE_RTP_REMOTE_STATE_ACTIVE, JINGLE_RTP_REMOTE_STATE_HOLD,
+      JINGLE_RTP_REMOTE_STATE_ACTIVE,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+  g_object_class_install_property (object_class, PROP_REMOTE_STATE, param_spec);
+
   /* signal definitions */
 
   signals[REMOTE_CODECS] = g_signal_new ("remote-codecs",
@@ -794,3 +812,57 @@ gabble_jingle_media_rtp_get_remote_codecs (GabbleJingleMediaRtp *self)
   return self->priv->remote_codecs;
 }
 
+static gboolean
+gabble_jingle_media_rtp_handle_info (GabbleJingleContent *content,
+    LmMessageNode *payload,
+    gboolean *handled,
+    GError **error)
+{
+  GabbleJingleMediaRtp *self = GABBLE_JINGLE_MEDIA_RTP (content);
+  const gchar *ns = lm_message_node_get_namespace (payload);
+  const gchar *elt = lm_message_node_get_name (payload);
+  JingleRtpRemoteState new_state;
+
+  if (tp_strdiff (ns, NS_JINGLE_RTP_INFO))
+    {
+      *handled = FALSE;
+      return TRUE;
+    }
+
+  *handled = TRUE;
+
+  if (!tp_strdiff (elt, "active"))
+    new_state = JINGLE_RTP_REMOTE_STATE_ACTIVE;
+  else if (!tp_strdiff (elt, "ringing"))
+    new_state = JINGLE_RTP_REMOTE_STATE_RINGING;
+  else if (!tp_strdiff (elt, "hold"))
+    new_state = JINGLE_RTP_REMOTE_STATE_HOLD;
+  else if (!tp_strdiff (elt, "mute"))
+    new_state = JINGLE_RTP_REMOTE_STATE_MUTE;
+  else
+    {
+      g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_JINGLE_UNSUPPORTED_INFO,
+          "<%s> is not known in namespace %s", elt, ns);
+      return FALSE;
+    }
+
+  if (new_state != self->priv->remote_state)
+    {
+      DEBUG ("moving from remote state %u to %u (%s)", self->priv->remote_state,
+          new_state, elt);
+      self->priv->remote_state = new_state;
+      g_object_notify ((GObject *) self, "remote-state");
+    }
+  else
+    {
+      DEBUG ("already in state %u (%s)", new_state, elt);
+    }
+
+  return TRUE;
+}
+
+JingleRtpRemoteState
+gabble_jingle_media_rtp_get_remote_state (GabbleJingleMediaRtp *self)
+{
+  return self->priv->remote_state;
+}
diff --git a/src/jingle-media-rtp.h b/src/jingle-media-rtp.h
index 77e6dca..f29dc3c 100644
--- a/src/jingle-media-rtp.h
+++ b/src/jingle-media-rtp.h
@@ -28,6 +28,13 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+    JINGLE_RTP_REMOTE_STATE_ACTIVE = 0,
+    JINGLE_RTP_REMOTE_STATE_RINGING,
+    JINGLE_RTP_REMOTE_STATE_MUTE,
+    JINGLE_RTP_REMOTE_STATE_HOLD,
+} JingleRtpRemoteState;
+
 typedef struct _GabbleJingleMediaRtpClass GabbleJingleMediaRtpClass;
 
 GType gabble_jingle_media_rtp_get_type (void);
@@ -78,5 +85,8 @@ GList *gabble_jingle_media_rtp_get_remote_codecs (GabbleJingleMediaRtp *self);
 JingleCodec * jingle_media_rtp_codec_new (guint id, const gchar *name,
     guint clockrate, guint channels, GHashTable *params);
 
+JingleRtpRemoteState gabble_jingle_media_rtp_get_remote_state (
+    GabbleJingleMediaRtp *self);
+
 #endif /* __JINGLE_MEDIA_RTP_H__ */
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list