[Spice-devel] [PATCH spice-gtk] Add SpiceSession:proxy
Christophe Fergeau
cfergeau at redhat.com
Tue Jan 29 05:12:57 PST 2013
On Tue, Jan 29, 2013 at 01:33:43PM +0100, Marc-André Lureau wrote:
> Add a session property to set proxy setting, since it is racy to rely
> on setenv(). Also doing so would override system environment, which
> will modify other session too sharing the same process.
>
> v2:
> - keep old proxy if update_proxy() fails
> - remove strlen() usage
> - return NULL in spice_proxy_to_string() on incomplete details
> - update property comment
NB: these v2: notes should not be part of what is pushed to the git
repository as they are only useful during review, they are generally added
with git send-email --annotate below the '---' above to make that explicit.
> ---
> gtk/spice-proxy.c | 13 +++++++++++++
> gtk/spice-proxy.h | 1 +
> gtk/spice-session.c | 52 ++++++++++++++++++++++++++++++++++++++++++----------
> 3 files changed, 56 insertions(+), 10 deletions(-)
>
> diff --git a/gtk/spice-proxy.c b/gtk/spice-proxy.c
> index 97c3a6b..581f030 100644
> --- a/gtk/spice-proxy.c
> +++ b/gtk/spice-proxy.c
> @@ -234,3 +234,16 @@ static void spice_proxy_class_init(SpiceProxyClass *klass)
> G_PARAM_STATIC_STRINGS |
> G_PARAM_READWRITE));
> }
> +
> +gchar* spice_proxy_to_string(SpiceProxy* self)
> +{
> + SpiceProxyPrivate *p;
> +
> + g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
> + p = self->priv;
> +
> + if (p->protocol == NULL || p->hostname == NULL)
> + return NULL;
> +
> + return g_strdup_printf("%s://%s:%u", p->protocol, p->hostname, p->port);
> +}
> diff --git a/gtk/spice-proxy.h b/gtk/spice-proxy.h
> index c780931..1e7b6d7 100644
> --- a/gtk/spice-proxy.h
> +++ b/gtk/spice-proxy.h
> @@ -53,6 +53,7 @@ const gchar* spice_proxy_get_hostname(SpiceProxy* self);
> void spice_proxy_set_hostname(SpiceProxy* self, const gchar* value);
> guint spice_proxy_get_port(SpiceProxy* self);
> void spice_proxy_set_port(SpiceProxy* self, guint port);
> +gchar *spice_proxy_to_string(SpiceProxy* self);
>
> G_END_DECLS
>
> diff --git a/gtk/spice-session.c b/gtk/spice-session.c
> index 5beb6a1..299bebc 100644
> --- a/gtk/spice-session.c
> +++ b/gtk/spice-session.c
> @@ -106,6 +106,7 @@ enum {
> PROP_UUID,
> PROP_NAME,
> PROP_CA,
> + PROP_PROXY
> };
>
> /* signals */
> @@ -118,24 +119,29 @@ enum {
> static guint signals[SPICE_SESSION_LAST_SIGNAL];
>
>
> -static SpiceProxy* get_proxy(void)
> +static void update_proxy(SpiceSession *self, const gchar *str)
> {
> + SpiceSessionPrivate *s = self->priv;
> + SpiceProxy *proxy = NULL;
> GError *error = NULL;
> - SpiceProxy *proxy;
>
> - const gchar *proxy_env = g_getenv("SPICE_PROXY");
> - if (proxy_env == NULL || strlen(proxy_env) == 0)
> - return NULL;
> + if (str == NULL)
> + str = g_getenv("SPICE_PROXY");
> + if (str == NULL || *str == 0)
> + return;
We need a g_clear_object(&s->proxy); or we won't be able to clear the
proxy.
>
> proxy = spice_proxy_new();
> - if (!spice_proxy_parse(proxy, proxy_env, &error))
> + if (!spice_proxy_parse(proxy, str, &error))
> g_clear_object(&proxy);
> if (error) {
> g_warning ("%s", error->message);
> g_clear_error (&error);
> }
>
> - return proxy;
> + if (proxy != NULL) {
> + g_clear_object(&s->proxy);
> + s->proxy = proxy;
> + }
> }
>
> static void spice_session_init(SpiceSession *session)
> @@ -167,7 +173,7 @@ static void spice_session_init(SpiceSession *session)
> cache_init(&s->images, "image");
> cache_init(&s->palettes, "palette");
> s->glz_window = glz_decoder_window_new();
> - s->proxy = get_proxy();
> + update_proxy(session, NULL);
> }
>
> static void
> @@ -513,6 +519,9 @@ static void spice_session_get_property(GObject *gobject,
> case PROP_UUID:
> g_value_set_pointer(value, s->uuid);
> break;
> + case PROP_PROXY:
> + g_value_take_string(value, spice_proxy_to_string(s->proxy));
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
> break;
> @@ -628,6 +637,9 @@ static void spice_session_set_property(GObject *gobject,
> g_clear_pointer(&s->ca, g_byte_array_unref);
> s->ca = g_value_dup_boxed(value);
> break;
> + case PROP_PROXY:
> + update_proxy(session, g_value_get_string(value));
> + break;
> default:
> G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec);
> break;
> @@ -1119,6 +1131,23 @@ static void spice_session_class_init(SpiceSessionClass *klass)
> G_PARAM_READABLE |
> G_PARAM_STATIC_STRINGS));
>
> + /**
> + * SpiceSession:proxy:
> + *
> + * URI to the proxy server to use when doing network connection.
> + * of the form <![CDATA[ [protocol://]<host>[:port] ]]>
> + *
> + * Since: 0.17
> + **/
> + g_object_class_install_property
> + (gobject_class, PROP_PROXY,
> + g_param_spec_string("proxy",
> + "Proxy",
> + "The proxy server",
Oh, I was referring to the "The proxy server" string, not to the property
comment which was good in the previous patch, sorry for not being clearer
:(
Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20130129/7ccbe414/attachment.pgp>
More information about the Spice-devel
mailing list