diff options
author | Daniel Gryniewicz <dang@gentoo.org> | 2006-11-28 02:49:11 +0800 |
---|---|---|
committer | Srinivasa Ragavan <sragavan@src.gnome.org> | 2006-11-28 02:49:11 +0800 |
commit | 6395ec0243694ee6677e65c4d5fef0731d7c7e86 (patch) | |
tree | 35b199198b2bcd4b31c2883feb8ab408c12b2ce6 /e-util | |
parent | 97585dc9f97faf21762939ef107eba756a47ef63 (diff) | |
download | gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.gz gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.zst gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.zip |
** Fix for bug #349966
2006-11-28 Daniel Gryniewicz <dang@gentoo.org>
** Fix for bug #349966
svn path=/trunk/; revision=33026
Diffstat (limited to 'e-util')
-rw-r--r-- | e-util/ChangeLog | 12 | ||||
-rw-r--r-- | e-util/e-dialog-utils.c | 239 | ||||
-rw-r--r-- | e-util/e-dialog-utils.h | 6 | ||||
-rw-r--r-- | e-util/e-util.c | 41 | ||||
-rw-r--r-- | e-util/e-util.h | 3 |
5 files changed, 185 insertions, 116 deletions
diff --git a/e-util/ChangeLog b/e-util/ChangeLog index a0e1bf8f38..57bf7fd461 100644 --- a/e-util/ChangeLog +++ b/e-util/ChangeLog @@ -1,3 +1,15 @@ +2006-11-28 Daniel Gryniewicz <dang@gentoo.org> + + ** Fix for bug #349966 + + * e-dialog-utils.c: (save_ok), (filechooser_response), + (e_file_dialog_save), (save_folder_ok), (folderchooser_response), + (e_file_dialog_save_folder), (e_file_get_save_filesel), + (e_file_can_save), (e_file_check_local): + * e-dialog-utils.h: + * e-util.c: (e_file_update_save_path), (e_file_get_save_path): + * e-util.h: + 2006-11-20 Harish Krishnaswamy <kharish@novell.com> * e-icon-factory.c: (load_icon), (e_icon_factory_get_icon): diff --git a/e-util/e-dialog-utils.c b/e-util/e-dialog-utils.c index 44c5c24194..581c24240c 100644 --- a/e-util/e-dialog-utils.c +++ b/e-util/e-dialog-utils.c @@ -28,6 +28,10 @@ #include "e-dialog-utils.h" +#include <unistd.h> +#include <glib.h> +#include <glib/gstdio.h> + #include <gdkconfig.h> #ifdef GDK_WINDOWING_X11 #include <gdk/gdkx.h> @@ -37,18 +41,19 @@ #include <gtk/gtkplug.h> #include <gtk/gtkversion.h> -#ifdef USE_GTKFILECHOOSER #include <gtk/gtkfilechooser.h> #include <gtk/gtkfilechooserdialog.h> #include <gtk/gtkstock.h> -#else -#include <gtk/gtkfilesel.h> -#endif #include <gconf/gconf-client.h> #include <libgnome/gnome-i18n.h> #include <libgnome/gnome-util.h> +#include <libgnomevfs/gnome-vfs-utils.h> + +#include "e-util/e-util.h" +#include "e-util/e-error.h" + /** * e_notice: @@ -261,104 +266,42 @@ save_ok (GtkWidget *widget, gpointer data) GtkWidget *fs; char **filename = data; char *uri; - const char *path; - int btn = GTK_RESPONSE_YES; - GConfClient *gconf = gconf_client_get_default(); - char *dir; fs = gtk_widget_get_toplevel (widget); -#ifdef USE_GTKFILECHOOSER - path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fs)); uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fs)); -#else - path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)); -#endif - - if (g_file_test (path, G_FILE_TEST_IS_REGULAR)) { - GtkWidget *dlg; - - dlg = gtk_message_dialog_new (GTK_WINDOW (fs), 0, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - _("A file by that name already exists.\n" - "Overwrite it?")); - gtk_window_set_title (GTK_WINDOW (dlg), _("Overwrite file?")); - gtk_dialog_set_has_separator (GTK_DIALOG (dlg), FALSE); - - btn = gtk_dialog_run (GTK_DIALOG (dlg)); - gtk_widget_destroy (dlg); - } - if (btn == GTK_RESPONSE_YES) { - dir = g_path_get_dirname (path); - gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", dir, NULL); - g_free (dir); + if (e_file_can_save((GtkWindow *)widget, uri)) { + e_file_update_save_path(gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER(fs)), TRUE); *filename = uri; } - g_object_unref(gconf); gtk_main_quit (); } -#ifdef USE_GTKFILECHOOSER static void filechooser_response (GtkWidget *fc, gint response_id, gpointer data) { - if (response_id == GTK_RESPONSE_ACCEPT) + if (response_id == GTK_RESPONSE_OK) save_ok (fc, data); else gtk_widget_destroy (fc); } -#endif char * e_file_dialog_save (const char *title, const char *fname) { GtkWidget *selection; char *filename = NULL; - char *dir, *gdir = NULL; - GConfClient *gconf; - - gconf = gconf_client_get_default(); - dir = gdir = gconf_client_get_string(gconf, "/apps/evolution/mail/save_dir", NULL); - g_object_unref(gconf); - - if (dir == NULL) - dir = (char *)g_get_home_dir(); - -#ifdef USE_GTKFILECHOOSER - selection = gtk_file_chooser_dialog_new (title, - NULL, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), dir); - gtk_file_chooser_set_local_only (selection, FALSE); - - if (fname) - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER (selection), fname); - - g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (filechooser_response), &filename); -#else - char *path; - selection = gtk_file_selection_new (title); - path = g_strdup_printf ("%s/", dir); - gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path); - g_free (path); + selection = e_file_get_save_filesel(NULL, title, fname, GTK_FILE_CHOOSER_ACTION_SAVE); - g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->ok_button), "clicked", G_CALLBACK (save_ok), &filename); - g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->cancel_button), "clicked", G_CALLBACK (gtk_main_quit), NULL); -#endif + g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (filechooser_response), &filename); gtk_widget_show (GTK_WIDGET (selection)); gtk_grab_add (GTK_WIDGET (selection)); gtk_main (); gtk_widget_destroy (GTK_WIDGET (selection)); - g_free (gdir); return filename; } @@ -369,83 +312,147 @@ save_folder_ok (GtkWidget *widget, gpointer data) GtkWidget *fs; char **filename = data; char *uri; - const char *path; - GConfClient *gconf = gconf_client_get_default(); fs = gtk_widget_get_toplevel (widget); -#ifdef USE_GTKFILECHOOSER - path = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (fs)); uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (fs)); -#else - path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)); -#endif - gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", path, NULL); - g_object_unref(gconf); + e_file_update_save_path(uri, FALSE); *filename = uri; gtk_main_quit (); } -#ifdef USE_GTKFILECHOOSER static void folderchooser_response (GtkWidget *fc, gint response_id, gpointer data) { - if (response_id == GTK_RESPONSE_ACCEPT) + if (response_id == GTK_RESPONSE_OK) save_folder_ok (fc, data); else gtk_widget_destroy (fc); } -#endif char * e_file_dialog_save_folder (const char *title) { GtkWidget *selection; -#ifndef USE_GTKFILECHOOSER - char *path; -#endif char *filename = NULL; - char *dir, *gdir = NULL; - GConfClient *gconf; - - gconf = gconf_client_get_default(); - dir = gdir = gconf_client_get_string(gconf, "/apps/evolution/mail/save_dir", NULL); - g_object_unref(gconf); - - if (dir == NULL) - dir = (char *)g_get_home_dir(); - -#ifdef USE_GTKFILECHOOSER - selection = gtk_file_chooser_dialog_new (title, - NULL, - GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (selection), GTK_RESPONSE_ACCEPT); - gtk_file_chooser_set_local_only (selection, FALSE); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (selection), dir); + selection = e_file_get_save_filesel(NULL, title, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); g_signal_connect (G_OBJECT (selection), "response", G_CALLBACK (folderchooser_response), &filename); -#else - selection = gtk_file_selection_new (title); - path = g_strdup_printf ("%s/", dir); - gtk_file_selection_set_filename (GTK_FILE_SELECTION (selection), path); - g_free (path); - - g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->ok_button), "clicked", G_CALLBACK (save_folder_ok), &filename); - g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (selection)->cancel_button), "clicked", G_CALLBACK (gtk_main_quit), NULL); -#endif gtk_widget_show (GTK_WIDGET (selection)); gtk_grab_add (GTK_WIDGET (selection)); gtk_main (); gtk_widget_destroy (GTK_WIDGET (selection)); - g_free (gdir); return filename; } +/** + * e_file_get_save_filesel: + * @parent: parent window + * @title: dialog title + * @name: filename + * @action: action for dialog + * + * Creates a save dialog, using the saved directory from gconf. The dialog has + * no signals connected and is not shown. + **/ +GtkWidget * +e_file_get_save_filesel (GtkWidget *parent, const char *title, const char *name, GtkFileChooserAction action) +{ + GtkWidget *filesel; + char *realname, *uri; + + filesel = gtk_file_chooser_dialog_new (title, + NULL, + action, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (filesel), GTK_RESPONSE_OK); + gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (filesel), FALSE); + + if (parent) + e_dialog_set_transient_for((GtkWindow *)filesel, parent); + + uri = e_file_get_save_path(); + + if (name && name[0]) { + realname = gnome_vfs_escape_string (name); + } else { + realname = NULL; + } + + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (filesel), uri); + + if (realname) + gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), realname); + + g_free (realname); + g_free (uri); + + return filesel; +} + +/** + * e_file_can_save: + * + * Return TRUE if the URI can be saved to, FALSE otherwise. It checks local + * files to see if they're regular and can be accessed. If the file exists and + * is writable, it pops up a dialog asking the user if they want to overwrite + * it. Returns the users choice. + **/ +gboolean +e_file_can_save(GtkWindow *parent, const char *uri) +{ + struct stat st; + char *path; + gboolean res; + + if (!uri || uri[0] == 0) + return FALSE; + + /* Assume remote files are writable; too costly to check */ + if (!e_file_check_local(uri)) + return TRUE; + + path = gnome_vfs_get_local_path_from_uri(uri); + if (!path) + return FALSE; + /* make sure we can actually save to it... */ + if (g_stat (path, &st) != -1 && !S_ISREG (st.st_mode)) { + g_free(path); + return FALSE; + } + + res = TRUE; + if (g_access (path, F_OK) == 0) { + if (g_access (path, W_OK) != 0) { e_error_run(parent, "mail:no-save-path", path, g_strerror(errno), NULL); + g_free(path); + return FALSE; + } + + res = e_error_run(parent, E_ERROR_ASK_FILE_EXISTS_OVERWRITE, path, NULL) == GTK_RESPONSE_OK; + + } + + g_free(path); + return res; +} + +gboolean +e_file_check_local (const char *name) +{ + char *uri; + + uri = gnome_vfs_get_local_path_from_uri(name); + if (uri) { + g_free(uri); + return TRUE; + } + + return FALSE; +} diff --git a/e-util/e-dialog-utils.h b/e-util/e-dialog-utils.h index 6ae3a2ec23..57cfac90c3 100644 --- a/e-util/e-dialog-utils.h +++ b/e-util/e-dialog-utils.h @@ -24,6 +24,7 @@ #define E_DIALOG_UTILS_H #include <gtk/gtkmessagedialog.h> +#include <gtk/gtkfilechooser.h> void e_notice (gpointer parent, GtkMessageType type, @@ -43,5 +44,10 @@ char *e_file_dialog_save (const char *title, const char *fname) char *e_file_dialog_save_folder (const char *title); +GtkWidget * e_file_get_save_filesel (GtkWidget *parent, const char *title, const char *name, GtkFileChooserAction action); + +gboolean e_file_can_save(GtkWindow *parent, const char *uri); +gboolean e_file_check_local(const char *name); + #endif diff --git a/e-util/e-util.c b/e-util/e-util.c index d213296041..5d854e0d51 100644 --- a/e-util/e-util.c +++ b/e-util/e-util.c @@ -1187,4 +1187,45 @@ get_font_options () return font_options; } +/** + * e_file_update_save_path: + * @uri: URI to store + * @free: If TRUE, free uri + * + * Save the save_dir path for evolution. If free is TRUE, uri gets freed when + * done. Genearally, this should be called with the output of + * gtk_file_chooser_get_current_folder_uri() The URI must be a path URI, not a + * file URI. + **/ +void +e_file_update_save_path(char *uri, gboolean free) +{ + GConfClient *gconf = gconf_client_get_default(); + + gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", uri, NULL); + g_object_unref(gconf); + if (free) + g_free(uri); +} + +/** + * e_file_get_save_path: + * + * Return the save_dir path for evolution. If there isn't a save_dir, returns + * the users home directory. Returns an allocated URI that should be freed by + * the caller. + **/ +char * +e_file_get_save_path(void) +{ + GConfClient *gconf = gconf_client_get_default(); + char *uri; + + uri = gconf_client_get_string(gconf, "/apps/evolution/mail/save_dir", NULL); + g_object_unref(gconf); + + if (uri == NULL) + uri = gnome_vfs_get_uri_from_local_path(g_get_home_dir()); + return (uri); +} diff --git a/e-util/e-util.h b/e-util/e-util.h index 1d3d6ba150..d0faa995d8 100644 --- a/e-util/e-util.h +++ b/e-util/e-util.h @@ -217,6 +217,9 @@ gchar *e_strdup_append_strings (gcha ...); cairo_font_options_t * get_font_options (); +void e_file_update_save_path(char *uri, gboolean free); +char *e_file_get_save_path(void); + #ifdef __cplusplus } #endif /* __cplusplus */ |