From 6bc969461080973c6878f0eb1973fd626f8a9663 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Fri, 21 Nov 2008 16:25:11 +0000 Subject: Remove empathy_tp_file_keep_alive hack and connect to "notify::state" in file_channel_create_cb() to unref the object when the FT is done. svn path=/trunk/; revision=1913 --- libempathy/empathy-dispatcher.c | 20 ++++++++++++++++++-- libempathy/empathy-tp-file.c | 37 ------------------------------------- libempathy/empathy-tp-file.h | 1 - 3 files changed, 18 insertions(+), 40 deletions(-) (limited to 'libempathy') diff --git a/libempathy/empathy-dispatcher.c b/libempathy/empathy-dispatcher.c index 21b6bcccb..7f2d873e7 100644 --- a/libempathy/empathy-dispatcher.c +++ b/libempathy/empathy-dispatcher.c @@ -933,6 +933,19 @@ typedef struct { TpHandle handle; } FileChannelRequest; +static void +tp_file_state_notify_cb (EmpathyTpFile *tp_file) +{ + EmpFileTransferState state; + + state = empathy_tp_file_get_state (tp_file, NULL); + if (state == EMP_FILE_TRANSFER_STATE_COMPLETED || + state == EMP_FILE_TRANSFER_STATE_CANCELLED) { + DEBUG ("Transfer is done, unref the object"); + g_object_unref (tp_file); + } +} + static void file_channel_create_cb (TpConnection *connection, const gchar *object_path, @@ -957,10 +970,13 @@ file_channel_create_cb (TpConnection *connection, request->handle, NULL); + /* We give the ref to the callback, it is responsible to unref the + * object once the transfer is done. */ tp_file = empathy_tp_file_new (channel); empathy_tp_file_offer (tp_file, request->gfile, NULL); - empathy_tp_file_keep_alive (tp_file); - g_object_unref (tp_file); + g_signal_connect (tp_file, "notify::state", + G_CALLBACK (tp_file_state_notify_cb), + NULL); g_object_unref (request->gfile); g_slice_free (FileChannelRequest, request); diff --git a/libempathy/empathy-tp-file.c b/libempathy/empathy-tp-file.c index 9a6602ecc..940db073a 100644 --- a/libempathy/empathy-tp-file.c +++ b/libempathy/empathy-tp-file.c @@ -297,7 +297,6 @@ struct _EmpathyTpFilePriv { time_t start_time; gchar *unix_socket_path; GCancellable *cancellable; - gboolean keep_alive; }; enum { @@ -326,18 +325,6 @@ empathy_tp_file_init (EmpathyTpFile *tp_file) tp_file->priv = priv; } -static void -tp_file_check_keep_alive (EmpathyTpFile *tp_file) -{ - if (tp_file->priv->keep_alive && - (tp_file->priv->state == EMP_FILE_TRANSFER_STATE_COMPLETED || - tp_file->priv->state == EMP_FILE_TRANSFER_STATE_CANCELLED)) - { - tp_file->priv->keep_alive = FALSE; - g_object_unref (tp_file); - } -} - static void tp_file_invalidated_cb (TpProxy *proxy, guint domain, @@ -356,8 +343,6 @@ tp_file_invalidated_cb (TpProxy *proxy, EMP_FILE_TRANSFER_STATE_CHANGE_REASON_LOCAL_ERROR; g_object_notify (G_OBJECT (tp_file), "state"); } - - tp_file_check_keep_alive (tp_file); } static void @@ -488,7 +473,6 @@ tp_file_state_changed_cb (TpProxy *proxy, tp_file->priv->state_change_reason = reason; g_object_notify (G_OBJECT (tp_file), "state"); - tp_file_check_keep_alive (tp_file); } static void @@ -840,27 +824,6 @@ empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile, GError **error) ¬hing, tp_file_method_cb, NULL, NULL, G_OBJECT (tp_file)); } -/** - * empathy_tp_file_keep_alive: - * @tp_file: an #EmpathyTpFile - * - * Keep @tp_file alive until the file transfer is COMPLETED or CANCELLED, by - * adding a temporary reference. - */ -void -empathy_tp_file_keep_alive (EmpathyTpFile *tp_file) -{ - g_return_if_fail (EMPATHY_IS_TP_FILE (tp_file)); - - if (tp_file->priv->keep_alive) - return; - - tp_file->priv->keep_alive = TRUE; - if (tp_file->priv->state != EMP_FILE_TRANSFER_STATE_COMPLETED && - tp_file->priv->state != EMP_FILE_TRANSFER_STATE_CANCELLED) - g_object_ref (tp_file); -} - EmpathyContact * empathy_tp_file_get_contact (EmpathyTpFile *tp_file) { diff --git a/libempathy/empathy-tp-file.h b/libempathy/empathy-tp-file.h index 4ea6650f8..3eb55a935 100644 --- a/libempathy/empathy-tp-file.h +++ b/libempathy/empathy-tp-file.h @@ -72,7 +72,6 @@ void empathy_tp_file_accept (EmpathyTpFile *tp_file, guint64 offset, void empathy_tp_file_cancel (EmpathyTpFile *tp_file); void empathy_tp_file_offer (EmpathyTpFile *tp_file, GFile *gfile, GError **error); -void empathy_tp_file_keep_alive (EmpathyTpFile *tp_file); guint64 empathy_tp_file_get_transferred_bytes (EmpathyTpFile *tp_file); EmpathyContact *empathy_tp_file_get_contact (EmpathyTpFile *tp_file); -- cgit v1.2.3