[Spice-devel] [PATCH spice-gtk 5/6] Add SpiceProxy object
Christophe Fergeau
cfergeau at redhat.com
Thu Oct 18 09:05:46 PDT 2012
Looks good, but I would have expected this to come before patch 4/6 and to
be used when adding sync proxy support to spice-gtk.
On Fri, Aug 24, 2012 at 03:58:18PM +0200, Marc-André Lureau wrote:
> Add a simple object to handle the SPICE_PROXY values.
>
> It's not clear to me whether each GIO user needs to handle the proxy
> configuration, or if there is a more global mechanism (via
> g_network_address_parse_uri())
>
> Also, the parsing is currently very limited and only support basic
> HTTP proxy URI. In the future, we really want to rely on GUri or
> similar instead...
> ---
> gtk/Makefile.am | 2 +
> gtk/spice-proxy.c | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> gtk/spice-proxy.h | 59 ++++++++++++++
> 3 files changed, 297 insertions(+)
> create mode 100644 gtk/spice-proxy.c
> create mode 100644 gtk/spice-proxy.h
>
> diff --git a/gtk/Makefile.am b/gtk/Makefile.am
> index 23ae457..fc6cab9 100644
> --- a/gtk/Makefile.am
> +++ b/gtk/Makefile.am
> @@ -240,6 +240,8 @@ libspice_client_glib_2_0_la_SOURCES = \
> channel-usbredir-priv.h \
> smartcard-manager.c \
> smartcard-manager-priv.h \
> + spice-proxy.c \
> + spice-proxy.h \
> usb-device-manager.c \
> usb-device-manager-priv.h \
> usbutil.c \
> diff --git a/gtk/spice-proxy.c b/gtk/spice-proxy.c
> new file mode 100644
> index 0000000..97c3a6b
> --- /dev/null
> +++ b/gtk/spice-proxy.c
> @@ -0,0 +1,236 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> + Copyright (C) 2012 Red Hat, Inc.
> +
> + This library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + This library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with this library; if not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +#include <stdlib.h>
> +#include <string.h>
> +
> +#include "spice-client.h"
> +#include "spice-proxy.h"
> +
> +struct _SpiceProxyPrivate {
> + gchar *protocol;
> + gchar *hostname;
> + guint port;
> +};
> +
> +#define SPICE_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), SPICE_TYPE_PROXY, SpiceProxyPrivate))
> +
> +G_DEFINE_TYPE(SpiceProxy, spice_proxy, G_TYPE_OBJECT);
> +
> +enum {
> + SPICE_PROXY_DUMMY_PROPERTY,
> + SPICE_PROXY_PROTOCOL,
> + SPICE_PROXY_HOSTNAME,
> + SPICE_PROXY_PORT
> +};
> +
> +SpiceProxy* spice_proxy_new(void)
> +{
> + SpiceProxy * self = NULL;
> + self = (SpiceProxy*)g_object_new(SPICE_TYPE_PROXY, NULL);
> + return self;
> +}
> +
> +gboolean spice_proxy_parse(SpiceProxy *self, const gchar *uri, GError **error)
> +{
> + gboolean success = FALSE;
> +
> + g_return_val_if_fail(self != NULL, FALSE);
> + g_return_val_if_fail(uri != NULL, FALSE);
> +
> + /* FIXME: use GUri when it is ready... only support http atm */
> + /* the code is voluntarily not parsing thoroughly the uri */
> + if (g_ascii_strncasecmp("http://", uri, 7) == 0)
> + uri += 7;
> +
> + spice_proxy_set_protocol(self, "http");
> + spice_proxy_set_port(self, 3128);
> +
> + gchar **proxyv = g_strsplit(uri, ":", 0);
> + const gchar *proxy_port = NULL;
> +
> + if (proxyv[0] == NULL || strlen(proxyv[0]) == 0) {
> + g_set_error(error, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> + "Invalid hostname in proxy address");
> + goto end;
> + }
> +
> + spice_proxy_set_hostname(self, proxyv[0]);
> + if (proxyv[0] != NULL)
> + proxy_port = proxyv[1];
> +
> + if (proxy_port != NULL) {
> + char *endptr;
> + guint port = strtoul(proxy_port, &endptr, 10);
> + if (*endptr != '\0') {
> + g_set_error(error, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
> + "Invalid proxy port: %s", proxy_port);
> + goto end;
> + }
> + spice_proxy_set_port(self, port);
> + }
> +
> + success = TRUE;
> +
> +end:
> + g_strfreev(proxyv);
> + return success;
> +}
> +
> +const gchar* spice_proxy_get_protocol(SpiceProxy *self)
> +{
> + g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
> + return self->priv->protocol;
> +}
> +
> +void spice_proxy_set_protocol(SpiceProxy *self, const gchar *value)
> +{
> + g_return_if_fail(SPICE_IS_PROXY(self));
> +
> + g_free(self->priv->protocol);
> + self->priv->protocol = g_strdup(value);
> + g_object_notify((GObject *)self, "protocol");
> +}
> +
> +const gchar* spice_proxy_get_hostname(SpiceProxy *self)
> +{
> + g_return_val_if_fail(SPICE_IS_PROXY(self), NULL);
> + return self->priv->hostname;
> +}
> +
> +
> +void spice_proxy_set_hostname(SpiceProxy *self, const gchar *value)
> +{
> + g_return_if_fail(SPICE_IS_PROXY(self));
> +
> + g_free(self->priv->hostname);
> + self->priv->hostname = g_strdup(value);
> + g_object_notify((GObject *)self, "hostname");
> +}
> +
> +guint spice_proxy_get_port(SpiceProxy *self)
> +{
> + g_return_val_if_fail(SPICE_IS_PROXY(self), 0);
> + return self->priv->port;
> +}
> +
> +void spice_proxy_set_port(SpiceProxy *self, guint port)
> +{
> + g_return_if_fail(SPICE_IS_PROXY(self));
> + self->priv->port = port;
> + g_object_notify((GObject *)self, "port");
> +}
> +
> +static void spice_proxy_get_property(GObject *object, guint property_id,
> + GValue *value, GParamSpec *pspec)
> +{
> + SpiceProxy *self;
> + self = G_TYPE_CHECK_INSTANCE_CAST(object, SPICE_TYPE_PROXY, SpiceProxy);
> +
> + switch (property_id) {
> + case SPICE_PROXY_PROTOCOL:
> + g_value_set_string(value, spice_proxy_get_protocol(self));
> + break;
> + case SPICE_PROXY_HOSTNAME:
> + g_value_set_string(value, spice_proxy_get_hostname(self));
> + break;
> + case SPICE_PROXY_PORT:
> + g_value_set_uint(value, spice_proxy_get_port(self));
> + break;
> + default:
> + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
> + break;
> + }
> +}
> +
> +
> +static void spice_proxy_set_property(GObject *object, guint property_id,
> + const GValue *value, GParamSpec *pspec)
> +{
> + SpiceProxy * self;
> + self = G_TYPE_CHECK_INSTANCE_CAST(object, SPICE_TYPE_PROXY, SpiceProxy);
> +
> + switch (property_id) {
> + case SPICE_PROXY_PROTOCOL:
> + spice_proxy_set_protocol(self, g_value_get_string(value));
> + break;
> + case SPICE_PROXY_HOSTNAME:
> + spice_proxy_set_hostname(self, g_value_get_string(value));
> + break;
> + case SPICE_PROXY_PORT:
> + spice_proxy_set_port(self, g_value_get_uint(value));
> + break;
> + default:
> + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec);
> + break;
> + }
> +}
> +
> +static void spice_proxy_finalize(GObject* obj)
> +{
> + SpiceProxy *self;
> +
> + self = G_TYPE_CHECK_INSTANCE_CAST(obj, SPICE_TYPE_PROXY, SpiceProxy);
> + g_free(self->priv->protocol);
> + g_free(self->priv->hostname);
> +
> + G_OBJECT_CLASS (spice_proxy_parent_class)->finalize (obj);
> +}
> +
> +static void spice_proxy_init (SpiceProxy *self)
> +{
> + self->priv = SPICE_PROXY_GET_PRIVATE(self);
> +}
> +
> +
> +static void spice_proxy_class_init(SpiceProxyClass *klass)
> +{
> + spice_proxy_parent_class = g_type_class_peek_parent (klass);
> + g_type_class_add_private(klass, sizeof(SpiceProxyPrivate));
> +
> + G_OBJECT_CLASS (klass)->get_property = spice_proxy_get_property;
> + G_OBJECT_CLASS (klass)->set_property = spice_proxy_set_property;
> + G_OBJECT_CLASS (klass)->finalize = spice_proxy_finalize;
> +
> + g_object_class_install_property(G_OBJECT_CLASS (klass),
> + SPICE_PROXY_PROTOCOL,
> + g_param_spec_string ("protocol",
> + "protocol",
> + "protocol",
> + NULL,
> + G_PARAM_STATIC_STRINGS |
> + G_PARAM_READWRITE));
> +
> + g_object_class_install_property(G_OBJECT_CLASS (klass),
> + SPICE_PROXY_HOSTNAME,
> + g_param_spec_string ("hostname",
> + "hostname",
> + "hostname",
> + NULL,
> + G_PARAM_STATIC_STRINGS |
> + G_PARAM_READWRITE));
> +
> + g_object_class_install_property(G_OBJECT_CLASS (klass),
> + SPICE_PROXY_PORT,
> + g_param_spec_uint ("port",
> + "port",
> + "port",
> + 0, G_MAXUINT, 0,
> + G_PARAM_STATIC_STRINGS |
> + G_PARAM_READWRITE));
> +}
> diff --git a/gtk/spice-proxy.h b/gtk/spice-proxy.h
> new file mode 100644
> index 0000000..c780931
> --- /dev/null
> +++ b/gtk/spice-proxy.h
> @@ -0,0 +1,59 @@
> +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */
> +/*
> + Copyright (C) 2012 Red Hat, Inc.
> +
> + This library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + This library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with this library; if not, see <http://www.gnu.org/licenses/>.
> +*/
> +#ifndef __SPICE_PROXY_H__
> +#define __SPICE_PROXY_H__
> +
> +#include <glib-object.h>
> +
> +G_BEGIN_DECLS
> +
> +#define SPICE_TYPE_PROXY (spice_proxy_get_type ())
> +#define SPICE_PROXY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SPICE_TYPE_PROXY, SpiceProxy))
> +#define SPICE_PROXY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SPICE_TYPE_PROXY, SpiceProxyClass))
> +#define SPICE_IS_PROXY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SPICE_TYPE_PROXY))
> +#define SPICE_IS_PROXY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SPICE_TYPE_PROXY))
> +#define SPICE_PROXY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SPICE_TYPE_PROXY, SpiceProxyClass))
> +
> +typedef struct _SpiceProxy SpiceProxy;
> +typedef struct _SpiceProxyClass SpiceProxyClass;
> +typedef struct _SpiceProxyPrivate SpiceProxyPrivate;
> +
> +struct _SpiceProxy {
> + GObject parent_instance;
> + SpiceProxyPrivate * priv;
> +};
> +
> +struct _SpiceProxyClass {
> + GObjectClass parent_class;
> +};
> +
> +
> +GType spice_proxy_get_type(void) G_GNUC_CONST;
> +
> +SpiceProxy* spice_proxy_new(void);
> +gboolean spice_proxy_parse(SpiceProxy* self, const gchar* uri, GError** error);
> +const gchar* spice_proxy_get_protocol(SpiceProxy* self);
> +void spice_proxy_set_protocol(SpiceProxy* self, const gchar* value);
> +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);
> +
> +G_END_DECLS
> +
> +#endif /* __SPICE_PROXY_H__ */
> --
> 1.7.11.4
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- 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/20121018/4bb55117/attachment.pgp>
More information about the Spice-devel
mailing list