diff --git a/gio/Makefile.am b/gio/Makefile.am index 20d10c49f..61f10eb8f 100644 --- a/gio/Makefile.am +++ b/gio/Makefile.am @@ -355,6 +355,8 @@ libgio_2_0_la_SOURCES = \ gproxy.c \ gproxyaddress.c \ gproxyaddressenumerator.c \ + gproxyconnection.c \ + gproxyconnection.h \ gsocketservice.c \ gsrvtarget.c \ gtcpconnection.c \ diff --git a/gio/gproxyconnection.c b/gio/gproxyconnection.c new file mode 100644 index 000000000..2e909af7d --- /dev/null +++ b/gio/gproxyconnection.c @@ -0,0 +1,155 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright © 2010 Collabora Ltd. + * + * 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 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, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Nicolas Dufresne + */ + +#include "config.h" + +#include "gproxyconnection.h" + +#include "gtcpconnection.h" +#include "glibintl.h" + +#define g_proxy_connection_get_type _g_proxy_connection_get_type +G_DEFINE_TYPE (GProxyConnection, + g_proxy_connection, G_TYPE_TCP_CONNECTION); + +enum +{ + PROP_NONE, + PROP_IO_STREAM +}; + +struct _GProxyConnectionPrivate +{ + GIOStream *io_stream; +}; + +static GInputStream * +g_proxy_connection_get_input_stream (GIOStream *io_stream) +{ + GProxyConnection *connection; + connection = G_PROXY_PROXY_CONNECTION (io_stream); + return g_io_stream_get_input_stream (connection->priv->io_stream); +} + +static GOutputStream * +g_proxy_connection_get_output_stream (GIOStream *io_stream) +{ + GProxyConnection *connection; + connection = G_PROXY_PROXY_CONNECTION (io_stream); + return g_io_stream_get_output_stream (connection->priv->io_stream); +} + +static void +g_proxy_connection_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GProxyConnection *connection = G_PROXY_PROXY_CONNECTION (object); + + switch (prop_id) + { + case PROP_IO_STREAM: + g_value_set_object (value, connection->priv->io_stream); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_proxy_connection_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GProxyConnection *connection = G_PROXY_PROXY_CONNECTION (object); + + switch (prop_id) + { + case PROP_IO_STREAM: + connection->priv->io_stream = G_IO_STREAM (g_value_dup_object (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + } +} + +static void +g_proxy_connection_finalize (GObject *object) +{ + GProxyConnection *connection = G_PROXY_PROXY_CONNECTION (object); + + g_object_unref (connection->priv->io_stream); + + G_OBJECT_CLASS (g_proxy_connection_parent_class)->finalize (object); +} + +static void +g_proxy_connection_class_init (GProxyConnectionClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass); + + g_type_class_add_private (klass, sizeof (GProxyConnectionPrivate)); + + gobject_class->set_property = g_proxy_connection_set_property; + gobject_class->get_property = g_proxy_connection_get_property; + gobject_class->finalize = g_proxy_connection_finalize; + + stream_class->get_input_stream = g_proxy_connection_get_input_stream; + stream_class->get_output_stream = g_proxy_connection_get_output_stream; + + g_object_class_install_property (gobject_class, + PROP_IO_STREAM, + g_param_spec_object ("io-stream", + P_("IO Stream"), + P_("The altered streams"), + G_TYPE_SOCKET_CONNECTION, + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); +} + +static void +g_proxy_connection_init (GProxyConnection *connection) +{ + connection->priv = G_TYPE_INSTANCE_GET_PRIVATE (connection, + G_TYPE_PROXY_CONNECTION, + GProxyConnectionPrivate); +} + +GSocketConnection * +_g_proxy_connection_new (GTcpConnection *connection, + GIOStream *io_stream) +{ + GSocket *socket; + + socket = g_socket_connection_get_socket (G_SOCKET_CONNECTION (connection)); + + return G_SOCKET_CONNECTION (g_object_new (G_TYPE_PROXY_CONNECTION, + "io-stream", io_stream, + "socket", socket, + NULL)); +} diff --git a/gio/gproxyconnection.h b/gio/gproxyconnection.h new file mode 100644 index 000000000..901a29037 --- /dev/null +++ b/gio/gproxyconnection.h @@ -0,0 +1,69 @@ +/* GIO - GLib Input, Output and Streaming Library + * Copyright © 2010 Collabora Ltd. + * + * This program 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 of the licence 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, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * Authors: Nicolas Dufresne + * + */ + +#if !defined (__GIO_GIO_H_INSIDE__) && !defined (GIO_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __G_PROXY_PROXY_CONNECTION_H__ +#define __G_PROXY_PROXY_CONNECTION_H__ + +#include +#include + +G_BEGIN_DECLS + +#define G_TYPE_PROXY_CONNECTION (_g_proxy_connection_get_type ()) +#define G_PROXY_PROXY_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), \ + G_TYPE_PROXY_CONNECTION, GProxyConnection)) +#define G_PROXY_PROXY_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_CAST ((class), \ + G_TYPE_PROXY_CONNECTION, GProxyConnectionClass)) +#define G_IS_PROXY_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), \ + G_TYPE_PROXY_CONNECTION)) +#define G_IS_PROXY_CONNECTION_CLASS(class) (G_TYPE_CHECK_CLASS_TYPE ((class), \ + G_TYPE_PROXY_CONNECTION)) +#define G_PROXY_PROXY_CONNECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), \ + G_TYPE_PROXY_CONNECTION, GProxyConnectionClass)) + +typedef struct _GProxyConnection GProxyConnection; +typedef struct _GProxyConnectionPrivate GProxyConnectionPrivate; +typedef struct _GProxyConnectionClass GProxyConnectionClass; + +struct _GProxyConnectionClass +{ + GTcpConnectionClass parent_class; +}; + +struct _GProxyConnection +{ + GTcpConnection parent_instance; + GProxyConnectionPrivate *priv; +}; + +GType _g_proxy_connection_get_type (void) G_GNUC_CONST; + +GSocketConnection *_g_proxy_connection_new (GTcpConnection *connection, + GIOStream *io_stream); + +G_END_DECLS + +#endif /* __G_PROXY_PROXY_CONNECTION_H__ */