GSocketClient: Drop @returns syntax from doc comments
[platform/upstream/glib.git] / gio / gsocketclient.c
1 /*  GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright © 2008, 2009 codethink
4  * Copyright © 2009 Red Hat, Inc
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General
17  * Public License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  * Authors: Ryan Lortie <desrt@desrt.ca>
22  *          Alexander Larsson <alexl@redhat.com>
23  */
24
25 #include "config.h"
26 #include "gsocketclient.h"
27
28 #include <stdlib.h>
29 #include <string.h>
30
31 #include <gio/gioenumtypes.h>
32 #include <gio/gsocketaddressenumerator.h>
33 #include <gio/gsocketconnectable.h>
34 #include <gio/gsocketconnection.h>
35 #include <gio/gproxyaddressenumerator.h>
36 #include <gio/gproxyaddress.h>
37 #include <gio/gsimpleasyncresult.h>
38 #include <gio/gcancellable.h>
39 #include <gio/gioerror.h>
40 #include <gio/gsocket.h>
41 #include <gio/gnetworkaddress.h>
42 #include <gio/gnetworkservice.h>
43 #include <gio/gproxy.h>
44 #include <gio/gsocketaddress.h>
45 #include <gio/gtcpconnection.h>
46 #include <gio/gtcpwrapperconnection.h>
47 #include <gio/gtlscertificate.h>
48 #include <gio/gtlsclientconnection.h>
49 #include <gio/ginetaddress.h>
50 #include "glibintl.h"
51
52
53 /**
54  * SECTION:gsocketclient
55  * @short_description: Helper for connecting to a network service
56  * @include: gio/gio.h
57  * @see_also: #GSocketConnection, #GSocketListener
58  *
59  * #GSocketClient is a high-level utility class for connecting to a
60  * network host using a connection oriented socket type.
61  *
62  * You create a #GSocketClient object, set any options you want, and then
63  * call a sync or async connect operation, which returns a #GSocketConnection
64  * subclass on success.
65  *
66  * The type of the #GSocketConnection object returned depends on the type of
67  * the underlying socket that is in use. For instance, for a TCP/IP connection
68  * it will be a #GTcpConnection.
69  *
70  * Since: 2.22
71  */
72
73
74 G_DEFINE_TYPE (GSocketClient, g_socket_client, G_TYPE_OBJECT);
75
76 enum
77 {
78   PROP_NONE,
79   PROP_FAMILY,
80   PROP_TYPE,
81   PROP_PROTOCOL,
82   PROP_LOCAL_ADDRESS,
83   PROP_TIMEOUT,
84   PROP_ENABLE_PROXY,
85   PROP_TLS,
86   PROP_TLS_VALIDATION_FLAGS
87 };
88
89 struct _GSocketClientPrivate
90 {
91   GSocketFamily family;
92   GSocketType type;
93   GSocketProtocol protocol;
94   GSocketAddress *local_address;
95   guint timeout;
96   gboolean enable_proxy;
97   GHashTable *app_proxies;
98   gboolean tls;
99   GTlsCertificateFlags tls_validation_flags;
100 };
101
102 static GSocket *
103 create_socket (GSocketClient  *client,
104                GSocketAddress *dest_address,
105                GError        **error)
106 {
107   GSocketFamily family;
108   GSocket *socket;
109
110   family = client->priv->family;
111   if (family == G_SOCKET_FAMILY_INVALID &&
112       client->priv->local_address != NULL)
113     family = g_socket_address_get_family (client->priv->local_address);
114   if (family == G_SOCKET_FAMILY_INVALID)
115     family = g_socket_address_get_family (dest_address);
116
117   socket = g_socket_new (family,
118                          client->priv->type,
119                          client->priv->protocol,
120                          error);
121   if (socket == NULL)
122     return NULL;
123
124   if (client->priv->local_address)
125     {
126       if (!g_socket_bind (socket,
127                           client->priv->local_address,
128                           FALSE,
129                           error))
130         {
131           g_object_unref (socket);
132           return NULL;
133         }
134     }
135
136   if (client->priv->timeout)
137     g_socket_set_timeout (socket, client->priv->timeout);
138
139   return socket;
140 }
141
142 static gboolean
143 can_use_proxy (GSocketClient *client)
144 {
145   GSocketClientPrivate *priv = client->priv;
146
147   return priv->enable_proxy
148           && priv->type == G_SOCKET_TYPE_STREAM;
149 }
150
151 static void
152 clarify_connect_error (GError             *error,
153                        GSocketConnectable *connectable,
154                        GSocketAddress     *address)
155 {
156   const char *name;
157   char *tmp_name = NULL;
158
159   if (G_IS_PROXY_ADDRESS (address))
160     {
161       name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address)));
162
163       g_prefix_error (&error, _("Could not connect to proxy server %s: "), name);
164     }
165   else
166     {
167       if (G_IS_NETWORK_ADDRESS (connectable))
168         name = g_network_address_get_hostname (G_NETWORK_ADDRESS (connectable));
169       else if (G_IS_NETWORK_SERVICE (connectable))
170         name = g_network_service_get_domain (G_NETWORK_SERVICE (connectable));
171       else if (G_IS_INET_SOCKET_ADDRESS (connectable))
172         name = tmp_name = g_inet_address_to_string (g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (connectable)));
173       else
174         name = NULL;
175
176       if (name)
177         g_prefix_error (&error, _("Could not connect to %s: "), name);
178       else
179         g_prefix_error (&error, _("Could not connect: "));
180     }
181
182   g_free (tmp_name);
183 }
184
185 static void
186 g_socket_client_init (GSocketClient *client)
187 {
188   client->priv = G_TYPE_INSTANCE_GET_PRIVATE (client,
189                                               G_TYPE_SOCKET_CLIENT,
190                                               GSocketClientPrivate);
191   client->priv->type = G_SOCKET_TYPE_STREAM;
192   client->priv->app_proxies = g_hash_table_new_full (g_str_hash,
193                                                      g_str_equal,
194                                                      g_free,
195                                                      NULL);
196 }
197
198 /**
199  * g_socket_client_new:
200  *
201  * Creates a new #GSocketClient with the default options.
202  *
203  * Returns: a #GSocketClient.
204  *     Free the returned object with g_object_unref().
205  *
206  * Since: 2.22
207  */
208 GSocketClient *
209 g_socket_client_new (void)
210 {
211   return g_object_new (G_TYPE_SOCKET_CLIENT, NULL);
212 }
213
214 static void
215 g_socket_client_finalize (GObject *object)
216 {
217   GSocketClient *client = G_SOCKET_CLIENT (object);
218
219   if (client->priv->local_address)
220     g_object_unref (client->priv->local_address);
221
222   if (G_OBJECT_CLASS (g_socket_client_parent_class)->finalize)
223     (*G_OBJECT_CLASS (g_socket_client_parent_class)->finalize) (object);
224
225   g_hash_table_unref (client->priv->app_proxies);
226 }
227
228 static void
229 g_socket_client_get_property (GObject    *object,
230                               guint       prop_id,
231                               GValue     *value,
232                               GParamSpec *pspec)
233 {
234   GSocketClient *client = G_SOCKET_CLIENT (object);
235
236   switch (prop_id)
237     {
238       case PROP_FAMILY:
239         g_value_set_enum (value, client->priv->family);
240         break;
241
242       case PROP_TYPE:
243         g_value_set_enum (value, client->priv->type);
244         break;
245
246       case PROP_PROTOCOL:
247         g_value_set_enum (value, client->priv->protocol);
248         break;
249
250       case PROP_LOCAL_ADDRESS:
251         g_value_set_object (value, client->priv->local_address);
252         break;
253
254       case PROP_TIMEOUT:
255         g_value_set_uint (value, client->priv->timeout);
256         break;
257
258       case PROP_ENABLE_PROXY:
259         g_value_set_boolean (value, client->priv->enable_proxy);
260         break;
261
262       case PROP_TLS:
263         g_value_set_boolean (value, g_socket_client_get_tls (client));
264         break;
265
266       case PROP_TLS_VALIDATION_FLAGS:
267         g_value_set_flags (value, g_socket_client_get_tls_validation_flags (client));
268         break;
269
270       default:
271         G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
272     }
273 }
274
275 static void
276 g_socket_client_set_property (GObject      *object,
277                               guint         prop_id,
278                               const GValue *value,
279                               GParamSpec   *pspec)
280 {
281   GSocketClient *client = G_SOCKET_CLIENT (object);
282
283   switch (prop_id)
284     {
285     case PROP_FAMILY:
286       g_socket_client_set_family (client, g_value_get_enum (value));
287       break;
288
289     case PROP_TYPE:
290       g_socket_client_set_socket_type (client, g_value_get_enum (value));
291       break;
292
293     case PROP_PROTOCOL:
294       g_socket_client_set_protocol (client, g_value_get_enum (value));
295       break;
296
297     case PROP_LOCAL_ADDRESS:
298       g_socket_client_set_local_address (client, g_value_get_object (value));
299       break;
300
301     case PROP_TIMEOUT:
302       g_socket_client_set_timeout (client, g_value_get_uint (value));
303       break;
304
305     case PROP_ENABLE_PROXY:
306       g_socket_client_set_enable_proxy (client, g_value_get_boolean (value));
307       break;
308
309     case PROP_TLS:
310       g_socket_client_set_tls (client, g_value_get_boolean (value));
311       break;
312
313     case PROP_TLS_VALIDATION_FLAGS:
314       g_socket_client_set_tls_validation_flags (client, g_value_get_flags (value));
315       break;
316
317     default:
318       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
319     }
320 }
321
322 /**
323  * g_socket_client_get_family:
324  * @client: a #GSocketClient.
325  *
326  * Gets the socket family of the socket client.
327  *
328  * See g_socket_client_set_family() for details.
329  *
330  * Returns: a #GSocketFamily
331  *
332  * Since: 2.22
333  */
334 GSocketFamily
335 g_socket_client_get_family (GSocketClient *client)
336 {
337   return client->priv->family;
338 }
339
340 /**
341  * g_socket_client_set_family:
342  * @client: a #GSocketClient.
343  * @family: a #GSocketFamily
344  *
345  * Sets the socket family of the socket client.
346  * If this is set to something other than %G_SOCKET_FAMILY_INVALID
347  * then the sockets created by this object will be of the specified
348  * family.
349  *
350  * This might be useful for instance if you want to force the local
351  * connection to be an ipv4 socket, even though the address might
352  * be an ipv6 mapped to ipv4 address.
353  *
354  * Since: 2.22
355  */
356 void
357 g_socket_client_set_family (GSocketClient *client,
358                             GSocketFamily  family)
359 {
360   if (client->priv->family == family)
361     return;
362
363   client->priv->family = family;
364   g_object_notify (G_OBJECT (client), "family");
365 }
366
367 /**
368  * g_socket_client_get_socket_type:
369  * @client: a #GSocketClient.
370  *
371  * Gets the socket type of the socket client.
372  *
373  * See g_socket_client_set_socket_type() for details.
374  *
375  * Returns: a #GSocketFamily
376  *
377  * Since: 2.22
378  */
379 GSocketType
380 g_socket_client_get_socket_type (GSocketClient *client)
381 {
382   return client->priv->type;
383 }
384
385 /**
386  * g_socket_client_set_socket_type:
387  * @client: a #GSocketClient.
388  * @type: a #GSocketType
389  *
390  * Sets the socket type of the socket client.
391  * The sockets created by this object will be of the specified
392  * type.
393  *
394  * It doesn't make sense to specify a type of %G_SOCKET_TYPE_DATAGRAM,
395  * as GSocketClient is used for connection oriented services.
396  *
397  * Since: 2.22
398  */
399 void
400 g_socket_client_set_socket_type (GSocketClient *client,
401                                  GSocketType    type)
402 {
403   if (client->priv->type == type)
404     return;
405
406   client->priv->type = type;
407   g_object_notify (G_OBJECT (client), "type");
408 }
409
410 /**
411  * g_socket_client_get_protocol:
412  * @client: a #GSocketClient
413  *
414  * Gets the protocol name type of the socket client.
415  *
416  * See g_socket_client_set_protocol() for details.
417  *
418  * Returns: a #GSocketProtocol
419  *
420  * Since: 2.22
421  */
422 GSocketProtocol
423 g_socket_client_get_protocol (GSocketClient *client)
424 {
425   return client->priv->protocol;
426 }
427
428 /**
429  * g_socket_client_set_protocol:
430  * @client: a #GSocketClient.
431  * @protocol: a #GSocketProtocol
432  *
433  * Sets the protocol of the socket client.
434  * The sockets created by this object will use of the specified
435  * protocol.
436  *
437  * If @protocol is %0 that means to use the default
438  * protocol for the socket family and type.
439  *
440  * Since: 2.22
441  */
442 void
443 g_socket_client_set_protocol (GSocketClient   *client,
444                               GSocketProtocol  protocol)
445 {
446   if (client->priv->protocol == protocol)
447     return;
448
449   client->priv->protocol = protocol;
450   g_object_notify (G_OBJECT (client), "protocol");
451 }
452
453 /**
454  * g_socket_client_get_local_address:
455  * @client: a #GSocketClient.
456  *
457  * Gets the local address of the socket client.
458  *
459  * See g_socket_client_set_local_address() for details.
460  *
461  * Returns: (transfer none): a #GSocketAddress or %NULL. Do not free.
462  *
463  * Since: 2.22
464  */
465 GSocketAddress *
466 g_socket_client_get_local_address (GSocketClient *client)
467 {
468   return client->priv->local_address;
469 }
470
471 /**
472  * g_socket_client_set_local_address:
473  * @client: a #GSocketClient.
474  * @address: a #GSocketAddress, or %NULL
475  *
476  * Sets the local address of the socket client.
477  * The sockets created by this object will bound to the
478  * specified address (if not %NULL) before connecting.
479  *
480  * This is useful if you want to ensure that the local
481  * side of the connection is on a specific port, or on
482  * a specific interface.
483  *
484  * Since: 2.22
485  */
486 void
487 g_socket_client_set_local_address (GSocketClient  *client,
488                                    GSocketAddress *address)
489 {
490   if (address)
491     g_object_ref (address);
492
493   if (client->priv->local_address)
494     {
495       g_object_unref (client->priv->local_address);
496     }
497   client->priv->local_address = address;
498   g_object_notify (G_OBJECT (client), "local-address");
499 }
500
501 /**
502  * g_socket_client_get_timeout:
503  * @client: a #GSocketClient
504  *
505  * Gets the I/O timeout time for sockets created by @client.
506  *
507  * See g_socket_client_set_timeout() for details.
508  *
509  * Returns: the timeout in seconds
510  *
511  * Since: 2.26
512  */
513 guint
514 g_socket_client_get_timeout (GSocketClient *client)
515 {
516   return client->priv->timeout;
517 }
518
519
520 /**
521  * g_socket_client_set_timeout:
522  * @client: a #GSocketClient.
523  * @timeout: the timeout
524  *
525  * Sets the I/O timeout for sockets created by @client. @timeout is a
526  * time in seconds, or 0 for no timeout (the default).
527  *
528  * The timeout value affects the initial connection attempt as well,
529  * so setting this may cause calls to g_socket_client_connect(), etc,
530  * to fail with %G_IO_ERROR_TIMED_OUT.
531  *
532  * Since: 2.26
533  */
534 void
535 g_socket_client_set_timeout (GSocketClient *client,
536                              guint          timeout)
537 {
538   if (client->priv->timeout == timeout)
539     return;
540
541   client->priv->timeout = timeout;
542   g_object_notify (G_OBJECT (client), "timeout");
543 }
544
545 /**
546  * g_socket_client_get_enable_proxy:
547  * @client: a #GSocketClient.
548  *
549  * Gets the proxy enable state; see g_socket_client_set_enable_proxy()
550  *
551  * Returns: whether proxying is enabled
552  *
553  * Since: 2.26
554  */
555 gboolean
556 g_socket_client_get_enable_proxy (GSocketClient *client)
557 {
558   return client->priv->enable_proxy;
559 }
560
561 /**
562  * g_socket_client_set_enable_proxy:
563  * @client: a #GSocketClient.
564  * @enable: whether to enable proxies
565  *
566  * Sets whether or not @client attempts to make connections via a
567  * proxy server. When enabled (the default), #GSocketClient will use a
568  * #GProxyResolver to determine if a proxy protocol such as SOCKS is
569  * needed, and automatically do the necessary proxy negotiation.
570  *
571  * Since: 2.26
572  */
573 void
574 g_socket_client_set_enable_proxy (GSocketClient *client,
575                                   gboolean       enable)
576 {
577   enable = !!enable;
578   if (client->priv->enable_proxy == enable)
579     return;
580
581   client->priv->enable_proxy = enable;
582   g_object_notify (G_OBJECT (client), "enable-proxy");
583 }
584
585 /**
586  * g_socket_client_get_tls:
587  * @client: a #GSocketClient.
588  *
589  * Gets whether @client creates TLS connections. See
590  * g_socket_client_set_tls() for details.
591  *
592  * Returns: whether @client uses TLS
593  *
594  * Since: 2.28
595  */
596 gboolean
597 g_socket_client_get_tls (GSocketClient *client)
598 {
599   return client->priv->tls;
600 }
601
602 /**
603  * g_socket_client_set_tls:
604  * @client: a #GSocketClient.
605  * @tls: whether to use TLS
606  *
607  * Sets whether @client creates TLS (aka SSL) connections. If @tls is
608  * %TRUE, @client will wrap its connections in a #GTlsClientConnection
609  * and perform a TLS handshake when connecting.
610  *
611  * Note that since #GSocketClient must return a #GSocketConnection,
612  * but #GTlsClientConnection is not a #GSocketConnection, this
613  * actually wraps the resulting #GTlsClientConnection in a
614  * #GTcpWrapperConnection when returning it. You can use
615  * g_tcp_wrapper_connection_get_base_io_stream() on the return value
616  * to extract the #GTlsClientConnection.
617  *
618  * Since: 2.28
619  */
620 void
621 g_socket_client_set_tls (GSocketClient *client,
622                          gboolean       tls)
623 {
624   tls = !!tls;
625   if (tls == client->priv->tls)
626     return;
627
628   client->priv->tls = tls;
629   g_object_notify (G_OBJECT (client), "tls");
630 }
631
632 /**
633  * g_socket_client_get_tls_validation_flags:
634  * @client: a #GSocketClient.
635  *
636  * Gets the TLS validation flags used creating TLS connections via
637  * @client.
638  *
639  * Returns: the TLS validation flags
640  *
641  * Since: 2.28
642  */
643 GTlsCertificateFlags
644 g_socket_client_get_tls_validation_flags (GSocketClient *client)
645 {
646   return client->priv->tls_validation_flags;
647 }
648
649 /**
650  * g_socket_client_set_tls_validation_flags:
651  * @client: a #GSocketClient.
652  * @flags: the validation flags
653  *
654  * Sets the TLS validation flags used when creating TLS connections
655  * via @client. The default value is %G_TLS_CERTIFICATE_VALIDATE_ALL.
656  *
657  * Since: 2.28
658  */
659 void
660 g_socket_client_set_tls_validation_flags (GSocketClient        *client,
661                                           GTlsCertificateFlags  flags)
662 {
663   if (client->priv->tls_validation_flags != flags)
664     {
665       client->priv->tls_validation_flags = flags;
666       g_object_notify (G_OBJECT (client), "tls-validation-flags");
667     }
668 }
669
670 static void
671 g_socket_client_class_init (GSocketClientClass *class)
672 {
673   GObjectClass *gobject_class = G_OBJECT_CLASS (class);
674
675   g_type_class_add_private (class, sizeof (GSocketClientPrivate));
676
677   gobject_class->finalize = g_socket_client_finalize;
678   gobject_class->set_property = g_socket_client_set_property;
679   gobject_class->get_property = g_socket_client_get_property;
680
681   g_object_class_install_property (gobject_class, PROP_FAMILY,
682                                    g_param_spec_enum ("family",
683                                                       P_("Socket family"),
684                                                       P_("The sockets address family to use for socket construction"),
685                                                       G_TYPE_SOCKET_FAMILY,
686                                                       G_SOCKET_FAMILY_INVALID,
687                                                       G_PARAM_CONSTRUCT |
688                                                       G_PARAM_READWRITE |
689                                                       G_PARAM_STATIC_STRINGS));
690
691   g_object_class_install_property (gobject_class, PROP_TYPE,
692                                    g_param_spec_enum ("type",
693                                                       P_("Socket type"),
694                                                       P_("The sockets type to use for socket construction"),
695                                                       G_TYPE_SOCKET_TYPE,
696                                                       G_SOCKET_TYPE_STREAM,
697                                                       G_PARAM_CONSTRUCT |
698                                                       G_PARAM_READWRITE |
699                                                       G_PARAM_STATIC_STRINGS));
700
701   g_object_class_install_property (gobject_class, PROP_PROTOCOL,
702                                    g_param_spec_enum ("protocol",
703                                                       P_("Socket protocol"),
704                                                       P_("The protocol to use for socket construction, or 0 for default"),
705                                                       G_TYPE_SOCKET_PROTOCOL,
706                                                       G_SOCKET_PROTOCOL_DEFAULT,
707                                                       G_PARAM_CONSTRUCT |
708                                                       G_PARAM_READWRITE |
709                                                       G_PARAM_STATIC_STRINGS));
710
711   g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS,
712                                    g_param_spec_object ("local-address",
713                                                         P_("Local address"),
714                                                         P_("The local address constructed sockets will be bound to"),
715                                                         G_TYPE_SOCKET_ADDRESS,
716                                                         G_PARAM_CONSTRUCT |
717                                                         G_PARAM_READWRITE |
718                                                         G_PARAM_STATIC_STRINGS));
719
720   g_object_class_install_property (gobject_class, PROP_TIMEOUT,
721                                    g_param_spec_uint ("timeout",
722                                                       P_("Socket timeout"),
723                                                       P_("The I/O timeout for sockets, or 0 for none"),
724                                                       0, G_MAXUINT, 0,
725                                                       G_PARAM_CONSTRUCT |
726                                                       G_PARAM_READWRITE |
727                                                       G_PARAM_STATIC_STRINGS));
728
729    g_object_class_install_property (gobject_class, PROP_ENABLE_PROXY,
730                                     g_param_spec_boolean ("enable-proxy",
731                                                           P_("Enable proxy"),
732                                                           P_("Enable proxy support"),
733                                                           TRUE,
734                                                           G_PARAM_CONSTRUCT |
735                                                           G_PARAM_READWRITE |
736                                                           G_PARAM_STATIC_STRINGS));
737
738   g_object_class_install_property (gobject_class, PROP_TLS,
739                                    g_param_spec_boolean ("tls",
740                                                          P_("TLS"),
741                                                          P_("Whether to create TLS connections"),
742                                                          FALSE,
743                                                          G_PARAM_CONSTRUCT |
744                                                          G_PARAM_READWRITE |
745                                                          G_PARAM_STATIC_STRINGS));
746   g_object_class_install_property (gobject_class, PROP_TLS_VALIDATION_FLAGS,
747                                    g_param_spec_flags ("tls-validation-flags",
748                                                        P_("TLS validation flags"),
749                                                        P_("TLS validation flags to use"),
750                                                        G_TYPE_TLS_CERTIFICATE_FLAGS,
751                                                        G_TLS_CERTIFICATE_VALIDATE_ALL,
752                                                        G_PARAM_CONSTRUCT |
753                                                        G_PARAM_READWRITE |
754                                                        G_PARAM_STATIC_STRINGS));
755 }
756
757 /**
758  * g_socket_client_connect:
759  * @client: a #GSocketClient.
760  * @connectable: a #GSocketConnectable specifying the remote address.
761  * @cancellable: (allow-none): optional #GCancellable object, %NULL to ignore.
762  * @error: #GError for error reporting, or %NULL to ignore.
763  *
764  * Tries to resolve the @connectable and make a network connection to it.
765  *
766  * Upon a successful connection, a new #GSocketConnection is constructed
767  * and returned.  The caller owns this new object and must drop their
768  * reference to it when finished with it.
769  *
770  * The type of the #GSocketConnection object returned depends on the type of
771  * the underlying socket that is used. For instance, for a TCP/IP connection
772  * it will be a #GTcpConnection.
773  *
774  * The socket created will be the same family as the address that the
775  * @connectable resolves to, unless family is set with g_socket_client_set_family()
776  * or indirectly via g_socket_client_set_local_address(). The socket type
777  * defaults to %G_SOCKET_TYPE_STREAM but can be set with
778  * g_socket_client_set_socket_type().
779  *
780  * If a local address is specified with g_socket_client_set_local_address() the
781  * socket will be bound to this address before connecting.
782  *
783  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
784  *
785  * Since: 2.22
786  */
787 GSocketConnection *
788 g_socket_client_connect (GSocketClient       *client,
789                          GSocketConnectable  *connectable,
790                          GCancellable        *cancellable,
791                          GError             **error)
792 {
793   GIOStream *connection = NULL;
794   GSocketAddressEnumerator *enumerator = NULL;
795   GError *last_error, *tmp_error;
796
797   last_error = NULL;
798
799   if (can_use_proxy (client))
800     enumerator = g_socket_connectable_proxy_enumerate (connectable);
801   else
802     enumerator = g_socket_connectable_enumerate (connectable);
803
804   while (connection == NULL)
805     {
806       GSocketAddress *address = NULL;
807       gboolean application_proxy = FALSE;
808       GSocket *socket;
809
810       if (g_cancellable_is_cancelled (cancellable))
811         {
812           g_clear_error (error);
813           g_cancellable_set_error_if_cancelled (cancellable, error);
814           break;
815         }
816
817       tmp_error = NULL;
818       address = g_socket_address_enumerator_next (enumerator, cancellable,
819                                                   &tmp_error);
820
821       if (address == NULL)
822         {
823           if (tmp_error)
824             {
825               g_clear_error (&last_error);
826               g_propagate_error (error, tmp_error);
827             }
828           else if (last_error)
829             {
830               g_propagate_error (error, last_error);
831             }
832           else
833             g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
834                                  _("Unknown error on connect"));
835           break;
836         }
837
838       /* clear error from previous attempt */
839       g_clear_error (&last_error);
840
841       socket = create_socket (client, address, &last_error);
842       if (socket == NULL)
843         {
844           g_object_unref (address);
845           continue;
846         }
847
848       if (g_socket_connect (socket, address, cancellable, &last_error))
849         connection = (GIOStream *)g_socket_connection_factory_create_connection (socket);
850       else
851         clarify_connect_error (last_error, connectable, address);
852
853       if (connection &&
854           G_IS_PROXY_ADDRESS (address) &&
855           client->priv->enable_proxy)
856         {
857           GProxyAddress *proxy_addr = G_PROXY_ADDRESS (address);
858           const gchar *protocol;
859           GProxy *proxy;
860
861           protocol = g_proxy_address_get_protocol (proxy_addr);
862           proxy = g_proxy_get_default_for_protocol (protocol);
863
864           /* The connection should not be anything else then TCP Connection,
865            * but let's put a safety guard in case
866            */
867           if (!G_IS_TCP_CONNECTION (connection))
868             {
869               g_critical ("Trying to proxy over non-TCP connection, this is "
870                           "most likely a bug in GLib IO library.");
871
872               g_set_error_literal (&last_error,
873                   G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
874                   _("Trying to proxy over non-TCP connection is not supported."));
875
876               g_object_unref (connection);
877               connection = NULL;
878             }
879           else if (proxy)
880             {
881               GIOStream *proxy_connection;
882
883               proxy_connection = g_proxy_connect (proxy,
884                                                   connection,
885                                                   proxy_addr,
886                                                   cancellable,
887                                                   &last_error);
888               g_object_unref (connection);
889               connection = proxy_connection;
890               g_object_unref (proxy);
891             }
892           else if (!g_hash_table_lookup_extended (client->priv->app_proxies,
893                                                   protocol, NULL, NULL))
894             {
895               g_set_error (&last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
896                            _("Proxy protocol '%s' is not supported."),
897                            protocol);
898               g_object_unref (connection);
899               connection = NULL;
900             }
901           else
902             {
903               application_proxy = TRUE;
904             }
905         }
906
907       if (!application_proxy && connection && client->priv->tls)
908         {
909           GIOStream *tlsconn;
910
911           tlsconn = g_tls_client_connection_new (connection, connectable, &last_error);
912           g_object_unref (connection);
913           connection = tlsconn;
914
915           if (tlsconn)
916             {
917               g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
918                                                             client->priv->tls_validation_flags);
919               if (!g_tls_connection_handshake (G_TLS_CONNECTION (tlsconn),
920                                                cancellable, &last_error))
921                 {
922                   g_object_unref (tlsconn);
923                   connection = NULL;
924                 }
925             }
926         }
927
928       if (connection && !G_IS_SOCKET_CONNECTION (connection))
929         {
930           GSocketConnection *wrapper_connection;
931
932           wrapper_connection = g_tcp_wrapper_connection_new (connection, socket);
933           g_object_unref (connection);
934           connection = (GIOStream *)wrapper_connection;
935         }
936
937       g_object_unref (socket);
938       g_object_unref (address);
939     }
940   g_object_unref (enumerator);
941
942   return G_SOCKET_CONNECTION (connection);
943 }
944
945 /**
946  * g_socket_client_connect_to_host:
947  * @client: a #GSocketClient
948  * @host_and_port: the name and optionally port of the host to connect to
949  * @default_port: the default port to connect to
950  * @cancellable: (allow-none): a #GCancellable, or %NULL
951  * @error: a pointer to a #GError, or %NULL
952  *
953  * This is a helper function for g_socket_client_connect().
954  *
955  * Attempts to create a TCP connection to the named host.
956  *
957  * @host_and_port may be in any of a number of recognized formats; an IPv6
958  * address, an IPv4 address, or a domain name (in which case a DNS
959  * lookup is performed).  Quoting with [] is supported for all address
960  * types.  A port override may be specified in the usual way with a
961  * colon.  Ports may be given as decimal numbers or symbolic names (in
962  * which case an /etc/services lookup is performed).
963  *
964  * If no port override is given in @host_and_port then @default_port will be
965  * used as the port number to connect to.
966  *
967  * In general, @host_and_port is expected to be provided by the user (allowing
968  * them to give the hostname, and a port override if necessary) and
969  * @default_port is expected to be provided by the application.
970  *
971  * In the case that an IP address is given, a single connection
972  * attempt is made.  In the case that a name is given, multiple
973  * connection attempts may be made, in turn and according to the
974  * number of address records in DNS, until a connection succeeds.
975  *
976  * Upon a successful connection, a new #GSocketConnection is constructed
977  * and returned.  The caller owns this new object and must drop their
978  * reference to it when finished with it.
979  *
980  * In the event of any failure (DNS error, service not found, no hosts
981  * connectable) %NULL is returned and @error (if non-%NULL) is set
982  * accordingly.
983  *
984  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
985  *
986  * Since: 2.22
987  */
988 GSocketConnection *
989 g_socket_client_connect_to_host (GSocketClient  *client,
990                                  const gchar    *host_and_port,
991                                  guint16         default_port,
992                                  GCancellable   *cancellable,
993                                  GError        **error)
994 {
995   GSocketConnectable *connectable;
996   GSocketConnection *connection;
997
998   connectable = g_network_address_parse (host_and_port, default_port, error);
999   if (connectable == NULL)
1000     return NULL;
1001
1002   connection = g_socket_client_connect (client, connectable,
1003                                         cancellable, error);
1004   g_object_unref (connectable);
1005
1006   return connection;
1007 }
1008
1009 /**
1010  * g_socket_client_connect_to_service:
1011  * @client: a #GSocketConnection
1012  * @domain: a domain name
1013  * @service: the name of the service to connect to
1014  * @cancellable: (allow-none): a #GCancellable, or %NULL
1015  * @error: a pointer to a #GError, or %NULL
1016  *
1017  * Attempts to create a TCP connection to a service.
1018  *
1019  * This call looks up the SRV record for @service at @domain for the
1020  * "tcp" protocol.  It then attempts to connect, in turn, to each of
1021  * the hosts providing the service until either a connection succeeds
1022  * or there are no hosts remaining.
1023  *
1024  * Upon a successful connection, a new #GSocketConnection is constructed
1025  * and returned.  The caller owns this new object and must drop their
1026  * reference to it when finished with it.
1027  *
1028  * In the event of any failure (DNS error, service not found, no hosts
1029  * connectable) %NULL is returned and @error (if non-%NULL) is set
1030  * accordingly.
1031  *
1032  * Returns: (transfer full): a #GSocketConnection if successful, or %NULL on error
1033  */
1034 GSocketConnection *
1035 g_socket_client_connect_to_service (GSocketClient  *client,
1036                                     const gchar    *domain,
1037                                     const gchar    *service,
1038                                     GCancellable   *cancellable,
1039                                     GError        **error)
1040 {
1041   GSocketConnectable *connectable;
1042   GSocketConnection *connection;
1043
1044   connectable = g_network_service_new (service, "tcp", domain);
1045   connection = g_socket_client_connect (client, connectable,
1046                                         cancellable, error);
1047   g_object_unref (connectable);
1048
1049   return connection;
1050 }
1051
1052 /**
1053  * g_socket_client_connect_to_uri:
1054  * @client: a #GSocketClient
1055  * @uri: A network URI
1056  * @default_port: the default port to connect to
1057  * @cancellable: (allow-none): a #GCancellable, or %NULL
1058  * @error: a pointer to a #GError, or %NULL
1059  *
1060  * This is a helper function for g_socket_client_connect().
1061  *
1062  * Attempts to create a TCP connection with a network URI.
1063  *
1064  * @uri may be any valid URI containing an "authority" (hostname/port)
1065  * component. If a port is not specified in the URI, @default_port
1066  * will be used. TLS will be negotiated if #GSocketClient:tls is %TRUE.
1067  * (#GSocketClient does not know to automatically assume TLS for
1068  * certain URI schemes.)
1069  *
1070  * Using this rather than g_socket_client_connect() or
1071  * g_socket_client_connect_to_host() allows #GSocketClient to
1072  * determine when to use application-specific proxy protocols.
1073  *
1074  * Upon a successful connection, a new #GSocketConnection is constructed
1075  * and returned.  The caller owns this new object and must drop their
1076  * reference to it when finished with it.
1077  *
1078  * In the event of any failure (DNS error, service not found, no hosts
1079  * connectable) %NULL is returned and @error (if non-%NULL) is set
1080  * accordingly.
1081  *
1082  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1083  *
1084  * Since: 2.26
1085  */
1086 GSocketConnection *
1087 g_socket_client_connect_to_uri (GSocketClient  *client,
1088                                 const gchar    *uri,
1089                                 guint16         default_port,
1090                                 GCancellable   *cancellable,
1091                                 GError        **error)
1092 {
1093   GSocketConnectable *connectable;
1094   GSocketConnection *connection;
1095
1096   connectable = g_network_address_parse_uri (uri, default_port, error);
1097   if (connectable == NULL)
1098     return NULL;
1099
1100   connection = g_socket_client_connect (client, connectable,
1101                                         cancellable, error);
1102   g_object_unref (connectable);
1103
1104   return connection;
1105 }
1106
1107 typedef struct
1108 {
1109   GSimpleAsyncResult *result;
1110   GCancellable *cancellable;
1111   GSocketClient *client;
1112
1113   GSocketConnectable *connectable;
1114   GSocketAddressEnumerator *enumerator;
1115   GProxyAddress *proxy_addr;
1116   GSocketAddress *current_addr;
1117   GSocket *current_socket;
1118   GIOStream *connection;
1119
1120   GError *last_error;
1121 } GSocketClientAsyncConnectData;
1122
1123 static void
1124 g_socket_client_async_connect_complete (GSocketClientAsyncConnectData *data)
1125 {
1126   if (data->last_error)
1127     {
1128       g_simple_async_result_take_error (data->result, data->last_error);
1129     }
1130   else
1131     {
1132       g_assert (data->connection);
1133
1134       if (!G_IS_SOCKET_CONNECTION (data->connection))
1135         {
1136           GSocketConnection *wrapper_connection;
1137
1138           wrapper_connection = g_tcp_wrapper_connection_new (data->connection,
1139                                                              data->current_socket);
1140           g_object_unref (data->connection);
1141           data->connection = (GIOStream *)wrapper_connection;
1142         }
1143
1144       g_simple_async_result_set_op_res_gpointer (data->result,
1145                                                  data->connection,
1146                                                  g_object_unref);
1147     }
1148
1149   g_simple_async_result_complete (data->result);
1150   g_object_unref (data->result);
1151   g_object_unref (data->connectable);
1152   g_object_unref (data->enumerator);
1153   if (data->cancellable)
1154     g_object_unref (data->cancellable);
1155   if (data->current_addr)
1156     g_object_unref (data->current_addr);
1157   if (data->current_socket)
1158     g_object_unref (data->current_socket);
1159   if (data->proxy_addr)
1160     g_object_unref (data->proxy_addr);
1161   g_slice_free (GSocketClientAsyncConnectData, data);
1162 }
1163
1164
1165 static void
1166 g_socket_client_enumerator_callback (GObject      *object,
1167                                      GAsyncResult *result,
1168                                      gpointer      user_data);
1169
1170 static void
1171 set_last_error (GSocketClientAsyncConnectData *data,
1172                 GError *error)
1173 {
1174   g_clear_error (&data->last_error);
1175   data->last_error = error;
1176 }
1177
1178 static void
1179 enumerator_next_async (GSocketClientAsyncConnectData *data)
1180 {
1181   /* We need to cleanup the state */
1182   g_clear_object (&data->current_socket);
1183   g_clear_object (&data->current_addr);
1184   g_clear_object (&data->proxy_addr);
1185   g_clear_object (&data->connection);
1186
1187   g_socket_address_enumerator_next_async (data->enumerator,
1188                                           data->cancellable,
1189                                           g_socket_client_enumerator_callback,
1190                                           data);
1191 }
1192
1193 static void
1194 g_socket_client_tls_handshake_callback (GObject      *object,
1195                                         GAsyncResult *result,
1196                                         gpointer      user_data)
1197 {
1198   GSocketClientAsyncConnectData *data = user_data;
1199
1200   if (g_tls_connection_handshake_finish (G_TLS_CONNECTION (object),
1201                                          result,
1202                                          &data->last_error))
1203     {
1204       g_object_unref (data->connection);
1205       data->connection = G_IO_STREAM (object);
1206
1207       g_socket_client_async_connect_complete (data);
1208     }
1209   else
1210     {
1211       g_object_unref (object);
1212       enumerator_next_async (data);
1213     }
1214 }
1215
1216 static void
1217 g_socket_client_tls_handshake (GSocketClientAsyncConnectData *data)
1218 {
1219   GIOStream *tlsconn;
1220
1221   if (!data->client->priv->tls)
1222     {
1223       g_socket_client_async_connect_complete (data);
1224       return;
1225     }
1226
1227   tlsconn = g_tls_client_connection_new (data->connection,
1228                                          data->connectable,
1229                                          &data->last_error);
1230   if (tlsconn)
1231     {
1232       g_tls_client_connection_set_validation_flags (G_TLS_CLIENT_CONNECTION (tlsconn),
1233                                                     data->client->priv->tls_validation_flags);
1234       g_tls_connection_handshake_async (G_TLS_CONNECTION (tlsconn),
1235                                         G_PRIORITY_DEFAULT,
1236                                         data->cancellable,
1237                                         g_socket_client_tls_handshake_callback,
1238                                         data);
1239     }
1240   else
1241     {
1242       enumerator_next_async (data);
1243     }
1244 }
1245
1246 static void
1247 g_socket_client_proxy_connect_callback (GObject      *object,
1248                                         GAsyncResult *result,
1249                                         gpointer      user_data)
1250 {
1251   GSocketClientAsyncConnectData *data = user_data;
1252
1253   g_object_unref (data->connection);
1254   data->connection = g_proxy_connect_finish (G_PROXY (object),
1255                                              result,
1256                                              &data->last_error);
1257   if (!data->connection)
1258     {
1259       enumerator_next_async (data);
1260       return;
1261     }
1262
1263   g_socket_client_tls_handshake (data);
1264 }
1265
1266 static void
1267 g_socket_client_proxy_connect (GSocketClientAsyncConnectData *data)
1268 {
1269   GProxy *proxy;
1270   const gchar *protocol;
1271
1272   if (!data->proxy_addr)
1273     {
1274       g_socket_client_tls_handshake (data);
1275       return;
1276     }
1277
1278   protocol  = g_proxy_address_get_protocol (data->proxy_addr);
1279   proxy = g_proxy_get_default_for_protocol (protocol);
1280
1281   /* The connection should not be anything else then TCP Connection,
1282    * but let's put a safety guard in case
1283    */
1284   if (!G_IS_TCP_CONNECTION (data->connection))
1285     {
1286       g_critical ("Trying to proxy over non-TCP connection, this is "
1287           "most likely a bug in GLib IO library.");
1288
1289       g_set_error_literal (&data->last_error,
1290           G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
1291           _("Trying to proxy over non-TCP connection is not supported."));
1292
1293       enumerator_next_async (data);
1294     }
1295   else if (proxy)
1296     {
1297       g_proxy_connect_async (proxy,
1298                              data->connection,
1299                              data->proxy_addr,
1300                              data->cancellable,
1301                              g_socket_client_proxy_connect_callback,
1302                              data);
1303       g_object_unref (proxy);
1304     }
1305   else if (!g_hash_table_lookup_extended (data->client->priv->app_proxies,
1306                                           protocol, NULL, NULL))
1307     {
1308       g_clear_error (&data->last_error);
1309
1310       g_set_error (&data->last_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
1311           _("Proxy protocol '%s' is not supported."),
1312           protocol);
1313
1314       enumerator_next_async (data);
1315     }
1316   else
1317     {
1318       /* Simply complete the connection, we don't want to do TLS handshake
1319        * as the application proxy handling may need proxy handshake first */
1320       g_socket_client_async_connect_complete (data);
1321     }
1322 }
1323
1324 static void
1325 g_socket_client_socket_connected (GSocketClientAsyncConnectData *data)
1326 {
1327   g_socket_set_blocking (data->current_socket, TRUE);
1328
1329   data->connection = (GIOStream *)
1330     g_socket_connection_factory_create_connection (data->current_socket);
1331
1332   g_socket_client_proxy_connect (data);
1333 }
1334
1335 static gboolean
1336 g_socket_client_socket_callback (GSocket *socket,
1337                                  GIOCondition condition,
1338                                  GSocketClientAsyncConnectData *data)
1339 {
1340   GError *error = NULL;
1341
1342   if (g_cancellable_is_cancelled (data->cancellable))
1343     {
1344       /* Cancelled, return done with last error being cancelled */
1345       g_clear_error (&data->last_error);
1346       g_cancellable_set_error_if_cancelled (data->cancellable,
1347                                             &data->last_error);
1348
1349       g_socket_client_async_connect_complete (data);
1350       return FALSE;
1351     }
1352   else
1353     {
1354       /* socket is ready for writing means connect done, did it succeed? */
1355       if (!g_socket_check_connect_result (data->current_socket, &error))
1356         {
1357           clarify_connect_error (error, data->connectable,
1358                                  data->current_addr);
1359           set_last_error (data, error);
1360
1361           /* try next one */
1362           enumerator_next_async (data);
1363
1364           return FALSE;
1365         }
1366     }
1367
1368   g_socket_client_socket_connected (data);
1369   return FALSE;
1370 }
1371
1372 static void
1373 g_socket_client_enumerator_callback (GObject      *object,
1374                                      GAsyncResult *result,
1375                                      gpointer      user_data)
1376 {
1377   GSocketClientAsyncConnectData *data = user_data;
1378   GSocketAddress *address = NULL;
1379   GSocket *socket;
1380   GError *tmp_error = NULL;
1381
1382   if (g_cancellable_is_cancelled (data->cancellable))
1383     {
1384       g_clear_error (&data->last_error);
1385       g_cancellable_set_error_if_cancelled (data->cancellable, &data->last_error);
1386       g_socket_client_async_connect_complete (data);
1387       return;
1388     }
1389
1390   address = g_socket_address_enumerator_next_finish (data->enumerator,
1391                                                      result, &tmp_error);
1392
1393   if (address == NULL)
1394     {
1395       if (tmp_error)
1396         set_last_error (data, tmp_error);
1397       else if (data->last_error == NULL)
1398         g_set_error_literal (&data->last_error, G_IO_ERROR, G_IO_ERROR_FAILED,
1399                              _("Unknown error on connect"));
1400
1401       g_socket_client_async_connect_complete (data);
1402       return;
1403     }
1404
1405   if (G_IS_PROXY_ADDRESS (address) &&
1406       data->client->priv->enable_proxy)
1407     data->proxy_addr = g_object_ref (G_PROXY_ADDRESS (address));
1408
1409   g_clear_error (&data->last_error);
1410
1411   socket = create_socket (data->client, address, &data->last_error);
1412   if (socket != NULL)
1413     {
1414       g_socket_set_blocking (socket, FALSE);
1415       if (g_socket_connect (socket, address, data->cancellable, &tmp_error))
1416         {
1417           data->current_socket = socket;
1418           g_socket_client_socket_connected (data);
1419
1420           g_object_unref (address);
1421           return;
1422         }
1423       else if (g_error_matches (tmp_error, G_IO_ERROR, G_IO_ERROR_PENDING))
1424         {
1425           GSource *source;
1426
1427           data->current_socket = socket;
1428           data->current_addr = address;
1429           g_error_free (tmp_error);
1430
1431           source = g_socket_create_source (socket, G_IO_OUT,
1432                                            data->cancellable);
1433           g_source_set_callback (source,
1434                                  (GSourceFunc) g_socket_client_socket_callback,
1435                                  data, NULL);
1436           g_source_attach (source, g_main_context_get_thread_default ());
1437           g_source_unref (source);
1438           return;
1439         }
1440       else
1441         {
1442           clarify_connect_error (tmp_error, data->connectable, address);
1443           data->last_error = tmp_error;
1444           g_object_unref (socket);
1445         }
1446     }
1447
1448   g_object_unref (address);
1449   enumerator_next_async (data);
1450 }
1451
1452 /**
1453  * g_socket_client_connect_async:
1454  * @client: a #GSocketClient
1455  * @connectable: a #GSocketConnectable specifying the remote address.
1456  * @cancellable: (allow-none): a #GCancellable, or %NULL
1457  * @callback: (scope async): a #GAsyncReadyCallback
1458  * @user_data: (closure): user data for the callback
1459  *
1460  * This is the asynchronous version of g_socket_client_connect().
1461  *
1462  * When the operation is finished @callback will be
1463  * called. You can then call g_socket_client_connect_finish() to get
1464  * the result of the operation.
1465  *
1466  * Since: 2.22
1467  */
1468 void
1469 g_socket_client_connect_async (GSocketClient       *client,
1470                                GSocketConnectable  *connectable,
1471                                GCancellable        *cancellable,
1472                                GAsyncReadyCallback  callback,
1473                                gpointer             user_data)
1474 {
1475   GSocketClientAsyncConnectData *data;
1476
1477   g_return_if_fail (G_IS_SOCKET_CLIENT (client));
1478
1479   data = g_slice_new0 (GSocketClientAsyncConnectData);
1480
1481   data->result = g_simple_async_result_new (G_OBJECT (client),
1482                                             callback, user_data,
1483                                             g_socket_client_connect_async);
1484   data->client = client;
1485   if (cancellable)
1486     data->cancellable = g_object_ref (cancellable);
1487   else
1488     data->cancellable = NULL;
1489   data->last_error = NULL;
1490   data->connectable = g_object_ref (connectable);
1491
1492   if (can_use_proxy (client))
1493       data->enumerator = g_socket_connectable_proxy_enumerate (connectable);
1494   else
1495       data->enumerator = g_socket_connectable_enumerate (connectable);
1496
1497   enumerator_next_async (data);
1498 }
1499
1500 /**
1501  * g_socket_client_connect_to_host_async:
1502  * @client: a #GSocketClient
1503  * @host_and_port: the name and optionally the port of the host to connect to
1504  * @default_port: the default port to connect to
1505  * @cancellable: (allow-none): a #GCancellable, or %NULL
1506  * @callback: (scope async): a #GAsyncReadyCallback
1507  * @user_data: (closure): user data for the callback
1508  *
1509  * This is the asynchronous version of g_socket_client_connect_to_host().
1510  *
1511  * When the operation is finished @callback will be
1512  * called. You can then call g_socket_client_connect_to_host_finish() to get
1513  * the result of the operation.
1514  *
1515  * Since: 2.22
1516  */
1517 void
1518 g_socket_client_connect_to_host_async (GSocketClient        *client,
1519                                        const gchar          *host_and_port,
1520                                        guint16               default_port,
1521                                        GCancellable         *cancellable,
1522                                        GAsyncReadyCallback   callback,
1523                                        gpointer              user_data)
1524 {
1525   GSocketConnectable *connectable;
1526   GError *error;
1527
1528   error = NULL;
1529   connectable = g_network_address_parse (host_and_port, default_port,
1530                                          &error);
1531   if (connectable == NULL)
1532     {
1533       g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
1534                                             callback, user_data, error);
1535     }
1536   else
1537     {
1538       g_socket_client_connect_async (client,
1539                                      connectable, cancellable,
1540                                      callback, user_data);
1541       g_object_unref (connectable);
1542     }
1543 }
1544
1545 /**
1546  * g_socket_client_connect_to_service_async:
1547  * @client: a #GSocketClient
1548  * @domain: a domain name
1549  * @service: the name of the service to connect to
1550  * @cancellable: (allow-none): a #GCancellable, or %NULL
1551  * @callback: (scope async): a #GAsyncReadyCallback
1552  * @user_data: (closure): user data for the callback
1553  *
1554  * This is the asynchronous version of
1555  * g_socket_client_connect_to_service().
1556  *
1557  * Since: 2.22
1558  */
1559 void
1560 g_socket_client_connect_to_service_async (GSocketClient       *client,
1561                                           const gchar         *domain,
1562                                           const gchar         *service,
1563                                           GCancellable        *cancellable,
1564                                           GAsyncReadyCallback  callback,
1565                                           gpointer             user_data)
1566 {
1567   GSocketConnectable *connectable;
1568
1569   connectable = g_network_service_new (service, "tcp", domain);
1570   g_socket_client_connect_async (client,
1571                                  connectable, cancellable,
1572                                  callback, user_data);
1573   g_object_unref (connectable);
1574 }
1575
1576 /**
1577  * g_socket_client_connect_to_uri_async:
1578  * @client: a #GSocketClient
1579  * @uri: a network uri
1580  * @default_port: the default port to connect to
1581  * @cancellable: (allow-none): a #GCancellable, or %NULL
1582  * @callback: (scope async): a #GAsyncReadyCallback
1583  * @user_data: (closure): user data for the callback
1584  *
1585  * This is the asynchronous version of g_socket_client_connect_to_uri().
1586  *
1587  * When the operation is finished @callback will be
1588  * called. You can then call g_socket_client_connect_to_uri_finish() to get
1589  * the result of the operation.
1590  *
1591  * Since: 2.26
1592  */
1593 void
1594 g_socket_client_connect_to_uri_async (GSocketClient        *client,
1595                                       const gchar          *uri,
1596                                       guint16               default_port,
1597                                       GCancellable         *cancellable,
1598                                       GAsyncReadyCallback   callback,
1599                                       gpointer              user_data)
1600 {
1601   GSocketConnectable *connectable;
1602   GError *error;
1603
1604   error = NULL;
1605   connectable = g_network_address_parse_uri (uri, default_port, &error);
1606   if (connectable == NULL)
1607     {
1608       g_simple_async_report_take_gerror_in_idle (G_OBJECT (client),
1609                                             callback, user_data, error);
1610     }
1611   else
1612     {
1613       g_socket_client_connect_async (client,
1614                                      connectable, cancellable,
1615                                      callback, user_data);
1616       g_object_unref (connectable);
1617     }
1618 }
1619
1620
1621 /**
1622  * g_socket_client_connect_finish:
1623  * @client: a #GSocketClient.
1624  * @result: a #GAsyncResult.
1625  * @error: a #GError location to store the error occurring, or %NULL to
1626  * ignore.
1627  *
1628  * Finishes an async connect operation. See g_socket_client_connect_async()
1629  *
1630  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1631  *
1632  * Since: 2.22
1633  */
1634 GSocketConnection *
1635 g_socket_client_connect_finish (GSocketClient  *client,
1636                                 GAsyncResult   *result,
1637                                 GError        **error)
1638 {
1639   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (result);
1640
1641   if (g_simple_async_result_propagate_error (simple, error))
1642     return NULL;
1643
1644   return g_object_ref (g_simple_async_result_get_op_res_gpointer (simple));
1645 }
1646
1647 /**
1648  * g_socket_client_connect_to_host_finish:
1649  * @client: a #GSocketClient.
1650  * @result: a #GAsyncResult.
1651  * @error: a #GError location to store the error occurring, or %NULL to
1652  * ignore.
1653  *
1654  * Finishes an async connect operation. See g_socket_client_connect_to_host_async()
1655  *
1656  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1657  *
1658  * Since: 2.22
1659  */
1660 GSocketConnection *
1661 g_socket_client_connect_to_host_finish (GSocketClient  *client,
1662                                         GAsyncResult   *result,
1663                                         GError        **error)
1664 {
1665   return g_socket_client_connect_finish (client, result, error);
1666 }
1667
1668 /**
1669  * g_socket_client_connect_to_service_finish:
1670  * @client: a #GSocketClient.
1671  * @result: a #GAsyncResult.
1672  * @error: a #GError location to store the error occurring, or %NULL to
1673  * ignore.
1674  *
1675  * Finishes an async connect operation. See g_socket_client_connect_to_service_async()
1676  *
1677  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1678  *
1679  * Since: 2.22
1680  */
1681 GSocketConnection *
1682 g_socket_client_connect_to_service_finish (GSocketClient  *client,
1683                                            GAsyncResult   *result,
1684                                            GError        **error)
1685 {
1686   return g_socket_client_connect_finish (client, result, error);
1687 }
1688
1689 /**
1690  * g_socket_client_connect_to_uri_finish:
1691  * @client: a #GSocketClient.
1692  * @result: a #GAsyncResult.
1693  * @error: a #GError location to store the error occurring, or %NULL to
1694  * ignore.
1695  *
1696  * Finishes an async connect operation. See g_socket_client_connect_to_uri_async()
1697  *
1698  * Returns: (transfer full): a #GSocketConnection on success, %NULL on error.
1699  *
1700  * Since: 2.26
1701  */
1702 GSocketConnection *
1703 g_socket_client_connect_to_uri_finish (GSocketClient  *client,
1704                                        GAsyncResult   *result,
1705                                        GError        **error)
1706 {
1707   return g_socket_client_connect_finish (client, result, error);
1708 }
1709
1710 /**
1711  * g_socket_client_add_application_proxy:
1712  * @client: a #GSocketClient
1713  * @protocol: The proxy protocol
1714  *
1715  * Enable proxy protocols to be handled by the application. When the
1716  * indicated proxy protocol is returned by the #GProxyResolver,
1717  * #GSocketClient will consider this protocol as supported but will
1718  * not try to find a #GProxy instance to handle handshaking. The
1719  * application must check for this case by calling
1720  * g_socket_connection_get_remote_address() on the returned
1721  * #GSocketConnection, and seeing if it's a #GProxyAddress of the
1722  * appropriate type, to determine whether or not it needs to handle
1723  * the proxy handshaking itself.
1724  *
1725  * This should be used for proxy protocols that are dialects of
1726  * another protocol such as HTTP proxy. It also allows cohabitation of
1727  * proxy protocols that are reused between protocols. A good example
1728  * is HTTP. It can be used to proxy HTTP, FTP and Gopher and can also
1729  * be use as generic socket proxy through the HTTP CONNECT method.
1730  *
1731  * When the proxy is detected as being an application proxy, TLS handshake
1732  * will be skipped. This is required to let the application do the proxy
1733  * specific handshake.
1734  */
1735 void
1736 g_socket_client_add_application_proxy (GSocketClient *client,
1737                                        const gchar   *protocol)
1738 {
1739   g_hash_table_insert (client->priv->app_proxies, g_strdup (protocol), NULL);
1740 }