diff options
author | Pekka Pessi <Pekka.Pessi@nokia.com> | 2011-02-02 18:35:56 +0200 |
---|---|---|
committer | Pekka Pessi <Pekka.Pessi@nokia.com> | 2011-02-02 18:35:56 +0200 |
commit | f6932f5c9cbddf91bc702d006f74b599c6bfb777 (patch) | |
tree | f8ddd4b6ace843b601d82f2d8f33b090502bb73b | |
parent | a9c5aab0f7f0757bd3c59f7d379d6a7bf21a8e2d (diff) |
ring-text-manager: close all channels when connection gets disconnected
"Hash tables are hard."
-rw-r--r-- | src/ring-text-manager.c | 37 |
1 files changed, 19 insertions, 18 deletions
diff --git a/src/ring-text-manager.c b/src/ring-text-manager.c index 3fb48dd..c03a78e 100644 --- a/src/ring-text-manager.c +++ b/src/ring-text-manager.c @@ -118,6 +118,8 @@ static void on_connection_status_changed (TpBaseConnection *conn, guint status, guint reason, RingTextManager *self); +static void foreach_dispose (gpointer, gpointer, gpointer); + static gboolean ring_text_requestotron(RingTextManager *self, gpointer request, GHashTable *properties, @@ -133,7 +135,6 @@ static RingTextChannel *ring_text_manager_request(RingTextManager *self, static gboolean tp_asv_get_sms_channel (GHashTable *properties); static void on_text_channel_closed(RingTextChannel *, RingTextManager *); -static void text_channel_removed (gpointer _channel); #if nomore static void on_sms_service_deliver(ModemSMSService *, @@ -187,7 +188,7 @@ ring_text_manager_init (RingTextManager *self) RingTextManagerPrivate); self->priv->channels = g_hash_table_new_full (g_str_hash, g_str_equal, - NULL, text_channel_removed); + NULL, g_object_unref); } static void @@ -196,12 +197,13 @@ ring_text_manager_dispose(GObject *object) RingTextManager *self = RING_TEXT_MANAGER(object); RingTextManagerPrivate *priv = self->priv; + ring_signal_disconnect (priv->connection, &priv->signals.status_changed); + ring_text_manager_disconnect (self); + g_hash_table_foreach (priv->channels, foreach_dispose, NULL); g_hash_table_remove_all (priv->channels); - ring_signal_disconnect (priv->connection, &priv->signals.status_changed); - G_OBJECT_CLASS(ring_text_manager_parent_class)->dispose(object); } @@ -411,11 +413,21 @@ on_connection_status_changed (TpBaseConnection *conn, guint reason, RingTextManager *self) { - RingTextManagerPrivate *priv = self->priv; - if (status == TP_CONNECTION_STATUS_DISCONNECTED) { - g_hash_table_remove_all (priv->channels); + ring_text_manager_dispose (G_OBJECT (self)); + } +} + +static void +foreach_dispose (gpointer key, + gpointer _channel, + gpointer user_data) +{ + /* Ensure "closed" has been emitted */ + if (!tp_base_channel_is_destroyed (_channel)) + { + g_object_run_dispose (_channel); } } @@ -697,17 +709,6 @@ ring_text_manager_request(RingTextManager *self, } static void -text_channel_removed (gpointer _channel) -{ - /* Ensure "closed" has been emitted */ - if (!tp_base_channel_is_destroyed (_channel)) - { - g_object_run_dispose (_channel); - } - g_object_unref (_channel); -} - -static void on_text_channel_closed(RingTextChannel *channel, RingTextManager *self) { char *object_path; |