[evolution-data-server] ESource: Implement the GProxyResolver interface.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] ESource: Implement the GProxyResolver interface.
- Date: Fri, 25 Oct 2013 17:26:09 +0000 (UTC)
commit 6002a4e29f2774a0c3bfa85e1270616bbaac36c4
Author: Matthew Barnes <mbarnes redhat com>
Date: Mon Oct 7 11:42:37 2013 -0400
ESource: Implement the GProxyResolver interface.
An ESource with an ESourceProxy extension can now serve as a
GProxyResolver. Calling g_proxy_resolver_is_supported() on an
ESource will reflect this constraint. Attempting a proxy lookup
operation on an ESource for which g_proxy_resolver_is_supported()
returns FALSE will fail with G_IO_ERROR_NOT_SUPPORTED.
libedataserver/e-source.c | 119 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 117 insertions(+), 2 deletions(-)
---
diff --git a/libedataserver/e-source.c b/libedataserver/e-source.c
index cfad3d9..e60daa6 100644
--- a/libedataserver/e-source.c
+++ b/libedataserver/e-source.c
@@ -58,6 +58,12 @@
* to applications and shared libraries. This is by design, to try and
* keep backend-specific knowledge from creeping into places it doesn't
* belong.
+ *
+ * As of 3.12, an #ESource with an #ESourceProxy extension can serve as a
+ * #GProxyResolver. Calling g_proxy_resolver_is_supported() on an #ESource
+ * will reflect this constraint. Attempting a proxy lookup operation on an
+ * #ESource for which g_proxy_resolver_is_supported() returns %FALSE will
+ * fail with %G_IO_ERROR_NOT_SUPPORTED.
**/
#include "e-source.h"
@@ -161,7 +167,9 @@ enum {
static guint signals[LAST_SIGNAL];
/* Forward Declarations */
-static void e_source_initable_init (GInitableIface *interface);
+static void e_source_initable_init (GInitableIface *interface);
+static void e_source_proxy_resolver_init
+ (GProxyResolverInterface *interface);
/* Private function shared only with ESourceRegistry. */
void __e_source_private_replace_dbus_object
@@ -174,7 +182,10 @@ G_DEFINE_TYPE_WITH_CODE (
G_TYPE_OBJECT,
G_IMPLEMENT_INTERFACE (
G_TYPE_INITABLE,
- e_source_initable_init))
+ e_source_initable_init)
+ G_IMPLEMENT_INTERFACE (
+ G_TYPE_PROXY_RESOLVER,
+ e_source_proxy_resolver_init))
static void
async_context_free (AsyncContext *async_context)
@@ -1508,6 +1519,101 @@ source_initable_init (GInitable *initable,
return success;
}
+static gboolean
+source_proxy_resolver_is_supported (GProxyResolver *resolver)
+{
+ return e_source_has_extension (
+ E_SOURCE (resolver), E_SOURCE_EXTENSION_PROXY);
+}
+
+static gchar **
+source_proxy_resolver_lookup (GProxyResolver *resolver,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GError **error)
+{
+ return e_source_proxy_lookup_sync (
+ E_SOURCE (resolver), uri, cancellable, error);
+}
+
+/* Helper for source_proxy_resolver_lookup_async() */
+static void
+source_proxy_resolver_lookup_ready_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *simple;
+ gchar **proxies;
+ GError *local_error = NULL;
+
+ simple = G_SIMPLE_ASYNC_RESULT (user_data);
+
+ proxies = e_source_proxy_lookup_finish (
+ E_SOURCE (object), result, &local_error);
+
+ /* Sanity check. */
+ g_return_if_fail (
+ ((proxies != NULL) && (local_error == NULL)) ||
+ ((proxies == NULL) && (local_error != NULL)));
+
+ if (proxies != NULL) {
+ g_simple_async_result_set_op_res_gpointer (
+ simple, proxies, (GDestroyNotify) g_strfreev);
+ } else {
+ g_simple_async_result_take_error (simple, local_error);
+ }
+
+ g_simple_async_result_complete (simple);
+
+ g_object_unref (simple);
+}
+
+static void
+source_proxy_resolver_lookup_async (GProxyResolver *resolver,
+ const gchar *uri,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *simple;
+
+ simple = g_simple_async_result_new (
+ G_OBJECT (resolver), callback, user_data,
+ source_proxy_resolver_lookup_async);
+
+ g_simple_async_result_set_check_cancellable (simple, cancellable);
+
+ e_source_proxy_lookup (
+ E_SOURCE (resolver), uri, cancellable,
+ source_proxy_resolver_lookup_ready_cb,
+ g_object_ref (simple));
+
+ g_object_unref (simple);
+}
+
+static gchar **
+source_proxy_resolver_lookup_finish (GProxyResolver *resolver,
+ GAsyncResult *result,
+ GError **error)
+{
+ GSimpleAsyncResult *simple;
+ gchar **proxies;
+
+ g_return_val_if_fail (
+ g_simple_async_result_is_valid (
+ result, G_OBJECT (resolver),
+ source_proxy_resolver_lookup_async), NULL);
+
+ simple = G_SIMPLE_ASYNC_RESULT (result);
+
+ if (g_simple_async_result_propagate_error (simple, error))
+ return NULL;
+
+ proxies = g_simple_async_result_get_op_res_gpointer (simple);
+
+ return g_strdupv (proxies);
+}
+
static void
e_source_class_init (ESourceClass *class)
{
@@ -1713,6 +1819,15 @@ e_source_initable_init (GInitableIface *interface)
}
static void
+e_source_proxy_resolver_init (GProxyResolverInterface *interface)
+{
+ interface->is_supported = source_proxy_resolver_is_supported;
+ interface->lookup = source_proxy_resolver_lookup;
+ interface->lookup_async = source_proxy_resolver_lookup_async;
+ interface->lookup_finish = source_proxy_resolver_lookup_finish;
+}
+
+static void
e_source_init (ESource *source)
{
GHashTable *extensions;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]