summaryrefslogtreecommitdiff
path: root/libcaja-private/caja-file-operations.c
diff options
context:
space:
mode:
Diffstat (limited to 'libcaja-private/caja-file-operations.c')
-rw-r--r--libcaja-private/caja-file-operations.c141
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,