diff options
Diffstat (limited to 'libcaja-private/caja-file-operations.c')
| -rw-r--r-- | libcaja-private/caja-file-operations.c | 141 |
1 files changed, 94 insertions, 47 deletions
diff --git a/libcaja-private/caja-file-operations.c b/libcaja-private/caja-file-operations.c index b0c15cdb..4b51c907 100644 --- a/libcaja-private/caja-file-operations.c +++ b/libcaja-private/caja-file-operations.c @@ -152,6 +152,8 @@ typedef struct { } SetPermissionsJob; typedef enum { + OP_KIND_CREATE, + OP_KIND_LINK, OP_KIND_COPY, OP_KIND_MOVE, OP_KIND_DELETE, @@ -188,7 +190,7 @@ typedef struct { #define DELETE_ALL _("Delete _All") #define REPLACE_ALL _("Replace _All") #define MERGE_ALL _("Merge _All") -#define COPY_FORCE _("Copy _Anyway") +#define CONTINUE_FORCE _("Continue _Anyway") NotifyNotification *unmount_notify; @@ -376,7 +378,7 @@ get_link_name (const char *name, int count, int max_length) { const char *format; char *result; - int unshortened_length; + size_t unshortened_length; gboolean use_count; g_assert (name != NULL); @@ -444,10 +446,10 @@ get_link_name (const char *name, int count, int max_length) else result = g_strdup_printf (format, name); - if (max_length > 0 && (unshortened_length = strlen (result)) > max_length) { + if (max_length > 0 && (unshortened_length = strlen (result)) > (size_t) max_length) { char *new_name; - new_name = shorten_utf8_string (name, unshortened_length - max_length); + new_name = shorten_utf8_string (name, ((int) unshortened_length) - max_length); if (new_name) { g_free (result); @@ -456,7 +458,7 @@ get_link_name (const char *name, int count, int max_length) else result = g_strdup_printf (format, new_name); - g_assert (strlen (result) <= max_length); + g_assert (strlen (result) <= (size_t) max_length); g_free (new_name); } } @@ -655,7 +657,7 @@ make_next_duplicate_name (const char *base, const char *suffix, int count, int m { const char *format; char *result; - int unshortened_length; + size_t unshortened_length; gboolean use_count; if (count < 1) { @@ -733,10 +735,10 @@ make_next_duplicate_name (const char *base, const char *suffix, int count, int m else result = g_strdup_printf (format, base, suffix); - if (max_length > 0 && (unshortened_length = strlen (result)) > max_length) { + if (max_length > 0 && (unshortened_length = strlen (result)) > (size_t) max_length) { char *new_base; - new_base = shorten_utf8_string (base, unshortened_length - max_length); + new_base = shorten_utf8_string (base, ((int) unshortened_length) - max_length); if (new_base) { g_free (result); @@ -745,7 +747,7 @@ make_next_duplicate_name (const char *base, const char *suffix, int count, int m else result = g_strdup_printf (format, new_base, suffix); - g_assert (strlen (result) <= max_length); + g_assert (strlen (result) <= (size_t) max_length); g_free (new_base); } } @@ -962,7 +964,11 @@ init_common (gsize job_size, GdkScreen *screen; screen = gtk_widget_get_screen (GTK_WIDGET (parent_window)); - common->screen_num = gdk_x11_screen_get_screen_number (screen); + /*common->screen_num = gdk_x11_screen_get_screen_number (screen);* + *https://discourse.ubuntu.com/t/porting-mate-apps-to-wayland/12670 + *Screen number is always 0 with >GTK 3.22 so we can just use zero here + */ + common->screen_num = 0; } return common; @@ -1491,7 +1497,7 @@ report_delete_progress (CommonJob *job, TransferInfo *transfer_info) { int files_left; - double elapsed; + double elapsed, transfer_rate; gint64 now; char *files_left_s; @@ -1518,15 +1524,19 @@ report_delete_progress (CommonJob *job, f (_("Deleting files"))); elapsed = g_timer_elapsed (job->time, NULL); - if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE) { + transfer_rate = 0; + if (elapsed > 0) { + transfer_rate = transfer_info->num_files / elapsed; + } + + if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE || + transfer_rate <= 0) { caja_progress_info_set_details (job->progress, files_left_s); } else { char *details, *time_left_s; int remaining_time; - double transfer_rate; - transfer_rate = transfer_info->num_files / elapsed; remaining_time = files_left / transfer_rate; /* Translators: %T will expand to a time like "2 minutes". @@ -1778,7 +1788,7 @@ delete_file (CommonJob *job, GFile *file, } static void -delete_files (CommonJob *job, GList *files, int *files_skipped) +delete_files (CommonJob *job, GList *files, guint *files_skipped) { GList *l; SourceInfo source_info; @@ -1821,10 +1831,10 @@ delete_files (CommonJob *job, GList *files, int *files_skipped) static void report_trash_progress (CommonJob *job, - int files_trashed, - int total_files) + guint files_trashed, + guint total_files) { - int files_left; + guint files_left; char *s; files_left = total_files - files_trashed; @@ -1844,13 +1854,13 @@ report_trash_progress (CommonJob *job, } static void -trash_files (CommonJob *job, GList *files, int *files_skipped) +trash_files (CommonJob *job, GList *files, guint *files_skipped) { GList *l; GFile *file; GList *to_delete; GError *error; - int total_files, files_trashed; + guint total_files, files_trashed; char *primary, *secondary, *details; int response; @@ -1869,7 +1879,7 @@ trash_files (CommonJob *job, GList *files, int *files_skipped) for (l = files; l != NULL && !job_aborted (job); l = l->next) { - caja_progress_info_get_ready (job->progress); + caja_progress_info_get_ready (job->progress, job->time); file = l->data; @@ -1978,7 +1988,7 @@ delete_job (GIOSchedulerJob *io_job, gboolean must_confirm_delete_in_trash; gboolean must_confirm_delete; gboolean must_confirm_trash; - int files_skipped; + guint files_skipped; GFile *file = NULL; common = (CommonJob *)job; @@ -2518,6 +2528,10 @@ report_count_progress (CommonJob *job, switch (source_info->op) { default: + // OP_KIND_CREATE and OP_KIND_LINK don't have a source + g_assert_not_reached (); + s = f (""); + break; case OP_KIND_COPY: s = f (ngettext("Preparing to copy %'d file (%S)", "Preparing to copy %'d files (%S)", @@ -2567,6 +2581,9 @@ get_scan_primary (OpKind kind) { switch (kind) { default: + // OP_KIND_CREATE and OP_KIND_LINK don't have a source + g_assert_not_reached (); + return f (""); case OP_KIND_COPY: return f (_("Error while copying.")); case OP_KIND_MOVE: @@ -2816,8 +2833,29 @@ scan_sources (GList *files, report_count_progress (job, source_info); } +static char * +get_verify_primary (OpKind kind, + GFile *dest) +{ + switch (kind) { + default: + // OP_KIND_DELETE and OP_KIND_TRASH don't have a destination + g_assert_not_reached (); + return f (""); + case OP_KIND_CREATE: + return f (_("Error while creating file/directory in \"%B\"."), dest); + case OP_KIND_LINK: + return f (_("Error while creating link in \"%B\"."), dest); + case OP_KIND_COPY: + return f (_("Error while copying to \"%B\"."), dest); + case OP_KIND_MOVE: + return f (_("Error while moving to \"%B\"."), dest); + } +} + static void verify_destination (CommonJob *job, + OpKind kind, GFile *dest, char **dest_fs_id, goffset required_size) @@ -2849,7 +2887,7 @@ verify_destination (CommonJob *job, return; } - primary = f (_("Error while copying to \"%B\"."), dest); + primary = get_verify_primary (kind, dest); details = NULL; if (IS_IO_ERROR (error, PERMISSION_DENIED)) { @@ -2891,7 +2929,7 @@ verify_destination (CommonJob *job, g_object_unref (info); if (file_type != G_FILE_TYPE_DIRECTORY) { - primary = f (_("Error while copying to \"%B\"."), dest); + primary = get_verify_primary (kind, dest); secondary = f (_("The destination is not a folder.")); response = run_error (job, @@ -2923,11 +2961,11 @@ verify_destination (CommonJob *job, free_size = g_file_info_get_attribute_uint64 (fsinfo, G_FILE_ATTRIBUTE_FILESYSTEM_FREE); - if (free_size < required_size) { - primary = f (_("Error while copying to \"%B\"."), dest); + if (free_size < (guint64) required_size) { + primary = get_verify_primary (kind, dest); secondary = f(_("There is not enough space on the destination. Try to remove files to make space.")); - details = f (_("There is %S available, but %S is required."), free_size, required_size); + details = f (_("There is %" G_GUINT64_FORMAT " available, but %" G_GOFFSET_FORMAT " is required."), free_size, required_size); response = run_warning (job, primary, @@ -2935,7 +2973,7 @@ verify_destination (CommonJob *job, details, FALSE, CANCEL, - COPY_FORCE, + CONTINUE_FORCE, RETRY, NULL); @@ -2944,7 +2982,7 @@ verify_destination (CommonJob *job, } else if (response == 2) { goto retry; } else if (response == 1) { - /* We are forced to copy - just fall through ... */ + /* We are forced to continue - just fall through ... */ } else { g_assert_not_reached (); } @@ -2954,7 +2992,7 @@ verify_destination (CommonJob *job, if (!job_aborted (job) && g_file_info_get_attribute_boolean (fsinfo, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY)) { - primary = f (_("Error while copying to \"%B\"."), dest); + primary = get_verify_primary (kind, dest); secondary = f (_("The destination is read-only.")); response = run_error (job, @@ -3075,8 +3113,8 @@ report_copy_progress (CopyMoveJob *copy_job, transfer_rate = transfer_info->num_bytes / elapsed; } - if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE && - transfer_rate > 0) { + if (elapsed < SECONDS_NEEDED_FOR_RELIABLE_TRANSFER_RATE || + transfer_rate <= 0) { char *s; /* Translators: %S will expand to a size like "2 bytes" or "3 MB", so something like "4 kb of 4 MB" */ s = f (_("%S of %S"), transfer_info->num_bytes, total_size); @@ -3174,7 +3212,7 @@ make_file_name_valid_for_dest_fs (char *filename, !strcmp (dest_fs_type, "msdos") || !strcmp (dest_fs_type, "msdosfs")) { gboolean ret; - int i, old_len; + size_t i, old_len; ret = str_replace (filename, FAT_FORBIDDEN_CHARACTERS, '_'); @@ -3594,7 +3632,7 @@ copy_move_directory (CopyMoveJob *copy_job, nextinfo = g_file_enumerator_next_file (enumerator, job->cancellable, skip_error?NULL:&error); while (!job_aborted (job) && (info = nextinfo) != NULL) { - caja_progress_info_get_ready (job->progress); + caja_progress_info_get_ready (job->progress, job->time); nextinfo = g_file_enumerator_next_file (enumerator, job->cancellable, skip_error?NULL:&error); src_file = g_file_get_child (src, @@ -4028,7 +4066,7 @@ do_run_conflict_dialog (gpointer _data) if (response == CONFLICT_RESPONSE_RENAME) { data->resp_data->new_name = caja_file_conflict_dialog_get_new_name (CAJA_FILE_CONFLICT_DIALOG (dialog)); - } else if (response != GTK_RESPONSE_CANCEL || + } else if (response != GTK_RESPONSE_CANCEL && response != GTK_RESPONSE_NONE) { data->resp_data->apply_to_all = caja_file_conflict_dialog_get_apply_to_all @@ -4560,7 +4598,7 @@ copy_files (CopyMoveJob *job, for (l = job->files; l != NULL && !job_aborted (common); l = l->next) { - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); src = l->data; @@ -4664,6 +4702,7 @@ copy_job (GIOSchedulerJob *io_job, } verify_destination (&job->common, + OP_KIND_COPY, dest, &dest_fs_id, source_info.num_bytes); @@ -4876,7 +4915,7 @@ move_file_prepare (CopyMoveJob *move_job, } retry: - caja_progress_info_get_ready (job->progress); + caja_progress_info_get_ready (job->progress, job->time); flags = G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_NO_FALLBACK_FOR_MOVE; if (overwrite) { @@ -5052,7 +5091,7 @@ move_files_prepare (CopyMoveJob *job, total = left = g_list_length (job->files); - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); report_move_progress (job, total, left); i = 0; @@ -5116,7 +5155,7 @@ move_files (CopyMoveJob *job, for (l = fallbacks; l != NULL && !job_aborted (common); l = l->next) { - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); fallback = l->data; src = fallback->file; @@ -5192,6 +5231,7 @@ move_job (GIOSchedulerJob *io_job, caja_progress_info_start (job->common.progress); verify_destination (&job->common, + OP_KIND_MOVE, job->destination, &dest_fs_id, -1); @@ -5221,6 +5261,7 @@ move_job (GIOSchedulerJob *io_job, } verify_destination (&job->common, + OP_KIND_MOVE, job->destination, NULL, source_info.num_bytes); @@ -5228,6 +5269,8 @@ move_job (GIOSchedulerJob *io_job, goto aborted; } + g_timer_start (job->common.time); + memset (&transfer_info, 0, sizeof (transfer_info)); move_files (job, fallbacks, @@ -5522,6 +5565,7 @@ link_job (GIOSchedulerJob *io_job, caja_progress_info_start (job->common.progress); verify_destination (&job->common, + OP_KIND_LINK, job->destination, NULL, -1); @@ -5537,7 +5581,7 @@ link_job (GIOSchedulerJob *io_job, for (l = job->files; l != NULL && !job_aborted (common); l = l->next) { - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); src = l->data; @@ -5679,7 +5723,7 @@ set_permissions_file (SetPermissionsJob *job, caja_progress_info_pulse_progress (common->progress); - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); free_info = FALSE; if (info == NULL) { @@ -6005,6 +6049,7 @@ create_job (GIOSchedulerJob *io_job, max_length = get_max_name_length (job->dest_dir); verify_destination (common, + OP_KIND_CREATE, job->dest_dir, NULL, -1); if (job_aborted (common)) { @@ -6043,7 +6088,7 @@ create_job (GIOSchedulerJob *io_job, count = 1; retry: - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); error = NULL; if (job->make_dir) { @@ -6134,11 +6179,13 @@ create_job (GIOSchedulerJob *io_job, if (count == 1) { new_filename = g_strdup (filename); } else if (job->make_dir) { - filename2 = g_strdup_printf ("%s %d", filename, count); + size_t unshortened_length; + filename2 = g_strdup_printf ("%s %d", filename, count); + unshortened_length = strlen (filename2); new_filename = NULL; - if (max_length > 0 && strlen (filename2) > max_length) { - new_filename = shorten_utf8_string (filename2, strlen (filename2) - max_length); + if (max_length > 0 && unshortened_length > (size_t) max_length) { + new_filename = shorten_utf8_string (filename2, ((int) unshortened_length) - max_length); } if (new_filename == NULL) { @@ -6371,7 +6418,7 @@ delete_trash_file (CommonJob *job, gboolean del_file, gboolean del_children) { - caja_progress_info_get_ready (job->progress); + caja_progress_info_get_ready (job->progress, job->time); if (job_aborted (job)) { return; @@ -6520,7 +6567,7 @@ mark_desktop_file_trusted (CommonJob *common, GFileInfo *info; retry: - caja_progress_info_get_ready (common->progress); + caja_progress_info_get_ready (common->progress, common->time); error = NULL; if (!g_file_load_contents (file, |
