#include <gnio/ginetaddress.h>
#include <gnio/ginet4address.h>
#include <gnio/ginet6address.h>
-#include <gnio/ginetsocketaddress.h>
#include <gnio/gsocketaddress.h>
+#include <gnio/ginetsocketaddress.h>
#include <gnio/gresolver.h>
#include <gnio/gsocket.h>
+ #include <gnio/gnioerror.h>
#include <gnio/gtcpclient.h>
#include <gnio/gtcpserver.h>
+#include <gnio/gnioenumtypes.h>
#undef __GNIO_GNIO_H_INSIDE__
}
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 {