Branch data Line data Source code
1 : : /* GIO - GLib Input, Output and Streaming Library
2 : : *
3 : : * Copyright © 2010 Collabora Ltd.
4 : : *
5 : : * SPDX-License-Identifier: LGPL-2.1-or-later
6 : : *
7 : : * This library is free software; you can redistribute it and/or
8 : : * modify it under the terms of the GNU Lesser General Public
9 : : * License as published by the Free Software Foundation; either
10 : : * version 2.1 of the License, or (at your option) any later version.
11 : : *
12 : : * This library is distributed in the hope that it will be useful,
13 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : : * Lesser General Public License for more details.
16 : : *
17 : : * You should have received a copy of the GNU Lesser General
18 : : * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
19 : : *
20 : : * Authors: Nicolas Dufresne <nicolas.dufresne@colllabora.co.uk>
21 : : */
22 : :
23 : : /**
24 : : * GTcpWrapperConnection:
25 : : *
26 : : * A `GTcpWrapperConnection` can be used to wrap a [class@Gio.IOStream] that is
27 : : * based on a [class@Gio.Socket], but which is not actually a
28 : : * [class@Gio.SocketConnection]. This is used by [class@Gio.SocketClient] so
29 : : * that it can always return a [class@Gio.SocketConnection], even when the
30 : : * connection it has actually created is not directly a
31 : : * [class@Gio.SocketConnection].
32 : : *
33 : : * Since: 2.28
34 : : */
35 : :
36 : : #include "config.h"
37 : :
38 : : #include "gtcpwrapperconnection.h"
39 : :
40 : : #include "gtcpconnection.h"
41 : : #include "glibintl.h"
42 : :
43 : : struct _GTcpWrapperConnectionPrivate
44 : : {
45 : : GIOStream *base_io_stream;
46 : : };
47 : :
48 : 5 : G_DEFINE_TYPE_WITH_PRIVATE (GTcpWrapperConnection, g_tcp_wrapper_connection, G_TYPE_TCP_CONNECTION)
49 : :
50 : : enum
51 : : {
52 : : PROP_NONE,
53 : : PROP_BASE_IO_STREAM
54 : : };
55 : :
56 : : static GInputStream *
57 : 0 : g_tcp_wrapper_connection_get_input_stream (GIOStream *io_stream)
58 : : {
59 : 0 : GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (io_stream);
60 : :
61 : 0 : return g_io_stream_get_input_stream (connection->priv->base_io_stream);
62 : : }
63 : :
64 : : static GOutputStream *
65 : 0 : g_tcp_wrapper_connection_get_output_stream (GIOStream *io_stream)
66 : : {
67 : 0 : GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (io_stream);
68 : :
69 : 0 : return g_io_stream_get_output_stream (connection->priv->base_io_stream);
70 : : }
71 : :
72 : : static void
73 : 0 : g_tcp_wrapper_connection_get_property (GObject *object,
74 : : guint prop_id,
75 : : GValue *value,
76 : : GParamSpec *pspec)
77 : : {
78 : 0 : GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object);
79 : :
80 : 0 : switch (prop_id)
81 : : {
82 : 0 : case PROP_BASE_IO_STREAM:
83 : 0 : g_value_set_object (value, connection->priv->base_io_stream);
84 : 0 : break;
85 : :
86 : 0 : default:
87 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
88 : : }
89 : 0 : }
90 : :
91 : : static void
92 : 0 : g_tcp_wrapper_connection_set_property (GObject *object,
93 : : guint prop_id,
94 : : const GValue *value,
95 : : GParamSpec *pspec)
96 : : {
97 : 0 : GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object);
98 : :
99 : 0 : switch (prop_id)
100 : : {
101 : 0 : case PROP_BASE_IO_STREAM:
102 : 0 : connection->priv->base_io_stream = g_value_dup_object (value);
103 : 0 : break;
104 : :
105 : 0 : default:
106 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
107 : : }
108 : 0 : }
109 : :
110 : : static void
111 : 0 : g_tcp_wrapper_connection_finalize (GObject *object)
112 : : {
113 : 0 : GTcpWrapperConnection *connection = G_TCP_WRAPPER_CONNECTION (object);
114 : :
115 : 0 : if (connection->priv->base_io_stream)
116 : 0 : g_object_unref (connection->priv->base_io_stream);
117 : :
118 : 0 : G_OBJECT_CLASS (g_tcp_wrapper_connection_parent_class)->finalize (object);
119 : 0 : }
120 : :
121 : : static void
122 : 1 : g_tcp_wrapper_connection_class_init (GTcpWrapperConnectionClass *klass)
123 : : {
124 : 1 : GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
125 : 1 : GIOStreamClass *stream_class = G_IO_STREAM_CLASS (klass);
126 : :
127 : 1 : gobject_class->set_property = g_tcp_wrapper_connection_set_property;
128 : 1 : gobject_class->get_property = g_tcp_wrapper_connection_get_property;
129 : 1 : gobject_class->finalize = g_tcp_wrapper_connection_finalize;
130 : :
131 : 1 : stream_class->get_input_stream = g_tcp_wrapper_connection_get_input_stream;
132 : 1 : stream_class->get_output_stream = g_tcp_wrapper_connection_get_output_stream;
133 : :
134 : : /**
135 : : * GTcpWrapperConnection:base-io-stream:
136 : : *
137 : : * The wrapped [class@Gio.IOStream].
138 : : *
139 : : * Since: 2.28
140 : : */
141 : 1 : g_object_class_install_property (gobject_class,
142 : : PROP_BASE_IO_STREAM,
143 : : g_param_spec_object ("base-io-stream", NULL, NULL,
144 : : G_TYPE_IO_STREAM,
145 : : G_PARAM_CONSTRUCT_ONLY |
146 : : G_PARAM_READWRITE |
147 : : G_PARAM_STATIC_STRINGS));
148 : 1 : }
149 : :
150 : : static void
151 : 0 : g_tcp_wrapper_connection_init (GTcpWrapperConnection *connection)
152 : : {
153 : 0 : connection->priv = g_tcp_wrapper_connection_get_instance_private (connection);
154 : 0 : }
155 : :
156 : : /**
157 : : * g_tcp_wrapper_connection_new:
158 : : * @base_io_stream: the #GIOStream to wrap
159 : : * @socket: the #GSocket associated with @base_io_stream
160 : : *
161 : : * Wraps @base_io_stream and @socket together as a #GSocketConnection.
162 : : *
163 : : * Returns: the new #GSocketConnection.
164 : : *
165 : : * Since: 2.28
166 : : */
167 : : GSocketConnection *
168 : 0 : g_tcp_wrapper_connection_new (GIOStream *base_io_stream,
169 : : GSocket *socket)
170 : : {
171 : 0 : g_return_val_if_fail (G_IS_IO_STREAM (base_io_stream), NULL);
172 : 0 : g_return_val_if_fail (G_IS_SOCKET (socket), NULL);
173 : 0 : g_return_val_if_fail (g_socket_get_family (socket) == G_SOCKET_FAMILY_IPV4 ||
174 : : g_socket_get_family (socket) == G_SOCKET_FAMILY_IPV6, NULL);
175 : 0 : g_return_val_if_fail (g_socket_get_socket_type (socket) == G_SOCKET_TYPE_STREAM, NULL);
176 : :
177 : 0 : return g_object_new (G_TYPE_TCP_WRAPPER_CONNECTION,
178 : : "base-io-stream", base_io_stream,
179 : : "socket", socket,
180 : : NULL);
181 : : }
182 : :
183 : : /**
184 : : * g_tcp_wrapper_connection_get_base_io_stream:
185 : : * @conn: a #GTcpWrapperConnection
186 : : *
187 : : * Gets @conn's base #GIOStream
188 : : *
189 : : * Returns: (transfer none): @conn's base #GIOStream
190 : : */
191 : : GIOStream *
192 : 0 : g_tcp_wrapper_connection_get_base_io_stream (GTcpWrapperConnection *conn)
193 : : {
194 : 0 : g_return_val_if_fail (G_IS_TCP_WRAPPER_CONNECTION (conn), NULL);
195 : :
196 : 0 : return conn->priv->base_io_stream;
197 : : }
|