summaryrefslogtreecommitdiff
path: root/client/gdaemonfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/gdaemonfile.c')
-rw-r--r--client/gdaemonfile.c138
1 files changed, 89 insertions, 49 deletions
diff --git a/client/gdaemonfile.c b/client/gdaemonfile.c
index b60e6725..5ffd1a71 100644
--- a/client/gdaemonfile.c
+++ b/client/gdaemonfile.c
@@ -2787,20 +2787,23 @@ g_daemon_file_set_attribute (GFile *file,
return TRUE;
}
-typedef struct {
+
+typedef struct
+{
+ GAsyncResult *res;
+ GMainContext *context;
+ GMainLoop *loop;
GFileProgressCallback progress_callback;
gpointer progress_callback_data;
-} ProgressCallbackData;
+} FileTransferSyncData;
static gboolean
handle_progress (GVfsDBusProgress *object,
GDBusMethodInvocation *invocation,
guint64 arg_current,
guint64 arg_total,
- ProgressCallbackData *data)
+ FileTransferSyncData *data)
{
- g_print ("handle_progress\n");
-
data->progress_callback (arg_current, arg_total, data->progress_callback_data);
gvfs_dbus_progress_complete_progress (object, invocation);
@@ -2808,6 +2811,17 @@ handle_progress (GVfsDBusProgress *object,
return TRUE;
}
+static void
+copy_cb (GObject *source_object,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ FileTransferSyncData *data = user_data;
+
+ data->res = g_object_ref (res);
+ g_main_loop_quit (data->loop);
+}
+
static gboolean
file_transfer (GFile *source,
GFile *destination,
@@ -2819,7 +2833,7 @@ file_transfer (GFile *source,
GError **error)
{
char *obj_path;
- ProgressCallbackData data;
+ FileTransferSyncData data = {0, };
char *local_path = NULL;
gboolean source_is_daemon;
gboolean dest_is_daemon;
@@ -2863,14 +2877,11 @@ file_transfer (GFile *source,
}
- if (progress_callback)
+ if (send_progress)
obj_path = g_strdup_printf ("/org/gtk/vfs/callback/%p", &obj_path);
else
obj_path = g_strdup ("/org/gtk/vfs/void");
- data.progress_callback = progress_callback;
- data.progress_callback_data = progress_callback_data;
-
/* need to create proxy with daemon files only */
if (native_transfer)
{
@@ -2904,69 +2915,98 @@ retry:
if (proxy == NULL)
goto out;
- /* Register progress interface skeleton */
- progress_skeleton = gvfs_dbus_progress_skeleton_new ();
- g_dbus_interface_skeleton_set_flags (G_DBUS_INTERFACE_SKELETON (progress_skeleton), G_DBUS_INTERFACE_SKELETON_FLAGS_HANDLE_METHOD_INVOCATIONS_IN_THREAD);
- g_signal_connect (progress_skeleton, "handle-progress", G_CALLBACK (handle_progress), &data);
+ data.progress_callback = progress_callback;
+ data.progress_callback_data = progress_callback_data;
+ data.context = g_main_context_new ();
+ data.loop = g_main_loop_new (data.context, FALSE);
- if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (progress_skeleton),
- connection,
- obj_path,
- &my_error))
- goto out;
+ g_main_context_push_thread_default (data.context);
+
+ if (send_progress)
+ {
+ /* Register progress interface skeleton */
+ progress_skeleton = gvfs_dbus_progress_skeleton_new ();
+ g_signal_connect (progress_skeleton, "handle-progress", G_CALLBACK (handle_progress), &data);
+
+ if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (progress_skeleton),
+ connection,
+ obj_path,
+ &my_error))
+ goto out;
+ }
if (native_transfer == TRUE)
{
if (remove_source == FALSE)
{
- res = gvfs_dbus_mount_call_copy_sync (proxy,
- path1, path2,
- flags,
- obj_path,
- cancellable,
- &my_error);
+ gvfs_dbus_mount_call_copy (proxy,
+ path1, path2,
+ flags,
+ obj_path,
+ cancellable,
+ copy_cb,
+ &data);
+ g_main_loop_run (data.loop);
+ res = gvfs_dbus_mount_call_copy_finish (proxy, data.res, &my_error);
}
else
{
- res = gvfs_dbus_mount_call_move_sync (proxy,
- path1, path2,
- flags,
- obj_path,
- cancellable,
- &my_error);
+ gvfs_dbus_mount_call_move (proxy,
+ path1, path2,
+ flags,
+ obj_path,
+ cancellable,
+ copy_cb,
+ &data);
+ g_main_loop_run (data.loop);
+ res = gvfs_dbus_mount_call_move_finish (proxy, data.res, &my_error);
}
}
else if (dest_is_daemon == TRUE)
{
- res = gvfs_dbus_mount_call_push_sync (proxy,
- path1,
- local_path,
- send_progress,
- flags,
- obj_path,
- remove_source,
- cancellable,
- &my_error);
+ gvfs_dbus_mount_call_push (proxy,
+ path1,
+ local_path,
+ send_progress,
+ flags,
+ obj_path,
+ remove_source,
+ cancellable,
+ copy_cb,
+ &data);
+ g_main_loop_run (data.loop);
+ res = gvfs_dbus_mount_call_push_finish (proxy, data.res, &my_error);
}
else
{
- res = gvfs_dbus_mount_call_pull_sync (proxy,
- path1,
- local_path,
- send_progress,
- flags,
- obj_path,
- remove_source,
- cancellable,
- &my_error);
+ gvfs_dbus_mount_call_pull (proxy,
+ path1,
+ local_path,
+ send_progress,
+ flags,
+ obj_path,
+ remove_source,
+ cancellable,
+ copy_cb,
+ &data);
+ g_main_loop_run (data.loop);
+ res = gvfs_dbus_mount_call_pull_finish (proxy, data.res, &my_error);
}
+ g_object_unref (data.res);
+
out:
if (progress_skeleton)
{
g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (progress_skeleton));
g_object_unref (progress_skeleton);
}
+ if (data.context)
+ {
+ g_main_context_pop_thread_default (data.context);
+ g_main_context_unref (data.context);
+ g_main_loop_unref (data.loop);
+ }
if (! res)
{