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)
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,
{
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);
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 *
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;
+ gchar *mime_type = NULL;
file = g_file_new_for_uri (uri);
file_info = g_file_query_info (file,
if (file_info == NULL)
return NULL;
- mime_type = g_content_type_get_mime_type (
- g_file_info_get_content_type (file_info));
- g_object_unref (file_info);
+ content_type = g_file_info_get_content_type (file_info);
+ if (content_type) {
+ mime_type = g_content_type_get_mime_type (content_type);
+ }
+ g_object_unref (file_info);
return mime_type;
}
GFileInputStream *input_stream;
gssize size_read;
guchar buffer[1024];
+ gboolean retval;
+ gchar *content_type, *mime_type;
file = g_file_new_for_uri (uri);
}
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;
}
/**
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;
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;
}
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;
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);
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,
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,