11d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering/* 21d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * ga-service-browser.c - Source for GaServiceBrowser 342a376fd09fe2f9d73fd97c69cbc4150ea79d3bbSjoerd Simons * Copyright (C) 2006-2007 Collabora Ltd. 41d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * 51d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * This library is free software; you can redistribute it and/or 61d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * modify it under the terms of the GNU Lesser General Public 71d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * License as published by the Free Software Foundation; either 81d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * version 2.1 of the License, or (at your option) any later version. 91d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * 101d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * This library is distributed in the hope that it will be useful, 111d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * but WITHOUT ANY WARRANTY; without even the implied warranty of 121d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 131d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * Lesser General Public License for more details. 141d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * 151d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * You should have received a copy of the GNU Lesser General Public 161d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * License along with this library; if not, write to the Free Software 171d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 181d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering */ 191d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 201d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#ifdef HAVE_CONFIG_H 211d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <config.h> 221d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#endif 231d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 241d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <stdio.h> 251d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <stdlib.h> 261d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 271d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <avahi-client/client.h> 281d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <avahi-client/lookup.h> 291d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include <avahi-common/error.h> 301d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 311d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include "ga-service-browser.h" 321d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include "signals-marshal.h" 3358ee9d8c85293eefa1e901c660fb30bf2b9122c8Sjoerd Simons#include "ga-error.h" 341d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#include "ga-enums-enumtypes.h" 351d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 361d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart PoetteringG_DEFINE_TYPE(GaServiceBrowser, ga_service_browser, G_TYPE_OBJECT) 371d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 381d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering/* signal enum */ 391d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringenum { 401d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NEW, 411d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering REMOVED, 421d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering CACHE_EXHAUSTED, 431d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering ALL_FOR_NOW, 441d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering FAILURE, 451d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering LAST_SIGNAL 461d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering}; 471d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 481d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic guint signals[LAST_SIGNAL] = { 0 }; 491d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 501d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering/* properties */ 511d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringenum { 521d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering PROP_PROTOCOL = 1, 531d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering PROP_IFINDEX, 541d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering PROP_TYPE, 551d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering PROP_DOMAIN, 561d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering PROP_FLAGS 571d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering}; 581d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 591d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering/* private structure */ 601d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringtypedef struct _GaServiceBrowserPrivate GaServiceBrowserPrivate; 611d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 621d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstruct _GaServiceBrowserPrivate { 631d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaClient *client; 641d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiServiceBrowser *browser; 651d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiIfIndex interface; 661d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiProtocol protocol; 671d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering char *type; 681d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering char *domain; 691d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiLookupFlags flags; 701d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering gboolean dispose_has_run; 711d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering}; 721d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 731d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering#define GA_SERVICE_BROWSER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GA_TYPE_SERVICE_BROWSER, GaServiceBrowserPrivate)) 741d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 751d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_init(GaServiceBrowser * obj) { 761d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(obj); 771d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 781d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering /* allocate any data required by the object here */ 791d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->client = NULL; 801d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->browser = NULL; 811d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->type = NULL; 821d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->domain = NULL; 831d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 841d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 851d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 861d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_dispose(GObject * object); 871d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_finalize(GObject * object); 881d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 891d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_set_property(GObject * object, 901d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering guint property_id, 911d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering const GValue * value, GParamSpec * pspec) { 921d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowser *browser = GA_SERVICE_BROWSER(object); 931d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(browser); 941d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 951d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_assert(priv->browser == NULL); 961d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering switch (property_id) { 971d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_PROTOCOL: 981d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->protocol = g_value_get_enum(value); 991d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1001d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_IFINDEX: 1011d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->interface = g_value_get_int(value); 1021d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1031d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_TYPE: 1041d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->type = g_strdup(g_value_get_string(value)); 1051d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1061d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_DOMAIN: 1071d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->domain = g_strdup(g_value_get_string(value)); 1081d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1091d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_FLAGS: 1101d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->flags = g_value_get_enum(value); 1111d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1121d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering default: 1131d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); 1141d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1151d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 1161d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 1171d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1181d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_get_property(GObject * object, 1191d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering guint property_id, 1201d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GValue * value, GParamSpec * pspec) { 1211d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowser *browser = GA_SERVICE_BROWSER(object); 1221d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(browser); 1231d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1241d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering switch (property_id) { 1251d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_PROTOCOL: 1261d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_value_set_int(value, priv->protocol); 1271d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1281d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_IFINDEX: 1291d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_value_set_int(value, priv->interface); 1301d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1311d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_TYPE: 1321d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_value_set_string(value, priv->type); 1331d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1341d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_DOMAIN: 1351d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_value_set_string(value, priv->domain); 1361d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1371d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case PROP_FLAGS: 1381d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_value_set_enum(value, priv->flags); 1391d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1401d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering default: 1411d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); 1421d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 1431d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 1441d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 1451d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1461d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1471d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void ga_service_browser_class_init(GaServiceBrowserClass * 1481d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering ga_service_browser_class) { 1491d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GObjectClass *object_class = G_OBJECT_CLASS(ga_service_browser_class); 1501d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GParamSpec *param_spec; 1511d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1521d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_type_class_add_private(ga_service_browser_class, 1531d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering sizeof (GaServiceBrowserPrivate)); 1541d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1551d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering object_class->dispose = ga_service_browser_dispose; 1561d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering object_class->finalize = ga_service_browser_finalize; 1571d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1581d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering object_class->set_property = ga_service_browser_set_property; 1591d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering object_class->get_property = ga_service_browser_get_property; 1601d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1611d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signals[NEW] = 1621d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_new("new-service", 1631d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS_TYPE(ga_service_browser_class), 1641d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_SIGNAL_RUN_LAST, 1651d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 0, 1661d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, NULL, 167c7f3feb3e6173a58bd7426382e4bd4fc13f05911Sjoerd Simons _ga_signals_marshal_VOID__INT_ENUM_STRING_STRING_STRING_UINT, 1681d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_NONE, 6, 1691d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_INT, 1701d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GA_TYPE_PROTOCOL, 1711d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, 1721d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, 1731d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, GA_TYPE_LOOKUP_RESULT_FLAGS); 1741d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1751d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signals[REMOVED] = 1761d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_new("removed-service", 1771d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS_TYPE(ga_service_browser_class), 1781d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_SIGNAL_RUN_LAST, 1791d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 0, 1801d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, NULL, 181c7f3feb3e6173a58bd7426382e4bd4fc13f05911Sjoerd Simons _ga_signals_marshal_VOID__INT_ENUM_STRING_STRING_STRING_UINT, 1821d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_NONE, 6, 1831d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_INT, 1841d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GA_TYPE_PROTOCOL, 1851d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, 1861d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, 1871d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_STRING, GA_TYPE_LOOKUP_RESULT_FLAGS); 1881d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1891d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signals[ALL_FOR_NOW] = 1901d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_new("all-for-now", 1911d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS_TYPE(ga_service_browser_class), 1921d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_SIGNAL_RUN_LAST, 1931d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 0, 1941d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, NULL, 1951d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); 1961d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 1971d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signals[CACHE_EXHAUSTED] = 1981d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_new("cache-exhausted", 1991d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS_TYPE(ga_service_browser_class), 2001d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_SIGNAL_RUN_LAST, 2011d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 0, 2021d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, NULL, 2031d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); 2041d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2051d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signals[FAILURE] = 2061d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_new("failure", 2071d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS_TYPE(ga_service_browser_class), 2081d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_SIGNAL_RUN_LAST, 2091d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 0, 2101d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, NULL, 2111d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_cclosure_marshal_VOID__POINTER, 2121d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_TYPE_NONE, 1, G_TYPE_POINTER); 2131d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2141d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering param_spec = g_param_spec_enum("protocol", "Avahi protocol to browse", 2151d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Avahi protocol to browse", 2161d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GA_TYPE_PROTOCOL, 2171d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GA_PROTOCOL_UNSPEC, 2181d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_READWRITE | 2191d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_NAME | 2201d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_BLURB); 2211d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_class_install_property(object_class, PROP_PROTOCOL, param_spec); 2221d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2231d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering param_spec = g_param_spec_int("interface", "interface index", 2241d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Interface use for browser", 2251d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AVAHI_IF_UNSPEC, 2261d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_MAXINT, 2271d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AVAHI_IF_UNSPEC, 2281d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_READWRITE | 2291d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB); 2301d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_class_install_property(object_class, PROP_IFINDEX, param_spec); 2311d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2321d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering param_spec = g_param_spec_string("type", "service type", 2331d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Service type to browse for", 2341d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, 2351d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_READWRITE | 2361d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_NAME | 2371d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_BLURB); 2381d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_class_install_property(object_class, PROP_TYPE, param_spec); 2391d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2401d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering param_spec = g_param_spec_string("domain", "service domain", 2411d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Domain to browse in", 2421d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering NULL, 2431d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_READWRITE | 2441d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_NAME | 2451d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_BLURB); 2461d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_class_install_property(object_class, PROP_DOMAIN, param_spec); 2471d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2481d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering param_spec = g_param_spec_enum("flags", "Lookup flags for the browser", 2491d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Browser lookup flags", 250b58b25b6a55e547ebcf75115415753ed67fe1038Sjoerd Simons GA_TYPE_LOOKUP_FLAGS, 2511d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GA_LOOKUP_NO_FLAGS, 2521d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_READWRITE | 2531d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_NAME | 2541d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_PARAM_STATIC_BLURB); 2551d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_class_install_property(object_class, PROP_FLAGS, param_spec); 2561d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 2571d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2581d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringvoid ga_service_browser_dispose(GObject * object) { 2591d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowser *self = GA_SERVICE_BROWSER(object); 2601d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(self); 2611d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2621d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (priv->dispose_has_run) 2631d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering return; 2641d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2651d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->dispose_has_run = TRUE; 2661d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2671d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (priv->browser) 2681d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering avahi_service_browser_free(priv->browser); 2691d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->browser = NULL; 2701d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (priv->client) 2711d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_unref(priv->client); 2721d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->client = NULL; 2731d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2741d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering /* release any references held by the object here */ 2751d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2761d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (G_OBJECT_CLASS(ga_service_browser_parent_class)->dispose) 2771d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS(ga_service_browser_parent_class)->dispose(object); 2781d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 2791d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2801d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringvoid ga_service_browser_finalize(GObject * object) { 2811d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowser *self = GA_SERVICE_BROWSER(object); 2821d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(self); 2831d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2841d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering /* free any data held directly by the object here */ 2851d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_free(priv->type); 2861d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->type = NULL; 2871d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_free(priv->domain); 2881d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->domain = NULL; 2891d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2901d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering G_OBJECT_CLASS(ga_service_browser_parent_class)->finalize(object); 2911d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 2921d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 2931d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringstatic void _avahi_service_browser_cb(AvahiServiceBrowser * b, AvahiIfIndex interface, 2941d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiProtocol protocol, AvahiBrowserEvent event, 2951d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering const char *name, const char *type, 2961d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering const char *domain, AvahiLookupResultFlags flags, 2971d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering void *userdata) { 2981d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowser *self = GA_SERVICE_BROWSER(userdata); 2991d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(self); 3001d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (priv->browser == NULL) { 3011d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->browser = b; 3021d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3031d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_assert(priv->browser == b); 3041d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 3051d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering switch (event) { 3061d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case AVAHI_BROWSER_NEW: 3071d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case AVAHI_BROWSER_REMOVE:{ 3081d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering guint signalid; 3091d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering signalid = (event == AVAHI_BROWSER_NEW ? NEW : REMOVED); 3101d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_emit(self, signals[signalid], 0, 3111d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering interface, protocol, name, type, domain, flags); 3121d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 3131d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3141d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case AVAHI_BROWSER_CACHE_EXHAUSTED: 3151d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_emit(self, signals[CACHE_EXHAUSTED], 0); 3161d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 3171d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case AVAHI_BROWSER_ALL_FOR_NOW: 3181d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_emit(self, signals[ALL_FOR_NOW], 0); 3191d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 3201d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering case AVAHI_BROWSER_FAILURE:{ 3211d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GError *error; 3221d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering int aerrno = avahi_client_errno(priv->client->avahi_client); 32358ee9d8c85293eefa1e901c660fb30bf2b9122c8Sjoerd Simons error = g_error_new(GA_ERROR, aerrno, 3241d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Browsing failed: %s", 3251d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering avahi_strerror(aerrno)); 3261d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_signal_emit(self, signals[FAILURE], 0, error); 3271d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_error_free(error); 3281d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering break; 3291d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3301d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3311d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 3321d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 333866c918072dcfd9f9f44ef075833fc56e0f35337Stef WalterGaServiceBrowser *ga_service_browser_new(const gchar * type) { 3341d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering return ga_service_browser_new_full(AVAHI_IF_UNSPEC, 3351d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AVAHI_PROTO_UNSPEC, type, NULL, 0); 3361d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 3371d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 3381d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart PoetteringGaServiceBrowser *ga_service_browser_new_full(AvahiIfIndex interface, 3391d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering AvahiProtocol protocol, 340866c918072dcfd9f9f44ef075833fc56e0f35337Stef Walter const gchar * type, gchar * domain, 3411d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaLookupFlags flags) { 3421d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering return g_object_new(GA_TYPE_SERVICE_BROWSER, 3431d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "interface", interface, 3441d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "protocol", protocol, 3451d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "type", type, "domain", domain, "flags", flags, NULL); 3461d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 3471d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 3481d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poetteringgboolean ga_service_browser_attach(GaServiceBrowser * browser, 3491d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaClient * client, GError ** error) { 3501d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering GaServiceBrowserPrivate *priv = GA_SERVICE_BROWSER_GET_PRIVATE(browser); 3511d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 3521d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering g_object_ref(client); 3531d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->client = client; 3541d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering 3551d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->browser = avahi_service_browser_new(client->avahi_client, 3561d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->interface, 3571d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->protocol, 3581d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->type, priv->domain, 3591d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering priv->flags, 3601d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering _avahi_service_browser_cb, 3611d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering browser); 3621d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (priv->browser == NULL) { 3631d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering if (error != NULL) { 3641d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering int aerrno = avahi_client_errno(client->avahi_client); 36558ee9d8c85293eefa1e901c660fb30bf2b9122c8Sjoerd Simons *error = g_error_new(GA_ERROR, aerrno, 3661d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering "Attaching group failed: %s", 3671d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering avahi_strerror(aerrno)); 3681d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3691d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering return FALSE; 3701d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering } 3711d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering return TRUE; 3721d987ef7422a107305d21f8b0c4903e7b7b6d93fLennart Poettering} 373