From: Samuel Cormier-Iijima Date: Sun, 2 Mar 2008 01:21:49 +0000 (-0500) Subject: Merge branch 'master' into errorstate X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fgnio.git;a=commitdiff_plain;h=5183a9b80c8a22531948af76f4433f0a1a510cbc Merge branch 'master' into errorstate Conflicts: gnio/gnio.h --- 5183a9b80c8a22531948af76f4433f0a1a510cbc diff --cc gnio/gnio.h index f1d0e93,816459c..6eb16a6 --- a/gnio/gnio.h +++ b/gnio/gnio.h @@@ -29,13 -29,13 +29,14 @@@ #include #include #include -#include #include +#include #include #include + #include #include #include +#include #undef __GNIO_GNIO_H_INSIDE__ diff --cc gnio/gtcpclient.c index ae8de6d,1bb056f..60822a3 --- a/gnio/gtcpclient.c +++ b/gnio/gtcpclient.c @@@ -130,10 -202,55 +202,55 @@@ g_tcp_client_new_from_address (GInetSoc } gboolean - g_tcp_client_connect (GTcpClient *client, - GError **error) + g_tcp_client_connect (GTcpClient *client, + GCancellable *cancellable, + GError **error) { - return FALSE; + GInetAddress *address; + + g_return_val_if_fail (G_IS_TCP_CLIENT (client), FALSE); + + if (!client->priv->address) + { + // we've been constructed with just hostname+port, resolve + GResolver *resolver = g_resolver_new (); + + address = g_resolver_resolve (resolver, client->priv->hostname, cancellable, error); + + if (!address) + return FALSE; + + client->priv->address = g_inet_socket_address_new (address, client->priv->port); + + g_object_unref (resolver); + + g_object_ref_sink (client->priv->address); + } + else + { + address = g_inet_socket_address_get_address (client->priv->address); + } + + if (G_IS_INET4_ADDRESS (address)) - client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET, G_SOCKET_TYPE_STREAM, NULL, error); ++ client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET, G_SOCKET_TYPE_STREAM, NULL); + else if (G_IS_INET6_ADDRESS (address)) - client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET6, G_SOCKET_TYPE_STREAM, NULL, error); ++ client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET6, G_SOCKET_TYPE_STREAM, NULL); + else + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "unsupported address domain"); + return FALSE; + } + - if (!client->priv->socket) ++ if (g_socket_has_error (client->priv->socket, error)) + return FALSE; + + if (g_cancellable_set_error_if_cancelled (cancellable, error)) + return FALSE; + + if (!g_socket_connect (client->priv->socket, G_SOCKET_ADDRESS (client->priv->address), error)) + return FALSE; + + return TRUE; } typedef struct {