X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libdocument%2Fev-file-helpers.c;h=dd3b3e1df8ca6051dc53420ac9e1f133a9cb427a;hb=f792ebcef8eab6e0b8fc5ff185851d038afbab56;hp=d4e9a84dcd5ffa77877f46f673e742df76805751;hpb=428601d594f50224ea40586dbfe6771d7a5f55e9;p=evince.git diff --git a/libdocument/ev-file-helpers.c b/libdocument/ev-file-helpers.c index d4e9a84d..dd3b3e1d 100644 --- a/libdocument/ev-file-helpers.c +++ b/libdocument/ev-file-helpers.c @@ -33,7 +33,10 @@ #include #include #include + +#if WITH_GNOME #include +#endif #include "ev-file-helpers.h" @@ -47,7 +50,7 @@ ensure_dir_exists (const char *dir) 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) @@ -63,9 +66,15 @@ ev_dot_dir (void) 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) @@ -136,6 +145,43 @@ ev_tmp_filename (const gchar *prefix) 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, @@ -172,22 +218,21 @@ ev_xfer_uri_simple (const char *from, /* Compressed files support */ #define BZIPCOMMAND "bzip2" #define GZIPCOMMAND "gzip" -#define N_ARGS 5 +#define N_ARGS 4 #define BUFFER_SIZE 1024 -gchar * -ev_file_uncompress (const gchar *uri, - EvCompressionType type, - GError **error) +static gchar * +compression_run (const gchar *uri, + EvCompressionType type, + gboolean compress, + GError **error) { gchar *argv[N_ARGS]; - gchar *uri_unc = NULL; - gchar *filename, *filename_unc; + gchar *uri_dst = NULL; + gchar *filename, *filename_dst; gchar *cmd; gint fd, pout; - g_return_val_if_fail (uri != NULL, NULL); - if (type == EV_COMPRESSION_NONE) return NULL; @@ -195,27 +240,25 @@ ev_file_uncompress (const gchar *uri, if (!cmd) return NULL; - filename = g_filename_from_uri (uri, NULL, NULL); if (!filename) { g_free (cmd); return NULL; } - filename_unc = g_build_filename (ev_tmp_dir (), "evinceXXXXXX", NULL); - fd = g_mkstemp (filename_unc); + 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_unc); + g_free (filename_dst); return NULL; } - + argv[0] = cmd; - argv[1] = "-cd"; + argv[1] = compress ? "-c" : "-cd"; argv[2] = filename; - argv[3] = filename_unc; - argv[4] = NULL; + argv[3] = NULL; if (g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_STDERR_TO_DEV_NULL, @@ -247,7 +290,7 @@ ev_file_uncompress (const gchar *uri, break; } } while (bytes_read > 0); - + g_io_channel_unref (in); g_io_channel_unref (out); } @@ -255,13 +298,32 @@ ev_file_uncompress (const gchar *uri, close (fd); if (*error == NULL) { - uri_unc = g_filename_to_uri (filename_unc, - NULL, NULL); + uri_dst = g_filename_to_uri (filename_dst, NULL, NULL); } g_free (cmd); g_free (filename); - g_free (filename_unc); + 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 uri_unc; + return compression_run (uri, type, TRUE, error); }