2 * Copyright (C) 2006 John Ellis
3 * Copyright (C) 2008 - 2016 The Geeqie Team
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
34 #include "main-defines.h"
37 #include "ui-fileops.h"
38 #include "ui-utildlg.h"
43 *--------------------------------------------------------------------------
45 *--------------------------------------------------------------------------
48 static gint file_util_safe_number(gint64 free_space)
54 gboolean sorted = FALSE;
55 gboolean warned = FALSE;
58 dir_fd = file_data_new_dir(options->file_ops.safe_delete_path);
59 if (!filelist_read(dir_fd, &list, nullptr))
61 file_data_unref(dir_fd);
64 file_data_unref(dir_fd);
72 fd = static_cast<FileData *>(work->data);
75 v = static_cast<gint>(strtol(fd->name, nullptr, 10));
76 if (v >= n) n = v + 1;
81 while (options->file_ops.safe_delete_folder_maxsize > 0 && list &&
82 (free_space < 0 || total + free_space > static_cast<gint64>(options->file_ops.safe_delete_folder_maxsize) * 1048576) )
88 list = filelist_sort(list, SORT_NAME, TRUE, TRUE);
92 fd = static_cast<FileData *>(list->data);
93 list = g_list_remove(list, fd);
95 DEBUG_1("expunging from trash for space: %s", fd->name);
96 if (!unlink_file(fd->path) && !warned)
98 file_util_warning_dialog(_("Delete failed"),
99 _("Unable to remove old file from trash folder"),
100 GQ_ICON_DIALOG_WARNING, nullptr);
112 void file_util_trash_clear()
114 file_util_safe_number(-1);
117 static gchar *file_util_safe_dest(const gchar *path)
123 n = file_util_safe_number(filesize(path));
124 name = g_strdup_printf("%06d_%s", n, filename_from_path(path));
125 dest = g_build_filename(options->file_ops.safe_delete_path, name, NULL);
131 static void move_to_trash_failed_cb(GenericDialog *, gpointer)
133 help_window_show("TrashFailed.html");
136 gboolean file_util_safe_unlink(const gchar *path)
138 static GenericDialog *gd = nullptr;
139 gchar *result = nullptr;
140 gboolean success = TRUE;
143 if (!isfile(path)) return FALSE;
145 if (options->file_ops.no_trash)
147 if (!unlink_file(path))
149 file_util_warning_dialog(_("Delete failed"),
150 _("Unable to remove file"),
151 GQ_ICON_DIALOG_WARNING, nullptr);
155 else if (!options->file_ops.use_system_trash)
157 if (!isdir(options->file_ops.safe_delete_path))
159 DEBUG_1("creating trash: %s", options->file_ops.safe_delete_path);
160 if (!options->file_ops.safe_delete_path || !mkdir_utf8(options->file_ops.safe_delete_path, 0755))
162 result = _("Could not create folder");
171 dest = file_util_safe_dest(path);
174 DEBUG_1("safe deleting %s to %s", path, dest);
175 success = move_file(path, dest);
182 if (!success && !access_file(path, W_OK))
184 result = _("Permission denied");
193 buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), options->file_ops.safe_delete_path);
194 gd = file_util_warning_dialog(result, buf, GQ_ICON_DIALOG_WARNING, nullptr);
200 GFile *tmp = g_file_new_for_path(path);
201 GError *error = nullptr;
203 if (!g_file_trash(tmp, FALSE, &error) )
205 message = g_strconcat("See the Help file for a possible workaround.\n\n", error->message, NULL);
206 gd = warning_dialog(_("Move to trash failed\n\n"), message, GQ_ICON_DIALOG_ERROR, nullptr);
207 generic_dialog_add_button(gd, GQ_ICON_HELP, _("Help"), move_to_trash_failed_cb, FALSE);
212 /* A second warning dialog is not necessary */
219 gchar *file_util_safe_delete_status()
221 gchar *buf = nullptr;
223 if (is_valid_editor_command(CMD_DELETE))
225 buf = g_strdup(_("Deletion by external command"));
227 else if (options->file_ops.no_trash)
229 buf = g_strdup(_("Deleting without trash"));
231 else if (options->file_ops.safe_delete_enable)
233 if (!options->file_ops.use_system_trash)
236 if (options->file_ops.safe_delete_folder_maxsize > 0)
237 buf2 = g_strdup_printf(_(" (max. %d MiB)"), options->file_ops.safe_delete_folder_maxsize);
241 buf = g_strdup_printf(_("Using Geeqie Trash bin\n%s"), buf2);
246 buf = g_strdup(_("Using system Trash bin"));
252 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */