/* #included into both socket-client.c and socket-server.c */

#ifdef G_OS_UNIX
static const char *unix_socket_address_types[] = {
  "invalid",
  "anonymous",
  "path",
  "abstract",
  "padded"
};
#endif

static char *
socket_address_to_string (GSocketAddress *address)
{
  char *res = NULL;

  if (G_IS_INET_SOCKET_ADDRESS (address))
    {
      GInetAddress *inet_address;
      char *str;
      int port;

      inet_address = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (address));
      str = g_inet_address_to_string (inet_address);
      port = g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address));
      res = g_strdup_printf ("%s:%d", str, port);
      g_free (str);
    }
#ifdef G_OS_UNIX
  else if (G_IS_UNIX_SOCKET_ADDRESS (address))
    {
      GUnixSocketAddress *uaddr = G_UNIX_SOCKET_ADDRESS (address);

      res = g_strdup_printf ("%s:%s",
			     unix_socket_address_types[g_unix_socket_address_get_address_type (uaddr)],
			     g_unix_socket_address_get_path (uaddr));
    }
#endif

  return res;
}

static GSocketAddress *
socket_address_from_string (const char *name)
{
#ifdef G_OS_UNIX
  gsize i, len;

  for (i = 0; i < G_N_ELEMENTS (unix_socket_address_types); i++)
    {
      len = strlen (unix_socket_address_types[i]);
      if (!strncmp (name, unix_socket_address_types[i], len) &&
	  name[len] == ':')
	{
	  return g_unix_socket_address_new_with_type (name + len + 1, -1,
						      (GUnixSocketAddressType)i);
	}
    }
#endif
  return NULL;
}

static gboolean
source_ready (GPollableInputStream *stream,
	      gpointer              data)
{
  g_main_loop_quit (loop);
  return FALSE;
}

static void
ensure_socket_condition (GSocket      *socket,
			 GIOCondition  condition,
			 GCancellable *cancellable)
{
  GSource *source;

  if (!non_blocking)
    return;

  source = g_socket_create_source (socket, condition, cancellable);
  g_source_set_callback (source,
			 (GSourceFunc) source_ready,
			 NULL, NULL);
  g_source_attach (source, NULL);
  g_source_unref (source);
  g_main_loop_run (loop);
}

static void
ensure_connection_condition (GIOStream    *stream,
			     GIOCondition  condition,
			     GCancellable *cancellable)
{
  GSource *source;

  if (!non_blocking)
    return;

  if (condition & G_IO_IN)
    source = g_pollable_input_stream_create_source (G_POLLABLE_INPUT_STREAM (g_io_stream_get_input_stream (stream)), cancellable);
  else
    source = g_pollable_output_stream_create_source (G_POLLABLE_OUTPUT_STREAM (g_io_stream_get_output_stream (stream)), cancellable);

  g_source_set_callback (source,
			 (GSourceFunc) source_ready,
			 NULL, NULL);
  g_source_attach (source, NULL);
  g_source_unref (source);
  g_main_loop_run (loop);
}

static gpointer
cancel_thread (gpointer data)
{
  GCancellable *cancellable = data;

  g_usleep (1000*1000*cancel_timeout);
  g_print ("Cancelling\n");
  g_cancellable_cancel (cancellable);
  return NULL;
}
