[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