[evolution-data-server/gnome-3-8] Automatically strip D-Bus info from error messages.



commit fd5632a266fe91a44a783f387de7a511cf8d2e3c
Author: Matthew Barnes <mbarnes redhat com>
Date:   Mon Apr 15 18:54:41 2013 -0400

    Automatically strip D-Bus info from error messages.
    
    I mistakenly assumed code generated by the gdbus-codegen tool would
    automatically strip off the D-Bus error name from error messages, but
    that apparently is not possible according to my discussion with David
    Zeuthen in [1], since it would break g_dbus_error_is_remote_error().
    
    Distinguishing between local and remote errors strikes me as a rarely
    needed corner case, and is certainly not worth the extra step imposed
    on applications when dealing with something as fundamental as GError.
    
    This commit prevents the D-Bus error name from leaking through in any
    Evolution-Data-Server client-facing library functions.
    
    Also rename any stack-allocated GError pointers to 'local_error' to
    help distinguish them from GError "out" parameters which are always
    named 'error'.  This is just to improve variable name consistency.
    
    [1] https://bugzilla.gnome.org/697819
    
    (cherry picked from commit 5115e6118bc030d2437d7fa73bb50f1fd31e28d3)
    
    Conflicts:
        addressbook/libebook/e-book-client-view.c
        addressbook/libebook/e-book-client.c
        calendar/libecal/e-cal-client-view.c

 addressbook/libebook/e-book-client-view.c |  63 ++--
 addressbook/libebook/e-book-client.c      | 324 +++++++++++-------
 calendar/libecal/e-cal-client-view.c      |  41 ++-
 calendar/libecal/e-cal-client.c           | 530 ++++++++++++++++++------------
 libebackend/e-user-prompter.c             |  31 +-
 libedataserver/e-source-registry.c        | 118 ++++---
 libedataserver/e-source.c                 | 163 +++++----
 7 files changed, 755 insertions(+), 515 deletions(-)
---
diff --git a/addressbook/libebook/e-book-client-view.c b/addressbook/libebook/e-book-client-view.c
index c26dc38..a66bade 100644
--- a/addressbook/libebook/e-book-client-view.c
+++ b/addressbook/libebook/e-book-client-view.c
@@ -305,18 +305,18 @@ direct_contacts_ready (GObject *source_object,
 {
        NotificationData *data = (NotificationData *) user_data;
        GSList *contacts = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        e_data_book_get_contacts_finish (
                E_DATA_BOOK (source_object),
-               result, &contacts, &error);
+               result, &contacts, &local_error);
 
-       if (error != NULL) {
+       if (local_error != NULL) {
                g_warn_if_fail (contacts == NULL);
                g_warning (
                        "Error fetching contacts directly: %s\n",
-                       error->message);
-               g_error_free (error);
+                       local_error->message);
+               g_error_free (local_error);
 
        } else if (data->signum == OBJECTS_ADDED) {
                /* Takes ownership of the linked list. */
@@ -347,18 +347,18 @@ direct_contacts_fetch (EBookClientView *view,
         */
        if (!view->priv->complete) {
                GSList *contacts = NULL;
-               GError *error = NULL;
+               GError *local_error = NULL;
 
                e_data_book_get_contacts_sync (
-                       view->priv->direct_book,
-                       sexp, &contacts, NULL, &error);
+                       view->priv->direct_book, sexp,
+                       &contacts, NULL, &local_error);
 
-               if (error != NULL) {
+               if (local_error != NULL) {
                        g_warn_if_fail (contacts == NULL);
                        g_warning (
                                "Error fetching contacts directly: %s\n",
-                               error->message);
-                       g_error_free (error);
+                               local_error->message);
+                       g_error_free (local_error);
 
                } else if (signum == OBJECTS_ADDED) {
                        /* Takes ownership of the linked list. */
@@ -565,14 +565,15 @@ book_client_view_dispose_cb (GObject *source_object,
                              GAsyncResult *result,
                              gpointer user_data)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        e_gdbus_book_view_call_dispose_finish (
-               G_DBUS_PROXY (source_object), result, &error);
+               G_DBUS_PROXY (source_object), result, &local_error);
 
-       if (error != NULL) {
-               g_warning ("%s: %s", G_STRFUNC, error->message);
-               g_error_free (error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_warning ("%s: %s", G_STRFUNC, local_error->message);
+               g_error_free (local_error);
        }
 }
 
@@ -999,20 +1000,20 @@ void
 e_book_client_view_start (EBookClientView *view,
                           GError **error)
 {
-       gboolean success;
        GError *local_error = NULL;
 
        g_return_if_fail (E_IS_BOOK_CLIENT_VIEW (view));
 
        view->priv->running = TRUE;
 
-       success = e_gdbus_book_view_call_start_sync (
+       e_gdbus_book_view_call_start_sync (
                view->priv->dbus_proxy, NULL, &local_error);
-       if (!success)
-               view->priv->running = FALSE;
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               view->priv->running = FALSE;
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -1035,8 +1036,10 @@ e_book_client_view_stop (EBookClientView *view,
        e_gdbus_book_view_call_stop_sync (
                view->priv->dbus_proxy, NULL, &local_error);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -1061,8 +1064,10 @@ e_book_client_view_set_flags (EBookClientView *view,
        e_gdbus_book_view_call_set_flags_sync (
                view->priv->dbus_proxy, flags, NULL, &local_error);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -1113,7 +1118,9 @@ e_book_client_view_set_fields_of_interest (EBookClientView *view,
                NULL, &local_error);
        g_strfreev (strv);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
diff --git a/addressbook/libebook/e-book-client.c b/addressbook/libebook/e-book-client.c
index e7cbb1a..a2ab374 100644
--- a/addressbook/libebook/e-book-client.c
+++ b/addressbook/libebook/e-book-client.c
@@ -668,13 +668,22 @@ book_client_open_sync (EClient *client,
                        GError **error)
 {
        EBookClient *book_client;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
 
        book_client = E_BOOK_CLIENT (client);
 
-       return e_dbus_address_book_call_open_sync (
-               book_client->priv->dbus_proxy, cancellable, error);
+       e_dbus_address_book_call_open_sync (
+               book_client->priv->dbus_proxy, cancellable, &local_error);
+
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static gboolean
@@ -683,13 +692,22 @@ book_client_refresh_sync (EClient *client,
                           GError **error)
 {
        EBookClient *book_client;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
 
        book_client = E_BOOK_CLIENT (client);
 
-       return e_dbus_address_book_call_refresh_sync (
-               book_client->priv->dbus_proxy, cancellable, error);
+       e_dbus_address_book_call_refresh_sync (
+               book_client->priv->dbus_proxy, cancellable, &local_error);
+
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static void
@@ -707,7 +725,7 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        const gchar *uid;
        gchar *object_path = NULL;
        gulong handler_id;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        priv = E_BOOK_CLIENT_GET_PRIVATE (source_object);
 
@@ -715,15 +733,17 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        source = e_client_get_source (client);
        uid = e_source_get_uid (source);
 
-       connection = g_bus_get_sync (G_BUS_TYPE_SESSION, cancellable, &error);
+       connection = g_bus_get_sync (
+               G_BUS_TYPE_SESSION, cancellable, &local_error);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((connection != NULL) && (error == NULL)) ||
-               ((connection == NULL) && (error != NULL)));
+               ((connection != NULL) && (local_error == NULL)) ||
+               ((connection == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                return;
        }
 
@@ -732,31 +752,33 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                G_DBUS_PROXY_FLAGS_NONE,
                ADDRESS_BOOK_DBUS_SERVICE_NAME,
                "/org/gnome/evolution/dataserver/AddressBookFactory",
-               cancellable, &error);
+               cancellable, &local_error);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((factory_proxy != NULL) && (error == NULL)) ||
-               ((factory_proxy == NULL) && (error != NULL)));
+               ((factory_proxy != NULL) && (local_error == NULL)) ||
+               ((factory_proxy == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
 
        e_dbus_address_book_factory_call_open_address_book_sync (
-               factory_proxy, uid, &object_path, cancellable, &error);
+               factory_proxy, uid, &object_path, cancellable, &local_error);
 
        g_object_unref (factory_proxy);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((object_path != NULL) && (error == NULL)) ||
-               ((object_path == NULL) && (error != NULL)));
+               ((object_path != NULL) && (local_error == NULL)) ||
+               ((object_path == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
@@ -765,17 +787,18 @@ book_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                connection,
                G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
                ADDRESS_BOOK_DBUS_SERVICE_NAME,
-               object_path, cancellable, &error);
+               object_path, cancellable, &local_error);
 
        g_free (object_path);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((priv->dbus_proxy != NULL) && (error == NULL)) ||
-               ((priv->dbus_proxy == NULL) && (error != NULL)));
+               ((priv->dbus_proxy != NULL) && (local_error == NULL)) ||
+               ((priv->dbus_proxy == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
@@ -949,7 +972,7 @@ e_book_client_connect_sync (ESource *source,
                             GError **error)
 {
        EBookClient *client;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_SOURCE (source), NULL);
 
@@ -957,14 +980,15 @@ e_book_client_connect_sync (ESource *source,
                E_TYPE_BOOK_CLIENT,
                "source", source, NULL);
 
-       success = g_initable_init (
-               G_INITABLE (client), cancellable, error);
+       g_initable_init (G_INITABLE (client), cancellable, &local_error);
 
-       if (success)
-               success = e_dbus_address_book_call_open_sync (
-                       client->priv->dbus_proxy, cancellable, error);
+       if (local_error == NULL)
+               e_dbus_address_book_call_open_sync (
+                       client->priv->dbus_proxy, cancellable, &local_error);
 
-       if (!success) {
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                g_prefix_error (
                        error, _("Unable to connect to '%s': "),
                        e_source_get_display_name (source));
@@ -982,15 +1006,17 @@ book_client_connect_open_cb (GObject *source_object,
                              gpointer user_data)
 {
        GSimpleAsyncResult *simple;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        simple = G_SIMPLE_ASYNC_RESULT (user_data);
 
        e_dbus_address_book_call_open_finish (
-               E_DBUS_ADDRESS_BOOK (source_object), result, &error);
+               E_DBUS_ADDRESS_BOOK (source_object), result, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
+       }
 
        g_simple_async_result_complete (simple);
 
@@ -1006,15 +1032,15 @@ book_client_connect_init_cb (GObject *source_object,
        GSimpleAsyncResult *simple;
        EBookClientPrivate *priv;
        ConnectClosure *closure;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        simple = G_SIMPLE_ASYNC_RESULT (user_data);
 
        g_async_initable_init_finish (
-               G_ASYNC_INITABLE (source_object), result, &error);
+               G_ASYNC_INITABLE (source_object), result, &local_error);
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_simple_async_result_take_error (simple, local_error);
                g_simple_async_result_complete (simple);
                goto exit;
        }
@@ -1470,7 +1496,7 @@ book_client_add_contact_thread (GSimpleAsyncResult *simple,
                                 GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -1478,10 +1504,10 @@ book_client_add_contact_thread (GSimpleAsyncResult *simple,
                E_BOOK_CLIENT (source_object),
                async_context->contact,
                &async_context->uid,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -1635,7 +1661,7 @@ book_client_add_contacts_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -1643,10 +1669,10 @@ book_client_add_contacts_thread (GSimpleAsyncResult *simple,
                E_BOOK_CLIENT (source_object),
                async_context->object_list,
                &async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -1778,8 +1804,8 @@ e_book_client_add_contacts_sync (EBookClient *client,
        GSList *link;
        gchar **strv;
        gchar **uids = NULL;
-       gboolean success;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (contacts != NULL, FALSE);
@@ -1796,20 +1822,23 @@ e_book_client_add_contacts_sync (EBookClient *client,
                g_free (string);
        }
 
-       success = e_dbus_address_book_call_create_contacts_sync (
+       e_dbus_address_book_call_create_contacts_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               &uids, cancellable, error);
+               &uids, cancellable, &local_error);
 
        g_strfreev (strv);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (uids != NULL)) ||
-               (!success && (uids == NULL)), FALSE);
+               ((uids != NULL) && (local_error == NULL)) ||
+               ((uids == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        /* XXX We should have passed the string array directly
         *     back to the caller instead of building a linked
@@ -1839,17 +1868,17 @@ book_client_modify_contact_thread (GSimpleAsyncResult *simple,
                                    GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_book_client_modify_contact_sync (
                E_BOOK_CLIENT (source_object),
                async_context->contact,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -1963,17 +1992,17 @@ book_client_modify_contacts_thread (GSimpleAsyncResult *simple,
                                     GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_book_client_modify_contacts_sync (
                E_BOOK_CLIENT (source_object),
                async_context->object_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2074,8 +2103,8 @@ e_book_client_modify_contacts_sync (EBookClient *client,
 {
        GSList *link;
        gchar **strv;
-       gboolean success;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (contacts != NULL, FALSE);
@@ -2092,14 +2121,20 @@ e_book_client_modify_contacts_sync (EBookClient *client,
                g_free (string);
        }
 
-       success = e_dbus_address_book_call_modify_contacts_sync (
+       e_dbus_address_book_call_modify_contacts_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               cancellable, error);
+               cancellable, &local_error);
 
        g_strfreev (strv);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_book_client_remove_contact() */
@@ -2109,17 +2144,17 @@ book_client_remove_contact_thread (GSimpleAsyncResult *simple,
                                    GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_book_client_remove_contact_sync (
                E_BOOK_CLIENT (source_object),
                async_context->contact,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2236,17 +2271,17 @@ book_client_remove_contact_by_uid_thread (GSimpleAsyncResult *simple,
                                           GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_book_client_remove_contact_by_uid_sync (
                E_BOOK_CLIENT (source_object),
                async_context->uid,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2360,17 +2395,17 @@ book_client_remove_contacts_thread (GSimpleAsyncResult *simple,
                                     GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_book_client_remove_contacts_sync (
                E_BOOK_CLIENT (source_object),
                async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2476,8 +2511,8 @@ e_book_client_remove_contacts_sync (EBookClient *client,
                                     GError **error)
 {
        gchar **strv;
-       gboolean success;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (uids != NULL, FALSE);
@@ -2488,14 +2523,20 @@ e_book_client_remove_contacts_sync (EBookClient *client,
                uids = g_slist_next (uids);
        }
 
-       success = e_dbus_address_book_call_remove_contacts_sync (
+       e_dbus_address_book_call_remove_contacts_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               cancellable, error);
+               cancellable, &local_error);
 
        g_strfreev (strv);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_book_client_get_contact() */
@@ -2505,7 +2546,7 @@ book_client_get_contact_thread (GSimpleAsyncResult *simple,
                                 GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -2513,10 +2554,10 @@ book_client_get_contact_thread (GSimpleAsyncResult *simple,
                E_BOOK_CLIENT (source_object),
                async_context->uid,
                &async_context->contact,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2633,27 +2674,30 @@ e_book_client_get_contact_sync (EBookClient *client,
 {
        gchar *utf8_uid;
        gchar *vcard = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (uid != NULL, FALSE);
        g_return_val_if_fail (out_contact != NULL, FALSE);
 
-       if (client->priv->direct_book != NULL)
+       if (client->priv->direct_book != NULL) {
+               /* Direct backend is not using D-Bus (obviously),
+                * so no need to strip D-Bus info from the error. */
                return e_data_book_get_contact_sync (
                        client->priv->direct_book, uid,
                        out_contact, cancellable, error);
+       }
 
        utf8_uid = e_util_utf8_make_valid (uid);
 
-       success = e_dbus_address_book_call_get_contact_sync (
-               client->priv->dbus_proxy,
-               utf8_uid, &vcard, cancellable, error);
+       e_dbus_address_book_call_get_contact_sync (
+               client->priv->dbus_proxy, utf8_uid,
+               &vcard, cancellable, &local_error);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (vcard != NULL)) ||
-               (!success && (vcard == NULL)), FALSE);
+               ((vcard != NULL) && (local_error == NULL)) ||
+               ((vcard == NULL) && (local_error != NULL)), FALSE);
 
        if (vcard != NULL) {
                *out_contact =
@@ -2663,7 +2707,13 @@ e_book_client_get_contact_sync (EBookClient *client,
 
        g_free (utf8_uid);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_book_client_get_contacts() */
@@ -2673,7 +2723,7 @@ book_client_get_contacts_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -2681,10 +2731,10 @@ book_client_get_contacts_thread (GSimpleAsyncResult *simple,
                E_BOOK_CLIENT (source_object),
                async_context->sexp,
                &async_context->object_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2809,29 +2859,32 @@ e_book_client_get_contacts_sync (EBookClient *client,
 {
        gchar *utf8_sexp;
        gchar **vcards = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (sexp != NULL, FALSE);
        g_return_val_if_fail (out_contacts != NULL, FALSE);
 
-       if (client->priv->direct_book != NULL)
+       if (client->priv->direct_book != NULL) {
+               /* Direct backend is not using D-Bus (obviously),
+                * so no need to strip D-Bus info from the error. */
                return e_data_book_get_contacts_sync (
                        client->priv->direct_book,
                        sexp, out_contacts, cancellable, error);
+       }
 
        utf8_sexp = e_util_utf8_make_valid (sexp);
 
-       success = e_dbus_address_book_call_get_contact_list_sync (
-               client->priv->dbus_proxy,
-               utf8_sexp, &vcards, cancellable, error);
+       e_dbus_address_book_call_get_contact_list_sync (
+               client->priv->dbus_proxy, utf8_sexp,
+               &vcards, cancellable, &local_error);
 
        g_free (utf8_sexp);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (vcards != NULL)) ||
-               (!success && (vcards == NULL)), FALSE);
+               ((vcards != NULL) && (local_error == NULL)) ||
+               ((vcards == NULL) && (local_error != NULL)), FALSE);
 
        if (vcards != NULL) {
                EContact *contact;
@@ -2848,7 +2901,13 @@ e_book_client_get_contacts_sync (EBookClient *client,
                g_strfreev (vcards);
        }
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_book_client_get_contacts_uids() */
@@ -2858,7 +2917,7 @@ book_client_get_contacts_uids_thread (GSimpleAsyncResult *simple,
                                       GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -2866,10 +2925,10 @@ book_client_get_contacts_uids_thread (GSimpleAsyncResult *simple,
                E_BOOK_CLIENT (source_object),
                async_context->sexp,
                &async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2994,29 +3053,32 @@ e_book_client_get_contacts_uids_sync (EBookClient *client,
 {
        gchar *utf8_sexp;
        gchar **uids = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_BOOK_CLIENT (client), FALSE);
        g_return_val_if_fail (sexp != NULL, FALSE);
        g_return_val_if_fail (out_contact_uids != NULL, FALSE);
 
-       if (client->priv->direct_book != NULL)
+       if (client->priv->direct_book != NULL) {
+               /* Direct backend is not using D-Bus (obviously),
+                * so no need to strip D-Bus info from the error. */
                return e_data_book_get_contacts_uids_sync (
                        client->priv->direct_book, sexp,
                        out_contact_uids, cancellable, error);
+       }
 
        utf8_sexp = e_util_utf8_make_valid (sexp);
 
-       success = e_dbus_address_book_call_get_contact_list_uids_sync (
-               client->priv->dbus_proxy,
-               utf8_sexp, &uids, cancellable, error);
+       e_dbus_address_book_call_get_contact_list_uids_sync (
+               client->priv->dbus_proxy, utf8_sexp,
+               &uids, cancellable, &local_error);
 
        g_free (utf8_sexp);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (uids != NULL)) ||
-               (!success && (uids == NULL)), FALSE);
+               ((uids != NULL) && (local_error == NULL)) ||
+               ((uids == NULL) && (local_error != NULL)), FALSE);
 
        /* XXX We should have passed the string array directly
         *     back to the caller instead of building a linked
@@ -3036,7 +3098,13 @@ e_book_client_get_contacts_uids_sync (EBookClient *client,
                g_free (uids);
        }
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_book_client_get_view() */
@@ -3049,7 +3117,7 @@ book_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
        AsyncContext *async_context;
        gchar *utf8_sexp;
        gchar *object_path = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -3057,14 +3125,14 @@ book_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
        e_dbus_address_book_call_get_view_sync (
                client->priv->dbus_proxy, utf8_sexp,
-               &object_path, cancellable, &error);
+               &object_path, cancellable, &local_error);
 
        g_free (utf8_sexp);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((object_path != NULL) && (error == NULL)) ||
-               ((object_path == NULL) && (error != NULL)));
+               ((object_path != NULL) && (local_error == NULL)) ||
+               ((object_path == NULL) && (local_error != NULL)));
 
        if (object_path != NULL) {
                GDBusConnection *connection;
@@ -3075,7 +3143,7 @@ book_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
                client_view = g_initable_new (
                        E_TYPE_BOOK_CLIENT_VIEW,
-                       cancellable, &error,
+                       cancellable, &local_error,
                        "client", client,
                        "connection", connection,
                        "object-path", object_path,
@@ -3084,16 +3152,18 @@ book_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
                /* Sanity check. */
                g_return_if_fail (
-                       ((client_view != NULL) && (error == NULL)) ||
-                       ((client_view == NULL) && (error != NULL)));
+                       ((client_view != NULL) && (local_error == NULL)) ||
+                       ((client_view == NULL) && (local_error != NULL)));
 
                async_context->client_view = client_view;
 
                g_free (object_path);
        }
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
+       }
 }
 
 /**
diff --git a/calendar/libecal/e-cal-client-view.c b/calendar/libecal/e-cal-client-view.c
index ce48269..5dd4270 100644
--- a/calendar/libecal/e-cal-client-view.c
+++ b/calendar/libecal/e-cal-client-view.c
@@ -426,14 +426,15 @@ cal_client_view_dispose_cb (GObject *source_object,
                             GAsyncResult *result,
                             gpointer user_data)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        e_gdbus_cal_view_call_dispose_finish (
-               G_DBUS_PROXY (source_object), result, &error);
+               G_DBUS_PROXY (source_object), result, &local_error);
 
-       if (error != NULL) {
-               g_warning ("%s: %s", G_STRFUNC, error->message);
-               g_error_free (error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_warning ("%s: %s", G_STRFUNC, local_error->message);
+               g_error_free (local_error);
        }
 }
 
@@ -853,20 +854,20 @@ void
 e_cal_client_view_start (ECalClientView *view,
                          GError **error)
 {
-       gboolean success;
        GError *local_error = NULL;
 
        g_return_if_fail (E_IS_CAL_CLIENT_VIEW (view));
 
        view->priv->running = TRUE;
 
-       success = e_gdbus_cal_view_call_start_sync (
+       e_gdbus_cal_view_call_start_sync (
                view->priv->dbus_proxy, NULL, &local_error);
-       if (!success)
-               view->priv->running = FALSE;
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               view->priv->running = FALSE;
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -891,8 +892,10 @@ e_cal_client_view_stop (ECalClientView *view,
        e_gdbus_cal_view_call_stop_sync (
                view->priv->dbus_proxy, NULL, &local_error);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -931,8 +934,10 @@ e_cal_client_view_set_fields_of_interest (ECalClientView *view,
                NULL, &local_error);
        g_strfreev (strv);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
 
 /**
@@ -957,6 +962,8 @@ e_cal_client_view_set_flags (ECalClientView *view,
        e_gdbus_cal_view_call_set_flags_sync (
                view->priv->dbus_proxy, flags, NULL, &local_error);
 
-       e_client_unwrap_dbus_error (
-               E_CLIENT (view->priv->client), local_error, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+       }
 }
diff --git a/calendar/libecal/e-cal-client.c b/calendar/libecal/e-cal-client.c
index 0a10e48..a5615a9 100644
--- a/calendar/libecal/e-cal-client.c
+++ b/calendar/libecal/e-cal-client.c
@@ -945,13 +945,22 @@ cal_client_open_sync (EClient *client,
                       GError **error)
 {
        ECalClient *cal_client;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
 
        cal_client = E_CAL_CLIENT (client);
 
-       return e_dbus_calendar_call_open_sync (
-               cal_client->priv->dbus_proxy, cancellable, error);
+       e_dbus_calendar_call_open_sync (
+               cal_client->priv->dbus_proxy, cancellable, &local_error);
+
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static gboolean
@@ -960,13 +969,22 @@ cal_client_refresh_sync (EClient *client,
                          GError **error)
 {
        ECalClient *cal_client;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
 
        cal_client = E_CAL_CLIENT (client);
 
-       return e_dbus_calendar_call_refresh_sync (
-               cal_client->priv->dbus_proxy, cancellable, error);
+       e_dbus_calendar_call_refresh_sync (
+               cal_client->priv->dbus_proxy, cancellable, &local_error);
+
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static void
@@ -984,7 +1002,7 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        const gchar *uid;
        gchar *object_path = NULL;
        gulong handler_id;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        priv = E_CAL_CLIENT_GET_PRIVATE (source_object);
 
@@ -992,15 +1010,17 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
        source = e_client_get_source (client);
        uid = e_source_get_uid (source);
 
-       connection = g_bus_get_sync (G_BUS_TYPE_SESSION, cancellable, &error);
+       connection = g_bus_get_sync (
+               G_BUS_TYPE_SESSION, cancellable, &local_error);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((connection != NULL) && (error == NULL)) ||
-               ((connection == NULL) && (error != NULL)));
+               ((connection != NULL) && (local_error == NULL)) ||
+               ((connection == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                return;
        }
 
@@ -1009,15 +1029,16 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                G_DBUS_PROXY_FLAGS_NONE,
                CALENDAR_DBUS_SERVICE_NAME,
                "/org/gnome/evolution/dataserver/CalendarFactory",
-               cancellable, &error);
+               cancellable, &local_error);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((factory_proxy != NULL) && (error == NULL)) ||
-               ((factory_proxy == NULL) && (error != NULL)));
+               ((factory_proxy != NULL) && (local_error == NULL)) ||
+               ((factory_proxy == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
@@ -1026,17 +1047,17 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
                        e_dbus_calendar_factory_call_open_calendar_sync (
                                factory_proxy, uid, &object_path,
-                               cancellable, &error);
+                               cancellable, &local_error);
                        break;
                case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
                        e_dbus_calendar_factory_call_open_task_list_sync (
                                factory_proxy, uid, &object_path,
-                               cancellable, &error);
+                               cancellable, &local_error);
                        break;
                case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
                        e_dbus_calendar_factory_call_open_memo_list_sync (
                                factory_proxy, uid, &object_path,
-                               cancellable, &error);
+                               cancellable, &local_error);
                        break;
                default:
                        g_return_if_reached ();
@@ -1046,11 +1067,12 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
 
        /* Sanity check. */
        g_return_if_fail (
-               ((object_path != NULL) && (error == NULL)) ||
-               ((object_path == NULL) && (error != NULL)));
+               ((object_path != NULL) && (local_error == NULL)) ||
+               ((object_path == NULL) && (local_error != NULL)));
 
        if (object_path == NULL) {
-               g_simple_async_result_take_error (simple, error);
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
@@ -1059,17 +1081,18 @@ cal_client_init_in_dbus_thread (GSimpleAsyncResult *simple,
                connection,
                G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
                CALENDAR_DBUS_SERVICE_NAME,
-               object_path, cancellable, &error);
+               object_path, cancellable, &local_error);
 
        g_free (object_path);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((priv->dbus_proxy != NULL) && (error == NULL)) ||
-               ((priv->dbus_proxy == NULL) && (error != NULL)));
+               ((priv->dbus_proxy != NULL) && (local_error == NULL)) ||
+               ((priv->dbus_proxy == NULL) && (local_error != NULL)));
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
                g_object_unref (connection);
                return;
        }
@@ -1461,7 +1484,7 @@ e_cal_client_connect_sync (ESource *source,
                            GError **error)
 {
        ECalClient *client;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_SOURCE (source), NULL);
        g_return_val_if_fail (
@@ -1474,14 +1497,15 @@ e_cal_client_connect_sync (ESource *source,
                "source", source,
                "source-type", source_type, NULL);
 
-       success = g_initable_init (
-               G_INITABLE (client), cancellable, error);
+       g_initable_init (G_INITABLE (client), cancellable, &local_error);
 
-       if (success)
-               success = e_dbus_calendar_call_open_sync (
-                       client->priv->dbus_proxy, cancellable, error);
+       if (local_error == NULL)
+               e_dbus_calendar_call_open_sync (
+                       client->priv->dbus_proxy, cancellable, &local_error);
 
-       if (!success) {
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                g_prefix_error (
                        error,_("Unable to connect to '%s': "),
                        e_source_get_display_name (source));
@@ -1499,15 +1523,17 @@ cal_client_connect_open_cb (GObject *source_object,
                             gpointer user_data)
 {
        GSimpleAsyncResult *simple;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        simple = G_SIMPLE_ASYNC_RESULT (user_data);
 
        e_dbus_calendar_call_open_finish (
-               E_DBUS_CALENDAR (source_object), result, &error);
+               E_DBUS_CALENDAR (source_object), result, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
+       }
 
        g_simple_async_result_complete (simple);
 
@@ -1523,15 +1549,15 @@ cal_client_connect_init_cb (GObject *source_object,
        GSimpleAsyncResult *simple;
        ECalClientPrivate *priv;
        ConnectClosure *closure;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        simple = G_SIMPLE_ASYNC_RESULT (user_data);
 
        g_async_initable_init_finish (
-               G_ASYNC_INITABLE (source_object), result, &error);
+               G_ASYNC_INITABLE (source_object), result, &local_error);
 
-       if (error != NULL) {
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_simple_async_result_take_error (simple, local_error);
                g_simple_async_result_complete (simple);
                goto exit;
        }
@@ -1986,17 +2012,18 @@ e_cal_client_resolve_tzid_cb (const gchar *tzid,
 {
        ECalClient *client = data;
        icaltimezone *zone = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), NULL);
 
-       e_cal_client_get_timezone_sync (client, tzid, &zone, NULL, &error);
+       e_cal_client_get_timezone_sync (
+               client, tzid, &zone, NULL, &local_error);
 
-       if (error != NULL) {
+       if (local_error != NULL) {
                g_debug (
                        "%s: Failed to find '%s' timezone: %s",
-                       G_STRFUNC, tzid, error->message);
-               g_error_free (error);
+                       G_STRFUNC, tzid, local_error->message);
+               g_error_free (local_error);
        }
 
        return zone;
@@ -2420,16 +2447,16 @@ get_objects_sync (ECalClient *client,
 
        /* Generate objects */
        if (uid && *uid) {
-               GError *error = NULL;
+               GError *local_error = NULL;
 
                e_cal_client_get_objects_for_uid_sync (
-                       client, uid, &objects, NULL, &error);
+                       client, uid, &objects, NULL, &local_error);
 
-               if (error != NULL) {
+               if (local_error != NULL) {
                        g_warning (
                                "Failed to get recurrence objects "
-                               "for uid: %s\n", error->message);
-                       g_clear_error (&error);
+                               "for uid: %s\n", local_error->message);
+                       g_error_free (local_error);
                        return NULL;
                }
        } else {
@@ -2506,7 +2533,7 @@ got_objects_for_uid_cb (GObject *source_object,
 {
        struct get_objects_async_data *goad = user_data;
        GSList *objects = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        g_return_if_fail (source_object != NULL);
        g_return_if_fail (result != NULL);
@@ -2514,17 +2541,17 @@ got_objects_for_uid_cb (GObject *source_object,
        g_return_if_fail (goad->client == E_CAL_CLIENT (source_object));
 
        e_cal_client_get_objects_for_uid_finish (
-               goad->client, result, &objects, &error);
+               goad->client, result, &objects, &local_error);
 
-       if (error != NULL) {
-               if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) ||
-                   g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+       if (local_error != NULL) {
+               if (g_error_matches (local_error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) ||
+                   g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                        free_get_objects_async_data (goad);
-                       g_clear_error (&error);
+                       g_error_free (local_error);
                        return;
                }
 
-               g_clear_error (&error);
+               g_clear_error (&local_error);
                objects = NULL;
        }
 
@@ -2541,7 +2568,7 @@ got_object_list_as_comps_cb (GObject *source_object,
 {
        struct get_objects_async_data *goad = user_data;
        GSList *objects = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        g_return_if_fail (source_object != NULL);
        g_return_if_fail (result != NULL);
@@ -2549,17 +2576,17 @@ got_object_list_as_comps_cb (GObject *source_object,
        g_return_if_fail (goad->client == E_CAL_CLIENT (source_object));
 
        e_cal_client_get_object_list_as_comps_finish (
-               goad->client, result, &objects, &error);
+               goad->client, result, &objects, &local_error);
 
-       if (error != NULL) {
-               if (g_error_matches (error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) ||
-                   g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
+       if (local_error != NULL) {
+               if (g_error_matches (local_error, E_CLIENT_ERROR, E_CLIENT_ERROR_CANCELLED) ||
+                   g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                        free_get_objects_async_data (goad);
-                       g_clear_error (&error);
+                       g_error_free (local_error);
                        return;
                }
 
-               g_clear_error (&error);
+               g_clear_error (&local_error);
                objects = NULL;
        }
 
@@ -3163,17 +3190,17 @@ cal_client_get_default_object_thread (GSimpleAsyncResult *simple,
                                       GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_cal_client_get_default_object_sync (
                E_CAL_CLIENT (source_object),
                &async_context->out_comp,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -3327,7 +3354,7 @@ cal_client_get_object_thread (GSimpleAsyncResult *simple,
                               GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -3336,10 +3363,10 @@ cal_client_get_object_thread (GSimpleAsyncResult *simple,
                async_context->uid,
                async_context->rid,
                &async_context->out_comp,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -3481,7 +3508,7 @@ e_cal_client_get_object_sync (ECalClient *client,
        gchar *utf8_uid;
        gchar *utf8_rid;
        gchar *string = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (uid != NULL, FALSE);
@@ -3493,20 +3520,23 @@ e_cal_client_get_object_sync (ECalClient *client,
        utf8_uid = e_util_utf8_make_valid (uid);
        utf8_rid = e_util_utf8_make_valid (rid);
 
-       success = e_dbus_calendar_call_get_object_sync (
+       e_dbus_calendar_call_get_object_sync (
                client->priv->dbus_proxy, utf8_uid, utf8_rid,
-               &string, cancellable, error);
+               &string, cancellable, &local_error);
 
        g_free (utf8_uid);
        g_free (utf8_rid);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (string != NULL)) ||
-               (!success && (string == NULL)), FALSE);
+               ((string != NULL) && (local_error == NULL)) ||
+               ((string == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        icalcomp = icalparser_parse_string (string);
 
@@ -3582,7 +3612,7 @@ cal_client_get_objects_for_uid_thread (GSimpleAsyncResult *simple,
                                        GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -3590,10 +3620,10 @@ cal_client_get_objects_for_uid_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->uid,
                &async_context->object_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -3720,7 +3750,7 @@ e_cal_client_get_objects_for_uid_sync (ECalClient *client,
        icalcomponent_kind kind;
        gchar *utf8_uid;
        gchar *string = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (uid != NULL, FALSE);
@@ -3728,19 +3758,22 @@ e_cal_client_get_objects_for_uid_sync (ECalClient *client,
 
        utf8_uid = e_util_utf8_make_valid (uid);
 
-       success = e_dbus_calendar_call_get_object_sync (
+       e_dbus_calendar_call_get_object_sync (
                client->priv->dbus_proxy, utf8_uid, "",
-               &string, cancellable, error);
+               &string, cancellable, &local_error);
 
        g_free (utf8_uid);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (string != NULL)) ||
-               (!success && (string == NULL)), FALSE);
+               ((string != NULL) && (local_error == NULL)) ||
+               ((string == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        icalcomp = icalparser_parse_string (string);
 
@@ -3813,7 +3846,7 @@ cal_client_get_object_list_thread (GSimpleAsyncResult *simple,
                                    GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -3821,10 +3854,10 @@ cal_client_get_object_list_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->sexp,
                &async_context->comp_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -3946,8 +3979,8 @@ e_cal_client_get_object_list_sync (ECalClient *client,
        GSList *tmp = NULL;
        gchar *utf8_sexp;
        gchar **strv = NULL;
-       gboolean success;
        gint ii;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (sexp != NULL, FALSE);
@@ -3955,19 +3988,22 @@ e_cal_client_get_object_list_sync (ECalClient *client,
 
        utf8_sexp = e_util_utf8_make_valid (sexp);
 
-       success = e_dbus_calendar_call_get_object_list_sync (
+       e_dbus_calendar_call_get_object_list_sync (
                client->priv->dbus_proxy, utf8_sexp,
-               &strv, cancellable, error);
+               &strv, cancellable, &local_error);
 
        g_free (utf8_sexp);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (strv != NULL)) ||
-               (!success && (strv == NULL)), FALSE);
+               ((strv != NULL) && (local_error == NULL)) ||
+               ((strv == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        for (ii = 0; strv[ii] != NULL; ii++) {
                icalcomponent *icalcomp;
@@ -3991,7 +4027,7 @@ cal_client_get_object_list_as_comps_thread (GSimpleAsyncResult *simple,
                                             GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -3999,10 +4035,10 @@ cal_client_get_object_list_as_comps_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->sexp,
                &async_context->object_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4175,7 +4211,7 @@ cal_client_get_free_busy_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -4184,10 +4220,10 @@ cal_client_get_free_busy_thread (GSimpleAsyncResult *simple,
                async_context->start,
                async_context->end,
                async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4302,8 +4338,8 @@ e_cal_client_get_free_busy_sync (ECalClient *client,
                                  GError **error)
 {
        gchar **strv;
-       gboolean success;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (start > 0, FALSE);
@@ -4315,15 +4351,21 @@ e_cal_client_get_free_busy_sync (ECalClient *client,
                users = g_slist_next (users);
        }
 
-       success = e_dbus_calendar_call_get_free_busy_sync (
+       e_dbus_calendar_call_get_free_busy_sync (
                client->priv->dbus_proxy,
                (gint64) start, (gint64) end,
                (const gchar * const *) strv,
-               cancellable, error);
+               cancellable, &local_error);
 
        g_strfreev (strv);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_create_object() */
@@ -4333,7 +4375,7 @@ cal_client_create_object_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -4341,10 +4383,10 @@ cal_client_create_object_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->in_comp,
                &async_context->uid,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4495,7 +4537,7 @@ cal_client_create_objects_thread (GSimpleAsyncResult *simple,
                                   GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -4503,10 +4545,10 @@ cal_client_create_objects_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->comp_list,
                &async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4631,8 +4673,8 @@ e_cal_client_create_objects_sync (ECalClient *client,
 {
        gchar **strv;
        gchar **uids = NULL;
-       gboolean success;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (icalcomps != NULL, FALSE);
@@ -4649,17 +4691,17 @@ e_cal_client_create_objects_sync (ECalClient *client,
                icalcomps = g_slist_next (icalcomps);
        }
 
-       success = e_dbus_calendar_call_create_objects_sync (
+       e_dbus_calendar_call_create_objects_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               &uids, cancellable, error);
+               &uids, cancellable, &local_error);
 
        g_strfreev (strv);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (uids != NULL)) ||
-               (!success && (uids == NULL)), FALSE);
+               ((uids != NULL) && (local_error == NULL)) ||
+               ((uids == NULL) && (local_error != NULL)), FALSE);
 
        if (uids != NULL) {
                GSList *tmp = NULL;
@@ -4675,7 +4717,13 @@ e_cal_client_create_objects_sync (ECalClient *client,
 
        g_strfreev (uids);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_modify_object() */
@@ -4685,7 +4733,7 @@ cal_client_modify_object_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -4693,10 +4741,10 @@ cal_client_modify_object_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->in_comp,
                async_context->mod,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4828,7 +4876,7 @@ cal_client_modify_objects_thread (GSimpleAsyncResult *simple,
                                   GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -4836,10 +4884,10 @@ cal_client_modify_objects_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->comp_list,
                async_context->mod,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -4959,9 +5007,9 @@ e_cal_client_modify_objects_sync (ECalClient *client,
        GFlagsClass *flags_class;
        GFlagsValue *flags_value;
        GString *flags;
-       gboolean success;
        gchar **strv;
        gint ii = 0;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (comps != NULL, FALSE);
@@ -4988,17 +5036,23 @@ e_cal_client_modify_objects_sync (ECalClient *client,
                comps = g_slist_next (comps);
        }
 
-       success = e_dbus_calendar_call_modify_objects_sync (
+       e_dbus_calendar_call_modify_objects_sync (
                client->priv->dbus_proxy,
                (const gchar * const *) strv,
-               flags->str, cancellable, error);
+               flags->str, cancellable, &local_error);
 
        g_strfreev (strv);
 
        g_type_class_unref (flags_class);
        g_string_free (flags, TRUE);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_remove_object() */
@@ -5008,7 +5062,7 @@ cal_client_remove_object_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -5017,10 +5071,10 @@ cal_client_remove_object_thread (GSimpleAsyncResult *simple,
                async_context->uid,
                async_context->rid,
                async_context->mod,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -5155,7 +5209,7 @@ cal_client_remove_objects_thread (GSimpleAsyncResult *simple,
                                   GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -5163,10 +5217,10 @@ cal_client_remove_objects_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->string_list,
                async_context->mod,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -5284,7 +5338,7 @@ e_cal_client_remove_objects_sync (ECalClient *client,
        GFlagsValue *flags_value;
        GString *flags;
        guint n_valid_uids = 0;
-       gboolean success = TRUE;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (ids != NULL, FALSE);
@@ -5315,13 +5369,12 @@ e_cal_client_remove_objects_sync (ECalClient *client,
                 * backward-compatibility, even though INVALID_ARG might
                 * be more appropriate. */
                if (*id->uid == '\0') {
-                       g_set_error_literal (
-                               error, E_CAL_CLIENT_ERROR,
+                       local_error = g_error_new_literal (
+                               E_CAL_CLIENT_ERROR,
                                E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND,
                                e_cal_client_error_to_string (
                                E_CAL_CLIENT_ERROR_OBJECT_NOT_FOUND));
                        n_valid_uids = 0;
-                       success = FALSE;
                        break;
                }
 
@@ -5340,10 +5393,10 @@ e_cal_client_remove_objects_sync (ECalClient *client,
        }
 
        if (n_valid_uids > 0) {
-               success = e_dbus_calendar_call_remove_objects_sync (
+               e_dbus_calendar_call_remove_objects_sync (
                        client->priv->dbus_proxy,
                        g_variant_builder_end (&builder),
-                       flags->str, cancellable, error);
+                       flags->str, cancellable, &local_error);
        } else {
                g_variant_builder_clear (&builder);
        }
@@ -5351,7 +5404,13 @@ e_cal_client_remove_objects_sync (ECalClient *client,
        g_type_class_unref (flags_class);
        g_string_free (flags, TRUE);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_receive_objects() */
@@ -5361,17 +5420,17 @@ cal_client_receive_objects_thread (GSimpleAsyncResult *simple,
                                    GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_cal_client_receive_objects_sync (
                E_CAL_CLIENT (source_object),
                async_context->in_comp,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -5476,21 +5535,27 @@ e_cal_client_receive_objects_sync (ECalClient *client,
 {
        gchar *ical_string;
        gchar *utf8_ical_string;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
 
        ical_string = icalcomponent_as_ical_string_r (icalcomp);
        utf8_ical_string = e_util_utf8_make_valid (ical_string);
 
-       success = e_dbus_calendar_call_receive_objects_sync (
-               client->priv->dbus_proxy,
-               utf8_ical_string, cancellable, error);
+       e_dbus_calendar_call_receive_objects_sync (
+               client->priv->dbus_proxy, utf8_ical_string,
+               cancellable, &local_error);
 
        g_free (utf8_ical_string);
        g_free (ical_string);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_send_objects() */
@@ -5500,7 +5565,7 @@ cal_client_send_objects_thread (GSimpleAsyncResult *simple,
                                 GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -5509,10 +5574,10 @@ cal_client_send_objects_thread (GSimpleAsyncResult *simple,
                async_context->in_comp,
                &async_context->string_list,
                &async_context->out_comp,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -5650,7 +5715,7 @@ e_cal_client_send_objects_sync (ECalClient *client,
        gchar *utf8_ical_string;
        gchar **users = NULL;
        gchar *out_ical_string = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (icalcomp != NULL, FALSE);
@@ -5660,20 +5725,22 @@ e_cal_client_send_objects_sync (ECalClient *client,
        ical_string = icalcomponent_as_ical_string_r (icalcomp);
        utf8_ical_string = e_util_utf8_make_valid (ical_string);
 
-       success = e_dbus_calendar_call_send_objects_sync (
-               client->priv->dbus_proxy, utf8_ical_string,
-               &users, &out_ical_string, cancellable, error);
+       e_dbus_calendar_call_send_objects_sync (
+               client->priv->dbus_proxy, utf8_ical_string, &users,
+               &out_ical_string, cancellable, &local_error);
 
        g_free (utf8_ical_string);
        g_free (ical_string);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (out_ical_string != NULL)) ||
-               (!success && (out_ical_string == NULL)), FALSE);
+               ((out_ical_string != NULL) && (local_error == NULL)) ||
+               ((out_ical_string == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success) {
+       if (local_error != NULL) {
                g_warn_if_fail (users == NULL);
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
        }
 
@@ -5717,7 +5784,7 @@ cal_client_get_attachment_uris_thread (GSimpleAsyncResult *simple,
                                        GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -5726,10 +5793,10 @@ cal_client_get_attachment_uris_thread (GSimpleAsyncResult *simple,
                async_context->uid,
                async_context->rid,
                &async_context->string_list,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -5854,7 +5921,7 @@ e_cal_client_get_attachment_uris_sync (ECalClient *client,
        gchar *utf8_uid;
        gchar *utf8_rid;
        gchar **uris = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (uid != NULL, FALSE);
@@ -5866,17 +5933,17 @@ e_cal_client_get_attachment_uris_sync (ECalClient *client,
        utf8_uid = e_util_utf8_make_valid (uid);
        utf8_rid = e_util_utf8_make_valid (rid);
 
-       success = e_dbus_calendar_call_get_attachment_uris_sync (
-               client->priv->dbus_proxy, utf8_uid,
-               utf8_rid, &uris, cancellable, error);
+       e_dbus_calendar_call_get_attachment_uris_sync (
+               client->priv->dbus_proxy, utf8_uid, utf8_rid,
+               &uris, cancellable, &local_error);
 
        g_free (utf8_uid);
        g_free (utf8_rid);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (uris != NULL)) ||
-               (!success && (uris == NULL)), FALSE);
+               ((uris != NULL) && (local_error == NULL)) ||
+               ((uris == NULL) && (local_error != NULL)), FALSE);
 
        if (uris != NULL) {
                GSList *tmp = NULL;
@@ -5890,7 +5957,13 @@ e_cal_client_get_attachment_uris_sync (ECalClient *client,
                *out_attachment_uris = g_slist_reverse (tmp);
        }
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_discard_alarm() */
@@ -5900,7 +5973,7 @@ cal_client_discard_alarm_thread (GSimpleAsyncResult *simple,
                                  GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -5909,10 +5982,10 @@ cal_client_discard_alarm_thread (GSimpleAsyncResult *simple,
                async_context->uid,
                async_context->rid,
                async_context->auid,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -6025,7 +6098,7 @@ e_cal_client_discard_alarm_sync (ECalClient *client,
        gchar *utf8_uid;
        gchar *utf8_rid;
        gchar *utf8_auid;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (uid != NULL, FALSE);
@@ -6038,15 +6111,22 @@ e_cal_client_discard_alarm_sync (ECalClient *client,
        utf8_rid = e_util_utf8_make_valid (rid);
        utf8_auid = e_util_utf8_make_valid (auid);
 
-       success = e_dbus_calendar_call_discard_alarm_sync (
-               client->priv->dbus_proxy, utf8_uid,
-               utf8_rid, utf8_auid, cancellable, error);
+       e_dbus_calendar_call_discard_alarm_sync (
+               client->priv->dbus_proxy,
+               utf8_uid, utf8_rid, utf8_auid,
+               cancellable, &local_error);
 
        g_free (utf8_uid);
        g_free (utf8_rid);
        g_free (utf8_auid);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for e_cal_client_get_view() */
@@ -6059,7 +6139,7 @@ cal_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
        AsyncContext *async_context;
        gchar *utf8_sexp;
        gchar *object_path = NULL;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -6067,14 +6147,14 @@ cal_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
        e_dbus_calendar_call_get_view_sync (
                client->priv->dbus_proxy, utf8_sexp,
-               &object_path, cancellable, &error);
+               &object_path, cancellable, &local_error);
 
        g_free (utf8_sexp);
 
        /* Sanity check. */
        g_return_if_fail (
-               ((object_path != NULL) && (error == NULL)) ||
-               ((object_path == NULL) && (error != NULL)));
+               ((object_path != NULL) && (local_error == NULL)) ||
+               ((object_path == NULL) && (local_error != NULL)));
 
        if (object_path != NULL) {
                GDBusConnection *connection;
@@ -6085,7 +6165,7 @@ cal_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
                client_view = g_initable_new (
                        E_TYPE_CAL_CLIENT_VIEW,
-                       cancellable, &error,
+                       cancellable, &local_error,
                        "client", client,
                        "connection", connection,
                        "object-path", object_path,
@@ -6093,16 +6173,18 @@ cal_client_get_view_in_dbus_thread (GSimpleAsyncResult *simple,
 
                /* Sanity check. */
                g_return_if_fail (
-                       ((client_view != NULL) && (error == NULL)) ||
-                       ((client_view == NULL) && (error != NULL)));
+                       ((client_view != NULL) && (local_error == NULL)) ||
+                       ((client_view == NULL) && (local_error != NULL)));
 
                async_context->client_view = client_view;
 
                g_free (object_path);
        }
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_simple_async_result_take_error (simple, local_error);
+       }
 }
 
 /**
@@ -6248,7 +6330,7 @@ cal_client_get_timezone_thread (GSimpleAsyncResult *simple,
                                 GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -6256,10 +6338,10 @@ cal_client_get_timezone_thread (GSimpleAsyncResult *simple,
                E_CAL_CLIENT (source_object),
                async_context->tzid,
                &async_context->zone,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -6379,7 +6461,7 @@ e_cal_client_get_timezone_sync (ECalClient *client,
        icaltimezone *zone;
        gchar *utf8_tzid;
        gchar *string = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (tzid != NULL, FALSE);
@@ -6394,19 +6476,22 @@ e_cal_client_get_timezone_sync (ECalClient *client,
 
        utf8_tzid = e_util_utf8_make_valid (tzid);
 
-       success = e_dbus_calendar_call_get_timezone_sync (
+       e_dbus_calendar_call_get_timezone_sync (
                client->priv->dbus_proxy, utf8_tzid,
-               &string, cancellable, error);
+               &string, cancellable, &local_error);
 
        g_free (utf8_tzid);
 
        /* Sanity check. */
        g_return_val_if_fail (
-               (success && (string != NULL)) ||
-               (!success && (string == NULL)), FALSE);
+               ((string != NULL) && (local_error == NULL)) ||
+               ((string == NULL) && (local_error != NULL)), FALSE);
 
-       if (!success)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        icalcomp = icalparser_parse_string (string);
 
@@ -6453,17 +6538,17 @@ cal_client_add_timezone_thread (GSimpleAsyncResult *simple,
                                 GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_cal_client_add_timezone_sync (
                E_CAL_CLIENT (source_object),
                async_context->zone,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -6574,7 +6659,7 @@ e_cal_client_add_timezone_sync (ECalClient *client,
        icalcomponent *icalcomp;
        gchar *zone_str;
        gchar *utf8_zone_str;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
        g_return_val_if_fail (zone != NULL, FALSE);
@@ -6593,12 +6678,19 @@ e_cal_client_add_timezone_sync (ECalClient *client,
        zone_str = icalcomponent_as_ical_string_r (icalcomp);
        utf8_zone_str = e_util_utf8_make_valid (zone_str);
 
-       success = e_dbus_calendar_call_add_timezone_sync (
-               client->priv->dbus_proxy, utf8_zone_str, cancellable, error);
+       e_dbus_calendar_call_add_timezone_sync (
+               client->priv->dbus_proxy, utf8_zone_str,
+               cancellable, &local_error);
 
        g_free (zone_str);
        g_free (utf8_zone_str);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
diff --git a/libebackend/e-user-prompter.c b/libebackend/e-user-prompter.c
index 127b9fd..59fe0cb 100644
--- a/libebackend/e-user-prompter.c
+++ b/libebackend/e-user-prompter.c
@@ -143,7 +143,7 @@ user_prompter_prompt_invoke (EDBusUserPrompter *dbus_prompter,
 {
        GPtrArray *captions;
        GList *list, *link;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (dbus_prompter != NULL, FALSE);
        g_return_val_if_fail (async_data != NULL, FALSE);
@@ -161,7 +161,7 @@ user_prompter_prompt_invoke (EDBusUserPrompter *dbus_prompter,
        /* NULL-terminated array */
        g_ptr_array_add (captions, NULL);
 
-       success = e_dbus_user_prompter_call_prompt_sync (
+       e_dbus_user_prompter_call_prompt_sync (
                dbus_prompter,
                async_data->type ? async_data->type : "",
                async_data->title ? async_data->title : "",
@@ -170,12 +170,17 @@ user_prompter_prompt_invoke (EDBusUserPrompter *dbus_prompter,
                async_data->use_markup,
                (const gchar *const *) captions->pdata,
                &async_data->prompt_id,
-               cancellable,
-               error);
+               cancellable, &local_error);
 
        g_ptr_array_free (captions, TRUE);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static void
@@ -201,24 +206,30 @@ user_prompter_extension_prompt_invoke (EDBusUserPrompter *dbus_prompter,
                                        GCancellable *cancellable,
                                        GError **error)
 {
-       gboolean success;
        gchar **params;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (dbus_prompter != NULL, FALSE);
        g_return_val_if_fail (async_data != NULL, FALSE);
 
        params = e_named_parameters_to_strv (async_data->in_parameters);
-       success = e_dbus_user_prompter_call_extension_prompt_sync (
+
+       e_dbus_user_prompter_call_extension_prompt_sync (
                dbus_prompter,
                async_data->dialog_name,
                (const gchar *const *) params,
                &async_data->prompt_id,
-               cancellable,
-               error);
+               cancellable, &local_error);
 
        g_strfreev (params);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 static void
diff --git a/libedataserver/e-source-registry.c b/libedataserver/e-source-registry.c
index ebcd59a..bfcdfce 100644
--- a/libedataserver/e-source-registry.c
+++ b/libedataserver/e-source-registry.c
@@ -126,7 +126,6 @@ struct _AuthContext {
        ESourceAuthenticationResult auth_result;
        GcrSecretExchange *secret_exchange;
        gboolean authenticating;
-       gboolean success;
        GError **error;
 };
 
@@ -565,24 +564,24 @@ source_registry_new_source (ESourceRegistry *registry,
        GMainContext *main_context;
        ESource *source;
        const gchar *object_path;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        /* We don't want the ESource emitting "changed" signals from
         * the manager thread, so we pass it the same main context the
         * registry uses for scheduling signal emissions. */
        main_context = registry->priv->main_context;
-       source = e_source_new (dbus_object, main_context, &error);
+       source = e_source_new (dbus_object, main_context, &local_error);
        object_path = g_dbus_object_get_object_path (dbus_object);
 
        /* The likelihood of an error here is slim, so it's
         * sufficient to just print a warning if one occurs. */
-       if (error != NULL) {
+       if (local_error != NULL) {
                g_warn_if_fail (source == NULL);
                g_critical (
                        "ESourceRegistry: Failed to create a "
                        "data source object for path '%s': %s",
-                       object_path, error->message);
-               g_error_free (error);
+                       object_path, local_error->message);
+               g_error_free (local_error);
                return NULL;
        }
 
@@ -1049,6 +1048,7 @@ source_registry_initable_init (GInitable *initable,
 {
        ESourceRegistry *registry;
        ThreadClosure *closure;
+       GError *local_error = NULL;
 
        registry = E_SOURCE_REGISTRY (initable);
 
@@ -1083,6 +1083,7 @@ source_registry_initable_init (GInitable *initable,
 
        /* Check for error in the manager thread. */
        if (closure->error != NULL) {
+               g_dbus_error_strip_remote_error (closure->error);
                g_propagate_error (error, closure->error);
                closure->error = NULL;
                return FALSE;
@@ -1116,10 +1117,13 @@ source_registry_initable_init (GInitable *initable,
                        G_DBUS_PROXY_FLAGS_NONE,
                        SOURCES_DBUS_SERVICE_NAME,
                        DBUS_OBJECT_PATH,
-                       cancellable, error);
+                       cancellable, &local_error);
 
-       if (registry->priv->dbus_source_manager == NULL)
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
                return FALSE;
+       }
 
        /* Allow authentication prompts for all exported data sources
         * when a new EDBusSourceManagerProxy is created.  The thought
@@ -1465,7 +1469,7 @@ source_registry_authenticate_thread (GSimpleAsyncResult *simple,
                                      GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -1473,10 +1477,10 @@ source_registry_authenticate_thread (GSimpleAsyncResult *simple,
                E_SOURCE_REGISTRY (object),
                async_context->source,
                async_context->auth,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /* Helper for e_source_registry_authenticate_sync() */
@@ -1513,7 +1517,6 @@ source_registry_authenticate_respond_cb (AuthContext *auth_context)
                        auth_context->dbus_auth,
                        NULL, &non_fatal_error);
                g_main_loop_quit (auth_context->main_loop);
-               auth_context->success = FALSE;
 
        /* If an error occurred while attempting to authenticate,
         * tell the server to cancel the authentication session. */
@@ -1523,7 +1526,6 @@ source_registry_authenticate_respond_cb (AuthContext *auth_context)
                        auth_context->cancellable,
                        &non_fatal_error);
                g_main_loop_quit (auth_context->main_loop);
-               auth_context->success = FALSE;
 
        /* If the password was accepted, let the server know so it
         * can close any authentication dialogs and save the user
@@ -1534,7 +1536,6 @@ source_registry_authenticate_respond_cb (AuthContext *auth_context)
                        auth_context->cancellable,
                        &non_fatal_error);
                g_main_loop_quit (auth_context->main_loop);
-               auth_context->success = TRUE;
 
        /* If the password was rejected, let the server know so it can
         * indicate failure and request a different password, and then
@@ -1549,6 +1550,7 @@ source_registry_authenticate_respond_cb (AuthContext *auth_context)
        /* Leave breadcrumbs if something went wrong,
         * but don't fail the whole operation over it. */
        if (non_fatal_error != NULL) {
+               g_dbus_error_strip_remote_error (non_fatal_error);
                g_warning ("%s: %s", G_STRFUNC, non_fatal_error->message);
                g_error_free (non_fatal_error);
        }
@@ -1627,7 +1629,6 @@ source_registry_authenticate_dismissed_cb (EDBusAuthenticator *dbus_auth,
        }
 
        g_main_loop_quit (auth_context->main_loop);
-       auth_context->success = FALSE;
 }
 
 /* Helper for e_source_registry_authenticate_sync() */
@@ -1644,7 +1645,7 @@ source_registry_call_authenticate_for_source (ESourceRegistry *registry,
        gchar *prompt_title = NULL;
        gchar *prompt_message = NULL;
        gchar *prompt_description = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_object_ref (source);
 
@@ -1691,10 +1692,10 @@ source_registry_call_authenticate_for_source (ESourceRegistry *registry,
                &prompt_message,
                &prompt_description);
 
-       success = e_dbus_source_manager_call_authenticate_sync (
+       e_dbus_source_manager_call_authenticate_sync (
                registry->priv->dbus_source_manager, uid,
                prompt_title, prompt_message, prompt_description,
-               out_object_path, cancellable, error);
+               out_object_path, cancellable, &local_error);
 
        g_free (prompt_title);
        g_free (prompt_message);
@@ -1702,7 +1703,13 @@ source_registry_call_authenticate_for_source (ESourceRegistry *registry,
 
        g_object_unref (source);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /**
@@ -1741,7 +1748,7 @@ e_source_registry_authenticate_sync (ESourceRegistry *registry,
        EDBusAuthenticator *dbus_auth;
        gchar *encryption_key;
        gchar *object_path = NULL;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
        g_return_val_if_fail (E_IS_SOURCE (source), FALSE);
@@ -1750,11 +1757,13 @@ e_source_registry_authenticate_sync (ESourceRegistry *registry,
        /* This extracts authentication prompt details for the ESource
         * before initiating an authentication session with the server,
         * so split it out of the main algorithm for clarity's sake. */
-       success = source_registry_call_authenticate_for_source (
-               registry, auth, source, &object_path, cancellable, error);
+       source_registry_call_authenticate_for_source (
+               registry, auth, source, &object_path,
+               cancellable, &local_error);
 
-       if (!success) {
+       if (local_error != NULL) {
                g_warn_if_fail (object_path == NULL);
+               g_propagate_error (error, local_error);
                return FALSE;
        }
 
@@ -1767,20 +1776,23 @@ e_source_registry_authenticate_sync (ESourceRegistry *registry,
                G_BUS_TYPE_SESSION,
                G_DBUS_PROXY_FLAGS_NONE,
                SOURCES_DBUS_SERVICE_NAME,
-               object_path, cancellable, error);
+               object_path, cancellable, &local_error);
 
        g_free (object_path);
 
-       if (dbus_auth == NULL) {
-               success = FALSE;
+       /* Sanity check. */
+       g_return_val_if_fail (
+               ((dbus_auth != NULL) && (local_error == NULL)) ||
+               ((dbus_auth == NULL) && (local_error != NULL)), FALSE);
+
+       if (local_error != NULL)
                goto exit;
-       }
 
        auth_context = g_slice_new0 (AuthContext);
        auth_context->auth = g_object_ref (auth);
        auth_context->dbus_auth = dbus_auth;  /* takes ownership */
        auth_context->main_loop = g_main_loop_new (main_context, FALSE);
-       auth_context->error = error;
+       auth_context->error = &local_error;
 
        /* This just needs to be something other than
         * E_SOURCE_AUTHENTICATION_ERROR so we don't trip
@@ -1810,15 +1822,13 @@ e_source_registry_authenticate_sync (ESourceRegistry *registry,
         * authentication session.  This must happen AFTER we've
         * connected to the response signal since the server may
         * already have a response ready and waiting for us. */
-       success = e_dbus_authenticator_call_ready_sync (
-               dbus_auth, encryption_key, cancellable, error);
+       e_dbus_authenticator_call_ready_sync (
+               dbus_auth, encryption_key, cancellable, &local_error);
 
        g_free (encryption_key);
 
-       if (success) {
+       if (local_error == NULL)
                g_main_loop_run (auth_context->main_loop);
-               success = auth_context->success;
-       }
 
        auth_context_free (auth_context);
 
@@ -1832,7 +1842,13 @@ exit:
 
        g_main_context_unref (main_context);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /**
@@ -1935,17 +1951,17 @@ source_registry_commit_source_thread (GSimpleAsyncResult *simple,
                                       GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_source_registry_commit_source_sync (
                E_SOURCE_REGISTRY (object),
                async_context->source,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /**
@@ -2106,17 +2122,17 @@ source_registry_create_sources_thread (GSimpleAsyncResult *simple,
                                        GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_source_registry_create_sources_sync (
                E_SOURCE_REGISTRY (object),
                async_context->list_of_sources,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 /* Helper for e_source_registry_create_sources_sync() */
@@ -2191,7 +2207,7 @@ e_source_registry_create_sources_sync (ESourceRegistry *registry,
        GVariant *variant;
        GList *link;
        gulong object_added_id;
-       gboolean success;
+       GError *local_error = NULL;
 
        g_return_val_if_fail (E_IS_SOURCE_REGISTRY (registry), FALSE);
 
@@ -2231,9 +2247,9 @@ e_source_registry_create_sources_sync (ESourceRegistry *registry,
                create_context);
 
        /* This function sinks the floating GVariant reference. */
-       success = e_dbus_source_manager_call_create_sources_sync (
+       e_dbus_source_manager_call_create_sources_sync (
                registry->priv->dbus_source_manager,
-               variant, cancellable, error);
+               variant, cancellable, &local_error);
 
        g_variant_builder_clear (&builder);
 
@@ -2241,7 +2257,7 @@ e_source_registry_create_sources_sync (ESourceRegistry *registry,
         * But also set a short timeout to avoid getting stuck here in
         * case the registry service adds sources to its orphan table,
         * which prevents them from being exported over D-Bus. */
-       if (success) {
+       if (local_error == NULL) {
                GSource *timeout_source;
 
                timeout_source = g_timeout_source_new_seconds (2);
@@ -2262,7 +2278,13 @@ e_source_registry_create_sources_sync (ESourceRegistry *registry,
        g_main_context_pop_thread_default (create_context->main_context);
        create_context_free (create_context);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /**
diff --git a/libedataserver/e-source.c b/libedataserver/e-source.c
index fe9bc50..251c3a1 100644
--- a/libedataserver/e-source.c
+++ b/libedataserver/e-source.c
@@ -387,7 +387,7 @@ source_set_property_from_key_file (GObject *object,
 {
        gchar *key;
        GValue *value;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        value = g_slice_new0 (GValue);
        key = e_source_parameter_to_key (pspec->name);
@@ -401,8 +401,8 @@ source_set_property_from_key_file (GObject *object,
                gint v_int;
 
                v_int = g_key_file_get_integer (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_INT);
                        g_value_set_int (value, v_int);
                }
@@ -411,8 +411,8 @@ source_set_property_from_key_file (GObject *object,
                gint64 v_int64;
 
                v_int64 = g_key_file_get_int64 (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_INT64);
                        g_value_set_int64 (value, v_int64);
                }
@@ -422,8 +422,8 @@ source_set_property_from_key_file (GObject *object,
                gchar *v_str;
 
                v_str = g_key_file_get_string (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        v_uint64 = g_ascii_strtoull (v_str, NULL, 16);
 
                        g_value_init (value, G_TYPE_UINT64);
@@ -436,8 +436,8 @@ source_set_property_from_key_file (GObject *object,
                gboolean v_boolean;
 
                v_boolean = g_key_file_get_boolean (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_BOOLEAN);
                        g_value_set_boolean (value, v_boolean);
                }
@@ -446,8 +446,8 @@ source_set_property_from_key_file (GObject *object,
                gchar *nick;
 
                nick = g_key_file_get_string (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        GParamSpecEnum *enum_pspec;
                        GEnumValue *enum_value;
 
@@ -466,8 +466,8 @@ source_set_property_from_key_file (GObject *object,
                gdouble v_double;
 
                v_double = g_key_file_get_double (
-                       key_file, group_name, key, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_DOUBLE);
                        g_value_set_double (value, v_double);
                }
@@ -477,8 +477,8 @@ source_set_property_from_key_file (GObject *object,
 
                /* Get the localized string if present. */
                v_string = g_key_file_get_locale_string (
-                       key_file, group_name, key, NULL, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, NULL, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_STRING);
                        g_value_take_string (value, v_string);
                }
@@ -487,8 +487,8 @@ source_set_property_from_key_file (GObject *object,
                gchar **strv;
 
                strv = g_key_file_get_string_list (
-                       key_file, group_name, key, NULL, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, NULL, &local_error);
+               if (local_error == NULL) {
                        g_value_init (value, G_TYPE_STRV);
                        g_value_take_boxed (value, strv);
                }
@@ -498,8 +498,8 @@ source_set_property_from_key_file (GObject *object,
 
                /* Create the GFile from the URI string. */
                uri = g_key_file_get_locale_string (
-                       key_file, group_name, key, NULL, &error);
-               if (error == NULL) {
+                       key_file, group_name, key, NULL, &local_error);
+               if (local_error == NULL) {
                        GFile *file = NULL;
                        if (uri != NULL && *uri != '\0')
                                file = g_file_new_for_uri (uri);
@@ -516,10 +516,10 @@ source_set_property_from_key_file (GObject *object,
 
        /* If a value could not be retrieved from the key
         * file, restore the property to its default value. */
-       if (error != NULL) {
+       if (local_error != NULL) {
                g_value_init (value, pspec->value_type);
                g_param_value_set_default (pspec, value);
-               g_error_free (error);
+               g_error_free (local_error);
        }
 
        if (G_IS_VALUE (value)) {
@@ -646,17 +646,18 @@ source_notify_dbus_data_cb (EDBusSource *dbus_source,
                             GParamSpec *pspec,
                             ESource *source)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        g_rec_mutex_lock (&source->priv->lock);
 
        /* Since the source data came from a GKeyFile structure on the
         * server-side, this should never fail.  But we'll print error
         * messages to the terminal just in case. */
-       if (!source_parse_dbus_data (source, &error)) {
-               g_return_if_fail (error != NULL);
-               g_warning ("%s", error->message);
-               g_error_free (error);
+       source_parse_dbus_data (source, &local_error);
+
+       if (local_error != NULL) {
+               g_warning ("%s", local_error->message);
+               g_error_free (local_error);
        }
 
        g_rec_mutex_unlock (&source->priv->lock);
@@ -926,7 +927,7 @@ source_remove_sync (ESource *source,
 {
        EDBusSourceRemovable *dbus_interface = NULL;
        GDBusObject *dbus_object;
-       gboolean success;
+       GError *local_error = NULL;
 
        dbus_object = e_source_ref_dbus_object (source);
        if (dbus_object != NULL) {
@@ -945,12 +946,18 @@ source_remove_sync (ESource *source,
                return FALSE;
        }
 
-       success = e_dbus_source_removable_call_remove_sync (
-               dbus_interface, cancellable, error);
+       e_dbus_source_removable_call_remove_sync (
+               dbus_interface, cancellable, &local_error);
 
        g_object_unref (dbus_interface);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for source_remove() */
@@ -959,12 +966,12 @@ source_remove_thread (GSimpleAsyncResult *simple,
                       GObject *object,
                       GCancellable *cancellable)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
-       e_source_remove_sync (E_SOURCE (object), cancellable, &error);
+       e_source_remove_sync (E_SOURCE (object), cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 static void
@@ -1011,8 +1018,8 @@ source_write_sync (ESource *source,
 {
        EDBusSourceWritable *dbus_interface = NULL;
        GDBusObject *dbus_object;
-       gboolean success;
        gchar *data;
+       GError *local_error = NULL;
 
        dbus_object = e_source_ref_dbus_object (source);
        if (dbus_object != NULL) {
@@ -1033,14 +1040,20 @@ source_write_sync (ESource *source,
 
        data = e_source_to_string (source, NULL);
 
-       success = e_dbus_source_writable_call_write_sync (
-               dbus_interface, data, cancellable, error);
+       e_dbus_source_writable_call_write_sync (
+               dbus_interface, data, cancellable, &local_error);
 
        g_free (data);
 
        g_object_unref (dbus_interface);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for source_write() */
@@ -1049,12 +1062,12 @@ source_write_thread (GSimpleAsyncResult *simple,
                      GObject *object,
                      GCancellable *cancellable)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
-       e_source_write_sync (E_SOURCE (object), cancellable, &error);
+       e_source_write_sync (E_SOURCE (object), cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 static void
@@ -1103,7 +1116,7 @@ source_remote_create_sync (ESource *source,
        EDBusSourceRemoteCreatable *dbus_interface = NULL;
        GDBusObject *dbus_object;
        gchar *uid, *data;
-       gboolean success;
+       GError *local_error = NULL;
 
        dbus_object = e_source_ref_dbus_object (source);
        if (dbus_object != NULL) {
@@ -1126,15 +1139,21 @@ source_remote_create_sync (ESource *source,
        uid = e_source_dup_uid (scratch_source);
        data = e_source_to_string (scratch_source, NULL);
 
-       success = e_dbus_source_remote_creatable_call_create_sync (
-               dbus_interface, uid, data, cancellable, error);
+       e_dbus_source_remote_creatable_call_create_sync (
+               dbus_interface, uid, data, cancellable, &local_error);
 
        g_free (data);
        g_free (uid);
 
        g_object_unref (dbus_interface);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for source_remote_create() */
@@ -1144,17 +1163,17 @@ source_remote_create_thread (GSimpleAsyncResult *simple,
                              GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
        e_source_remote_create_sync (
                E_SOURCE (object),
                async_context->scratch_source,
-               cancellable, &error);
+               cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 static void
@@ -1210,7 +1229,7 @@ source_remote_delete_sync (ESource *source,
 {
        EDBusSourceRemoteDeletable *dbus_interface = NULL;
        GDBusObject *dbus_object;
-       gboolean success;
+       GError *local_error = NULL;
 
        dbus_object = e_source_ref_dbus_object (source);
        if (dbus_object != NULL) {
@@ -1230,12 +1249,18 @@ source_remote_delete_sync (ESource *source,
                return FALSE;
        }
 
-       success = e_dbus_source_remote_deletable_call_delete_sync (
-               dbus_interface, cancellable, error);
+       e_dbus_source_remote_deletable_call_delete_sync (
+               dbus_interface, cancellable, &local_error);
 
        g_object_unref (dbus_interface);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for source_remote_delete() */
@@ -1244,13 +1269,13 @@ source_remote_delete_thread (GSimpleAsyncResult *simple,
                              GObject *object,
                              GCancellable *cancellable)
 {
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        e_source_remote_delete_sync (
-               E_SOURCE (object), cancellable, &error);
+               E_SOURCE (object), cancellable, &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 static void
@@ -1300,7 +1325,7 @@ source_get_oauth2_access_token_sync (ESource *source,
 {
        EDBusSourceOAuth2Support *dbus_interface = NULL;
        GDBusObject *dbus_object;
-       gboolean success;
+       GError *local_error = NULL;
 
        dbus_object = e_source_ref_dbus_object (source);
        if (dbus_object != NULL) {
@@ -1320,13 +1345,19 @@ source_get_oauth2_access_token_sync (ESource *source,
                return FALSE;
        }
 
-       success = e_dbus_source_oauth2_support_call_get_access_token_sync (
+       e_dbus_source_oauth2_support_call_get_access_token_sync (
                dbus_interface, out_access_token,
-               out_expires_in, cancellable, error);
+               out_expires_in, cancellable, &local_error);
 
        g_object_unref (dbus_interface);
 
-       return success;
+       if (local_error != NULL) {
+               g_dbus_error_strip_remote_error (local_error);
+               g_propagate_error (error, local_error);
+               return FALSE;
+       }
+
+       return TRUE;
 }
 
 /* Helper for source_get_oauth2_access_token() */
@@ -1336,7 +1367,7 @@ source_get_oauth2_access_token_thread (GSimpleAsyncResult *simple,
                                        GCancellable *cancellable)
 {
        AsyncContext *async_context;
-       GError *error = NULL;
+       GError *local_error = NULL;
 
        async_context = g_simple_async_result_get_op_res_gpointer (simple);
 
@@ -1344,10 +1375,10 @@ source_get_oauth2_access_token_thread (GSimpleAsyncResult *simple,
                E_SOURCE (object), cancellable,
                &async_context->access_token,
                &async_context->expires_in,
-               &error);
+               &local_error);
 
-       if (error != NULL)
-               g_simple_async_result_take_error (simple, error);
+       if (local_error != NULL)
+               g_simple_async_result_take_error (simple, local_error);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]