4 * Copyright (C) 2008 - 2012 The Geeqie Team
8 * This software is released under the GNU General Public License (GNU GPL).
9 * Please read the included file COPYING for more information.
10 * This software comes with no warranty of any kind, use at your own risk!
20 #include "ui_fileops.h"
25 *--------------------------------------------------------------------------
27 *--------------------------------------------------------------------------
30 static gint file_util_safe_number(gint64 free_space)
36 gboolean sorted = FALSE;
37 gboolean warned = FALSE;
40 dir_fd = file_data_new_dir(options->file_ops.safe_delete_path);
41 if (!filelist_read(dir_fd, &list, NULL))
43 file_data_unref(dir_fd);
46 file_data_unref(dir_fd);
57 v = (gint)strtol(fd->name, NULL, 10);
58 if (v >= n) n = v + 1;
63 while (options->file_ops.safe_delete_folder_maxsize > 0 && list &&
64 (free_space < 0 || total + free_space > (gint64)options->file_ops.safe_delete_folder_maxsize * 1048576) )
70 list = filelist_sort(list, SORT_NAME, TRUE);
75 list = g_list_remove(list, fd);
77 DEBUG_1("expunging from trash for space: %s", fd->name);
78 if (!unlink_file(fd->path) && !warned)
80 file_util_warning_dialog(_("Delete failed"),
81 _("Unable to remove old file from trash folder"),
82 GTK_STOCK_DIALOG_WARNING, NULL);
94 void file_util_trash_clear(void)
96 file_util_safe_number(-1);
99 static gchar *file_util_safe_dest(const gchar *path)
105 n = file_util_safe_number(filesize(path));
106 name = g_strdup_printf("%06d_%s", n, filename_from_path(path));
107 dest = g_build_filename(options->file_ops.safe_delete_path, name, NULL);
113 static void file_util_safe_del_toggle_cb(GtkWidget *button, gpointer data)
115 options->file_ops.safe_delete_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
118 static void file_util_safe_del_close_cb(GtkWidget *dialog, gpointer data)
120 GenericDialog **gd = data;
125 gboolean file_util_safe_unlink(const gchar *path)
127 static GenericDialog *gd = NULL;
128 gchar *result = NULL;
129 gboolean success = TRUE;
131 if (!isfile(path)) return FALSE;
133 if (!isdir(options->file_ops.safe_delete_path))
135 DEBUG_1("creating trash: %s", options->file_ops.safe_delete_path);
136 if (!options->file_ops.safe_delete_path || !mkdir_utf8(options->file_ops.safe_delete_path, 0755))
138 result = _("Could not create folder");
147 dest = file_util_safe_dest(path);
150 DEBUG_1("safe deleting %s to %s", path, dest);
151 success = move_file(path, dest);
158 if (!success && !access_file(path, W_OK))
160 result = _("Permission denied");
170 buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), options->file_ops.safe_delete_path);
171 gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL);
174 button = gtk_check_button_new_with_label(_("Turn off safe delete"));
175 g_signal_connect(G_OBJECT(button), "toggled",
176 G_CALLBACK(file_util_safe_del_toggle_cb), NULL);
177 gtk_box_pack_start(GTK_BOX(gd->vbox), button, FALSE, FALSE, 0);
178 gtk_widget_show(button);
180 g_signal_connect(G_OBJECT(gd->dialog), "destroy",
181 G_CALLBACK(file_util_safe_del_close_cb), &gd);
187 gchar *file_util_safe_delete_status(void)
191 if (is_valid_editor_command(CMD_DELETE))
193 buf = g_strdup(_("Deletion by external command"));
197 if (options->file_ops.safe_delete_enable)
200 if (options->file_ops.safe_delete_folder_maxsize > 0)
201 buf2 = g_strdup_printf(_(" (max. %d MB)"), options->file_ops.safe_delete_folder_maxsize);
205 buf = g_strdup_printf(_("Safe delete: %s%s\nTrash: %s"), _("on"), buf2, options->file_ops.safe_delete_path);
210 buf = g_strdup_printf(_("Safe delete: %s"), _("off"));
216 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */