[evolution] Adapt to Camel's proxy resolver API changes.



commit eb166460103ecbf561d56a518447442851b3db6e
Author: Matthew Barnes <mbarnes redhat com>
Date:   Thu Oct 10 15:04:01 2013 -0400

    Adapt to Camel's proxy resolver API changes.

 libemail-engine/e-mail-session.c |  177 ++++++++++++++++++++++++++------------
 1 files changed, 120 insertions(+), 57 deletions(-)
---
diff --git a/libemail-engine/e-mail-session.c b/libemail-engine/e-mail-session.c
index 494228e..9123822 100644
--- a/libemail-engine/e-mail-session.c
+++ b/libemail-engine/e-mail-session.c
@@ -68,6 +68,7 @@
        ((obj), E_TYPE_MAIL_SESSION, EMailSessionPrivate))
 
 typedef struct _AsyncContext AsyncContext;
+typedef struct _ServiceProxyData ServiceProxyData;
 
 struct _EMailSessionPrivate {
        MailFolderCache *folder_cache;
@@ -107,6 +108,11 @@ struct _AsyncContext {
        CamelFolder *folder;
 };
 
+struct _ServiceProxyData {
+       ESource *authentication_source;
+       gulong auth_source_changed_handler_id;
+};
+
 enum {
        PROP_0,
        PROP_FOLDER_CACHE,
@@ -278,6 +284,117 @@ async_context_free (AsyncContext *context)
        g_slice_free (AsyncContext, context);
 }
 
+static void
+service_proxy_data_free (ServiceProxyData *proxy_data)
+{
+       g_signal_handler_disconnect (
+               proxy_data->authentication_source,
+               proxy_data->auth_source_changed_handler_id);
+
+       g_clear_object (&proxy_data->authentication_source);
+
+       g_slice_free (ServiceProxyData, proxy_data);
+}
+
+static void
+mail_session_update_proxy_resolver (CamelService *service,
+                                    ESource *authentication_source)
+{
+       GProxyResolver *proxy_resolver = NULL;
+       ESourceAuthentication *extension;
+       CamelSession *session;
+       ESource *source = NULL;
+       gchar *uid;
+
+       session = camel_service_ref_session (service);
+
+       extension = e_source_get_extension (
+               authentication_source,
+               E_SOURCE_EXTENSION_AUTHENTICATION);
+
+       uid = e_source_authentication_dup_proxy_uid (extension);
+       if (uid != NULL) {
+               ESourceRegistry *registry;
+               EMailSession *mail_session;
+
+               mail_session = E_MAIL_SESSION (session);
+               registry = e_mail_session_get_registry (mail_session);
+               source = e_source_registry_ref_source (registry, uid);
+               g_free (uid);
+       }
+
+       if (source != NULL) {
+               proxy_resolver = G_PROXY_RESOLVER (source);
+               if (!g_proxy_resolver_is_supported (proxy_resolver))
+                       proxy_resolver = NULL;
+       }
+
+       camel_service_set_proxy_resolver (service, proxy_resolver);
+
+       g_clear_object (&session);
+       g_clear_object (&source);
+}
+
+static void
+mail_session_auth_source_changed_cb (ESource *authentication_source,
+                                     GWeakRef *service_weak_ref)
+{
+       CamelService *service;
+
+       service = g_weak_ref_get (service_weak_ref);
+
+       if (service != NULL) {
+               mail_session_update_proxy_resolver (
+                       service, authentication_source);
+               g_object_unref (service);
+       }
+}
+
+static void
+mail_session_configure_proxy_resolver (ESourceRegistry *registry,
+                                       CamelService *service)
+{
+       ESource *source;
+       ESource *authentication_source;
+       const gchar *uid;
+
+       uid = camel_service_get_uid (service);
+       source = e_source_registry_ref_source (registry, uid);
+       g_return_if_fail (source != NULL);
+
+       authentication_source =
+               e_source_registry_find_extension (
+               registry, source, E_SOURCE_EXTENSION_AUTHENTICATION);
+
+       if (authentication_source != NULL) {
+               ServiceProxyData *proxy_data;
+               gulong handler_id;
+
+               mail_session_update_proxy_resolver (
+                       service, authentication_source);
+
+               handler_id = g_signal_connect_data (
+                       authentication_source, "changed",
+                       G_CALLBACK (mail_session_auth_source_changed_cb),
+                       e_weak_ref_new (service),
+                       (GClosureNotify) e_weak_ref_free, 0);
+
+               /* This takes ownership of the authentication source. */
+               proxy_data = g_slice_new0 (ServiceProxyData);
+               proxy_data->authentication_source = authentication_source;
+               proxy_data->auth_source_changed_handler_id = handler_id;
+
+               /* Tack the proxy data on to the CamelService,
+                * so it's destroyed along with the CamelService. */
+               g_object_set_data_full (
+                       G_OBJECT (service),
+                       "proxy-data", proxy_data,
+                       (GDestroyNotify) service_proxy_data_free);
+       }
+
+       g_object_unref (source);
+}
+
 static gchar *
 mail_session_resolve_popb4smtp (ESourceRegistry *registry,
                                 CamelService *smtp_service)
@@ -1260,6 +1377,9 @@ mail_session_add_service (CamelSession *session,
                /* This handles all the messy property bindings. */
                e_source_camel_configure_service (source, service);
 
+               /* Track the proxy resolver for this service. */
+               mail_session_configure_proxy_resolver (registry, service);
+
                g_object_bind_property (
                        source, "display-name",
                        service, "display-name",
@@ -1468,62 +1588,6 @@ mail_session_trust_prompt (CamelSession *session,
        return response;
 }
 
-static GProxyResolver *
-mail_session_ref_proxy_resolver (CamelSession *session,
-                                 CamelService *service)
-{
-       EMailSessionPrivate *priv;
-       GProxyResolver *proxy_resolver = NULL;
-       CamelSettings *settings;
-       gchar *host = NULL;
-       gchar *uri;
-
-       priv = E_MAIL_SESSION_GET_PRIVATE (session);
-
-       settings = camel_service_ref_settings (service);
-       if (CAMEL_IS_NETWORK_SETTINGS (settings)) {
-               CamelNetworkSettings *network_settings;
-
-               network_settings = CAMEL_NETWORK_SETTINGS (settings);
-               host = camel_network_settings_dup_host (network_settings);
-       }
-       g_object_unref (settings);
-
-       if (host == NULL)
-               goto chainup;
-
-       uri = g_strconcat ("socks://", host, NULL);
-
-       if (e_proxy_require_proxy_for_uri (priv->proxy, uri)) {
-               SoupURI *soup_uri;
-
-               soup_uri = e_proxy_peek_uri_for (priv->proxy, uri);
-               if (soup_uri != NULL) {
-                       gchar *default_proxy;
-
-                       default_proxy = soup_uri_to_string (soup_uri, TRUE);
-
-                       /* XXX EProxy provides no way to get at the
-                        *     "ignore-hosts" list, so just skip it. */
-                       proxy_resolver = g_simple_proxy_resolver_new (
-                               default_proxy, NULL);
-
-                       g_free (default_proxy);
-               }
-       }
-
-       g_free (host);
-       g_free (uri);
-
-       if (proxy_resolver != NULL)
-               return proxy_resolver;
-
-chainup:
-       /* Chain up to parent's ref_proxy_resolver() method. */
-       return CAMEL_SESSION_CLASS (e_mail_session_parent_class)->
-               ref_proxy_resolver (session, service);
-}
-
 static gboolean
 mail_session_authenticate_sync (CamelSession *session,
                                 CamelService *service,
@@ -1841,7 +1905,6 @@ e_mail_session_class_init (EMailSessionClass *class)
        session_class->forget_password = mail_session_forget_password;
        session_class->alert_user = mail_session_alert_user;
        session_class->trust_prompt = mail_session_trust_prompt;
-       session_class->ref_proxy_resolver = mail_session_ref_proxy_resolver;
        session_class->authenticate_sync = mail_session_authenticate_sync;
        session_class->forward_to_sync = mail_session_forward_to_sync;
 


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