#include "config.h"
#include "gsocketlistener.h"
+#include <gio/gioenumtypes.h>
#include <gio/gtask.h>
#include <gio/gcancellable.h>
#include <gio/gsocketaddress.h>
PROP_LISTEN_BACKLOG
};
+enum
+{
+ EVENT,
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
static GQuark source_quark = 0;
}
}
-
static void
g_socket_listener_class_init (GSocketListenerClass *klass)
{
10,
G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * GSocketListener::event:
+ * @listener: the #GSocketListener
+ * @event: the event that is occurring
+ * @socket: the #GSocket the event is occurring on
+ *
+ * Emitted when @listener's activity on @socket changes state.
+ * Note that when @listener is used to listen on both IPv4 and
+ * IPv6, a separate set of signals will be emitted for each, and
+ * the order they happen in is undefined.
+ *
+ * Since: 2.46
+ */
+ signals[EVENT] =
+ g_signal_new (I_("event"),
+ G_TYPE_FROM_CLASS (gobject_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GSocketListenerClass, event),
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 2,
+ G_TYPE_SOCKET_LISTENER_EVENT,
+ G_TYPE_SOCKET);
+
source_quark = g_quark_from_static_string ("g-socket-listener-source");
}
g_socket_set_listen_backlog (socket, listener->priv->listen_backlog);
- if (!g_socket_bind (socket, address, TRUE, error) ||
- !g_socket_listen (socket, error))
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BINDING, socket);
+
+ if (!g_socket_bind (socket, address, TRUE, error))
+ {
+ g_object_unref (socket);
+ return FALSE;
+ }
+
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket);
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENING, socket);
+
+ if (!g_socket_listen (socket, error))
{
g_object_unref (socket);
return FALSE;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENED, socket);
+
local_address = NULL;
if (effective_address)
{
{
GInetAddress *inet_address;
GSocketAddress *address;
- gboolean result;
inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV6);
address = g_inet_socket_address_new (inet_address, port);
g_socket_set_listen_backlog (socket6, listener->priv->listen_backlog);
- result = g_socket_bind (socket6, address, TRUE, error) &&
- g_socket_listen (socket6, error);
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BINDING, socket6);
+
+ if (!g_socket_bind (socket6, address, TRUE, error))
+ {
+ g_object_unref (address);
+ g_object_unref (socket6);
+ return FALSE;
+ }
g_object_unref (address);
- if (!result)
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket6);
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENING, socket6);
+
+ if (!g_socket_listen (socket6, error))
{
g_object_unref (socket6);
-
return FALSE;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENED, socket6);
+
if (source_object)
g_object_set_qdata_full (G_OBJECT (socket6), source_quark,
g_object_ref (source_object),
{
GInetAddress *inet_address;
GSocketAddress *address;
- gboolean result;
inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
address = g_inet_socket_address_new (inet_address, port);
g_socket_set_listen_backlog (socket4,
listener->priv->listen_backlog);
- result = g_socket_bind (socket4, address, TRUE, error) &&
- g_socket_listen (socket4, error);
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BINDING, socket4);
+
+ if (!g_socket_bind (socket4, address, TRUE, error))
+ {
+ g_object_unref (address);
+ g_object_unref (socket4);
+ if (socket6 != NULL)
+ g_object_unref (socket6);
+
+ return FALSE;
+ }
g_object_unref (address);
- if (!result)
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket4);
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENING, socket4);
+
+ if (!g_socket_listen (socket4, error))
{
g_object_unref (socket4);
-
if (socket6 != NULL)
g_object_unref (socket6);
return FALSE;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENED, socket4);
+
+ g_object_unref (address);
+
if (source_object)
g_object_set_qdata_full (G_OBJECT (socket4), source_quark,
g_object_ref (source_object),
inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV6);
address = g_inet_socket_address_new (inet_address, 0);
g_object_unref (inet_address);
+
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BINDING, socket6);
+
result = g_socket_bind (socket6, address, TRUE, error);
g_object_unref (address);
break;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket6);
+
g_assert (G_IS_INET_SOCKET_ADDRESS (address));
candidate_port =
g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address));
inet_address = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
address = g_inet_socket_address_new (inet_address, candidate_port);
g_object_unref (inet_address);
+
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BINDING, socket4);
+
/* a note on the 'error' clause below:
*
* if candidate_port is 0 then we report the error right away
if (result)
/* got our candidate port successfully */
- break;
-
+ {
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket4);
+ break;
+ }
else
/* we failed to bind to the specified port. try again. */
{
break;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_BOUND, socket4);
+
g_assert (G_IS_INET_SOCKET_ADDRESS (address));
candidate_port =
g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (address));
if (socket6 != NULL)
{
g_socket_set_listen_backlog (socket6, listener->priv->listen_backlog);
+
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENING, socket6);
+
if (!g_socket_listen (socket6, error))
{
g_object_unref (socket6);
return 0;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENED, socket6);
+
if (source_object)
g_object_set_qdata_full (G_OBJECT (socket6), source_quark,
g_object_ref (source_object),
if (socket4 != NULL)
{
g_socket_set_listen_backlog (socket4, listener->priv->listen_backlog);
+
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENING, socket4);
+
if (!g_socket_listen (socket4, error))
{
g_object_unref (socket4);
return 0;
}
+ g_signal_emit (listener, signals[EVENT], 0,
+ G_SOCKET_LISTENER_LISTENED, socket4);
+
if (source_object)
g_object_set_qdata_full (G_OBJECT (socket4), source_quark,
g_object_ref (source_object),