2
* @file avahi_browser.c cache synchronization using AVAHI
4
* Copyright (C) 2007 Lars Lindner <lars.lindner@gmail.com>
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21
#include "sync/avahi_browser.h"
25
#include <glib/gi18n.h>
26
#include <glib-object.h>
28
#include <avahi-client/lookup.h>
29
#include <avahi-client/publish.h>
30
#include <avahi-client/client.h>
31
#include <avahi-common/error.h>
32
#include <avahi-glib/glib-malloc.h>
33
#include <avahi-glib/glib-watch.h>
35
static void liferea_avahi_browser_class_init (LifereaAvahiBrowserClass *klass);
36
static void liferea_avahi_browser_init (LifereaAvahiBrowser *browser);
37
static void liferea_avahi_browser_finalize (GObject *object);
39
#define LIFEREA_AVAHI_BROWSER_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), LIFEREA_AVAHI_BROWSER_TYPE, LifereaAvahiBrowserPrivate))
41
struct LifereaAvahiBrowserPrivate {
44
AvahiServiceBrowser *serviceBrowser;
59
//static guint signals [LAST_SIGNAL] = { 0, };
60
static GObjectClass *parent_class = NULL;
62
static gpointer liferea_avahi_browser = NULL;
65
liferea_avahi_browser_error_quark (void)
67
static GQuark quark = 0;
69
quark = g_quark_from_static_string ("liferea_avahi_browser_error");
75
client_cb (AvahiClient *client,
76
AvahiClientState state,
77
LifereaAvahiBrowser *browser)
79
/* Called whenever the client or server state changes */
82
case AVAHI_CLIENT_FAILURE:
83
g_warning ("Client failure: %s\n", avahi_strerror (avahi_client_errno (client)));
91
avahi_client_init (LifereaAvahiBrowser *browser)
95
avahi_set_allocator (avahi_glib_allocator ());
97
browser->priv->poll = avahi_glib_poll_new (NULL, G_PRIORITY_DEFAULT);
99
if (!browser->priv->poll)
100
g_warning ("Unable to create AvahiGlibPoll object for mDNS");
102
AvahiClientFlags flags;
105
browser->priv->client = avahi_client_new (avahi_glib_poll_get (browser->priv->poll),
107
(AvahiClientCallback)client_cb,
113
resolve_cb (AvahiServiceResolver *service_resolver,
114
AvahiIfIndex interface,
115
AvahiProtocol protocol,
116
AvahiResolverEvent event,
117
const char *service_name,
120
const char *host_name,
121
const AvahiAddress *address,
123
AvahiStringList *text,
124
AvahiLookupResultFlags flags,
125
LifereaAvahiBrowser *browser)
127
if (event == AVAHI_RESOLVER_FOUND) {
129
char host [AVAHI_ADDRESS_STR_MAX];
135
for (l = text; l != NULL; l = l->next) {
141
ret = avahi_string_list_get_pair (l, &key, &value, &size);
142
if (ret != 0 || key == NULL) {
146
if (strcmp (key, "Password") == 0) {
147
if (size >= 4 && strncmp (value, "true", 4) == 0) {
150
} else if (strcmp (key, "Machine Name") == 0) {
151
name = g_strdup (value);
160
name = g_strdup (service_name);
163
avahi_address_snprint (host, AVAHI_ADDRESS_STR_MAX, address);
165
g_signal_emit (browser,
166
signals [SERVICE_ADDED],
177
browser->priv->resolvers = g_slist_remove (browser->priv->resolvers, service_resolver);
178
avahi_service_resolver_free (service_resolver);
182
liferea_avahi_browser_resolve (LifereaAvahiBrowser *browser,
185
AvahiServiceResolver *service_resolver;
187
service_resolver = avahi_service_resolver_new (browser->priv->client,
195
(AvahiServiceResolverCallback)resolve_cb,
197
if (service_resolver == NULL) {
198
rb_debug ("Error starting mDNS resolving using AvahiServiceResolver");
202
browser->priv->resolvers = g_slist_prepend (browser->priv->resolvers, service_resolver);
208
liferea_avahi_browser_start (LifereaAvahiBrowser *browser)
213
liferea_avahi_browser_stop (LifereaAvahiBrowser *browser)
218
liferea_avahi_browser_get_type (void)
220
static GType type = 0;
222
if (G_UNLIKELY (type == 0))
224
static const GTypeInfo our_info =
226
sizeof (LifereaAvahiBrowserClass),
227
NULL, /* base_init */
228
NULL, /* base_finalize */
229
(GClassInitFunc) liferea_avahi_browser_class_init,
231
NULL, /* class_data */
232
sizeof (LifereaAvahiBrowser),
234
(GInstanceInitFunc) liferea_avahi_browser_init
237
type = g_type_register_static (G_TYPE_OBJECT,
238
"LifereaAvahiBrowser",
246
liferea_avahi_browser_class_init (LifereaAvahiBrowserClass *klass)
248
GObjectClass *object_class = G_OBJECT_CLASS (klass);
250
parent_class = g_type_class_peek_parent (klass);
252
object_class->finalize = liferea_avahi_browser_finalize;
254
g_type_class_add_private (object_class, sizeof(LifereaAvahiBrowserPrivate));
258
liferea_avahi_browser_init (LifereaAvahiBrowser *browser)
260
browser->priv = LIFEREA_AVAHI_BROWSER_GET_PRIVATE (browser);
262
avahi_client_init (browser);
266
liferea_avahi_browser_finalize (GObject *object)
268
LifereaAvahiBrowser *browser;
270
browser = LIFEREA_AVAHI_BROWSER (object);
272
g_return_if_fail (browser->priv != NULL);
274
/* if (browser->priv->entry_group)
275
avahi_entry_group_free (browser->priv->entry_group);
277
if (browser->priv->client)
278
avahi_client_free (browser->priv->client);
280
if (browser->priv->poll)
281
avahi_glib_poll_free (browser->priv->poll);
283
// g_free (browser->priv->name);
285
G_OBJECT_CLASS (parent_class)->finalize (object);
288
LifereaAvahiBrowser *
289
liferea_avahi_browser_new (void)
293
/* check service name preference and set default if necessary */
294
serviceName = conf_get_str_value (SYNC_AVAHI_SERVICE_NAME);
295
if (g_str_equal (serviceName, "")) {
296
g_free (serviceName);
297
serviceName = g_strdup_printf (_("Liferea Sync %s@%s"), g_get_user_name(), g_get_host_name ());
298
conf_set_str_value (SYNC_AVAHI_SERVICE_NAME, serviceName);
300
g_free (serviceName);
302
if (liferea_avahi_browser) {
303
g_object_ref (liferea_avahi_browser);
305
liferea_avahi_browser = g_object_new (LIFEREA_AVAHI_BROWSER_TYPE, NULL);
306
g_object_add_weak_pointer (liferea_avahi_browser, (gpointer *) &liferea_avahi_browser);
309
return liferea_avahi_browser;