]> git.0d.be Git - empathy.git/commitdiff
Don't wait longer than 5 seconds when trying to join chatrooms
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 3 Jun 2010 09:27:16 +0000 (11:27 +0200)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Thu, 3 Jun 2010 12:52:25 +0000 (14:52 +0200)
If the accounts takes ages to connect or was disabled, it would be weird to
automatically join the room a long time after the user asked to join
favorite rooms.

src/empathy-main-window.c

index 4337c4547c4b94813a4d73c100bb8aa421a62adc..28837c280d3cb3c9311f57be071ecc8911731a81 100644 (file)
@@ -871,18 +871,22 @@ join_chatroom (EmpathyChatroom *chatroom,
 
 typedef struct
 {
+       TpAccount *account;
        EmpathyChatroom *chatroom;
        gint64 timestamp;
        glong sig_id;
+       guint timeout;
 } join_fav_account_sig_ctx;
 
 static join_fav_account_sig_ctx *
-join_fav_account_sig_ctx_new (EmpathyChatroom *chatroom,
+join_fav_account_sig_ctx_new (TpAccount *account,
+                            EmpathyChatroom *chatroom,
                              gint64 timestamp)
 {
        join_fav_account_sig_ctx *ctx = g_slice_new0 (
                join_fav_account_sig_ctx);
 
+       ctx->account = g_object_ref (account);
        ctx->chatroom = g_object_ref (chatroom);
        ctx->timestamp = timestamp;
        return ctx;
@@ -891,6 +895,7 @@ join_fav_account_sig_ctx_new (EmpathyChatroom *chatroom,
 static void
 join_fav_account_sig_ctx_free (join_fav_account_sig_ctx *ctx)
 {
+       g_object_unref (ctx->account);
        g_object_unref (ctx->chatroom);
        g_slice_free (join_fav_account_sig_ctx, ctx);
 }
@@ -924,9 +929,22 @@ account_status_changed_cb (TpAccount  *account,
        join_chatroom (ctx->chatroom, ctx->timestamp);
 
 disconnect:
+       g_source_remove (ctx->timeout);
        g_signal_handler_disconnect (account, ctx->sig_id);
 }
 
+#define JOIN_FAVORITE_TIMEOUT 5
+
+static gboolean
+join_favorite_timeout_cb (gpointer data)
+{
+       join_fav_account_sig_ctx *ctx = data;
+
+       /* stop waiting for joining the favorite room */
+       g_signal_handler_disconnect (ctx->account, ctx->sig_id);
+       return FALSE;
+}
+
 static void
 main_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
 {
@@ -937,12 +955,15 @@ main_window_favorite_chatroom_join (EmpathyChatroom *chatroom)
                                             TP_CONNECTION_STATUS_CONNECTED) {
                join_fav_account_sig_ctx *ctx;
 
-               ctx = join_fav_account_sig_ctx_new (chatroom,
+               ctx = join_fav_account_sig_ctx_new (account, chatroom,
                        gtk_get_current_event_time ());
 
                ctx->sig_id = g_signal_connect_data (account, "status-changed",
                        G_CALLBACK (account_status_changed_cb), ctx,
                        (GClosureNotify) join_fav_account_sig_ctx_free, 0);
+
+               ctx->timeout = g_timeout_add_seconds (JOIN_FAVORITE_TIMEOUT,
+                       join_favorite_timeout_cb, ctx);
                return;
        }