aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxclaesse <xclaesse@4ee84921-47dd-4033-b63a-18d7a039a3e4>2008-11-22 00:25:11 +0800
committerxclaesse <xclaesse@4ee84921-47dd-4033-b63a-18d7a039a3e4>2008-11-22 00:25:11 +0800
commit667f7edf1a159b37658d83587572c90310a3963f (patch)
treeeb19a2deef68ff22d8e0e074fa9888fe09937aa2
parent084a45531a3317b8194eb397295750a491a1ba19 (diff)
downloadgsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar.gz
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar.bz2
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar.lz
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar.xz
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.tar.zst
gsoc2013-empathy-667f7edf1a159b37658d83587572c90310a3963f.zip
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
-rw-r--r--libempathy/empathy-dispatcher.c20
-rw-r--r--libempathy/empathy-tp-file.c37
-rw-r--r--libempathy/empathy-tp-file.h1
-rw-r--r--src/empathy.c1
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
@@ -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)
&nothing, 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);
}
}