[libgdata] core: Add a GDataClientLoginAuthorizer:proxy-resolver property



commit 4647e0b5cd60cb5429c14e77733bb6e423d27472
Author: Philip Withnall <philip tecnocode co uk>
Date:   Sat Oct 12 09:25:42 2013 +0100

    core: Add a GDataClientLoginAuthorizer:proxy-resolver property
    
    Bound to SoupSession’s ‘proxy-resolver’ property. Based on commit
    8f1923fcd9c4203f68ce6a0405526500a77783e5 by Matthew Barnes <mbarnes redhat com>.
    
    This deprecates the following API:
     • GDataClientLoginAuthorizer:proxy-uri
     • gdata_client_login_authorizer_[get|set]_proxy_uri()
    and adds the following new API:
     • GDataClientLoginAuthorizer:proxy-resolver
     • gdata_client_login_authorizer_[get|set]_proxy_resolver()
    
    Helps: https://bugzilla.gnome.org/show_bug.cgi?id=709758

 docs/reference/gdata-sections.txt     |    2 +
 gdata/gdata-client-login-authorizer.c |  123 ++++++++++++++++++++++++++++----
 gdata/gdata-client-login-authorizer.h |    9 ++-
 gdata/gdata.symbols                   |    2 +
 gdata/tests/client-login-authorizer.c |   66 +++++++++---------
 5 files changed, 151 insertions(+), 51 deletions(-)
---
diff --git a/docs/reference/gdata-sections.txt b/docs/reference/gdata-sections.txt
index 773600a..995fb5e 100644
--- a/docs/reference/gdata-sections.txt
+++ b/docs/reference/gdata-sections.txt
@@ -2278,6 +2278,8 @@ gdata_client_login_authorizer_get_username
 gdata_client_login_authorizer_get_password
 gdata_client_login_authorizer_get_proxy_uri
 gdata_client_login_authorizer_set_proxy_uri
+gdata_client_login_authorizer_get_proxy_resolver
+gdata_client_login_authorizer_set_proxy_resolver
 gdata_client_login_authorizer_get_timeout
 gdata_client_login_authorizer_set_timeout
 <SUBSECTION Standard>
diff --git a/gdata/gdata-client-login-authorizer.c b/gdata/gdata-client-login-authorizer.c
index 29f17a1..7185271 100644
--- a/gdata/gdata-client-login-authorizer.c
+++ b/gdata/gdata-client-login-authorizer.c
@@ -118,9 +118,13 @@ static gboolean is_authorized_for_domain (GDataAuthorizer *self, GDataAuthorizat
 static void notify_proxy_uri_cb (GObject *gobject, GParamSpec *pspec, GDataClientLoginAuthorizer *self);
 static void notify_timeout_cb (GObject *gobject, GParamSpec *pspec, GObject *self);
 
+static SoupURI *_get_proxy_uri (GDataClientLoginAuthorizer *self);
+static void _set_proxy_uri (GDataClientLoginAuthorizer *self, SoupURI *proxy_uri);
+
 struct _GDataClientLoginAuthorizerPrivate {
        SoupSession *session;
        SoupURI *proxy_uri; /* cached version only set if gdata_client_login_authorizer_get_proxy_uri() is 
called */
+       GProxyResolver *proxy_resolver;
 
        gchar *client_id;
 
@@ -142,6 +146,7 @@ enum {
        PROP_PASSWORD,
        PROP_PROXY_URI,
        PROP_TIMEOUT,
+       PROP_PROXY_RESOLVER,
 };
 
 enum {
@@ -227,6 +232,7 @@ gdata_client_login_authorizer_class_init (GDataClientLoginAuthorizerClass *klass
         * The proxy URI used internally for all network requests.
         *
         * Since: 0.9.0
+        * Deprecated: Use #GDataClientLoginAuthorizer:proxy-resolver instead, which gives more flexibility 
over the proxy used. (Since: 0.15.0.)
         */
        g_object_class_install_property (gobject_class, PROP_PROXY_URI,
                                         g_param_spec_boxed ("proxy-uri",
@@ -251,6 +257,19 @@ gdata_client_login_authorizer_class_init (GDataClientLoginAuthorizerClass *klass
                                                            G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
        /**
+        * GDataClientLoginAuthorizer:proxy-resolver:
+        *
+        * The #GProxyResolver used to determine a proxy URI.  Setting this will clear the 
#GDataClientLoginAuthorizer:proxy-uri property.
+        *
+        * Since: 0.15.0
+        */
+       g_object_class_install_property (gobject_class, PROP_PROXY_RESOLVER,
+                                        g_param_spec_object ("proxy-resolver",
+                                                             "Proxy Resolver", "A GProxyResolver used to 
determine a proxy URI.",
+                                                             G_TYPE_PROXY_RESOLVER,
+                                                             G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+       /**
         * GDataClientLoginAuthorizer::captcha-challenge:
         * @authorizer: the #GDataClientLoginAuthorizer which received the challenge
         * @uri: the URI of the CAPTCHA image to be used
@@ -293,6 +312,9 @@ gdata_client_login_authorizer_init (GDataClientLoginAuthorizer *self)
        /* Proxy the SoupSession's proxy-uri and timeout properties */
        g_signal_connect (self->priv->session, "notify::proxy-uri", (GCallback) notify_proxy_uri_cb, self);
        g_signal_connect (self->priv->session, "notify::timeout", (GCallback) notify_timeout_cb, self);
+
+       /* Keep our GProxyResolver synchronized with SoupSession's. */
+       g_object_bind_property (self->priv->session, "proxy-resolver", self, "proxy-resolver", 
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 }
 
 static void
@@ -305,6 +327,8 @@ dispose (GObject *object)
        }
        priv->session = NULL;
 
+       g_clear_object (&priv->proxy_resolver);
+
        /* Chain up to the parent class */
        G_OBJECT_CLASS (gdata_client_login_authorizer_parent_class)->dispose (object);
 }
@@ -349,11 +373,14 @@ get_property (GObject *object, guint property_id, GValue *value, GParamSpec *psp
                        g_rec_mutex_unlock (&(priv->mutex));
                        break;
                case PROP_PROXY_URI:
-                       g_value_set_boxed (value, gdata_client_login_authorizer_get_proxy_uri 
(GDATA_CLIENT_LOGIN_AUTHORIZER (object)));
+                       g_value_set_boxed (value, _get_proxy_uri (GDATA_CLIENT_LOGIN_AUTHORIZER (object)));
                        break;
                case PROP_TIMEOUT:
                        g_value_set_uint (value, gdata_client_login_authorizer_get_timeout 
(GDATA_CLIENT_LOGIN_AUTHORIZER (object)));
                        break;
+               case PROP_PROXY_RESOLVER:
+                       g_value_set_object (value, gdata_client_login_authorizer_get_proxy_resolver 
(GDATA_CLIENT_LOGIN_AUTHORIZER (object)));
+                       break;
                default:
                        /* We don't have any other property... */
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -371,11 +398,14 @@ set_property (GObject *object, guint property_id, const GValue *value, GParamSpe
                        priv->client_id = g_value_dup_string (value);
                        break;
                case PROP_PROXY_URI:
-                       gdata_client_login_authorizer_set_proxy_uri (GDATA_CLIENT_LOGIN_AUTHORIZER (object), 
g_value_get_boxed (value));
+                       _set_proxy_uri (GDATA_CLIENT_LOGIN_AUTHORIZER (object), g_value_get_boxed (value));
                        break;
                case PROP_TIMEOUT:
                        gdata_client_login_authorizer_set_timeout (GDATA_CLIENT_LOGIN_AUTHORIZER (object), 
g_value_get_uint (value));
                        break;
+               case PROP_PROXY_RESOLVER:
+                       gdata_client_login_authorizer_set_proxy_resolver (GDATA_CLIENT_LOGIN_AUTHORIZER 
(object), g_value_get_object (value));
+                       break;
                default:
                        /* We don't have any other property... */
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1093,18 +1123,9 @@ notify_proxy_uri_cb (GObject *object, GParamSpec *pspec, GDataClientLoginAuthori
        g_object_notify (G_OBJECT (self), "proxy-uri");
 }
 
-/**
- * gdata_client_login_authorizer_get_proxy_uri:
- * @self: a #GDataClientLoginAuthorizer
- *
- * Gets the proxy URI on the #GDataClientLoginAuthorizer's #SoupSession.
- *
- * Return value: (transfer full): the proxy URI, or %NULL; free with soup_uri_free()
- *
- * Since: 0.9.0
- */
-SoupURI *
-gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self)
+/* Static function which isn't deprecated so we can continue using it internally. */
+static SoupURI *
+_get_proxy_uri (GDataClientLoginAuthorizer *self)
 {
        SoupURI *proxy_uri;
 
@@ -1124,6 +1145,34 @@ gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self)
 }
 
 /**
+ * gdata_client_login_authorizer_get_proxy_uri:
+ * @self: a #GDataClientLoginAuthorizer
+ *
+ * Gets the proxy URI on the #GDataClientLoginAuthorizer's #SoupSession.
+ *
+ * Return value: (transfer full): the proxy URI, or %NULL; free with soup_uri_free()
+ *
+ * Since: 0.9.0
+ * Deprecated: Use gdata_client_login_authorizer_get_proxy_resolver() instead, which gives more flexibility 
over the proxy used. (Since: 0.15.0.)
+ */
+SoupURI *
+gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self)
+{
+       return _get_proxy_uri (self);
+}
+
+/* Static function which isn't deprecated so we can continue using it internally. */
+static void
+_set_proxy_uri (GDataClientLoginAuthorizer *self, SoupURI *proxy_uri)
+{
+       g_return_if_fail (GDATA_IS_CLIENT_LOGIN_AUTHORIZER (self));
+
+       g_object_set (self->priv->session, SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+
+       /* Notification is handled in notify_proxy_uri_cb() which is called as a result of setting the 
property on the session */
+}
+
+/**
  * gdata_client_login_authorizer_set_proxy_uri:
  * @self: a #GDataClientLoginAuthorizer
  * @proxy_uri: (allow-none): the proxy URI, or %NULL
@@ -1133,15 +1182,57 @@ gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self)
  * If @proxy_uri is %NULL, no proxy will be used.
  *
  * Since: 0.9.0
+ * Deprecated: Use gdata_client_login_authorizer_set_proxy_resolver() instead, which gives more flexibility 
over the proxy used. (Since: 0.15.0.)
  */
 void
 gdata_client_login_authorizer_set_proxy_uri (GDataClientLoginAuthorizer *self, SoupURI *proxy_uri)
 {
+       _set_proxy_uri (self, proxy_uri);
+}
+
+/**
+ * gdata_client_login_authorizer_get_proxy_resolver:
+ * @self: a #GDataClientLoginAuthorizer
+ *
+ * Gets the #GProxyResolver on the #GDataClientLoginAuthorizer's #SoupSession.
+ *
+ * Return value: (transfer none) (allow-none): a #GProxyResolver, or %NULL
+ *
+ * Since: 0.15.0
+ */
+GProxyResolver *
+gdata_client_login_authorizer_get_proxy_resolver (GDataClientLoginAuthorizer *self)
+{
+       g_return_val_if_fail (GDATA_IS_CLIENT_LOGIN_AUTHORIZER (self), NULL);
+
+       return self->priv->proxy_resolver;
+}
+
+/**
+ * gdata_client_login_authorizer_set_proxy_resolver:
+ * @self: a #GDataClientLoginAuthorizer
+ * @proxy_resolver: (allow-none): a #GProxyResolver, or %NULL
+ *
+ * Sets the #GProxyResolver on the #SoupSession used internally by the given #GDataClientLoginAuthorizer.
+ *
+ * Setting this will clear the #GDataClientLoginAuthorizer:proxy-uri property.
+ *
+ * Since: 0.15.0
+ */
+void
+gdata_client_login_authorizer_set_proxy_resolver (GDataClientLoginAuthorizer *self, GProxyResolver 
*proxy_resolver)
+{
        g_return_if_fail (GDATA_IS_CLIENT_LOGIN_AUTHORIZER (self));
+       g_return_if_fail (proxy_resolver == NULL || G_IS_PROXY_RESOLVER (proxy_resolver));
 
-       g_object_set (self->priv->session, SOUP_SESSION_PROXY_URI, proxy_uri, NULL);
+       if (proxy_resolver != NULL) {
+               g_object_ref (proxy_resolver);
+       }
 
-       /* Notification is handled in notify_proxy_uri_cb() which is called as a result of setting the 
property on the session */
+       g_clear_object (&self->priv->proxy_resolver);
+       self->priv->proxy_resolver = proxy_resolver;
+
+       g_object_notify (G_OBJECT (self), "proxy-resolver");
 }
 
 static void
diff --git a/gdata/gdata-client-login-authorizer.h b/gdata/gdata-client-login-authorizer.h
index d6d4f19..c4b4722 100644
--- a/gdata/gdata-client-login-authorizer.h
+++ b/gdata/gdata-client-login-authorizer.h
@@ -119,8 +119,13 @@ const gchar *gdata_client_login_authorizer_get_client_id (GDataClientLoginAuthor
 const gchar *gdata_client_login_authorizer_get_username (GDataClientLoginAuthorizer *self) G_GNUC_PURE;
 const gchar *gdata_client_login_authorizer_get_password (GDataClientLoginAuthorizer *self) G_GNUC_PURE;
 
-SoupURI *gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self) G_GNUC_PURE;
-void gdata_client_login_authorizer_set_proxy_uri (GDataClientLoginAuthorizer *self, SoupURI *proxy_uri);
+#ifndef LIBGDATA_DISABLE_DEPRECATED
+SoupURI *gdata_client_login_authorizer_get_proxy_uri (GDataClientLoginAuthorizer *self) G_GNUC_PURE 
G_GNUC_DEPRECATED_FOR (gdata_client_login_authorizer_get_proxy_resolver);
+void gdata_client_login_authorizer_set_proxy_uri (GDataClientLoginAuthorizer *self, SoupURI *proxy_uri) 
G_GNUC_DEPRECATED_FOR (gdata_client_login_authorizer_set_proxy_resolver);
+#endif /* !LIBGDATA_DISABLE_DEPRECATED */
+
+GProxyResolver *gdata_client_login_authorizer_get_proxy_resolver (GDataClientLoginAuthorizer *self) 
G_GNUC_PURE;
+void gdata_client_login_authorizer_set_proxy_resolver (GDataClientLoginAuthorizer *self, GProxyResolver 
*proxy_resolver);
 
 guint gdata_client_login_authorizer_get_timeout (GDataClientLoginAuthorizer *self) G_GNUC_PURE;
 void gdata_client_login_authorizer_set_timeout (GDataClientLoginAuthorizer *self, guint timeout);
diff --git a/gdata/gdata.symbols b/gdata/gdata.symbols
index a22723c..12e0b9e 100644
--- a/gdata/gdata.symbols
+++ b/gdata/gdata.symbols
@@ -886,6 +886,8 @@ gdata_client_login_authorizer_get_username
 gdata_client_login_authorizer_get_password
 gdata_client_login_authorizer_get_proxy_uri
 gdata_client_login_authorizer_set_proxy_uri
+gdata_client_login_authorizer_get_proxy_resolver
+gdata_client_login_authorizer_set_proxy_resolver
 gdata_client_login_authorizer_get_timeout
 gdata_client_login_authorizer_set_timeout
 gdata_client_login_authorizer_error_quark
diff --git a/gdata/tests/client-login-authorizer.c b/gdata/tests/client-login-authorizer.c
index e87d9f4..6c8a87a 100644
--- a/gdata/tests/client-login-authorizer.c
+++ b/gdata/tests/client-login-authorizer.c
@@ -78,8 +78,8 @@ test_client_login_authorizer_constructor_for_domains (void)
 typedef struct {
        GDataClientLoginAuthorizer *authorizer;
 
-       guint proxy_uri_notification_count;
-       gulong proxy_uri_signal_handler;
+       guint proxy_resolver_notification_count;
+       gulong proxy_resolver_signal_handler;
        guint timeout_notification_count;
        gulong timeout_signal_handler;
        guint username_notification_count;
@@ -103,8 +103,8 @@ static void
 connect_to_client_login_authorizer (ClientLoginAuthorizerData *data)
 {
        /* Connect to notifications from the object to verify they're only emitted the correct number of 
times */
-       data->proxy_uri_signal_handler = g_signal_connect (data->authorizer, "notify::proxy-uri", (GCallback) 
notify_cb,
-                                                          &(data->proxy_uri_notification_count));
+       data->proxy_resolver_signal_handler = g_signal_connect (data->authorizer, "notify::proxy-resolver", 
(GCallback) notify_cb,
+                                                               &(data->proxy_resolver_notification_count));
        data->timeout_signal_handler = g_signal_connect (data->authorizer, "notify::timeout", (GCallback) 
notify_cb,
                                                         &(data->timeout_notification_count));
        data->username_signal_handler = g_signal_connect (data->authorizer, "notify::username", (GCallback) 
notify_cb,
@@ -152,7 +152,7 @@ tear_down_client_login_authorizer_data (ClientLoginAuthorizerData *data, gconstp
        g_signal_handler_disconnect (data->authorizer, data->password_signal_handler);
        g_signal_handler_disconnect (data->authorizer, data->username_signal_handler);
        g_signal_handler_disconnect (data->authorizer, data->timeout_signal_handler);
-       g_signal_handler_disconnect (data->authorizer, data->proxy_uri_signal_handler);
+       g_signal_handler_disconnect (data->authorizer, data->proxy_resolver_signal_handler);
 
        g_object_unref (data->authorizer);
 }
@@ -199,52 +199,52 @@ test_client_login_authorizer_properties_password (ClientLoginAuthorizerData *dat
        g_free (password);
 }
 
-/* Test getting and setting the proxy-uri property */
+/* Test getting and setting the proxy-resolver property */
 static void
-test_client_login_authorizer_properties_proxy_uri (ClientLoginAuthorizerData *data, gconstpointer user_data)
+test_client_login_authorizer_properties_proxy_resolver (ClientLoginAuthorizerData *data, gconstpointer 
user_data)
 {
-       SoupURI *proxy_uri, *new_proxy_uri;
+       GProxyResolver *proxy_resolver, *new_proxy_resolver;
 
        /* Verifying the normal state of the property in a newly-constructed instance of 
GDataClientLoginAuthorizer */
-       g_assert (gdata_client_login_authorizer_get_proxy_uri (data->authorizer) == NULL);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) == NULL);
 
-       g_object_get (data->authorizer, "proxy-uri", &proxy_uri, NULL);
-       g_assert (proxy_uri == NULL);
+       g_object_get (data->authorizer, "proxy-resolver", &proxy_resolver, NULL);
+       g_assert (proxy_resolver == NULL);
 
-       g_assert_cmpuint (data->proxy_uri_notification_count, ==, 0);
+       g_assert_cmpuint (data->proxy_resolver_notification_count, ==, 0);
 
        /* Check setting it works and emits a notification */
-       new_proxy_uri = soup_uri_new ("http://example.com/";);
-       gdata_client_login_authorizer_set_proxy_uri (data->authorizer, new_proxy_uri);
+       new_proxy_resolver = g_object_ref (g_proxy_resolver_get_default ());
+       gdata_client_login_authorizer_set_proxy_resolver (data->authorizer, new_proxy_resolver);
 
-       g_assert_cmpuint (data->proxy_uri_notification_count, ==, 1);
+       g_assert_cmpuint (data->proxy_resolver_notification_count, ==, 1);
 
-       g_assert (gdata_client_login_authorizer_get_proxy_uri (data->authorizer) != NULL);
-       g_assert (soup_uri_equal (gdata_client_login_authorizer_get_proxy_uri (data->authorizer), 
new_proxy_uri) == TRUE);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) != NULL);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) == new_proxy_resolver);
 
-       g_object_get (data->authorizer, "proxy-uri", &proxy_uri, NULL);
-       g_assert (proxy_uri != NULL);
-       g_assert (soup_uri_equal (gdata_client_login_authorizer_get_proxy_uri (data->authorizer), 
new_proxy_uri) == TRUE);
-       soup_uri_free (proxy_uri);
+       g_object_get (data->authorizer, "proxy-resolver", &proxy_resolver, NULL);
+       g_assert (proxy_resolver != NULL);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) == new_proxy_resolver);
+       g_object_unref (proxy_resolver);
 
-       soup_uri_free (new_proxy_uri);
+       g_object_unref (new_proxy_resolver);
 
        /* Check setting it back to NULL works */
-       gdata_client_login_authorizer_set_proxy_uri (data->authorizer, NULL);
+       gdata_client_login_authorizer_set_proxy_resolver (data->authorizer, NULL);
 
-       g_assert_cmpuint (data->proxy_uri_notification_count, ==, 2);
+       g_assert_cmpuint (data->proxy_resolver_notification_count, ==, 2);
 
-       g_assert (gdata_client_login_authorizer_get_proxy_uri (data->authorizer) == NULL);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) == NULL);
 
-       g_object_get (data->authorizer, "proxy-uri", &proxy_uri, NULL);
-       g_assert (proxy_uri == NULL);
+       g_object_get (data->authorizer, "proxy-resolver", &proxy_resolver, NULL);
+       g_assert (proxy_resolver == NULL);
 
        /* Test that setting it using g_object_set() works */
-       new_proxy_uri = soup_uri_new ("http://example.com/";);
-       g_object_set (data->authorizer, "proxy-uri", new_proxy_uri, NULL);
-       soup_uri_free (new_proxy_uri);
+       new_proxy_resolver = g_object_ref (g_proxy_resolver_get_default ());
+       g_object_set (data->authorizer, "proxy-resolver", new_proxy_resolver, NULL);
+       g_object_unref (new_proxy_resolver);
 
-       g_assert (gdata_client_login_authorizer_get_proxy_uri (data->authorizer) != NULL);
+       g_assert (gdata_client_login_authorizer_get_proxy_resolver (data->authorizer) != NULL);
 }
 
 /* Test getting and setting the timeout property */
@@ -745,8 +745,8 @@ main (int argc, char *argv[])
                    test_client_login_authorizer_properties_username, tear_down_client_login_authorizer_data);
        g_test_add ("/client-login-authorizer/properties/password", ClientLoginAuthorizerData, NULL, 
set_up_client_login_authorizer_data,
                    test_client_login_authorizer_properties_password, tear_down_client_login_authorizer_data);
-       g_test_add ("/client-login-authorizer/properties/proxy-uri", ClientLoginAuthorizerData, NULL, 
set_up_client_login_authorizer_data,
-                   test_client_login_authorizer_properties_proxy_uri, 
tear_down_client_login_authorizer_data);
+       g_test_add ("/client-login-authorizer/properties/proxy-resolver", ClientLoginAuthorizerData, NULL, 
set_up_client_login_authorizer_data,
+                   test_client_login_authorizer_properties_proxy_resolver, 
tear_down_client_login_authorizer_data);
        g_test_add ("/client-login-authorizer/properties/timeout", ClientLoginAuthorizerData, NULL, 
set_up_client_login_authorizer_data,
                    test_client_login_authorizer_properties_timeout, tear_down_client_login_authorizer_data);
 


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