--- a/traversity/meson.build Wed Oct 05 00:53:02 2022 -0500
+++ b/traversity/meson.build Wed Oct 05 02:17:22 2022 -0500
@@ -40,10 +40,15 @@
TRAVERSITY_ALL_SOURCES = TRAVERSITY_SOURCES + TRAVERSITY_HEADERS + TRAVERSITY_BUILT_SOURCES + TRAVERSITY_BUILT_HEADERS
+ '-DTRAVERSITY_COMPILATION', + '-DTRAVERSITY_RESOURCE_PATH="/org/imfreedom/keep/traversity/traversity"', libtraversity = library('traversity',
dependencies : [GLIB, GOBJECT, TEMPLATE_GLIB],
- c_args : ['-DTRAVERSITY_COMPILATION'],
+ c_args : TRAVERSITY_CFLAGS, version : LIBTRAVERSITY_VERSION,
include_directories : [toplevel_inc, traversity_inc],
--- a/traversity/traversityupnpdiscoverer.c Wed Oct 05 00:53:02 2022 -0500
+++ b/traversity/traversityupnpdiscoverer.c Wed Oct 05 02:17:22 2022 -0500
@@ -10,31 +10,62 @@
#define TRAVERSITY_UPNP_DISCOVER_WAN_IP_SERVICE "WANIPConnection:1"
#define TRAVERSITY_UPNP_DISCOVER_WAN_PPP_SERVICE "WANPPPConnection:1"
+static GParamSpec *properties[N_PROPERTIES] = {NULL, }; struct _TraversityUpnpDiscoverer {
TraversityDiscoverer parent;
-G_DEFINE_TYPE(TraversityUpnpDiscoverer, traversity_upnp_discoverer, TRAVERSITY_TYPE_DISCOVERER)
+G_DEFINE_TYPE(TraversityUpnpDiscoverer, traversity_upnp_discoverer, + TRAVERSITY_TYPE_DISCOVERER) /******************************************************************************
*****************************************************************************/
+traversity_upnp_discoverer_set_host_address(TraversityUpnpDiscoverer *upnp, + const char *host_address) + g_free(upnp->host_address); + upnp->host_address = g_strdup(host_address); + g_object_notify_by_pspec(G_OBJECT(upnp), properties[PROP_HOST_ADDRESS]); +traversity_upnp_discoverer_set_host_port(TraversityUpnpDiscoverer *upnp, + upnp->host_port = host_port; + g_object_notify_by_pspec(G_OBJECT(upnp), properties[PROP_HOST_PORT]); traversity_upnp_build_search_request(TraversityUpnpDiscoverer *upnp,
- const gchar *service_type,
+ const char *service_type, TmplSymbol *symbol = NULL;
TmplTemplate *template = NULL;
gboolean success = FALSE;
- const gchar *path = "/org/imfreedom/keep/traversity/traversity/upnp/search-request";
+ const char *path = TRAVERSITY_RESOURCE_PATH "/upnp/search-request"; template = tmpl_template_new(NULL);
success = tmpl_template_parse_resource(template, path, NULL, error);
@@ -45,10 +76,10 @@
scope = tmpl_scope_new();
symbol = tmpl_scope_get(scope, "httpmu_host_address");
- tmpl_symbol_assign_string(symbol, TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_ADDRESS);
+ tmpl_symbol_assign_string(symbol, upnp->host_address); symbol = tmpl_scope_get(scope, "httpmu_host_port");
- tmpl_symbol_assign_string(symbol, G_STRINGIFY(TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_PORT));
+ tmpl_symbol_assign_double(symbol, upnp->host_port); symbol = tmpl_scope_get(scope, "service_type");
tmpl_symbol_assign_string(symbol, service_type);
@@ -61,12 +92,13 @@
-traversity_upnp_discoverer_udp_read(GSocket *socket, GIOCondition condition,
+traversity_upnp_discoverer_udp_read(GSocket *socket, + G_GNUC_UNUSED GIOCondition condition, TraversityUpnpDiscoverer *upnp = data;
length = g_socket_receive(upnp->socket, buffer, sizeof(buffer) - 1, NULL,
@@ -83,19 +115,23 @@
-traversity_upnp_discoverer_broadcast(TraversityUpnpDiscoverer *upnp, GTask *task) {
+traversity_upnp_discoverer_broadcast(TraversityUpnpDiscoverer *upnp,
+ const char *service = TRAVERSITY_UPNP_DISCOVER_WAN_IP_SERVICE; - body = traversity_upnp_build_search_request(upnp, TRAVERSITY_UPNP_DISCOVER_WAN_IP_SERVICE, &error);
+ body = traversity_upnp_build_search_request(upnp, service, &error); - g_message("sending body (%d)\n%s", length, body);
+ g_message("sending body (%ld)\n%s", length, body); - sent = g_socket_send_to(upnp->socket, upnp->address, body, length, NULL, &error);
+ sent = g_socket_send_to(upnp->socket, upnp->address, body, length, NULL, g_task_return_error(task, error);
@@ -115,9 +151,9 @@
*****************************************************************************/
traversity_upnp_discoverer_discover_async(TraversityDiscoverer *discoverer,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
+ GCancellable *cancellable, + GAsyncReadyCallback callback, TraversityUpnpDiscoverer *upnp = NULL;
@@ -149,16 +185,16 @@
- upnp->address = g_inet_socket_address_new_from_string(TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_ADDRESS,
- TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_PORT);
+ upnp->address = g_inet_socket_address_new_from_string(upnp->host_address, traversity_upnp_discoverer_broadcast(upnp, task);
traversity_upnp_discoverer_discover_finish(TraversityDiscoverer *discoverer,
@@ -167,6 +203,48 @@
*****************************************************************************/
+traversity_upnp_discoverer_get_property(GObject *obj, guint param_id, + GValue *value, GParamSpec *pspec) + TraversityUpnpDiscoverer *upnp = TRAVERSITY_UPNP_DISCOVERER(obj); + case PROP_HOST_ADDRESS: + g_value_set_string(value, + traversity_upnp_discoverer_get_host_address(upnp)); + traversity_upnp_discoverer_get_host_port(upnp)); + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); +traversity_upnp_discoverer_set_property(GObject *obj, guint param_id, + const GValue *value, GParamSpec *pspec) + TraversityUpnpDiscoverer *upnp = TRAVERSITY_UPNP_DISCOVERER(obj); + case PROP_HOST_ADDRESS: + traversity_upnp_discoverer_set_host_address(upnp, + g_value_get_string(value)); + traversity_upnp_discoverer_set_host_port(upnp, + g_value_get_int(value)); + G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); traversity_upnp_discoverer_dispose(GObject *obj) {
TraversityUpnpDiscoverer *discoverer = TRAVERSITY_UPNP_DISCOVERER(obj);
@@ -176,17 +254,96 @@
-traversity_upnp_discoverer_init(TraversityUpnpDiscoverer *discoverer) {
+traversity_upnp_discoverer_finalize(GObject *obj) { + TraversityUpnpDiscoverer *discoverer = TRAVERSITY_UPNP_DISCOVERER(obj); + g_clear_pointer(&discoverer->host_address, g_free); + G_OBJECT_CLASS(traversity_upnp_discoverer_parent_class)->finalize(obj); +traversity_upnp_discoverer_init(G_GNUC_UNUSED TraversityUpnpDiscoverer *discoverer) traversity_upnp_discoverer_class_init(TraversityUpnpDiscovererClass *klass) {
- GObjectClass *obj_class = G_OBJECT_CLASS(klass);
- TraversityDiscovererClass *discoverer_class = TRAVERSITY_DISCOVERER_CLASS(klass);
+ GObjectClass *obj_class = NULL; + TraversityDiscovererClass *discoverer_class = NULL; + obj_class = G_OBJECT_CLASS(klass); + obj_class->get_property = traversity_upnp_discoverer_get_property; + obj_class->set_property = traversity_upnp_discoverer_set_property; obj_class->dispose = traversity_upnp_discoverer_dispose;
+ obj_class->finalize = traversity_upnp_discoverer_finalize; + discoverer_class = TRAVERSITY_DISCOVERER_CLASS(klass); discoverer_class->discover_async = traversity_upnp_discoverer_discover_async;
discoverer_class->discover_finish = traversity_upnp_discoverer_discover_finish;
+ * TraversityUpnpDiscoverer:host-address: + * The address of the host to look for. + * This defaults to 239.255.255.250 which is the address to use per the + properties[PROP_HOST_ADDRESS] = g_param_spec_string( + "host-address", "host-address", + "The host address to use.", + TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_ADDRESS, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + * TraversityUpnpDiscoverer:host-port: + * The UDP port number to use. + * This defaults to 1900 per the specification. + properties[PROP_HOST_PORT] = g_param_spec_int( + "host-port", "host-port", + "The host port to use.", + 0, 65535, TRAVERSITY_UPNP_DISCOVERER_HTTPMU_HOST_PORT, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties(obj_class, N_PROPERTIES, properties); +/****************************************************************************** + *****************************************************************************/ +traversity_upnp_discoverer_new(void) { + return g_object_new(TRAVERSITY_TYPE_DISCOVERER, NULL); +traversity_upnp_discoverer_new_custom(const char *host_address, int host_port) { + TRAVERSITY_TYPE_DISCOVERER, + "host-address", host_address, + "host-port", host_port, +traversity_upnp_discoverer_get_host_address(TraversityUpnpDiscoverer *upnp) { + g_return_val_if_fail(TRAVERSITY_IS_UPNP_DISCOVERER(upnp), NULL); + return upnp->host_address; +traversity_upnp_discoverer_get_host_port(TraversityUpnpDiscoverer *upnp) { + g_return_val_if_fail(TRAVERSITY_IS_UPNP_DISCOVERER(upnp), 0); + return upnp->host_port;