]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-file-helpers.c
Rename GIRs to EvinceDocument/EvinceView.
[evince.git] / libdocument / ev-file-helpers.c
index 9c65aa5e9e445d37e0ccd20a900082254b7035bb..6a3d2fa019e422943cb901cb26fe5c46e3c2fbf9 100644 (file)
 #include <glib/gstdio.h>
 #include <errno.h>
 
-#if WITH_GNOME
-#include <libgnome/gnome-init.h>
-#endif
-
 #include "ev-file-helpers.h"
 
 static gchar *tmp_dir = NULL;
@@ -75,12 +71,12 @@ ev_tmp_dir (void)
 }
 
 void
-ev_file_helpers_init (void)
+_ev_file_helpers_init (void)
 {
 }
 
 void
-ev_file_helpers_shutdown (void)
+_ev_file_helpers_shutdown (void)
 {      
        if (tmp_dir != NULL)    
                g_rmdir (tmp_dir);
@@ -216,9 +212,9 @@ ev_xfer_uri_simple (const char *from,
 static gchar *
 get_mime_type_from_uri (const gchar *uri, GError **error)
 {
-       GFile     *file;
-       GFileInfo *file_info;
-       gchar     *mime_type;
+       GFile       *file;
+       GFileInfo   *file_info;
+       const gchar *content_type;
 
        file = g_file_new_for_uri (uri);
        file_info = g_file_query_info (file,
@@ -229,11 +225,13 @@ get_mime_type_from_uri (const gchar *uri, GError **error)
        if (file_info == NULL)
                return NULL;
 
-       mime_type = g_content_type_get_mime_type (
-                       g_file_info_get_content_type (file_info));
+       content_type = g_file_info_get_content_type (file_info);
        g_object_unref (file_info);
 
-       return mime_type;
+       if (!content_type)
+               return NULL;
+
+       return g_content_type_get_mime_type (content_type);
 }
 
 static gchar *
@@ -243,6 +241,8 @@ get_mime_type_from_data (const gchar *uri, GError **error)
        GFileInputStream *input_stream;
        gssize            size_read;
        guchar            buffer[1024];
+       gboolean          retval;
+       gchar            *content_type, *mime_type;
 
        file = g_file_new_for_uri (uri);
        
@@ -253,19 +253,43 @@ get_mime_type_from_data (const gchar *uri, GError **error)
        }
 
        size_read = g_input_stream_read (G_INPUT_STREAM (input_stream),
-                                        buffer, 1024, NULL, NULL);
-       g_input_stream_close (G_INPUT_STREAM (input_stream), NULL, error);
+                                        buffer, sizeof (buffer), NULL, error);
+       if (size_read == -1) {
+               g_object_unref (input_stream);
+               g_object_unref (file);
+               return NULL;
+       }
+
+       retval = g_input_stream_close (G_INPUT_STREAM (input_stream), NULL, error);
 
+       g_object_unref (input_stream);
        g_object_unref (file);
+       if (!retval)
+               return NULL;
 
-       if (size_read == -1)
+       content_type = g_content_type_guess (NULL, /* no filename */
+                                            buffer, size_read,
+                                            NULL);
+       if (!content_type)
                return NULL;
 
-       return g_content_type_guess (NULL, /* no filename */
-                                    buffer, 1024,
-                                    NULL);
+       mime_type = g_content_type_get_mime_type (content_type);
+       g_free (content_type);
+       return mime_type;
 }
 
+/**
+ * ev_file_get_mime_type:
+ * @uri: the URI
+ * @fast: whether to use fast MIME type detection
+ * @error: a #GError location to store an error, or %NULL
+ *
+ * Note: on unknown MIME types, this may return NULL without @error
+ * being filled in.
+ * 
+ * Returns: a newly allocated string with the MIME type of the file at
+ *   @uri, or %NULL on error or if the MIME type could not be determined
+ */
 gchar *
 ev_file_get_mime_type (const gchar *uri,
                       gboolean     fast,
@@ -291,15 +315,22 @@ compression_run (const gchar       *uri,
        gchar *filename, *filename_dst;
        gchar *cmd;
        gint   fd, pout;
+       GError *err = NULL;
 
        if (type == EV_COMPRESSION_NONE)
                return NULL;
 
        cmd = g_find_program_in_path ((type == EV_COMPRESSION_BZIP2) ? BZIPCOMMAND : GZIPCOMMAND);
-       if (!cmd)
+       if (!cmd) {
+               /* FIXME: better error codes! */
+               /* FIXME: i18n later */
+               g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED,
+                            "Failed to find the \"%s\" command in the search path.",
+                            type == EV_COMPRESSION_BZIP2 ? BZIPCOMMAND : GZIPCOMMAND);
                return NULL;
+       }
 
-       filename = g_filename_from_uri (uri, NULL, NULL);
+       filename = g_filename_from_uri (uri, NULL, error);
        if (!filename) {
                g_free (cmd);
                return NULL;
@@ -308,9 +339,16 @@ compression_run (const gchar       *uri,
        filename_dst = g_build_filename (ev_tmp_dir (), "evinceXXXXXX", NULL);
        fd = g_mkstemp (filename_dst);
        if (fd < 0) {
+               int errsv = errno;
+
                g_free (cmd);
                g_free (filename);
                g_free (filename_dst);
+
+               g_set_error (error, G_IO_ERROR,
+                            g_io_error_from_errno (errsv),
+                            "Error creating a temporary file: %s",
+                            g_strerror (errsv));
                return NULL;
        }
 
@@ -322,7 +360,7 @@ compression_run (const gchar       *uri,
        if (g_spawn_async_with_pipes (NULL, argv, NULL,
                                      G_SPAWN_STDERR_TO_DEV_NULL,
                                      NULL, NULL, NULL,
-                                     NULL, &pout, NULL, error)) {
+                                     NULL, &pout, NULL, &err)) {
                GIOChannel *in, *out;
                gchar buf[BUFFER_SIZE];
                GIOStatus read_st, write_st;
@@ -356,8 +394,10 @@ compression_run (const gchar       *uri,
 
        close (fd);
 
-       if (*error == NULL) {
-               uri_dst = g_filename_to_uri (filename_dst, NULL, NULL);
+       if (err) {
+               g_propagate_error (error, err);
+       } else {
+               uri_dst = g_filename_to_uri (filename_dst, NULL, error);
        }
 
        g_free (cmd);
@@ -367,6 +407,24 @@ compression_run (const gchar       *uri,
        return uri_dst;
 }
 
+/**
+ * ev_file_uncompress:
+ * @uri: a file URI
+ * @type: the compression type
+ * @error: a #GError location to store an error, or %NULL
+ *
+ * Uncompresses the file at @uri.
+ *
+ * If @type is %EV_COMPRESSION_NONE, it does nothing and returns %NULL.
+ *
+ * Otherwise, it returns the filename of a
+ * temporary file containing the decompressed data from the file at @uri.
+ * On error it returns %NULL and fills in @error.
+ *
+ * It is the caller's responsibility to unlink the temp file after use.
+ *
+ * Returns: a newly allocated string URI, or %NULL on error
+ */
 gchar *
 ev_file_uncompress (const gchar       *uri,
                    EvCompressionType  type,
@@ -377,6 +435,25 @@ ev_file_uncompress (const gchar       *uri,
        return compression_run (uri, type, FALSE, error);
 }
 
+/**
+ * ev_file_compress:
+ * @uri: a file URI
+ * @type: the compression type
+ * @error: a #GError location to store an error, or %NULL
+ *
+ * Compresses the file at @uri.
+ * If @type is %EV_COMPRESSION_NONE, it does nothing and returns %NULL.
+ *
+ * Otherwise, it returns the filename of a
+ * temporary file containing the compressed data from the file at @uri.
+ *
+ * On error it returns %NULL and fills in @error.
+ *
+ * It is the caller's responsibility to unlink the temp file after use.
+ *
+ * Returns: a newly allocated string URI, or %NULL on error
+ */
 gchar *
 ev_file_compress (const gchar       *uri,
                  EvCompressionType  type,