]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-file-helpers.c
[printing] Fix multipage even/odd printing issues
[evince.git] / libdocument / ev-file-helpers.c
index 2546fe700d4282ebc6902c00a931a280b520535d..3da4a59832d5031bedac8c19a00c3ef62fc4686b 100644 (file)
@@ -122,6 +122,12 @@ ev_tmp_filename (const gchar *prefix)
        return filename;
 }
 
+gchar * 
+ev_tmp_directory (const gchar *prefix) 
+{
+       return ev_tmp_filename (prefix ? prefix : "directory");
+}
+
 /* Remove a local temp file created by evince */
 void
 ev_tmp_filename_unlink (const gchar *filename)
@@ -176,6 +182,16 @@ ev_tmp_uri_unlink (const gchar *uri)
        g_object_unref (file);
 }
 
+/**
+ * ev_xfer_uri_simple:
+ * @from: the source URI
+ * @to: the target URI
+ * @error: a #GError location to store an error, or %NULL
+ *
+ * Performs a g_file_copy() from @from to @to.
+ *
+ * Returns: %TRUE on success, or %FALSE on error with @error filled in
+ */
 gboolean
 ev_xfer_uri_simple (const char *from,
                    const char *to,
@@ -183,12 +199,13 @@ ev_xfer_uri_simple (const char *from,
 {
        GFile *source_file;
        GFile *target_file;
-       GError *ioerror = NULL;
        gboolean result;
        
        if (!from)
-               return FALSE;
-       
+               return TRUE;
+
+        g_return_val_if_fail (to != NULL, TRUE);
+
        source_file = g_file_new_for_uri (from);
        target_file = g_file_new_for_uri (to);
        
@@ -197,16 +214,12 @@ ev_xfer_uri_simple (const char *from,
                              G_FILE_COPY_TARGET_DEFAULT_PERMS |
 #endif
                              G_FILE_COPY_OVERWRITE,
-                             NULL, NULL, NULL, &ioerror);
+                             NULL, NULL, NULL, error);
 
        g_object_unref (target_file);
        g_object_unref (source_file);
     
-       if (!result) {
-               g_propagate_error (error, ioerror);
-       }
        return result;
-
 }
 
 static gchar *
@@ -215,6 +228,7 @@ get_mime_type_from_uri (const gchar *uri, GError **error)
        GFile       *file;
        GFileInfo   *file_info;
        const gchar *content_type;
+        gchar       *mime_type = NULL;
 
        file = g_file_new_for_uri (uri);
        file_info = g_file_query_info (file,
@@ -226,12 +240,12 @@ get_mime_type_from_uri (const gchar *uri, GError **error)
                return NULL;
 
        content_type = g_file_info_get_content_type (file_info);
-       g_object_unref (file_info);
-
-       if (!content_type)
-               return NULL;
+       if (content_type) {
+                mime_type = g_content_type_get_mime_type (content_type);
+        }
 
-       return g_content_type_get_mime_type (content_type);
+       g_object_unref (file_info);
+       return mime_type;
 }
 
 static gchar *
@@ -315,15 +329,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;
@@ -332,9 +353,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;
        }
 
@@ -346,7 +374,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;
@@ -380,8 +408,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);