diff options
author | Cosimo Cecchi <cosimoc@gnome.org> | 2010-12-06 19:44:00 +0100 |
---|---|---|
committer | Cosimo Cecchi <cosimoc@gnome.org> | 2010-12-06 19:44:00 +0100 |
commit | 4be5d548a438b2b3c02f3e7e7e0265f4c8b641fe (patch) | |
tree | daa30fb74590cd9db8e8f9851d6518ae4bcf0667 /libnautilus-private/nautilus-file-operations.c | |
parent | 52b8185908725ba9842f3d2ce8c29d7b7e3d520f (diff) | |
download | nautilus-4be5d548a438b2b3c02f3e7e7e0265f4c8b641fe.tar.gz |
file-operations: add nautilus_file_operations_copy_file
Copies a single file to a target directory, allowing to specify a custom
target display name, and a custom source display name, which will be
shown in the FileOperations dialog instead of the actual file name.
Diffstat (limited to 'libnautilus-private/nautilus-file-operations.c')
-rw-r--r-- | libnautilus-private/nautilus-file-operations.c | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/libnautilus-private/nautilus-file-operations.c b/libnautilus-private/nautilus-file-operations.c index 2aab84f39..a000b6784 100644 --- a/libnautilus-private/nautilus-file-operations.c +++ b/libnautilus-private/nautilus-file-operations.c @@ -89,9 +89,11 @@ typedef struct { GList *files; GFile *destination; GFile *desktop_location; + GFile *fake_display_source; GdkPoint *icon_positions; int n_icon_positions; GHashTable *debuting_files; + gchar *target_name; NautilusCopyCallback done_callback; gpointer done_callback_data; } CopyMoveJob; @@ -2868,6 +2870,8 @@ report_copy_progress (CopyMoveJob *copy_job, f (is_move ? _("Moving \"%B\" to \"%B\""): _("Copying \"%B\" to \"%B\""), + copy_job->fake_display_source != NULL ? + copy_job->fake_display_source : (GFile *)copy_job->files->data, copy_job->destination)); } else { @@ -3164,10 +3168,11 @@ get_target_file_for_link (GFile *src, } static GFile * -get_target_file (GFile *src, - GFile *dest_dir, - const char *dest_fs_type, - gboolean same_fs) +get_target_file_with_custom_name (GFile *src, + GFile *dest_dir, + const char *dest_fs_type, + gboolean same_fs, + const gchar *custom_name) { char *basename; GFile *dest; @@ -3175,7 +3180,16 @@ get_target_file (GFile *src, char *copyname; dest = NULL; - if (!same_fs) { + + if (custom_name != NULL) { + copyname = g_strdup (custom_name); + make_file_name_valid_for_dest_fs (copyname, dest_fs_type); + dest = g_file_get_child_for_display_name (dest_dir, copyname, NULL); + + g_free (copyname); + } + + if (dest == NULL && !same_fs) { info = g_file_query_info (src, G_FILE_ATTRIBUTE_STANDARD_COPY_NAME, 0, NULL, NULL); @@ -3203,6 +3217,15 @@ get_target_file (GFile *src, return dest; } +static GFile * +get_target_file (GFile *src, + GFile *dest_dir, + const char *dest_fs_type, + gboolean same_fs) +{ + return get_target_file_with_custom_name (src, dest_dir, dest_fs_type, same_fs, NULL); +} + static gboolean has_fs_id (GFile *file, const char *fs_id) { @@ -3910,10 +3933,10 @@ conflict_response_data_free (ConflictResponseData *data) static GFile * get_target_file_for_display_name (GFile *dir, - char *name) + const gchar *name) { GFile *dest; - + dest = NULL; dest = g_file_get_child_for_display_name (dir, name, NULL); @@ -3968,11 +3991,13 @@ copy_move_file (CopyMoveJob *copy_job, if (unique_names) { dest = get_unique_target_file (src, dest_dir, same_fs, *dest_fs_type, unique_name_nr++); + } else if (copy_job->target_name != NULL) { + dest = get_target_file_with_custom_name (src, dest_dir, *dest_fs_type, same_fs, + copy_job->target_name); } else { dest = get_target_file (src, dest_dir, *dest_fs_type, same_fs); } - /* Don't allow recursive move/copy into itself. * (We would get a file system error if we proceeded but it is nicer to * detect and report it at this level) */ @@ -4423,6 +4448,9 @@ copy_job_done (gpointer user_data) } g_hash_table_unref (job->debuting_files); g_free (job->icon_positions); + g_free (job->target_name); + + g_clear_object (&job->fake_display_source); finalize_common ((CommonJob *)job); @@ -4496,6 +4524,43 @@ copy_job (GIOSchedulerJob *io_job, } void +nautilus_file_operations_copy_file (GFile *source_file, + GFile *target_dir, + const gchar *source_display_name, + const gchar *new_name, + GtkWindow *parent_window, + NautilusCopyCallback done_callback, + gpointer done_callback_data) +{ + CopyMoveJob *job; + + job = op_job_new (CopyMoveJob, parent_window); + job->done_callback = done_callback; + job->done_callback_data = done_callback_data; + job->files = g_list_append (NULL, g_object_ref (source_file)); + job->destination = g_object_ref (target_dir); + job->target_name = g_strdup (new_name); + job->debuting_files = g_hash_table_new_full (g_file_hash, (GEqualFunc)g_file_equal, g_object_unref, NULL); + + if (source_display_name != NULL) { + gchar *path; + + path = g_build_filename ("/", source_display_name, NULL); + job->fake_display_source = g_file_new_for_path (path); + + g_free (path); + } + + inhibit_power_manager ((CommonJob *)job, _("Copying Files")); + + g_io_scheduler_push_job (copy_job, + job, + NULL, /* destroy notify */ + 0, + job->common.cancellable); +} + +void nautilus_file_operations_copy (GList *files, GArray *relative_item_points, GFile *target_dir, |