summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2011-02-01 19:07:56 +0200
committerPekka Pessi <Pekka.Pessi@nokia.com>2011-02-01 19:13:16 +0200
commit3d4b5f2fd3da0dee25d9b626f44a9d6bc3801876 (patch)
tree4ccd32dff34e9533499cac6842c0d251ef392a5c
parent22798a79f92d1b4532583e2b22deb9f26424cb44 (diff)
ring-media-manager: close all channels when connection gets disconnected
-rw-r--r--src/ring-media-manager.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/ring-media-manager.c b/src/ring-media-manager.c
index 69687db..71a9b11 100644
--- a/src/ring-media-manager.c
+++ b/src/ring-media-manager.c
@@ -98,6 +98,10 @@ static void ring_media_manager_connected (RingMediaManager *self);
static void ring_media_manager_disconnect(RingMediaManager *self);
+static void on_connection_status_changed (TpBaseConnection *conn,
+ guint status, guint reason,
+ RingMediaManager *self);
+
static gboolean ring_media_requestotron(RingMediaManager *,
gpointer,
GHashTable *,
@@ -175,6 +179,7 @@ struct _RingMediaManagerPrivate
struct {
gulong incoming, created, removed;
gulong emergency_numbers, joined, user_connection;
+ gulong status_changed;
} signals;
unsigned dispose_has_run:1, :0;
@@ -195,6 +200,12 @@ ring_media_manager_init(RingMediaManager *self)
static void
ring_media_manager_constructed(GObject *object)
{
+ RingMediaManager *self = RING_MEDIA_MANAGER(object);
+ RingMediaManagerPrivate *priv = self->priv;
+
+ priv->signals.status_changed = g_signal_connect (priv->connection,
+ "status-changed", (GCallback) on_connection_status_changed, self);
+
if (G_OBJECT_CLASS(ring_media_manager_parent_class)->constructed)
G_OBJECT_CLASS(ring_media_manager_parent_class)->constructed(object);
}
@@ -209,6 +220,8 @@ ring_media_manager_dispose(GObject *object)
return;
priv->dispose_has_run = TRUE;
+ ring_signal_disconnect (priv->connection, &priv->signals.status_changed);
+
g_object_set (object, "call-service", NULL, NULL);
g_object_run_dispose (G_OBJECT (priv->tones));
@@ -389,6 +402,20 @@ ring_media_manager_is_connected (RingMediaManager *self)
return RING_IS_MEDIA_MANAGER (self) && self->priv->call_service != NULL;
}
+static void
+on_connection_status_changed (TpBaseConnection *conn,
+ guint status,
+ guint reason,
+ RingMediaManager *self)
+{
+ RingMediaManagerPrivate *priv = self->priv;
+
+ if (status == TP_CONNECTION_STATUS_DISCONNECTED)
+ {
+ g_hash_table_remove_all (priv->channels);
+ }
+}
+
/* ---------------------------------------------------------------------- */
RingEmergencyServiceInfoList *