]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-file-helpers.c
Added. Returns whether the animation has everything necessary to run. Do
[evince.git] / libdocument / ev-file-helpers.c
index b6a50b6f8c470a5f1dbce4710007af53c496e95f..20c7bc4eabd1b8c66927ceafc401500b708a11de 100644 (file)
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <errno.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <errno.h>
-#include <libgnomevfs/gnome-vfs-uri.h>
-#include <libgnomevfs/gnome-vfs-utils.h>
-#include <libgnomevfs/gnome-vfs-ops.h>
-#include <libgnomevfs/gnome-vfs-xfer.h>
+
+#if WITH_GNOME
+#include <libgnome/gnome-init.h>
+#endif
 
 #include "ev-file-helpers.h"
 
 
 #include "ev-file-helpers.h"
 
@@ -46,7 +46,7 @@ ensure_dir_exists (const char *dir)
        if (g_file_test (dir, G_FILE_TEST_IS_DIR))
                return TRUE;
        
        if (g_file_test (dir, G_FILE_TEST_IS_DIR))
                return TRUE;
        
-       if (g_mkdir (dir, 488) == 0)
+       if (g_mkdir_with_parents (dir, 488) == 0)
                return TRUE;
 
        if (errno == EEXIST)
                return TRUE;
 
        if (errno == EEXIST)
@@ -62,9 +62,15 @@ ev_dot_dir (void)
        if (dot_dir == NULL) {
                gboolean exists;
 
        if (dot_dir == NULL) {
                gboolean exists;
 
+#if WITH_GNOME
                dot_dir = g_build_filename (gnome_user_dir_get (),
                                            "evince",
                                            NULL);
                dot_dir = g_build_filename (gnome_user_dir_get (),
                                            "evince",
                                            NULL);
+#else
+               dot_dir = g_build_filename (g_get_user_config_dir (),
+                                           "evince",
+                                           NULL);
+#endif
 
                exists = ensure_dir_exists (dot_dir);
                if (!exists)
 
                exists = ensure_dir_exists (dot_dir);
                if (!exists)
@@ -112,6 +118,20 @@ ev_file_helpers_shutdown (void)
        tmp_dir = NULL;
 }
 
        tmp_dir = NULL;
 }
 
+GFile *
+ev_tmp_file_get (const gchar *prefix)
+{
+       gchar *path;
+       GFile *file;
+
+       path = ev_tmp_filename (prefix);
+       file = g_file_new_for_path (path);
+       
+       g_free (path);
+       
+       return file;
+}
+
 gchar * 
 ev_tmp_filename (const gchar *prefix)
 {
 gchar * 
 ev_tmp_filename (const gchar *prefix)
 {
@@ -135,35 +155,197 @@ ev_tmp_filename (const gchar *prefix)
        return filename;
 }
 
        return filename;
 }
 
+/* Remove a local temp file created by evince */
+void
+ev_tmp_filename_unlink (const gchar *filename)
+{
+       const gchar *tempdir;
+       
+       if (!filename)
+               return;
+
+       tempdir = g_get_tmp_dir ();
+       if (g_ascii_strncasecmp (filename, tempdir, strlen (tempdir)) == 0) {
+               g_unlink (filename);
+       }
+}
+
+void
+ev_tmp_file_unlink (GFile *file)
+{
+       gboolean res;
+
+       if (!file)
+               return;
+       
+       res = g_file_delete (file, NULL, NULL);
+       if (!res) {
+               char *uri;
+               
+               uri = g_file_get_uri (file);
+               g_warning ("Unable to delete temp file %s\n", uri);
+               g_free (uri);
+       }
+}
+
+void
+ev_tmp_uri_unlink (const gchar *uri)
+{
+       GFile *file;
+       
+       if (!uri)
+               return;
+       
+       file = g_file_new_for_uri (uri);
+       if (!g_file_is_native (file)) {
+               g_warning ("Attempting to delete non native uri: %s\n", uri);
+               g_object_unref (file);
+               return;
+       }
+       
+       ev_tmp_file_unlink (file);
+       g_object_unref (file);
+}
+
 gboolean
 ev_xfer_uri_simple (const char *from,
                    const char *to,
                    GError     **error)
 {
 gboolean
 ev_xfer_uri_simple (const char *from,
                    const char *to,
                    GError     **error)
 {
-       GnomeVFSResult result;
-       GnomeVFSURI *source_uri;
-       GnomeVFSURI *target_uri;
+       GFile *source_file;
+       GFile *target_file;
+       GError *ioerror;
+       gboolean result;
        
        if (!from)
                return FALSE;
        
        
        if (!from)
                return FALSE;
        
-       source_uri = gnome_vfs_uri_new (from);
-       target_uri = gnome_vfs_uri_new (to);
-
-       result = gnome_vfs_xfer_uri (source_uri, target_uri, 
-                                    GNOME_VFS_XFER_DEFAULT | GNOME_VFS_XFER_FOLLOW_LINKS,
-                                    GNOME_VFS_XFER_ERROR_MODE_ABORT,
-                                    GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
-                                    NULL,
-                                    NULL);
-       gnome_vfs_uri_unref (target_uri);
-       gnome_vfs_uri_unref (source_uri);
+       source_file = g_file_new_for_uri (from);
+       target_file = g_file_new_for_uri (to);
+       
+       result = g_file_copy (source_file, target_file,
+                             G_FILE_COPY_OVERWRITE,
+                             NULL, NULL, NULL, &ioerror);
+
+       g_object_unref (target_file);
+       g_object_unref (source_file);
     
     
-       if (result != GNOME_VFS_OK)
-               g_set_error (error,
-                            G_FILE_ERROR,
-                            G_FILE_ERROR_FAILED,
-                            gnome_vfs_result_to_string (result));
-       return (result == GNOME_VFS_OK);
+       if (!result) {
+               g_propagate_error (error, ioerror);
+       }
+       return result;
+
+}
+
+/* Compressed files support */
+#define BZIPCOMMAND "bzip2"
+#define GZIPCOMMAND "gzip"
+#define N_ARGS      4
+#define BUFFER_SIZE 1024
+
+static gchar *
+compression_run (const gchar       *uri,
+                EvCompressionType  type,
+                gboolean           compress, 
+                GError           **error)
+{
+       gchar *argv[N_ARGS];
+       gchar *uri_dst = NULL;
+       gchar *filename, *filename_dst;
+       gchar *cmd;
+       gint   fd, pout;
+
+       if (type == EV_COMPRESSION_NONE)
+               return NULL;
+
+       cmd = g_find_program_in_path ((type == EV_COMPRESSION_BZIP2) ? BZIPCOMMAND : GZIPCOMMAND);
+       if (!cmd)
+               return NULL;
+
+       filename = g_filename_from_uri (uri, NULL, NULL);
+       if (!filename) {
+               g_free (cmd);
+               return NULL;
+       }
+       
+       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_dst);
+               return NULL;
+       }
+
+       argv[0] = cmd;
+       argv[1] = compress ? "-c" : "-cd";
+       argv[2] = filename;
+       argv[3] = NULL;
+
+       if (g_spawn_async_with_pipes (NULL, argv, NULL,
+                                     G_SPAWN_STDERR_TO_DEV_NULL,
+                                     NULL, NULL, NULL,
+                                     NULL, &pout, NULL, error)) {
+               GIOChannel *in, *out;
+               gchar buf[BUFFER_SIZE];
+               GIOStatus read_st, write_st;
+               gsize bytes_read, bytes_written;
+
+               in = g_io_channel_unix_new (pout);
+               g_io_channel_set_encoding (in, NULL, NULL);
+               out = g_io_channel_unix_new (fd);
+               g_io_channel_set_encoding (out, NULL, NULL);
+
+               do {
+                       read_st = g_io_channel_read_chars (in, buf,
+                                                          BUFFER_SIZE,
+                                                          &bytes_read,
+                                                          error);
+                       if (read_st == G_IO_STATUS_NORMAL) {
+                               write_st = g_io_channel_write_chars (out, buf,
+                                                                    bytes_read,
+                                                                    &bytes_written,
+                                                                    error);
+                               if (write_st == G_IO_STATUS_ERROR)
+                                       break;
+                       } else if (read_st == G_IO_STATUS_ERROR) {
+                               break;
+                       }
+               } while (bytes_read > 0);
+
+               g_io_channel_unref (in);
+               g_io_channel_unref (out);
+       }
+
+       close (fd);
+
+       if (*error == NULL) {
+               uri_dst = g_filename_to_uri (filename_dst, NULL, NULL);
+       }
+
+       g_free (cmd);
+       g_free (filename);
+       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 compression_run (uri, type, TRUE, error);
 }
 }