]> www.fi.muni.cz Git - evince.git/commitdiff
Save document compressed when saving a copy of a compressed document.
authorCarlos Garcia Campos <carlosgc@gnome.org>
Tue, 27 Feb 2007 14:56:44 +0000 (14:56 +0000)
committerCarlos Garcia Campos <carlosgc@src.gnome.org>
Tue, 27 Feb 2007 14:56:44 +0000 (14:56 +0000)
2007-02-27  Carlos Garcia Campos  <carlosgc@gnome.org>
* 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

ChangeLog
libdocument/ev-file-helpers.c
libdocument/ev-file-helpers.h
shell/ev-window.c

index 67891244d9d0035da55df4208baa74d8dcc874f0..dcf144b871db4f82fbc8743c7d831b6e4b6146f5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2007-02-27  Carlos Garcia Campos  <carlosgc@gnome.org>
+
+       * 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  <carlosgc@gnome.org>
 
        * shell/ev-view.c: (ev_view_goto_window_key_press_event):
index d4e9a84dcd5ffa77877f46f673e742df76805751..d9b6448418b1739e33196265d76a37f433e5cb89 100644 (file)
@@ -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);
 }
index 945573d51e25bde532679c93fe0d007e8c08ee74..f7d9f9e129a5912dcdb5a3415c29eec8018c4739 100644 (file)
@@ -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
index 81e7354dc101d5bb9005380178dbe4d7c9560824..9c74f3970fd45443ba53630e9fc860c9a01ae43e 100644 (file)
@@ -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);
 }