struct _GSSDPClientPrivate {
char *server_id;
+ guint socket_ttl;
GSSDPNetworkDevice device;
GSSDPSocketSource *request_socket;
PROP_IFACE,
PROP_NETWORK,
PROP_HOST_IP,
- PROP_ACTIVE
+ PROP_ACTIVE,
+ PROP_SOCKET_TTL,
};
enum {
client->priv->request_socket =
gssdp_socket_source_new (GSSDP_SOCKET_SOURCE_TYPE_REQUEST,
gssdp_client_get_host_ip (client),
+ client->priv->socket_ttl,
&internal_error);
if (client->priv->request_socket != NULL) {
gssdp_socket_source_set_callback
client->priv->multicast_socket =
gssdp_socket_source_new (GSSDP_SOCKET_SOURCE_TYPE_MULTICAST,
gssdp_client_get_host_ip (client),
+ client->priv->socket_ttl,
&internal_error);
if (client->priv->multicast_socket != NULL) {
gssdp_socket_source_set_callback
client->priv->search_socket = gssdp_socket_source_new
(GSSDP_SOCKET_SOURCE_TYPE_SEARCH,
gssdp_client_get_host_ip (client),
+ client->priv->socket_ttl,
&internal_error);
if (client->priv->search_socket != NULL) {
gssdp_socket_source_set_callback
case PROP_ACTIVE:
g_value_set_boolean (value, client->priv->active);
break;
+ case PROP_SOCKET_TTL:
+ g_value_set_uint (value, client->priv->socket_ttl);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
case PROP_ACTIVE:
client->priv->active = g_value_get_boolean (value);
break;
+ case PROP_SOCKET_TTL:
+ client->priv->socket_ttl = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
G_PARAM_STATIC_BLURB));
/**
+ * GSSDPClient:socket-ttl:
+ *
+ * Time-to-live value to use for all sockets created by this client.
+ * If not set (or set to 0) the value recommended by UPnP will be used.
+ * This property can only be set during object construction.
+ */
+ g_object_class_install_property
+ (object_class,
+ PROP_SOCKET_TTL,
+ g_param_spec_uint
+ ("socket-ttl",
+ "Socket TTL",
+ "Time To Live for client's sockets",
+ 0, 255,
+ 0,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+
+ /**
* GSSDPClient::message-received: (skip)
*
* Internal signal.
GSource *source;
GSocket *socket;
GSSDPSocketSourceType type;
+
char *host_ip;
+ guint ttl;
};
enum {
PROP_0,
PROP_TYPE,
- PROP_HOST_IP
+ PROP_HOST_IP,
+ PROP_TTL,
};
static void
case PROP_HOST_IP:
self->priv->host_ip = g_value_dup_string (value);
break;
+ case PROP_TTL:
+ self->priv->ttl = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
GSSDPSocketSource *
gssdp_socket_source_new (GSSDPSocketSourceType type,
const char *host_ip,
+ guint ttl,
GError **error)
{
return g_initable_new (GSSDP_TYPE_SOCKET_SOURCE,
type,
"host-ip",
host_ip,
+ "ttl",
+ ttl,
NULL);
}
}
/* TTL */
+ if (!self->priv->ttl)
+ /* UDA/1.0 says 4, UDA/1.1 says 2 */
+ self->priv->ttl = 4;
+
if (!gssdp_socket_set_ttl (self->priv->socket,
- 4,
+ self->priv->ttl,
&inner_error)) {
g_propagate_prefixed_error (error,
inner_error,
- "Failed to set TTL");
+ "Failed to set TTL to %u", self->priv->ttl);
goto error;
}
+
/* Set up additional things according to the type of socket desired */
if (self->priv->type == GSSDP_SOCKET_SOURCE_TYPE_MULTICAST) {
/* Enable multicast loopback */
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_TTL,
+ g_param_spec_uint
+ ("ttl",
+ "TTL",
+ "Time To Live for the socket",
+ 0, 255,
+ 0,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
}