42 #ifdef HAVE_LIBAVAHI_CLIENT 44 #include <avahi-client/client.h> 45 #include <avahi-client/lookup.h> 46 #include <avahi-common/simple-watch.h> 47 #include <avahi-common/malloc.h> 48 #include <avahi-common/error.h> 53 AvahiServiceBrowser*
sb;
60 AvahiServiceResolver* r,
61 AVAHI_GCC_UNUSED AvahiIfIndex interface,
62 AVAHI_GCC_UNUSED AvahiProtocol protocol,
63 AvahiResolverEvent event,
67 const char* host_name,
68 const AvahiAddress* address,
71 AvahiLookupResultFlags flags,
72 AVAHI_GCC_UNUSED
void* userdata)
81 ga->
priv->has_event = TRUE;
84 case AVAHI_RESOLVER_FAILURE:
85 g_print(
"(remmina-applet avahi-resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s\n",
86 name, type, domain, avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(r))));
89 case AVAHI_RESOLVER_FOUND:
90 key = g_strdup_printf(
"%s,%s,%s", name, type, domain);
95 value = g_strdup_printf(
"[%s]:%i", host_name, port);
99 g_print(
"(remmina-applet avahi-resolver) Added service '%s'\n", value);
104 avahi_service_resolver_free(r);
109 AvahiServiceBrowser* b,
110 AvahiIfIndex interface,
111 AvahiProtocol protocol,
112 AvahiBrowserEvent event,
116 AVAHI_GCC_UNUSED AvahiLookupResultFlags flags,
119 TRACE_CALL(__func__);
125 ga->
priv->has_event = TRUE;
128 case AVAHI_BROWSER_FAILURE:
129 g_print(
"(remmina-applet avahi-browser) %s\n",
130 avahi_strerror(avahi_client_errno(avahi_service_browser_get_client(b))));
133 case AVAHI_BROWSER_NEW:
134 key = g_strdup_printf(
"%s,%s,%s", name, type, domain);
141 g_print(
"(remmina-applet avahi-browser) Found service '%s' of type '%s' in domain '%s'\n", name, type, domain);
143 if (!(avahi_service_resolver_new(ga->
priv->client, interface, protocol, name, type, domain,
145 g_print(
"(remmina-applet avahi-browser) Failed to resolve service '%s': %s\n",
146 name, avahi_strerror(avahi_client_errno(ga->
priv->client)));
150 case AVAHI_BROWSER_REMOVE:
151 g_print(
"(remmina-applet avahi-browser) Removed service '%s' of type '%s' in domain '%s'\n", name, type, domain);
152 key = g_strdup_printf(
"%s,%s,%s", name, type, domain);
157 case AVAHI_BROWSER_ALL_FOR_NOW:
158 case AVAHI_BROWSER_CACHE_EXHAUSTED:
165 TRACE_CALL(__func__);
168 ga->
priv->has_event = TRUE;
170 if (state == AVAHI_CLIENT_FAILURE) {
171 g_print(
"(remmina-applet avahi) Server connection failure: %s\n", avahi_strerror(avahi_client_errno(c)));
177 TRACE_CALL(__func__);
180 ga->
priv->has_event = FALSE;
181 avahi_simple_poll_iterate(ga->
priv->simple_poll, 0);
182 if (!ga->
priv->has_event)
191 TRACE_CALL(__func__);
198 ga->
priv->simple_poll = NULL;
199 ga->
priv->client = NULL;
201 ga->
priv->iterate_handler = 0;
202 ga->
priv->has_event = FALSE;
209 TRACE_CALL(__func__);
217 ga->
priv->simple_poll = avahi_simple_poll_new();
218 if (!ga->
priv->simple_poll) {
219 g_print(
"Failed to create simple poll object.\n");
225 if (!ga->
priv->client) {
226 g_print(
"Failed to create client: %s\n", avahi_strerror(error));
231 ga->
priv->sb = avahi_service_browser_new(ga->
priv->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
"_rfb._tcp", NULL, 0,
234 g_print(
"Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(ga->
priv->client)));
243 TRACE_CALL(__func__);
245 if (ga->
priv->iterate_handler) {
246 g_source_remove(ga->
priv->iterate_handler);
247 ga->
priv->iterate_handler = 0;
250 avahi_service_browser_free(ga->
priv->sb);
253 if (ga->
priv->client) {
254 avahi_client_free(ga->
priv->client);
255 ga->
priv->client = NULL;
257 if (ga->
priv->simple_poll) {
258 avahi_simple_poll_free(ga->
priv->simple_poll);
259 ga->
priv->simple_poll = NULL;
266 TRACE_CALL(__func__);
281 TRACE_CALL(__func__);
287 TRACE_CALL(__func__);
292 TRACE_CALL(__func__);
297 TRACE_CALL(__func__);
static void remmina_avahi_client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void *userdata)
RemminaAvahi * remmina_avahi_new(void)
typedefG_BEGIN_DECLS struct _RemminaAvahiPriv RemminaAvahiPriv
static void remmina_avahi_resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIndex interface, AVAHI_GCC_UNUSED AvahiProtocol protocol, AvahiResolverEvent event, const char *name, const char *type, const char *domain, const char *host_name, const AvahiAddress *address, uint16_t port, AvahiStringList *txt, AvahiLookupResultFlags flags, AVAHI_GCC_UNUSED void *userdata)
static gboolean remmina_avahi_iterate(RemminaAvahi *ga)
void remmina_avahi_stop(RemminaAvahi *ga)
void remmina_avahi_free(RemminaAvahi *ga)
GHashTable * discovered_services
void remmina_avahi_start(RemminaAvahi *ga)
static void remmina_avahi_browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char *name, const char *type, const char *domain, AVAHI_GCC_UNUSED AvahiLookupResultFlags flags, void *userdata)
AvahiSimplePoll * simple_poll