From 4606019b8ed2ec4e6ae1cc5b18938c3b3051707a Mon Sep 17 00:00:00 2001 From: Ayan George Date: Thu, 26 Jan 2012 09:45:17 -0500 Subject: [PATCH] Added fr_window_overwrite_files_dialog() which checks for file extration collisions and displays a warning if files will be overwritten. --- src/fr-window.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 68 insertions(+), 0 deletions(-) diff --git a/src/fr-window.c b/src/fr-window.c index a9ec234..c89c231 100644 --- a/src/fr-window.c +++ b/src/fr-window.c @@ -6642,6 +6642,71 @@ fr_window_archive_extract_here (FrWindow *window, } } +static gboolean +fr_window_overwrite_files_dialog(FrWindow *window, + GList *file_list, + const char *extract_to_dir, + const char *base_dir) +{ + GList *cur = NULL, *overwrite_list = NULL; + gchar *msg = NULL; + int rc = GTK_RESPONSE_CANCEL; + + for (cur = file_list; cur; cur = cur->next) { + gchar *dest_uri = g_strdup_printf ("%s/%s",extract_to_dir, (char*)cur->data), + *dest_path = g_filename_from_uri (dest_uri, NULL, NULL); + GFile *file = g_file_new_for_uri (dest_uri); + + if (g_file_query_exists (file, NULL) == TRUE) { + GFileType file_type = g_file_query_file_type (file, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL); + + if (file_type != G_FILE_TYPE_DIRECTORY) + overwrite_list = g_list_append (overwrite_list, cur->data); + } + + g_free(dest_uri); + g_free(dest_path); + } + + if (g_list_length (overwrite_list) == 0) { + rc = TRUE; + } else { + gint warning_lines; + GtkWidget *d; + + msg = g_strdup_printf ("Warning: %d files will be overwritten!\n", g_list_length (overwrite_list)); + + /* Show at most 16 files that collide. Ideally, all files would be listed. */ + for (cur = overwrite_list, warning_lines = 0; (cur != NULL) && (warning_lines < 16); warning_lines++, cur = cur->next) { + gchar *t = msg; + msg = g_strdup_printf ("%s\n%s", msg, (char *)cur->data); + g_free(t); + } + + if (warning_lines == 16) { + gchar *t = msg; + msg = g_strdup_printf("%s\n...",msg); + g_free(t); + } + + d = _gtk_message_dialog_new (GTK_WINDOW (window), + GTK_DIALOG_MODAL, + GTK_STOCK_DIALOG_QUESTION, + msg, + NULL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + _("Overwrite Files"), GTK_RESPONSE_YES, + NULL); + + gtk_dialog_set_default_response (GTK_DIALOG (d), GTK_RESPONSE_YES); + + rc = gtk_dialog_run (GTK_DIALOG (d)) == GTK_RESPONSE_YES ? TRUE : FALSE ; + + gtk_widget_destroy (GTK_WIDGET (d)); + } + + return rc; +} void fr_window_archive_extract (FrWindow *window, @@ -6657,6 +6722,9 @@ fr_window_archive_extract (FrWindow *window, gboolean do_not_extract = FALSE; GError *error = NULL; + if (fr_window_overwrite_files_dialog(window, file_list, extract_to_dir, base_dir) == FALSE) + return; + edata = extract_data_new (file_list, extract_to_dir, base_dir, -- 1.7.5.4