#include <config.h>
#include <glib.h>
#include <gio/gio.h>
+#include <gnio/gnio.h>
#include <string.h>
#include <errno.h>
-#include "gtcpclient.h"
-#include "gasynchelper.h"
-
G_DEFINE_TYPE (GTcpClient, g_tcp_client, G_TYPE_OBJECT);
enum
GInetSocketAddress *address;
gchar *hostname;
gushort port;
+ GSocket *socket;
};
static void
{
case PROP_ADDRESS:
// sink the address' floating reference
- client->priv->address = G_INET_SOCKET_ADDRESS (g_object_ref_sink (g_value_get_object (value)));
+ client->priv->address = G_INET_SOCKET_ADDRESS (g_value_get_object (value));
+ if (client->priv->address)
+ g_object_ref_sink (client->priv->address);
break;
case PROP_HOSTNAME:
"hostname",
"the hostname of the remote address the socket will connect to",
NULL,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
g_object_class_install_property (gobject_class, PROP_PORT,
g_param_spec_uint ("port",
0,
G_MAXUSHORT,
0,
- G_PARAM_CONSTRUCT_ONLY | G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK));
}
static void
client->priv->address = NULL;
client->priv->hostname = NULL;
client->priv->port = 0;
+ client->priv->socket = NULL;
}
GTcpClient *
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);
+ else if (G_IS_INET6_ADDRESS (address))
+ client->priv->socket = g_socket_new (G_SOCKET_DOMAIN_INET6, G_SOCKET_TYPE_STREAM, NULL, error);
+ else
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "unsupported address domain");
+ return FALSE;
+ }
+
+ if (!client->priv->socket)
+ 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 {
GTcpClient * g_tcp_client_new_from_address (GInetSocketAddress *address);
-gboolean g_tcp_client_connect (GTcpClient *client,
- GCancellable *cancellable,
- GError **error);
+gboolean g_tcp_client_connect (GTcpClient *client,
+ GCancellable *cancellable,
+ GError **error);
void g_tcp_client_connect_async (GTcpClient *client,
GCancellable *cancellable,
--- /dev/null
+#include <gio/gio.h>
+#include <gnio/gnio.h>
+
+GMainLoop *loop;
+
+/*
+void
+accept_callback (GSocket *socket, GAsyncResult *result, gpointer data)
+{
+ GError *error = NULL;
+
+ if (!g_socket_connect_finish (socket, result, &error)) {
+ g_warning (error->message);
+ return;
+ }
+
+ g_print ("successfully connected\n");
+}
+*/
+
+int main (int argc, char *argv[])
+{
+ GTcpClient *client;
+ GError *error = NULL;
+
+ g_thread_init (NULL);
+
+ g_type_init ();
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ client = g_tcp_client_new ("localhost", 90);
+
+ g_print ("connecting to www.google.com:80\n");
+
+ if (!g_tcp_client_connect (client, NULL, &error)) {
+ g_warning (error->message);
+ return;
+ }
+
+ g_print ("connected!\n");
+
+ g_object_unref (G_OBJECT (client));
+
+// g_main_loop_run (loop);
+
+ return 0;
+}