[Telepathy-commits] [telepathy-gabble/master] GabbleMediaStream: add STUN servers as a GObject property
Simon McVittie
simon.mcvittie at collabora.co.uk
Thu Feb 26 04:00:55 PST 2009
---
src/media-stream.c | 47 +++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/src/media-stream.c b/src/media-stream.c
index a9cd7b4..6a99bc6 100644
--- a/src/media-stream.c
+++ b/src/media-stream.c
@@ -83,6 +83,7 @@ enum
PROP_COMBINED_DIRECTION,
PROP_LOCAL_HOLD,
PROP_CONTENT,
+ PROP_STUN_SERVERS,
LAST_PROPERTY
};
@@ -111,6 +112,9 @@ struct _GabbleMediaStreamPrivate
/* source ID for initial codecs/candidates getter */
gulong initial_getter_id;
+ /* GPtrArray(GValueArray(STRING, UINT)) */
+ GPtrArray *stun_servers;
+
/* These are really booleans, but gboolean is signed. Thanks, GLib */
unsigned closed:1;
unsigned dispose_has_run:1;
@@ -184,6 +188,8 @@ gabble_media_stream_init (GabbleMediaStream *self)
g_value_init (&priv->remote_candidates, candidate_list_type);
g_value_take_boxed (&priv->remote_candidates,
dbus_g_type_specialized_construct (candidate_list_type));
+
+ priv->stun_servers = g_ptr_array_sized_new (1);
}
static gboolean
@@ -216,6 +222,9 @@ gabble_media_stream_constructor (GType type, guint n_props,
GabbleMediaStream *stream;
GabbleMediaStreamPrivate *priv;
DBusGConnection *bus;
+ GabbleConnection *connection;
+ gchar *stun_server;
+ guint stun_port;
/* call base class constructor */
obj = G_OBJECT_CLASS (gabble_media_stream_parent_class)->
@@ -223,12 +232,36 @@ gabble_media_stream_constructor (GType type, guint n_props,
stream = GABBLE_MEDIA_STREAM (obj);
priv = GABBLE_MEDIA_STREAM_GET_PRIVATE (stream);
+ g_assert (priv->content != NULL);
+
+ /* STUN servers are needed as soon as the stream appears, so there's little
+ * point in waiting for them - either they've already been resolved, or
+ * we're too late to use them for this stream */
+ g_object_get (priv->content,
+ "connection", &connection,
+ NULL);
+
+ /* maybe one day we'll support multiple STUN servers */
+ if (gabble_jingle_factory_get_stun_server (connection->jingle_factory,
+ &stun_server, &stun_port))
+ {
+ GValueArray *va = g_value_array_new (2);
+
+ g_value_array_append (va, NULL);
+ g_value_array_append (va, NULL);
+ g_value_init (va->values + 0, G_TYPE_STRING);
+ g_value_init (va->values + 1, G_TYPE_UINT);
+ g_value_take_string (va->values + 0, stun_server);
+ g_value_set_uint (va->values + 1, stun_port);
+ g_ptr_array_add (priv->stun_servers, va);
+ }
+
+ g_object_unref (connection);
+
/* go for the bus */
bus = tp_get_bus ();
dbus_g_connection_register_g_object (bus, priv->object_path, obj);
- g_assert (priv->content != NULL);
-
update_direction (stream, priv->content);
/* MediaStream is created as soon as GabbleJingleContent is
@@ -283,6 +316,9 @@ gabble_media_stream_get_property (GObject *object,
case PROP_CONTENT:
g_value_set_object (value, priv->content);
break;
+ case PROP_STUN_SERVERS:
+ g_value_set_boxed (value, priv->stun_servers);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -486,6 +522,13 @@ gabble_media_stream_class_init (GabbleMediaStreamClass *gabble_media_stream_clas
G_PARAM_STATIC_BLURB);
g_object_class_install_property (object_class, PROP_CONTENT, param_spec);
+ param_spec = g_param_spec_boxed ("stun-servers", "STUN servers",
+ "Array of (STRING: address literal, UINT: port) pairs",
+ /* FIXME: use correct macro when available */
+ tp_type_dbus_array_su (),
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+ g_object_class_install_property (object_class, PROP_STUN_SERVERS, param_spec);
+
/* signals not exported by D-Bus interface */
signals[DESTROY] =
--
1.5.6.5
More information about the telepathy-commits
mailing list