+ const char *tmp;
+ char *name;
+ int fd;
+
+ if ((tmp = _ev_tmp_dir (error)) == NULL)
+ return -1;
+
+ name = g_build_filename (tmp, template, NULL);
+ fd = g_mkstemp (name);
+
+ if (fd == -1) {
+ int errsv = errno;
+
+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
+ _("Failed to create a temporary file: %s"),
+ g_strerror (errsv));
+
+ g_free (name);
+ return -1;
+ }
+
+ if (file_name)
+ *file_name = name;
+
+ return fd;
+}
+
+static void
+close_fd_cb (gpointer fdptr)
+{
+ int fd = GPOINTER_TO_INT (fdptr);
+
+ close (fd);
+}
+
+/**
+ * ev_mkstemp_file:
+ * @template: a template string; must contain 'XXXXXX', but not necessarily as a suffix
+ * @error: a location to store a #GError
+ *
+ * Creates a temp #GFile in the evince temp directory. See ev_mkstemp() for more information.
+ *
+ * Returns: a newly allocated #GFile for the newly created temp file name, or %NULL
+ * on error with @error filled in
+ */
+GFile *
+ev_mkstemp_file (const char *template,
+ GError **error)
+{
+ char *file_name;
+ int fd;
+ GFile *file;
+
+ fd = ev_mkstemp (template, &file_name, error);
+ if (fd == -1)
+ return NULL;
+
+ file = g_file_new_for_path (file_name);
+ g_free (file_name);
+
+ g_object_set_data_full (G_OBJECT (file), "ev-mkstemp-fd",
+ GINT_TO_POINTER (fd), (GDestroyNotify) close_fd_cb);
+
+ return file;
+}
+
+/**
+ * ev_mkdtemp:
+ * @template: a template string; must end in 'XXXXXX'
+ * @error: a location to store a #GError
+ *
+ * Creates a temp directory in the evince temp directory.
+ *
+ * Returns: a newly allocated string with the temp directory name, or %NULL
+ * on error with @error filled in
+ */
+gchar *
+ev_mkdtemp (const char *template,
+ GError **error)
+{
+ const char *tmp;
+ char *name;
+
+ if ((tmp = _ev_tmp_dir (error)) == NULL)
+ return NULL;
+
+ name = g_build_filename (tmp, template, NULL);
+ if (mkdtemp (name) == NULL) {
+ int errsv = errno;
+
+ g_set_error (error, G_IO_ERROR, g_io_error_from_errno (errsv),
+ _("Failed to create a temporary directory: %s"),
+ g_strerror (errsv));
+
+ g_free (name);
+ return NULL;
+ }
+
+ return name;
+}
+
+/* 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_str_has_prefix (filename, tempdir) == 0) {
+ g_unlink (filename);
+ }
+}
+
+void
+ev_tmp_file_unlink (GFile *file)
+{
+ gboolean res;
+ GError *error = NULL;
+
+ if (!file)
+ return;
+
+ res = g_file_delete (file, NULL, &error);
+ if (!res) {
+ char *uri;