Blame 0004-wizard-steal-directory-before-copying-added-files-to.patch

Jiri Moskovcak 373fc9d
From 9e36fa04511b245ae904d67cbb9cd803d3a7e7c6 Mon Sep 17 00:00:00 2001
Jiri Moskovcak 373fc9d
From: Denys Vlasenko <dvlasenk@redhat.com>
Jiri Moskovcak 373fc9d
Date: Tue, 19 Jul 2011 12:06:01 +0200
Jiri Moskovcak 373fc9d
Subject: [PATCH 04/12] wizard: steal directory before copying added files to
Jiri Moskovcak 373fc9d
 it
Jiri Moskovcak 373fc9d
Jiri Moskovcak 373fc9d
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Jiri Moskovcak 373fc9d
---
Jiri Moskovcak 373fc9d
 src/gui-wizard-gtk/wizard.c |  163 +++++++++++++++++++++++--------------------
Jiri Moskovcak 373fc9d
 1 files changed, 86 insertions(+), 77 deletions(-)
Jiri Moskovcak 373fc9d
Jiri Moskovcak 373fc9d
diff --git a/src/gui-wizard-gtk/wizard.c b/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 373fc9d
index cdc4a5c..847e84c 100644
Jiri Moskovcak 373fc9d
--- a/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 373fc9d
+++ b/src/gui-wizard-gtk/wizard.c
Jiri Moskovcak 373fc9d
@@ -1675,6 +1675,92 @@ static void search_timeout(GtkEntry *entry)
Jiri Moskovcak 373fc9d
     g_timeout = g_timeout_add(500, &highlight_search, (gpointer)entry);
Jiri Moskovcak 373fc9d
 }
Jiri Moskovcak 373fc9d
 
Jiri Moskovcak 373fc9d
+static void save_edited_one_liner(GtkCellRendererText *renderer,
Jiri Moskovcak 373fc9d
+                gchar *tree_path,
Jiri Moskovcak 373fc9d
+                gchar *new_text,
Jiri Moskovcak 373fc9d
+                gpointer user_data)
Jiri Moskovcak 373fc9d
+{
Jiri Moskovcak 373fc9d
+    //log("path:'%s' new_text:'%s'", tree_path, new_text);
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
+    GtkTreeIter iter;
Jiri Moskovcak 373fc9d
+    if (!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(g_ls_details), &iter, tree_path))
Jiri Moskovcak 373fc9d
+        return;
Jiri Moskovcak 373fc9d
+    gchar *item_name = NULL;
Jiri Moskovcak 373fc9d
+    gtk_tree_model_get(GTK_TREE_MODEL(g_ls_details), &iter,
Jiri Moskovcak 373fc9d
+                DETAIL_COLUMN_NAME, &item_name,
Jiri Moskovcak 373fc9d
+                -1);
Jiri Moskovcak 373fc9d
+    if (!item_name) /* paranoia, should never happen */
Jiri Moskovcak 373fc9d
+        return;
Jiri Moskovcak 373fc9d
+    struct problem_item *item = get_problem_data_item_or_NULL(g_cd, item_name);
Jiri Moskovcak 373fc9d
+    if (item && (item->flags & CD_FLAG_ISEDITABLE))
Jiri Moskovcak 373fc9d
+    {
Jiri Moskovcak 373fc9d
+        struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
Jiri Moskovcak 373fc9d
+        dd = steal_if_needed(dd);
Jiri Moskovcak 373fc9d
+        if (dd && dd->locked)
Jiri Moskovcak 373fc9d
+        {
Jiri Moskovcak 373fc9d
+            dd_save_text(dd, item_name, new_text);
Jiri Moskovcak 373fc9d
+            free(item->content);
Jiri Moskovcak 373fc9d
+            item->content = xstrdup(new_text);
Jiri Moskovcak 373fc9d
+            gtk_list_store_set(g_ls_details, &iter,
Jiri Moskovcak 373fc9d
+                    DETAIL_COLUMN_VALUE, new_text,
Jiri Moskovcak 373fc9d
+                    -1);
Jiri Moskovcak 373fc9d
+        }
Jiri Moskovcak 373fc9d
+        dd_close(dd);
Jiri Moskovcak 373fc9d
+    }
Jiri Moskovcak 373fc9d
+}
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
+static void on_btn_add_file(GtkButton *button)
Jiri Moskovcak 373fc9d
+{
Jiri Moskovcak 373fc9d
+    GtkWidget *dialog = gtk_file_chooser_dialog_new(
Jiri Moskovcak 373fc9d
+            "Attach File",
Jiri Moskovcak 373fc9d
+            GTK_WINDOW(g_assistant),
Jiri Moskovcak 373fc9d
+            GTK_FILE_CHOOSER_ACTION_OPEN,
Jiri Moskovcak 373fc9d
+            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
Jiri Moskovcak 373fc9d
+            GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
Jiri Moskovcak 373fc9d
+            NULL
Jiri Moskovcak 373fc9d
+    );
Jiri Moskovcak 373fc9d
+    char *filename = NULL;
Jiri Moskovcak 373fc9d
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
Jiri Moskovcak 373fc9d
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
Jiri Moskovcak 373fc9d
+    gtk_widget_destroy(dialog);
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
+    if (filename)
Jiri Moskovcak 373fc9d
+    {
Jiri Moskovcak 373fc9d
+        char *basename = strrchr(filename, '/');
Jiri Moskovcak 373fc9d
+        if (!basename)  /* wtf? */
Jiri Moskovcak 373fc9d
+            goto free_and_ret;
Jiri Moskovcak 373fc9d
+        basename++;
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
+        struct stat statbuf;
Jiri Moskovcak 373fc9d
+        if (stat(filename, &statbuf) != 0 || !S_ISREG(statbuf.st_mode))
Jiri Moskovcak 373fc9d
+            goto free_and_ret;
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
+        struct problem_item *item = get_problem_data_item_or_NULL(g_cd, basename);
Jiri Moskovcak 373fc9d
+        if (!item || (item->flags & CD_FLAG_ISEDITABLE))
Jiri Moskovcak 373fc9d
+        {
Jiri Moskovcak 373fc9d
+            struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
Jiri Moskovcak 373fc9d
+            dd = steal_if_needed(dd);
Jiri Moskovcak 373fc9d
+            bool writable = (dd && dd->locked);
Jiri Moskovcak 373fc9d
+            dd_close(dd);
Jiri Moskovcak 373fc9d
+            if (writable)
Jiri Moskovcak 373fc9d
+            {
Jiri Moskovcak 373fc9d
+                char *new_name = concat_path_file(g_dump_dir_name, basename);
Jiri Moskovcak 373fc9d
+                /* TODO: error check */
Jiri Moskovcak 373fc9d
+                copy_file(filename, new_name, 0666);
Jiri Moskovcak 373fc9d
+                free(new_name);
Jiri Moskovcak 373fc9d
+                reload_problem_data_from_dump_dir();
Jiri Moskovcak 373fc9d
+                update_gui_state_from_problem_data();
Jiri Moskovcak 373fc9d
+            }
Jiri Moskovcak 373fc9d
+        }
Jiri Moskovcak 373fc9d
+        else
Jiri Moskovcak 373fc9d
+        {
Jiri Moskovcak 373fc9d
+            /* TODO: show error dialog */
Jiri Moskovcak 373fc9d
+        }
Jiri Moskovcak 373fc9d
+ free_and_ret:
Jiri Moskovcak 373fc9d
+        g_free(filename);
Jiri Moskovcak 373fc9d
+    }
Jiri Moskovcak 373fc9d
+}
Jiri Moskovcak 373fc9d
+
Jiri Moskovcak 373fc9d
 
Jiri Moskovcak 373fc9d
 /* Initialization */
Jiri Moskovcak 373fc9d
 
Jiri Moskovcak 373fc9d
@@ -1829,83 +1915,6 @@ static void add_pages()
Jiri Moskovcak 373fc9d
 //    g_signal_connect(g_tv_details, "key-press-event", G_CALLBACK(on_key_press_event_cb), NULL);
Jiri Moskovcak 373fc9d
 }
Jiri Moskovcak 373fc9d
 
Jiri Moskovcak 373fc9d
-static void save_edited_one_liner(GtkCellRendererText *renderer,
Jiri Moskovcak 373fc9d
-                gchar *tree_path,
Jiri Moskovcak 373fc9d
-                gchar *new_text,
Jiri Moskovcak 373fc9d
-                gpointer user_data)
Jiri Moskovcak 373fc9d
-{
Jiri Moskovcak 373fc9d
-    //log("path:'%s' new_text:'%s'", tree_path, new_text);
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
-    GtkTreeIter iter;
Jiri Moskovcak 373fc9d
-    if (!gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(g_ls_details), &iter, tree_path))
Jiri Moskovcak 373fc9d
-        return;
Jiri Moskovcak 373fc9d
-    gchar *item_name = NULL;
Jiri Moskovcak 373fc9d
-    gtk_tree_model_get(GTK_TREE_MODEL(g_ls_details), &iter,
Jiri Moskovcak 373fc9d
-                DETAIL_COLUMN_NAME, &item_name,
Jiri Moskovcak 373fc9d
-                -1);
Jiri Moskovcak 373fc9d
-    if (!item_name) /* paranoia, should never happen */
Jiri Moskovcak 373fc9d
-        return;
Jiri Moskovcak 373fc9d
-    struct problem_item *item = get_problem_data_item_or_NULL(g_cd, item_name);
Jiri Moskovcak 373fc9d
-    if (item && (item->flags & CD_FLAG_ISEDITABLE))
Jiri Moskovcak 373fc9d
-    {
Jiri Moskovcak 373fc9d
-        struct dump_dir *dd = dd_opendir(g_dump_dir_name, DD_OPEN_READONLY);
Jiri Moskovcak 373fc9d
-        dd = steal_if_needed(dd);
Jiri Moskovcak 373fc9d
-        if (dd && dd->locked)
Jiri Moskovcak 373fc9d
-        {
Jiri Moskovcak 373fc9d
-            dd_save_text(dd, item_name, new_text);
Jiri Moskovcak 373fc9d
-            free(item->content);
Jiri Moskovcak 373fc9d
-            item->content = xstrdup(new_text);
Jiri Moskovcak 373fc9d
-            gtk_list_store_set(g_ls_details, &iter,
Jiri Moskovcak 373fc9d
-                    DETAIL_COLUMN_VALUE, new_text,
Jiri Moskovcak 373fc9d
-                    -1);
Jiri Moskovcak 373fc9d
-        }
Jiri Moskovcak 373fc9d
-        dd_close(dd);
Jiri Moskovcak 373fc9d
-    }
Jiri Moskovcak 373fc9d
-}
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
-static void on_btn_add_file(GtkButton *button)
Jiri Moskovcak 373fc9d
-{
Jiri Moskovcak 373fc9d
-    GtkWidget *dialog = gtk_file_chooser_dialog_new(
Jiri Moskovcak 373fc9d
-            "Attach File",
Jiri Moskovcak 373fc9d
-            GTK_WINDOW(g_assistant),
Jiri Moskovcak 373fc9d
-            GTK_FILE_CHOOSER_ACTION_OPEN,
Jiri Moskovcak 373fc9d
-            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
Jiri Moskovcak 373fc9d
-            GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
Jiri Moskovcak 373fc9d
-            NULL
Jiri Moskovcak 373fc9d
-    );
Jiri Moskovcak 373fc9d
-    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
Jiri Moskovcak 373fc9d
-    {
Jiri Moskovcak 373fc9d
-        char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
-        char *basename = strrchr(filename, '/');
Jiri Moskovcak 373fc9d
-        if (!basename)  /* wtf? */
Jiri Moskovcak 373fc9d
-            goto free_and_ret;
Jiri Moskovcak 373fc9d
-        basename++;
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
-        struct stat statbuf;
Jiri Moskovcak 373fc9d
-        if (stat(filename, &statbuf) != 0 || !S_ISREG(statbuf.st_mode))
Jiri Moskovcak 373fc9d
-            goto free_and_ret;
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
-        struct problem_item *item = get_problem_data_item_or_NULL(g_cd, basename);
Jiri Moskovcak 373fc9d
-        if (!item || (item->flags & CD_FLAG_ISEDITABLE))
Jiri Moskovcak 373fc9d
-        {
Jiri Moskovcak 373fc9d
-            char *new_name = concat_path_file(g_dump_dir_name, basename);
Jiri Moskovcak 373fc9d
-            /* TODO: error check */
Jiri Moskovcak 373fc9d
-            copy_file(filename, new_name, 0666);
Jiri Moskovcak 373fc9d
-            free(new_name);
Jiri Moskovcak 373fc9d
-            reload_problem_data_from_dump_dir();
Jiri Moskovcak 373fc9d
-            update_gui_state_from_problem_data();
Jiri Moskovcak 373fc9d
-        }
Jiri Moskovcak 373fc9d
-        else
Jiri Moskovcak 373fc9d
-        {
Jiri Moskovcak 373fc9d
-            /* TODO: error dialog */
Jiri Moskovcak 373fc9d
-        }
Jiri Moskovcak 373fc9d
- free_and_ret:
Jiri Moskovcak 373fc9d
-        g_free(filename);
Jiri Moskovcak 373fc9d
-    }
Jiri Moskovcak 373fc9d
-    gtk_widget_destroy(dialog);
Jiri Moskovcak 373fc9d
-}
Jiri Moskovcak 373fc9d
-
Jiri Moskovcak 373fc9d
 static void create_details_treeview(void)
Jiri Moskovcak 373fc9d
 {
Jiri Moskovcak 373fc9d
     GtkCellRenderer *renderer;
Jiri Moskovcak 373fc9d
-- 
Jiri Moskovcak 373fc9d
1.7.6
Jiri Moskovcak 373fc9d