diff options
author | Xavier Claessens <xclaesse@gmail.com> | 2010-12-09 16:44:54 +0100 |
---|---|---|
committer | Xavier Claessens <xclaesse@gmail.com> | 2010-12-09 16:44:54 +0100 |
commit | 8970287d60902ad47e853bc05f04e9ee6cc41e94 (patch) | |
tree | 69682a6af5eb0fa5423c9f2bc0a8651cc5d0b72b | |
parent | c3753f37b3505b5907e1f67b90dc281b03d89e95 (diff) |
Correctly close channel before leaving
-rw-r--r-- | src/client.c | 29 | ||||
-rw-r--r-- | src/service.c | 31 | ||||
-rw-r--r-- | src/vinagre/tab.c | 53 |
3 files changed, 80 insertions, 33 deletions
diff --git a/src/client.c b/src/client.c index f57989b..daf49fe 100644 --- a/src/client.c +++ b/src/client.c @@ -54,12 +54,32 @@ typedef struct } ClientContext; static void +channel_invalidated_cb (TpChannel *channel, + guint domain, + gint code, + gchar *message, + ClientContext *context) +{ + g_main_loop_quit (context->loop); +} + +static void +leave (ClientContext *context) +{ + if (context->channel != NULL && + tp_proxy_get_invalidated (context->channel) == NULL) + tp_cli_channel_call_close (context->channel, -1, NULL, NULL, NULL, NULL); + else + g_main_loop_quit (context->loop); +} + +static void throw_error_message (ClientContext *context, const gchar *message) { g_print ("Error: %s\n", message); context->success = FALSE; - g_main_loop_quit (context->loop); + leave (context); } static void @@ -76,7 +96,7 @@ ssh_client_watch_cb (GPid pid, { ClientContext *context = user_data; - g_main_loop_quit (context->loop); + leave (context); g_spawn_close_pid (pid); } @@ -91,7 +111,7 @@ splice_cb (GObject *source_object, if (!_g_io_stream_splice_finish (res, &error)) throw_error (context, error); else - g_main_loop_quit (context->loop); + leave (context); g_clear_error (&error); } @@ -140,6 +160,9 @@ create_tube_cb (GObject *source_object, return; } + g_signal_connect (context->channel, "invalidated", + G_CALLBACK (channel_invalidated_cb), context); + listener = g_socket_listener_new (); socket = _client_create_local_socket (&error); if (socket == NULL) diff --git a/src/service.c b/src/service.c index 888155e..a12f914 100644 --- a/src/service.c +++ b/src/service.c @@ -30,20 +30,13 @@ static GMainLoop *loop = NULL; static GList *channel_list = NULL; -static void channel_invalidated_cb (TpChannel *channel, guint domain, gint code, - gchar *message, gpointer user_data); - static void -session_complete (TpChannel *channel, const GError *error) +channel_invalidated_cb (TpChannel *channel, + guint domain, + gint code, + gchar *message, + gpointer user_data) { - if (error != NULL) - { - g_debug ("Error for channel %p: %s", channel, - error ? error->message : "No error message"); - } - - g_signal_handlers_disconnect_by_func (channel, channel_invalidated_cb, NULL); - tp_cli_channel_call_close (channel, -1, NULL, NULL, NULL, NULL); channel_list = g_list_remove (channel_list, channel); g_object_unref (channel); @@ -52,13 +45,15 @@ session_complete (TpChannel *channel, const GError *error) } static void -channel_invalidated_cb (TpChannel *channel, - guint domain, - gint code, - gchar *message, - gpointer user_data) +session_complete (TpChannel *channel, const GError *error) { - session_complete (channel, tp_proxy_get_invalidated (TP_PROXY (channel))); + if (error != NULL) + { + g_debug ("Error for channel %p: %s", channel, + error ? error->message : "No error message"); + } + + tp_cli_channel_call_close (channel, -1, NULL, NULL, NULL, NULL); } static void diff --git a/src/vinagre/tab.c b/src/vinagre/tab.c index ee54c24..61940e5 100644 --- a/src/vinagre/tab.c +++ b/src/vinagre/tab.c @@ -44,13 +44,6 @@ struct _SshContactTabPrivate G_DEFINE_TYPE (SshContactTab, ssh_contact_tab, VINAGRE_TYPE_TAB) static void -ssh_disconnected_cb (VteTerminal *ssh, - SshContactTab *self) -{ - g_signal_emit_by_name (self, "tab-disconnected"); -} - -static void get_connection_info (SshContactTab *self, const gchar **account_path, const gchar **contact_id, @@ -100,14 +93,47 @@ impl_get_screenshot (VinagreTab *tab) } static void -throw_error (SshContactTab *self, - const GError *error) +disconnect_tab (SshContactTab *self) { - g_debug ("ERROR: %s", error->message); if (self->priv->connected) g_signal_emit_by_name (self, "tab-disconnected"); else - g_signal_emit_by_name (self, "tab-auth-failed", error->message); + g_signal_emit_by_name (self, "tab-auth-failed", ""); +} + +static void +channel_invalidated_cb (TpChannel *channel, + guint domain, + gint code, + gchar *message, + SshContactTab *self) +{ + disconnect_tab (self); +} + +static void +leave (SshContactTab *self) +{ + if (self->priv->channel != NULL && + tp_proxy_get_invalidated (self->priv->channel) == NULL) + tp_cli_channel_call_close (context->channel, -1, NULL, NULL, NULL, NULL); + else + disconnect_tab (self); +} + +static void +ssh_disconnected_cb (VteTerminal *ssh, + SshContactTab *self) +{ + leave (self); +} + +static void +throw_error (SshContactTab *self, + const GError *error) +{ + g_debug ("ERROR: %s", error->message); + leave (self); } static void @@ -121,7 +147,7 @@ splice_cb (GObject *source_object, if (!_g_io_stream_splice_finish (res, &error)) throw_error (self, error); else - g_signal_emit_by_name (self, "tab-disconnected"); + leave (self); g_clear_error (&error); } @@ -174,6 +200,9 @@ create_tube_cb (GObject *source_object, return; } + g_signal_connect (self->priv->channel, "invalidated", + G_CALLBACK (channel_invalidated_cb), self); + listener = g_socket_listener_new (); socket = _client_create_local_socket (&error); if (socket == NULL) |