aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/e-source-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/e-source-util.c')
-rw-r--r--e-util/e-source-util.c187
1 files changed, 187 insertions, 0 deletions
diff --git a/e-util/e-source-util.c b/e-util/e-source-util.c
new file mode 100644
index 0000000000..61b7897d32
--- /dev/null
+++ b/e-util/e-source-util.c
@@ -0,0 +1,187 @@
+/*
+ * e-source-util.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-source-util.h"
+
+typedef struct _AsyncContext AsyncContext;
+
+struct _AsyncContext {
+ EActivity *activity;
+ ESource *source;
+};
+
+static void
+async_context_free (AsyncContext *context)
+{
+ if (context->activity != NULL)
+ g_object_unref (context->activity);
+
+ if (context->source != NULL)
+ g_object_unref (context->source);
+
+ g_slice_free (AsyncContext, context);
+}
+
+static void
+source_util_remove_cb (ESource *source,
+ GAsyncResult *result,
+ AsyncContext *context)
+{
+ EActivity *activity;
+ EAlertSink *alert_sink;
+ GError *error = NULL;
+
+ activity = context->activity;
+ alert_sink = e_activity_get_alert_sink (activity);
+
+ e_source_remove_finish (source, result, &error);
+
+ if (e_activity_handle_cancellation (activity, error)) {
+ g_error_free (error);
+
+ } else if (error != NULL) {
+ e_alert_submit (
+ alert_sink,
+ "source:remove-source-fail",
+ e_source_get_display_name (context->source),
+ error->message, NULL);
+ g_error_free (error);
+
+ } else {
+ e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
+ }
+
+ async_context_free (context);
+}
+
+/**
+ * e_source_util_remove:
+ * @source: the #ESource to be removed
+ * @alert_sink: an #EAlertSink
+ *
+ * Requests the D-Bus service to delete the key files for @source and all of
+ * its descendants and broadcast their removal to all clients. If an error
+ * occurs, an #EAlert will be posted to @alert_sink.
+ *
+ * This function does not block. The returned #EActivity can either be
+ * ignored or passed to something that can display activity status to the
+ * user, such as e_shell_backend_add_activity().
+ *
+ * Returns: an #EActivity to track the operation
+ **/
+EActivity *
+e_source_util_remove (ESource *source,
+ EAlertSink *alert_sink)
+{
+ AsyncContext *context;
+ GCancellable *cancellable;
+
+ g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+ g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL);
+
+ cancellable = g_cancellable_new ();
+
+ context = g_slice_new0 (AsyncContext);
+ context->activity = e_activity_new ();
+ context->source = g_object_ref (source);
+
+ e_activity_set_alert_sink (context->activity, alert_sink);
+ e_activity_set_cancellable (context->activity, cancellable);
+
+ e_source_remove (
+ source, cancellable, (GAsyncReadyCallback)
+ source_util_remove_cb, context);
+
+ g_object_unref (cancellable);
+
+ return context->activity;
+}
+
+static void
+source_util_write_cb (ESource *source,
+ GAsyncResult *result,
+ AsyncContext *context)
+{
+ EActivity *activity;
+ EAlertSink *alert_sink;
+ GError *error = NULL;
+
+ activity = context->activity;
+ alert_sink = e_activity_get_alert_sink (activity);
+
+ e_source_write_finish (source, result, &error);
+
+ if (e_activity_handle_cancellation (activity, error)) {
+ g_error_free (error);
+
+ } else if (error != NULL) {
+ e_alert_submit (
+ alert_sink,
+ "source:submit-data-fail",
+ error->message, NULL);
+ g_error_free (error);
+
+ } else {
+ e_activity_set_state (activity, E_ACTIVITY_COMPLETED);
+ }
+
+ async_context_free (context);
+}
+
+/**
+ * e_source_util_write:
+ * @source: an #ESource
+ * @alert_sink: an #EAlertSink
+ *
+ * Submits the current contents of @source to the D-Bus service to be
+ * written to disk and broadcast to other clients. If an error occurs,
+ * an #EAlert will be posted to @alert_sink.
+ *
+ * This function does not block. The returned #EActivity can either be
+ * ignored or passed to something that can display activity status to the
+ * user, such as e_shell_backend_add_activity().
+ *
+ * Returns: an #EActivity to track the operation
+ **/
+EActivity *
+e_source_util_write (ESource *source,
+ EAlertSink *alert_sink)
+{
+ AsyncContext *context;
+ GCancellable *cancellable;
+
+ g_return_val_if_fail (E_IS_SOURCE (source), NULL);
+ g_return_val_if_fail (E_IS_ALERT_SINK (alert_sink), NULL);
+
+ cancellable = g_cancellable_new ();
+
+ context = g_slice_new0 (AsyncContext);
+ context->activity = e_activity_new ();
+
+ e_activity_set_alert_sink (context->activity, alert_sink);
+ e_activity_set_cancellable (context->activity, cancellable);
+
+ e_source_write (
+ source, cancellable, (GAsyncReadyCallback)
+ source_util_write_cb, context);
+
+ g_object_unref (cancellable);
+
+ return context->activity;
+}
+