diff options
author | Ryan Lortie <desrt@desrt.ca> | 2008-12-12 07:42:32 +0000 |
---|---|---|
committer | Ryan Lortie <ryanl@src.gnome.org> | 2008-12-12 07:42:32 +0000 |
commit | 5eec790d20e0e4e30af57e82147f0c211b89a472 (patch) | |
tree | 05fc029685fcb794b2c6f67994c06d86a94c66c2 /daemon/gvfsbackendtrash.c | |
parent | 1394c3a853596f9a08275e49f8b70f2a4174738f (diff) | |
download | gvfs-5eec790d20e0e4e30af57e82147f0c211b89a472.tar.gz |
Implement pull support on trash backend.
2008-12-11 Ryan Lortie <desrt@desrt.ca>
Implement pull support on trash backend.
* daemon/trashlib/trashitem.[ch]: add support for restoring items
* daemon/gvfsbackendtrash.c: implement pull
svn path=/trunk/; revision=2133
Diffstat (limited to 'daemon/gvfsbackendtrash.c')
-rw-r--r-- | daemon/gvfsbackendtrash.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/daemon/gvfsbackendtrash.c b/daemon/gvfsbackendtrash.c index b4b5916a..be674716 100644 --- a/daemon/gvfsbackendtrash.c +++ b/daemon/gvfsbackendtrash.c @@ -367,6 +367,70 @@ trash_backend_delete (GVfsBackend *vfs_backend, return TRUE; } +static gboolean +trash_backend_pull (GVfsBackend *vfs_backend, + GVfsJobPull *job, + const gchar *source, + const gchar *local_path, + GFileCopyFlags flags, + gboolean remove_source, + GFileProgressCallback progress_callback, + gpointer progress_callback_data) +{ + GVfsBackendTrash *backend = G_VFS_BACKEND_TRASH (vfs_backend); + GError *error = NULL; + + if (source[1] == '\0') + g_set_error (&error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Can't pull trash")); + else + { + gboolean is_toplevel; + TrashItem *item; + GFile *real; + + real = trash_backend_get_file (backend, source, &item, + &is_toplevel, &error); + + if (real) + { + if (remove_source && !is_toplevel) + g_set_error (&error, G_IO_ERROR, G_IO_ERROR_PERMISSION_DENIED, + _("Items in the trash may not be modified")); + + else + { + GFile *destination; + gboolean it_worked; + + destination = g_file_new_for_path (local_path); + + if (remove_source) + it_worked = trash_item_restore (item, destination, &error); + else + it_worked = g_file_copy (real, destination, flags, + NULL, NULL, NULL, &error); + + g_object_unref (destination); + + if (it_worked) + { + g_vfs_job_succeeded (G_VFS_JOB (job)); + + return TRUE; + } + } + + trash_item_unref (item); + } + + } + + g_vfs_job_failed_from_error (G_VFS_JOB (job), error); + + return TRUE; +} + static void trash_backend_add_info (TrashItem *item, GFileInfo *info, @@ -717,6 +781,7 @@ g_vfs_backend_trash_class_init (GVfsBackendTrashClass *class) backend_class->try_query_fs_info = trash_backend_query_fs_info; backend_class->try_enumerate = trash_backend_enumerate; backend_class->try_delete = trash_backend_delete; + backend_class->try_pull = trash_backend_pull; backend_class->try_create_dir_monitor = trash_backend_create_dir_monitor; backend_class->try_create_file_monitor = trash_backend_create_file_monitor; } |