aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Gryniewicz <dang@gentoo.org>2006-11-28 02:49:11 +0800
committerSrinivasa Ragavan <sragavan@src.gnome.org>2006-11-28 02:49:11 +0800
commit6395ec0243694ee6677e65c4d5fef0731d7c7e86 (patch)
tree35b199198b2bcd4b31c2883feb8ab408c12b2ce6
parent97585dc9f97faf21762939ef107eba756a47ef63 (diff)
downloadgsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar
gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.gz
gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.bz2
gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.lz
gsoc2013-evolution-6395ec0243694ee6677e65c4d5fef0731d7c7e86.tar.xz
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
-rw-r--r--calendar/ChangeLog8
-rw-r--r--calendar/gui/apps_evolution_calendar.schemas.in.in14
-rw-r--r--calendar/gui/calendar-config-keys.h2
-rw-r--r--calendar/gui/dialogs/alarm-dialog.c1
-rw-r--r--e-util/ChangeLog12
-rw-r--r--e-util/e-dialog-utils.c239
-rw-r--r--e-util/e-dialog-utils.h6
-rw-r--r--e-util/e-util.c41
-rw-r--r--e-util/e-util.h3
-rw-r--r--mail/ChangeLog9
-rw-r--r--mail/em-utils.c167
-rw-r--r--mail/evolution-mail.schemas.in.in15
12 files changed, 258 insertions, 259 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index d235e04709..6a97fbfa9b 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,11 @@
+2006-11-28 Daniel Gryniewicz <dang@gentoo.org>
+
+ ** Fix for bug #349966
+
+ * gui/apps_evolution_calendar.schemas.in.in:
+ * gui/calendar-config-keys.h:
+ * gui/dialogs/alarm-dialog.c: (action_selection_done_cb):
+
2006-11-20 Carlos Garcia Campos <carlosgc@gnome.org>
Fixes bug #367183
diff --git a/calendar/gui/apps_evolution_calendar.schemas.in.in b/calendar/gui/apps_evolution_calendar.schemas.in.in
index 34730bd303..e024826c95 100644
--- a/calendar/gui/apps_evolution_calendar.schemas.in.in
+++ b/calendar/gui/apps_evolution_calendar.schemas.in.in
@@ -577,5 +577,19 @@
<long>The URL template to use as a free/busy data fallback, %u is replaced by the user part of the mail address and %d is replaced by the domain.</long>
</locale>
</schema>
+
+ <schema>
+ <key>/schemas/apps/evolution/calendar/audio_dir</key>
+ <applyto>/apps/evolution/calendar/audio_dir</applyto>
+ <owner>evolution-calendar</owner>
+ <type>string</type>
+ <locale name="C">
+ <short>Save directory for alarm audio</short>
+ <long>
+ Directory for saving alarm audio files
+ </long>
+ </locale>
+ </schema>
+
</schemalist>
</gconfschemafile>
diff --git a/calendar/gui/calendar-config-keys.h b/calendar/gui/calendar-config-keys.h
index 2f85954ab7..b1fe13918b 100644
--- a/calendar/gui/calendar-config-keys.h
+++ b/calendar/gui/calendar-config-keys.h
@@ -91,7 +91,7 @@ G_BEGIN_DECLS
/* Free/Busy settings */
#define CALENDAR_CONFIG_TEMPLATE CALENDAR_CONFIG_PREFIX"/publish/template"
-#define CALENDAR_CONFIG_SAVE_DIR "/apps/evolution/mail/save_dir"
+#define CALENDAR_CONFIG_SAVE_DIR CALENDAR_CONFIG_PREFIX"/audio_dir"
G_END_DECLS
#endif
diff --git a/calendar/gui/dialogs/alarm-dialog.c b/calendar/gui/dialogs/alarm-dialog.c
index 90f3e72e2b..d6e03cc036 100644
--- a/calendar/gui/dialogs/alarm-dialog.c
+++ b/calendar/gui/dialogs/alarm-dialog.c
@@ -1080,6 +1080,7 @@ action_selection_done_cb (GtkMenuShell *menu_shell, gpointer data)
dir = calendar_config_get_dir_path ();
if ( dir && *dir )
gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (dialog->aalarm_file_entry), dir);
+ g_free (dir);
check_custom_sound (dialog);
break;
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 */
diff --git a/mail/ChangeLog b/mail/ChangeLog
index b4fb5a7f5a..dcc159d862 100644
--- a/mail/ChangeLog
+++ b/mail/ChangeLog
@@ -1,3 +1,12 @@
+2006-11-28 Daniel Gryniewicz <dang@gentoo.org>
+
+ ** Fix for bug #349966
+
+ * em-utils.c: (emu_save_part_response), (em_utils_save_part),
+ (emu_save_parts_response), (em_utils_save_parts),
+ (emu_save_messages_response), (em_utils_save_messages):
+ * evolution-mail.schemas.in.in:
+
2006-11-26 Srinivasa Ragavan <sragavan@novell.com>
* Fix for bug #337439 DoS attach with large emails
diff --git a/mail/em-utils.c b/mail/em-utils.c
index d8d0109fa7..0c6945444a 100644
--- a/mail/em-utils.c
+++ b/mail/em-utils.c
@@ -90,23 +90,6 @@ extern struct _CamelSession *session;
#define d(x)
-static gboolean
-emu_file_check_local (const char *name)
-{
- CamelURL *url;
- gboolean local = FALSE;
-
- url = camel_url_new (name, NULL);
- if (url == NULL)
- return TRUE;
-
- if (!g_ascii_strcasecmp (url->protocol, "file"))
- local = TRUE;
-
- camel_url_free (url);
-
- return local;
-}
/**
* em_utils_prompt_user:
* @parent: parent window
@@ -375,119 +358,24 @@ em_filename_make_safe (gchar *string)
/* Saving messages... */
-static GtkWidget *
-emu_get_save_filesel (GtkWidget *parent, const char *title, const char *name, GtkFileChooserAction action)
-{
- GtkWidget *filesel;
- const char *dir;
- char *realname, *gdir;
- GConfClient *gconf;
-
-#ifdef USE_GTKFILECHOOSER
- 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 (filesel, FALSE);
-#else
- char *filename;
-
- filesel = gtk_file_selection_new (title);
-#endif
-
- if (parent)
- e_dialog_set_transient_for((GtkWindow *)filesel, parent);
-
- 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 = g_get_home_dir();
-
- if (name && name[0]) {
- realname = g_strdup (name);
- em_filename_make_safe (realname);
- } else {
- realname = NULL;
- }
-
-#ifdef USE_GTKFILECHOOSER
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (filesel), dir);
-
- if (realname)
- gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (filesel), realname);
-#else
- filename = g_build_filename (dir, G_DIR_SEPARATOR_S, realname, NULL);
- gtk_file_selection_set_filename (GTK_FILE_SELECTION (filesel), filename);
- g_free (filename);
-#endif
-
- g_free (realname);
- g_free (gdir);
-
- return filesel;
-}
-
-static void
-emu_update_save_path(const char *filename, gboolean path)
-{
- char *dir = path ? (char *)filename : g_path_get_dirname(filename);
- GConfClient *gconf = gconf_client_get_default();
-
- gconf_client_set_string(gconf, "/apps/evolution/mail/save_dir", dir, NULL);
- g_object_unref(gconf);
- if (!path)
- g_free(dir);
-}
-
-static gboolean
-emu_can_save(GtkWindow *parent, const char *path)
-{
- struct stat st;
-
- if (!path || path[0] == 0)
- return FALSE;
-
- /* make sure we can actually save to it... */
- if (g_stat (path, &st) != -1 && !S_ISREG (st.st_mode))
- return FALSE;
-
- 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);
- return FALSE;
- }
-
- return e_error_run(parent, E_ERROR_ASK_FILE_EXISTS_OVERWRITE, path, NULL) == GTK_RESPONSE_OK;
- }
-
- return TRUE;
-}
-
static void
emu_save_part_response(GtkWidget *filesel, int response, CamelMimePart *part)
{
- const char *path;
- const char *uri;
+ char *uri;
if (response == GTK_RESPONSE_OK) {
-#ifdef USE_GTKFILECHOOSER
uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (filesel));
- path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filesel));
-#else
- path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
-#endif
- if (emu_file_check_local(uri) && !emu_can_save((GtkWindow *)filesel, path))
+ if (!e_file_can_save((GtkWindow *)filesel, uri)) {
+ g_free(uri);
return;
+ }
- emu_update_save_path(path, FALSE);
+ e_file_update_save_path(gtk_file_chooser_get_current_folder_uri(
+ GTK_FILE_CHOOSER(filesel)), TRUE);
/* FIXME: popup error if it fails? */
mail_save_part(part, uri, NULL, NULL, FALSE);
+ g_free(uri);
}
gtk_widget_destroy((GtkWidget *)filesel);
@@ -519,7 +407,7 @@ em_utils_save_part(GtkWidget *parent, const char *prompt, CamelMimePart *part)
}
}
- filesel = emu_get_save_filesel(parent, prompt, name, GTK_FILE_CHOOSER_ACTION_SAVE);
+ filesel = e_file_get_save_filesel(parent, prompt, name, GTK_FILE_CHOOSER_ACTION_SAVE);
camel_object_ref(part);
g_signal_connect (filesel, "response", G_CALLBACK (emu_save_part_response), part);
gtk_widget_show (filesel);
@@ -528,16 +416,11 @@ em_utils_save_part(GtkWidget *parent, const char *prompt, CamelMimePart *part)
static void
emu_save_parts_response (GtkWidget *filesel, int response, GSList *parts)
{
- char *path = NULL;
GSList *selected;
+ char *uri = NULL;
if (response == GTK_RESPONSE_OK) {
-#ifdef USE_GTKFILECHOOSER
- path = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (filesel));
-#else
- path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
-#endif
-
- emu_update_save_path(path, TRUE);
+ uri = gtk_file_chooser_get_current_folder_uri(GTK_FILE_CHOOSER (filesel));
+ e_file_update_save_path(uri, FALSE);
for ( selected = parts; selected != NULL; selected = selected->next) {
const char *file_name;
@@ -560,8 +443,8 @@ emu_save_parts_response (GtkWidget *filesel, int response, GSList *parts)
file_name = safe_name;
}
- file_path = g_build_filename (path, file_name, NULL);
- if (!g_file_test(file_path, (G_FILE_TEST_EXISTS)) || e_error_run(NULL, E_ERROR_ASK_FILE_EXISTS_OVERWRITE, file_name, NULL) == GTK_RESPONSE_OK)
+ file_path = g_build_filename (uri, file_name, NULL);
+ if (!e_file_check_local(file_path) || !g_file_test(file_path, (G_FILE_TEST_EXISTS)) || e_error_run(NULL, E_ERROR_ASK_FILE_EXISTS_OVERWRITE, file_name, NULL) == GTK_RESPONSE_OK)
mail_save_part(part, file_path, NULL, NULL, FALSE);
else
g_warning ("Could not save %s. File already exists", file_path);
@@ -570,7 +453,7 @@ emu_save_parts_response (GtkWidget *filesel, int response, GSList *parts)
g_free (safe_name);
}
- g_free (path);
+ g_free (uri);
}
g_slist_free (parts);
@@ -582,7 +465,7 @@ em_utils_save_parts (GtkWidget *parent, const char *prompt, GSList * parts)
{
GtkWidget *filesel;
- filesel = emu_get_save_filesel (parent, prompt, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+ filesel = e_file_get_save_filesel (parent, prompt, NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
g_signal_connect (filesel, "response", G_CALLBACK (emu_save_parts_response), parts);
gtk_widget_show (filesel);
}
@@ -643,21 +526,21 @@ struct _save_messages_data {
static void
emu_save_messages_response(GtkWidget *filesel, int response, struct _save_messages_data *data)
{
- const char *path;
+ char *uri;
if (response == GTK_RESPONSE_OK) {
-#ifdef USE_GTKFILECHOOSER
- path = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (filesel));
-#else
- path = gtk_file_selection_get_filename (GTK_FILE_SELECTION (filesel));
-#endif
+ uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (filesel));
- if (!emu_can_save((GtkWindow *)filesel, path))
+ if (!e_file_can_save((GtkWindow *)filesel, uri)) {
+ g_free(uri);
return;
+ }
- emu_update_save_path(path, FALSE);
- mail_save_messages(data->folder, data->uids, path, NULL, NULL);
+ e_file_update_save_path(gtk_file_chooser_get_current_folder_uri(
+ GTK_FILE_CHOOSER (filesel)), TRUE);
+ mail_save_messages(data->folder, data->uids, uri, NULL, NULL);
data->uids = NULL;
+ g_free(uri);
}
camel_object_unref(data->folder);
@@ -685,7 +568,7 @@ em_utils_save_messages (GtkWidget *parent, CamelFolder *folder, GPtrArray *uids)
g_return_if_fail (CAMEL_IS_FOLDER (folder));
g_return_if_fail (uids != NULL);
- filesel = emu_get_save_filesel(parent, _("Save Message..."), NULL, GTK_FILE_CHOOSER_ACTION_SAVE);
+ filesel = e_file_get_save_filesel(parent, _("Save Message..."), NULL, GTK_FILE_CHOOSER_ACTION_SAVE);
camel_object_ref(folder);
data = g_malloc(sizeof(struct _save_messages_data));
diff --git a/mail/evolution-mail.schemas.in.in b/mail/evolution-mail.schemas.in.in
index 692a190ee4..6ab3b1b844 100644
--- a/mail/evolution-mail.schemas.in.in
+++ b/mail/evolution-mail.schemas.in.in
@@ -942,5 +942,20 @@
</locale>
</schema>
+ <!-- save directory settings -->
+
+ <schema>
+ <key>/schemas/apps/evolution/mail/save_dir</key>
+ <applyto>/apps/evolution/mail/save_dir</applyto>
+ <owner>evolution-mail</owner>
+ <type>string</type>
+ <locale name="C">
+ <short>Save directory</short>
+ <long>
+ Directory for saving mail component files
+ </long>
+ </locale>
+ </schema>
+
</schemalist>
</gconfschemafile>