From 667f7edf1a159b37658d83587572c90310a3963f Mon Sep 17 00:00:00 2001 From: xclaesse 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. git-svn-id: svn+ssh://svn.gnome.org/svn/empathy/trunk@1913 4ee84921-47dd-4033-b63a-18d7a039a3e4 --- libempathy/empathy-dispatcher.c | 20 ++++++++++++++++++-- libempathy/empathy-tp-file.c | 37 ------------------------------------- libempathy/empathy-tp-file.h | 1 - src/empathy.c | 1 - 4 files changed, 18 insertions(+), 41 deletions(-) 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); diff --git a/src/empathy.c b/src/empathy.c index b1ea60018..dc295be6d 100644 --- a/src/empathy.c +++ b/src/empathy.c @@ -112,7 +112,6 @@ dispatch_channel_cb (EmpathyDispatcher *dispatcher, ft_manager = empathy_ft_manager_get_default (); tp_file = empathy_tp_file_new (channel); empathy_ft_manager_add_tp_file (ft_manager, tp_file); - empathy_tp_file_keep_alive (tp_file); g_object_unref (tp_file); } } -- cgit v1.2.3