#include "ev-file-helpers.h"
-static gchar *dot_dir = NULL;
static gchar *tmp_dir = NULL;
static gint count = 0;
-static gboolean
-ensure_dir_exists (const char *dir)
+gboolean
+ev_dir_ensure_exists (const gchar *dir,
+ int mode)
{
- if (g_file_test (dir, G_FILE_TEST_IS_DIR))
- return TRUE;
-
- if (g_mkdir_with_parents (dir, 488) == 0)
+ if (g_mkdir_with_parents (dir, mode) == 0)
return TRUE;
if (errno == EEXIST)
return g_file_test (dir, G_FILE_TEST_IS_DIR);
- g_warning ("Failed to create directory %s: %s", dir, strerror (errno));
+ g_warning ("Failed to create directory %s: %s", dir, g_strerror (errno));
return FALSE;
}
-const gchar *
-ev_dot_dir (void)
-{
- if (dot_dir == NULL) {
- gboolean exists;
-
- dot_dir = g_build_filename (g_get_home_dir (),
- ".gnome2",
- "evince",
- NULL);
-
- exists = ensure_dir_exists (dot_dir);
- if (!exists)
- exit (1);
- }
-
- return dot_dir;
-}
-
const gchar *
ev_tmp_dir (void)
{
if (tmp_dir == NULL) {
gboolean exists;
- gchar *dirname;
+ gchar *dirname, *prgname;
- dirname = g_strdup_printf ("evince-%u", getpid ());
+ prgname = g_get_prgname ();
+ dirname = g_strdup_printf ("%s-%u", prgname ? prgname : "unknown", getpid ());
tmp_dir = g_build_filename (g_get_tmp_dir (),
dirname,
NULL);
g_free (dirname);
- exists = ensure_dir_exists (tmp_dir);
+ exists = ev_dir_ensure_exists (tmp_dir, 0700);
g_assert (exists);
}
}
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);
g_free (tmp_dir);
- g_free (dot_dir);
-
- dot_dir = NULL;
tmp_dir = NULL;
}
ev_tmp_file_unlink (GFile *file)
{
gboolean res;
+ GError *error = NULL;
if (!file)
return;
- res = g_file_delete (file, NULL, NULL);
+ res = g_file_delete (file, NULL, &error);
if (!res) {
char *uri;
uri = g_file_get_uri (file);
- g_warning ("Unable to delete temp file %s\n", uri);
+ g_warning ("Unable to delete temp file %s: %s\n", uri, error->message);
g_free (uri);
+ g_error_free (error);
}
}
{
GFile *source_file;
GFile *target_file;
- GError *ioerror;
+ GError *ioerror = NULL;
gboolean result;
if (!from)
target_file = g_file_new_for_uri (to);
result = g_file_copy (source_file, target_file,
+#if GLIB_CHECK_VERSION(2,19,0)
+ G_FILE_COPY_TARGET_DEFAULT_PERMS |
+#endif
G_FILE_COPY_OVERWRITE,
NULL, NULL, NULL, &ioerror);
}
+static gchar *
+get_mime_type_from_uri (const gchar *uri, GError **error)
+{
+ GFile *file;
+ GFileInfo *file_info;
+ gchar *mime_type;
+
+ file = g_file_new_for_uri (uri);
+ file_info = g_file_query_info (file,
+ G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
+ 0, NULL, error);
+ g_object_unref (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);
+
+ return mime_type;
+}
+
+static gchar *
+get_mime_type_from_data (const gchar *uri, GError **error)
+{
+ GFile *file;
+ GFileInputStream *input_stream;
+ gssize size_read;
+ guchar buffer[1024];
+
+ file = g_file_new_for_uri (uri);
+
+ input_stream = g_file_read (file, NULL, error);
+ if (!input_stream) {
+ g_object_unref (file);
+ return NULL;
+ }
+
+ 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);
+
+ g_object_unref (file);
+
+ if (size_read == -1)
+ return NULL;
+
+ return g_content_type_guess (NULL, /* no filename */
+ buffer, 1024,
+ NULL);
+}
+
+gchar *
+ev_file_get_mime_type (const gchar *uri,
+ gboolean fast,
+ GError **error)
+{
+ return fast ? get_mime_type_from_uri (uri, error) : get_mime_type_from_data (uri, error);
+}
+
/* Compressed files support */
#define BZIPCOMMAND "bzip2"
#define GZIPCOMMAND "gzip"