Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2007-01-13 13:16:13 (GMT)
committer Carlos Garcia Campos <carlosgc@src.gnome.org>2007-01-13 13:16:13 (GMT)
commitaaea26139003ab196a978dd7127a748d6ebca5a5 (patch)
tree735c10ce1bbca8166ef9a0d593103ba27afea9d8 /shell
parent0128689c3246132ac4a9de6a01ca10b99510b00d (diff)
Do Save a copy in atomic way. Fixes bug #328266.
2007-01-13 Carlos Garcia Campos <carlosgc@gnome.org> * shell/ev-window.c: (file_save_dialog_response_cb): Do Save a copy in atomic way. Fixes bug #328266. svn path=/trunk/; revision=2221
Diffstat (limited to 'shell')
-rw-r--r--shell/ev-window.c60
1 files changed, 48 insertions, 12 deletions
diff --git a/shell/ev-window.c b/shell/ev-window.c
index ba8de92..07080e7 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -1585,23 +1585,59 @@ file_save_dialog_response_cb (GtkWidget *fc,
gboolean success;
if (response_id == GTK_RESPONSE_OK) {
- gchar *uri;
- GError *err = NULL;
+ gint fd;
+ gchar *filename;
+ gchar *tmp_filename;
+ GError *error = NULL;
- uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc));
+ tmp_filename = g_strdup_printf ("%s.XXXXXX", filename);
+
+ fd = g_mkstemp (tmp_filename);
+ if (fd == -1) {
+ gchar *display_name;
+ gint save_errno = errno;
+
+ display_name = g_filename_display_name (tmp_filename);
+ g_set_error (&error,
+ G_FILE_ERROR,
+ g_file_error_from_errno (save_errno),
+ _("Failed to create file ā€œ%sā€: %s"),
+ display_name, g_strerror (save_errno));
+ g_free (display_name);
+ } else {
+ gchar *uri;
+
+ uri = g_filename_to_uri (tmp_filename, NULL, NULL);
+
+ ev_document_doc_mutex_lock ();
+ success = ev_document_save (ev_window->priv->document,
+ uri,
+ &error);
+ ev_document_doc_mutex_unlock ();
- ev_document_doc_mutex_lock ();
- success = ev_document_save (ev_window->priv->document, uri, &err);
- ev_document_doc_mutex_unlock ();
+ g_free (uri);
+ close (fd);
+ }
- if (err) {
+ if (!error) {
+ if (g_rename (tmp_filename, filename) == -1) {
+ g_unlink (tmp_filename);
+ }
+ } else {
gchar *msg;
+ gchar *uri;
+
+ uri = g_filename_to_uri (filename, NULL, NULL);
msg = g_strdup_printf (_("The file could not be saved as ā€œ%sā€."), uri);
- ev_window_error_dialog (GTK_WINDOW (fc), msg, err);
+ ev_window_error_dialog (GTK_WINDOW (ev_window), msg, error);
g_free (msg);
+ g_free (uri);
+ g_error_free (error);
}
-
- g_free (uri);
+
+ g_free (tmp_filename);
+ g_free (filename);
}
gtk_widget_destroy (fc);
@@ -4317,7 +4353,7 @@ image_save_dialog_response_cb (GtkWidget *fc,
filename, "png", &error, NULL);
if (error) {
- ev_window_error_dialog (GTK_WINDOW (fc),
+ ev_window_error_dialog (GTK_WINDOW (ev_window),
_("The image could not be saved."),
error);
g_error_free (error);
@@ -4438,7 +4474,7 @@ attachment_save_dialog_response_cb (GtkWidget *fc,
g_free (filename);
if (error) {
- ev_window_error_dialog (GTK_WINDOW (fc),
+ ev_window_error_dialog (GTK_WINDOW (ev_window),
_("The attachment could not be saved."),
error);
g_error_free (error);