From: Marc-André Lureau <marcandre.lur...@redhat.com> Someday this ought to be GURI.. or SoupUri? --- gtk/spice-proxy.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++- gtk/spice-proxy.h | 4 +++ gtk/spice-session.c | 2 +- 3 files changed, 88 insertions(+), 2 deletions(-)
diff --git a/gtk/spice-proxy.c b/gtk/spice-proxy.c index bc4037e..834aa10 100644 --- a/gtk/spice-proxy.c +++ b/gtk/spice-proxy.c @@ -19,6 +19,7 @@ #include <stdlib.h> #include <string.h> +#include "glib-compat.h" #include "spice-client.h" #include "spice-proxy.h" @@ -26,6 +27,8 @@ struct _SpiceProxyPrivate { gchar *protocol; gchar *hostname; guint port; + gchar *user; + gchar *password; }; #define SPICE_PROXY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), SPICE_TYPE_PROXY, SpiceProxyPrivate)) @@ -35,6 +38,8 @@ G_DEFINE_TYPE(SpiceProxy, spice_proxy, G_TYPE_OBJECT); enum { SPICE_PROXY_DUMMY_PROPERTY, SPICE_PROXY_PROTOCOL, + SPICE_PROXY_USER, + SPICE_PROXY_PASSWORD, SPICE_PROXY_HOSTNAME, SPICE_PROXY_PORT }; @@ -74,7 +79,18 @@ gboolean spice_proxy_parse(SpiceProxy *self, const gchar *proxyuri, GError **err spice_proxy_set_protocol(self, "http"); spice_proxy_set_port(self, 3128); - gchar **proxyv = g_strsplit(uri, ":", 0); + gchar *saveptr, *auth = strtok_r(uri, "@", &saveptr); + if (saveptr && *saveptr) { + gchar *saveptr2; + const gchar *user = strtok_r(auth, ":", &saveptr2); + const gchar *pass = strtok_r(NULL, ":", &saveptr2); + spice_proxy_set_user(self, user); + spice_proxy_set_password(self, pass); + g_debug("user: %s pass: %s", user, pass); + uri = saveptr; + } + + gchar **proxyv = g_strsplit(uri, ":", 2); const gchar *proxy_port = NULL; if (proxyv[0] == NULL || strlen(proxyv[0]) == 0) { @@ -172,6 +188,12 @@ static void spice_proxy_get_property(GObject *object, guint property_id, case SPICE_PROXY_PORT: g_value_set_uint(value, spice_proxy_get_port(self)); break; + case SPICE_PROXY_USER: + g_value_set_string(value, spice_proxy_get_user(self)); + break; + case SPICE_PROXY_PASSWORD: + g_value_set_string(value, spice_proxy_get_password(self)); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); break; @@ -192,6 +214,12 @@ static void spice_proxy_set_property(GObject *object, guint property_id, case SPICE_PROXY_HOSTNAME: spice_proxy_set_hostname(self, g_value_get_string(value)); break; + case SPICE_PROXY_USER: + spice_proxy_set_user(self, g_value_get_string(value)); + break; + case SPICE_PROXY_PASSWORD: + spice_proxy_set_password(self, g_value_get_string(value)); + break; case SPICE_PROXY_PORT: spice_proxy_set_port(self, g_value_get_uint(value)); break; @@ -253,6 +281,24 @@ static void spice_proxy_class_init(SpiceProxyClass *klass) 0, G_MAXUINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + + g_object_class_install_property(G_OBJECT_CLASS (klass), + SPICE_PROXY_USER, + g_param_spec_string ("user", + "user", + "user", + NULL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE)); + + g_object_class_install_property(G_OBJECT_CLASS (klass), + SPICE_PROXY_PASSWORD, + g_param_spec_string ("password", + "password", + "password", + NULL, + G_PARAM_STATIC_STRINGS | + G_PARAM_READWRITE)); } G_GNUC_INTERNAL @@ -268,3 +314,39 @@ gchar* spice_proxy_to_string(SpiceProxy* self) return g_strdup_printf("%s://%s:%u", p->protocol, p->hostname, p->port); } + +G_GNUC_INTERNAL +const gchar* spice_proxy_get_user(SpiceProxy *self) +{ + g_return_val_if_fail(SPICE_IS_PROXY(self), NULL); + return self->priv->user; +} + + +G_GNUC_INTERNAL +void spice_proxy_set_user(SpiceProxy *self, const gchar *value) +{ + g_return_if_fail(SPICE_IS_PROXY(self)); + + g_free(self->priv->user); + self->priv->user = g_strdup(value); + g_object_notify((GObject *)self, "user"); +} + +G_GNUC_INTERNAL +const gchar* spice_proxy_get_password(SpiceProxy *self) +{ + g_return_val_if_fail(SPICE_IS_PROXY(self), NULL); + return self->priv->password; +} + + +G_GNUC_INTERNAL +void spice_proxy_set_password(SpiceProxy *self, const gchar *value) +{ + g_return_if_fail(SPICE_IS_PROXY(self)); + + g_free(self->priv->password); + self->priv->password = g_strdup(value); + g_object_notify((GObject *)self, "password"); +} diff --git a/gtk/spice-proxy.h b/gtk/spice-proxy.h index 1e7b6d7..e74053b 100644 --- a/gtk/spice-proxy.h +++ b/gtk/spice-proxy.h @@ -54,6 +54,10 @@ 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); +const gchar* spice_proxy_get_user(SpiceProxy* self); +void spice_proxy_set_user(SpiceProxy* self, const gchar* value); +const gchar* spice_proxy_get_password(SpiceProxy* self); +void spice_proxy_set_password(SpiceProxy* self, const gchar* value); G_END_DECLS diff --git a/gtk/spice-session.c b/gtk/spice-session.c index bcbba27..ae14a1f 100644 --- a/gtk/spice-session.c +++ b/gtk/spice-session.c @@ -1839,7 +1839,7 @@ GSocketConnection* spice_session_channel_open_host(SpiceSession *session, SpiceC #endif if (open_host.error != NULL) { - g_warning("%s", open_host.error->message); + g_warning("open host: %s", open_host.error->message); g_clear_error(&open_host.error); } else if (open_host.connection != NULL) { GSocket *socket; -- 1.8.4.2 _______________________________________________ Spice-devel mailing list Spice-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/spice-devel