summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Claessens <xclaesse@gmail.com>2010-12-09 16:44:54 +0100
committerXavier Claessens <xclaesse@gmail.com>2010-12-09 16:44:54 +0100
commit8970287d60902ad47e853bc05f04e9ee6cc41e94 (patch)
tree69682a6af5eb0fa5423c9f2bc0a8651cc5d0b72b
parentc3753f37b3505b5907e1f67b90dc281b03d89e95 (diff)
Correctly close channel before leaving
-rw-r--r--src/client.c29
-rw-r--r--src/service.c31
-rw-r--r--src/vinagre/tab.c53
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)