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