From 67dbdd12a75b63b11f1a7ebe7324445ad17ceb13 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 27 Feb 2007 14:56:44 +0000 Subject: Save document compressed when saving a copy of a compressed document. 2007-02-27 Carlos Garcia Campos * libdocument/ev-file-helpers.[ch]: (compression_run), (ev_file_uncompress), (ev_file_compress): * shell/ev-window.c: (file_save_dialog_response_cb): Save document compressed when saving a copy of a compressed document. Fixes bug #334542. svn path=/trunk/; revision=2356 --- diff --git a/ChangeLog b/ChangeLog index 6789124..dcf144b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-02-27 Carlos Garcia Campos + + * libdocument/ev-file-helpers.[ch]: (compression_run), + (ev_file_uncompress), (ev_file_compress): + * shell/ev-window.c: (file_save_dialog_response_cb): + + Save document compressed when saving a copy of a compressed document. + Fixes bug #334542. + 2007-02-23 Carlos Garcia Campos * shell/ev-view.c: (ev_view_goto_window_key_press_event): diff --git a/libdocument/ev-file-helpers.c b/libdocument/ev-file-helpers.c index d4e9a84..d9b6448 100644 --- a/libdocument/ev-file-helpers.c +++ b/libdocument/ev-file-helpers.c @@ -172,22 +172,21 @@ ev_xfer_uri_simple (const char *from, /* Compressed files support */ #define BZIPCOMMAND "bzip2" #define GZIPCOMMAND "gzip" -#define N_ARGS 5 +#define N_ARGS 4 #define BUFFER_SIZE 1024 -gchar * -ev_file_uncompress (const gchar *uri, - EvCompressionType type, - GError **error) +static gchar * +compression_run (const gchar *uri, + EvCompressionType type, + gboolean compress, + GError **error) { gchar *argv[N_ARGS]; - gchar *uri_unc = NULL; - gchar *filename, *filename_unc; + gchar *uri_dst = NULL; + gchar *filename, *filename_dst; gchar *cmd; gint fd, pout; - g_return_val_if_fail (uri != NULL, NULL); - if (type == EV_COMPRESSION_NONE) return NULL; @@ -195,27 +194,25 @@ ev_file_uncompress (const gchar *uri, if (!cmd) return NULL; - filename = g_filename_from_uri (uri, NULL, NULL); if (!filename) { g_free (cmd); return NULL; } - filename_unc = g_build_filename (ev_tmp_dir (), "evinceXXXXXX", NULL); - fd = g_mkstemp (filename_unc); + filename_dst = g_build_filename (ev_tmp_dir (), "evinceXXXXXX", NULL); + fd = g_mkstemp (filename_dst); if (fd < 0) { g_free (cmd); g_free (filename); - g_free (filename_unc); + g_free (filename_dst); return NULL; } - + argv[0] = cmd; - argv[1] = "-cd"; + argv[1] = compress ? "-c" : "-cd"; argv[2] = filename; - argv[3] = filename_unc; - argv[4] = NULL; + argv[3] = NULL; if (g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL, @@ -247,7 +244,7 @@ ev_file_uncompress (const gchar *uri, break; } } while (bytes_read > 0); - + g_io_channel_unref (in); g_io_channel_unref (out); } @@ -255,13 +252,32 @@ ev_file_uncompress (const gchar *uri, close (fd); if (*error == NULL) { - uri_unc = g_filename_to_uri (filename_unc, - NULL, NULL); + uri_dst = g_filename_to_uri (filename_dst, NULL, NULL); } g_free (cmd); g_free (filename); - g_free (filename_unc); + g_free (filename_dst); + + return uri_dst; +} + +gchar * +ev_file_uncompress (const gchar *uri, + EvCompressionType type, + GError **error) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return compression_run (uri, type, FALSE, error); +} + +gchar * +ev_file_compress (const gchar *uri, + EvCompressionType type, + GError **error) +{ + g_return_val_if_fail (uri != NULL, NULL); - return uri_unc; + return compression_run (uri, type, TRUE, error); } diff --git a/libdocument/ev-file-helpers.h b/libdocument/ev-file-helpers.h index 945573d..f7d9f9e 100644 --- a/libdocument/ev-file-helpers.h +++ b/libdocument/ev-file-helpers.h @@ -47,6 +47,9 @@ gboolean ev_xfer_uri_simple (const char *from, gchar *ev_file_uncompress (const gchar *uri, EvCompressionType type, GError **error); +gchar *ev_file_compress (const gchar *uri, + EvCompressionType type, + GError **error); G_END_DECLS diff --git a/shell/ev-window.c b/shell/ev-window.c index 81e7354..9c74f39 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -1543,11 +1543,11 @@ ev_window_create_tmp_symlink (const gchar *filename, GError **error) static void ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest) { - GError *error = NULL; - gchar *symlink_uri; - gchar *old_filename; - gchar *new_filename; - gchar *uri_unc; + GError *error = NULL; + gchar *symlink_uri; + gchar *old_filename; + gchar *new_filename; + const gchar *uri_unc; uri_unc = g_object_get_data (G_OBJECT (window->priv->document), "uri-uncompressed"); @@ -1696,13 +1696,11 @@ ev_window_get_recent_file_label (gint index, const gchar *filename) p = filename; end = filename + length; - while (p != end) - { + while (p != end) { const gchar *next; next = g_utf8_next_char (p); - switch (*p) - { + switch (*p) { case '_': g_string_append (str, "__"); break; @@ -1818,63 +1816,100 @@ file_save_dialog_response_cb (GtkWidget *fc, gint response_id, EvWindow *ev_window) { - gboolean success; + const gchar *uri_unc; + gint fd; + gchar *filename; + gchar *tmp_filename; + GError *error = NULL; - if (response_id == GTK_RESPONSE_OK) { - gint fd; - gchar *filename; - gchar *tmp_filename; - GError *error = NULL; + if (response_id != GTK_RESPONSE_OK) { + gtk_widget_destroy (fc); + return; + } + - filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (fc)); - tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); + 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; - 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; + 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 (); + ev_document_save (ev_window->priv->document, uri, &error); + ev_document_doc_mutex_unlock (); + + g_free (uri); + close (fd); + } - 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 (); + if (!error) { + uri_unc = g_object_get_data (G_OBJECT (ev_window->priv->document), + "uri-uncompressed"); + if (uri_unc) { + EvCompressionType ctype; + gchar *uri_comp; + gchar *uri; + const gchar *ext; + ctype = EV_COMPRESSION_NONE; + + ext = g_strrstr (ev_window->priv->uri, ".gz"); + if (ext && g_ascii_strcasecmp (ext, ".gz") == 0) + ctype = EV_COMPRESSION_GZIP; + + ext = g_strrstr (ev_window->priv->uri, ".bz2"); + if (ext && g_ascii_strcasecmp (ext, ".bz2") == 0) + ctype = EV_COMPRESSION_BZIP2; + + uri = g_filename_to_uri (tmp_filename, NULL, NULL); + uri_comp = ev_file_compress (uri, ctype, &error); g_free (uri); - close (fd); - } + g_unlink (tmp_filename); + g_free (tmp_filename); - if (!error) { - if (g_rename (tmp_filename, filename) == -1) { - g_unlink (tmp_filename); + if (!uri_comp || error) { + tmp_filename = NULL; + } else { + tmp_filename = g_filename_from_uri (uri_comp, + NULL, NULL); } - } 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 (ev_window), msg, error); - g_free (msg); - g_free (uri); - g_error_free (error); + + g_free (uri_comp); } + } + + if (tmp_filename && g_rename (tmp_filename, filename) == -1) { + g_unlink (tmp_filename); + } + + if (error) { + gchar *msg; + gchar *uri; - g_free (tmp_filename); - g_free (filename); + 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 (ev_window), msg, error); + g_free (msg); + g_free (uri); + g_error_free (error); } + + g_free (tmp_filename); + g_free (filename); gtk_widget_destroy (fc); } -- cgit v0.9.1