On Tue, Feb 11, 2014 at 12:37:53PM -0500, Marc-André Lureau wrote: > > > static void > > > wocky_http_proxy_init (WockyHttpProxy *proxy) > > > @@ -180,10 +182,34 @@ wocky_http_proxy_connect (GProxy *proxy, > > > { > > > GInputStream *in; > > > GOutputStream *out; > > > - GDataInputStream *data_in; > > > - gchar *buffer; > > > + GDataInputStream *data_in = NULL; > > > + gchar *buffer = NULL; > > > gboolean has_cred; > > > > > > +#if GLIB_CHECK_VERSION(2, 28, 0) > > > + if (WOCKY_IS_HTTPS_PROXY (proxy)) > > > > Having runtime type checks in a interface virtual method is not very nice, > > having a wocky_https_proxy_iface_init would allow to call directly the > > right implementation without having to resort to runtime type checking. > > I decided to use this consciously, as doing it differently added much > more boilerplate for no clear benefit. Gave it a quick try (only compile-tested), and the resulting code is not particularly bad. Having both inheritance and runtime type checks is imo quite ugly. I can send a follow-up patch after your series land if it's likely to be accepted. diff --git a/gtk/wocky-http-proxy.c b/gtk/wocky-http-proxy.c index 25f2af5..3eb6931 100644 --- a/gtk/wocky-http-proxy.c +++ b/gtk/wocky-http-proxy.c @@ -186,30 +186,6 @@ wocky_http_proxy_connect (GProxy *proxy, gchar *buffer = NULL; gboolean has_cred; -#if GLIB_CHECK_VERSION(2, 28, 0) - if (WOCKY_IS_HTTPS_PROXY (proxy)) - { - GIOStream *tlsconn; - - tlsconn = g_tls_client_connection_new (io_stream, - G_SOCKET_CONNECTABLE(proxy_address), - error); - if (!tlsconn) - goto error; - - GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL; -#ifdef DEBUG - tls_validation_flags -= G_TLS_CERTIFICATE_UNKNOWN_CA + G_TLS_CERTIFICATE_BAD_IDENTITY; -#endif - g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), - tls_validation_flags); - if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), cancellable, error)) - goto error; - - io_stream = tlsconn; - } -#endif - in = g_io_stream_get_input_stream (io_stream); out = g_io_stream_get_output_stream (io_stream); @@ -251,6 +227,41 @@ error: return NULL; } +#if GLIB_CHECK_VERSION(2, 28, 0) +static GIOStream * +wocky_https_proxy_connect (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GError **error) +{ + { + GIOStream *tlsconn; + + tlsconn = g_tls_client_connection_new (io_stream, + G_SOCKET_CONNECTABLE(proxy_address), + error); + if (!tlsconn) + goto error; + + GTlsCertificateFlags tls_validation_flags = G_TLS_CERTIFICATE_VALIDATE_ALL; +#ifdef DEBUG + tls_validation_flags -= G_TLS_CERTIFICATE_UNKNOWN_CA + G_TLS_CERTIFICATE_BAD_IDENTITY; +#endif + g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn), + tls_validation_flags); + if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn), cancellable, error)) + goto error; + + io_stream = tlsconn; + } + return wocky_http_proxy_connect(proxy, io_stream, proxy_address, cancellable, error); + +error: + return NULL; +} +#endif + typedef struct { @@ -351,8 +362,9 @@ handshake_completed (GObject *source_object, } #endif -static void -wocky_http_proxy_connect_async (GProxy *proxy, + static ConnectAsyncData * + wocky_http_proxy_connect_async_data_new ( + GProxy *proxy, GIOStream *io_stream, GProxyAddress *proxy_address, GCancellable *cancellable, @@ -364,7 +376,7 @@ wocky_http_proxy_connect_async (GProxy *proxy, simple = g_simple_async_result_new (G_OBJECT (proxy), callback, user_data, - wocky_http_proxy_connect_async); + wocky_http_proxy_connect_async_data_new); data = g_slice_new0 (ConnectAsyncData); if (cancellable != NULL) @@ -378,12 +390,30 @@ wocky_http_proxy_connect_async (GProxy *proxy, g_simple_async_result_set_op_res_gpointer (simple, data, (GDestroyNotify) free_connect_data); + return data; + } + + #if GLIB_CHECK_VERSION(2, 28, 0) - if (WOCKY_IS_HTTPS_PROXY (proxy)) +static void +wocky_https_proxy_connect_async (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { + ConnectAsyncData *data; GError *error = NULL; GIOStream *tlsconn; + data = wocky_http_proxy_connect_async_data_new(proxy, + io_stream, + proxy_address, + cancellable, + callback, + user_data); + tlsconn = g_tls_client_connection_new (io_stream, G_SOCKET_CONNECTABLE(proxy_address), &error); @@ -405,12 +435,26 @@ wocky_http_proxy_connect_async (GProxy *proxy, G_PRIORITY_DEFAULT, cancellable, handshake_completed, data); } - else #endif + +static void +wocky_http_proxy_connect_async (GProxy *proxy, + GIOStream *io_stream, + GProxyAddress *proxy_address, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { + ConnectAsyncData *data; + data = wocky_http_proxy_connect_async_data_new(proxy, + io_stream, + proxy_address, + cancellable, + callback, + user_data); + stream_connected(data, io_stream); } -} static void request_write_cb (GObject *source, @@ -510,6 +554,16 @@ wocky_http_proxy_iface_init (GProxyInterface *proxy_iface) proxy_iface->supports_hostname = wocky_http_proxy_supports_hostname; } +static void +wocky_https_proxy_iface_init (GProxyInterface *proxy_iface) +{ + proxy_iface->connect = wocky_https_proxy_connect; + proxy_iface->connect_async = wocky_https_proxy_connect_async; + proxy_iface->connect_finish = wocky_http_proxy_connect_finish; + proxy_iface->supports_hostname = wocky_http_proxy_supports_hostname; +} + + #if GLIB_CHECK_VERSION(2, 28, 0) struct _WockyHttpsProxy { @@ -524,7 +578,7 @@ struct _WockyHttpsProxyClass #define wocky_https_proxy_get_type _wocky_https_proxy_get_type G_DEFINE_TYPE_WITH_CODE (WockyHttpsProxy, wocky_https_proxy, WOCKY_TYPE_HTTP_PROXY, G_IMPLEMENT_INTERFACE (G_TYPE_PROXY, - wocky_http_proxy_iface_init) + wocky_https_proxy_iface_init) g_io_extension_point_set_required_type ( g_io_extension_point_register (G_PROXY_EXTENSION_POINT_NAME), G_TYPE_PROXY);
Attachment:
pgpOPsF9iKltc.pgp
Description: PGP signature
_______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel