#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"
static gchar *dot_dir = NULL;
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)
if (dot_dir == NULL) {
gboolean exists;
+#if WITH_GNOME
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)
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_uri_unlink (const gchar *uri)
+{
+ GnomeVFSURI *vfs_uri;
+ gchar *filename;
+
+ if (!uri)
+ return;
+
+ vfs_uri = gnome_vfs_uri_new (uri);
+ if (!gnome_vfs_uri_is_local (vfs_uri)) {
+ g_warning ("Attempting to delete non local uri: %s\n", uri);
+ gnome_vfs_uri_unref (vfs_uri);
+ return;
+ }
+ gnome_vfs_uri_unref (vfs_uri);
+
+ filename = g_filename_from_uri (uri, NULL, NULL);
+ ev_tmp_filename_unlink (filename);
+ g_free (filename);
+}
+
gboolean
ev_xfer_uri_simple (const char *from,
const char *to,
return (result == GNOME_VFS_OK);
}
+
+/* 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);
+}