diff options
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-dispatcher.c | 20 | ||||
-rw-r--r-- | libempathy/empathy-tp-file.c | 37 | ||||
-rw-r--r-- | libempathy/empathy-tp-file.h | 1 |
3 files changed, 18 insertions, 40 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 @@ -934,6 +934,19 @@ typedef struct { } 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, GHashTable *properties, @@ -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 { @@ -327,18 +326,6 @@ empathy_tp_file_init (EmpathyTpFile *tp_file) } 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, gint code, @@ -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); |