aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-file-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-file-utils.c')
-rw-r--r--e-util/e-file-utils.c78
1 files changed, 50 insertions, 28 deletions
diff --git a/e-util/e-file-utils.c b/e-util/e-file-utils.c
index e647b8deb1..2d5ff30ff7 100644
--- a/e-util/e-file-utils.c
+++ b/e-util/e-file-utils.c
@@ -51,40 +51,56 @@
#include <glib/gstdio.h>
#include <glib/gi18n-lib.h>
+#include "e-activity.h"
#include "e-file-utils.h"
-#include "e-io-activity.h"
+
+typedef struct _AsyncContext AsyncContext;
+
+struct _AsyncContext {
+ EActivity *activity;
+ gchar *new_etag;
+};
+
+static void
+async_context_free (AsyncContext *context)
+{
+ if (context->activity != NULL)
+ g_object_unref (context->activity);
+
+ g_free (context->new_etag);
+
+ g_slice_free (AsyncContext, context);
+}
static void
file_replace_contents_cb (GFile *file,
GAsyncResult *result,
- EActivity *activity)
+ GSimpleAsyncResult *simple)
{
- gchar *new_etag;
- gboolean success;
+ AsyncContext *context;
+ gchar *new_etag = NULL;
GError *error = NULL;
- success = g_file_replace_contents_finish (
- file, result, &new_etag, &error);
+ context = g_simple_async_result_get_op_res_gpointer (simple);
- result = e_io_activity_get_async_result (E_IO_ACTIVITY (activity));
+ g_file_replace_contents_finish (file, result, &new_etag, &error);
- if (error == NULL) {
- g_object_set_data_full (
- G_OBJECT (result),
- "__new_etag__", new_etag,
- (GDestroyNotify) g_free);
- } else {
- g_simple_async_result_set_from_error (
- G_SIMPLE_ASYNC_RESULT (result), error);
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ e_activity_set_state (context->activity, E_ACTIVITY_CANCELLED);
+ else
+ e_activity_set_state (context->activity, E_ACTIVITY_COMPLETED);
+
+ if (error == NULL)
+ context->new_etag = new_etag;
+ else {
+ g_warn_if_fail (new_etag == NULL);
+ g_simple_async_result_set_from_error (simple, error);
g_error_free (error);
}
- g_simple_async_result_set_op_res_gboolean (
- G_SIMPLE_ASYNC_RESULT (result), success);
-
- e_activity_complete (activity);
+ g_simple_async_result_complete (simple);
- g_object_unref (activity);
+ g_object_unref (simple);
}
/**
@@ -115,9 +131,9 @@ e_file_replace_contents_async (GFile *file,
GAsyncReadyCallback callback,
gpointer user_data)
{
- EActivity *activity;
GSimpleAsyncResult *simple;
GCancellable *cancellable;
+ AsyncContext *context;
const gchar *format;
gchar *description;
gchar *basename;
@@ -148,21 +164,26 @@ e_file_replace_contents_async (GFile *file,
cancellable = g_cancellable_new ();
+ context = g_slice_new0 (AsyncContext);
+ context->activity = e_activity_new ();
+
+ e_activity_set_text (context->activity, description);
+ e_activity_set_cancellable (context->activity, cancellable);
+
simple = g_simple_async_result_new (
G_OBJECT (file), callback, user_data,
e_file_replace_contents_async);
- activity = e_io_activity_new (
- description, G_ASYNC_RESULT (simple), cancellable);
+ g_simple_async_result_set_op_res_gpointer (
+ simple, context, (GDestroyNotify) async_context_free);
g_file_replace_contents_async (
file, contents, length, etag,
make_backup, flags, cancellable,
(GAsyncReadyCallback) file_replace_contents_cb,
- activity);
+ simple);
g_object_unref (cancellable);
- g_object_unref (simple);
g_free (description);
g_free (basename);
@@ -170,7 +191,7 @@ e_file_replace_contents_async (GFile *file,
g_free (hostname);
g_free (uri);
- return activity;
+ return context->activity;
}
/**
@@ -194,18 +215,19 @@ e_file_replace_contents_finish (GFile *file,
GError **error)
{
GSimpleAsyncResult *simple;
+ AsyncContext *context;
g_return_val_if_fail (G_IS_FILE (file), FALSE);
g_return_val_if_fail (G_IS_SIMPLE_ASYNC_RESULT (result), FALSE);
simple = G_SIMPLE_ASYNC_RESULT (result);
+ context = g_simple_async_result_get_op_res_gpointer (simple);
if (g_simple_async_result_propagate_error (simple, error))
return FALSE;
if (new_etag != NULL)
- *new_etag = g_object_steal_data (
- G_OBJECT (result), "__new_etag__");
+ *new_etag = g_strdup (context->new_etag);
return TRUE;
}