X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-client%2Fbrowser.c;h=122d6f2f74b02676f0b4573dcdcb3f0ee431b4fd;hb=50248a63a26c7bfc959813b834e68e2144182146;hp=5de48249668fa5523eef3a0b00b0b8d07242f242;hpb=d0c6f66e03793c19c034c26c1267f9382167b3ad;p=catta diff --git a/avahi-client/browser.c b/avahi-client/browser.c index 5de4824..122d6f2 100644 --- a/avahi-client/browser.c +++ b/avahi-client/browser.c @@ -38,69 +38,22 @@ #include "client.h" #include "internal.h" -static int simple_method_call(AvahiClient *client, const char *path, const char *interface, const char *method) { - DBusMessage *message = NULL, *reply = NULL; - DBusError error; - int r = AVAHI_OK; - - dbus_error_init(&error); - - assert(client); - assert(path); - assert(interface); - assert(method); - - if (!(message = dbus_message_new_method_call(AVAHI_DBUS_NAME, path, interface, method))) { - r = avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); - goto fail; - } - - if (!(reply = dbus_connection_send_with_reply_and_block(client->bus, message, -1, &error)) || - dbus_error_is_set (&error)) { - r = avahi_client_set_errno(client, AVAHI_ERR_DBUS_ERROR); - goto fail; - } - - if (!dbus_message_get_args(reply, &error, DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { - r = avahi_client_set_errno(client, AVAHI_ERR_DBUS_ERROR); - goto fail; - } - - dbus_message_unref(message); - dbus_message_unref(reply); - - return AVAHI_OK; - -fail: - if (dbus_error_is_set(&error)) { - r = avahi_client_set_dbus_error(client, &error); - dbus_error_free(&error); - } - - if (message) - dbus_message_unref(message); - - if (reply) - dbus_message_unref(reply); - - return r; -} - AvahiDomainBrowser* avahi_domain_browser_new( AvahiClient *client, AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, AvahiDomainBrowserType btype, + AvahiLookupFlags flags, AvahiDomainBrowserCallback callback, void *userdata) { AvahiDomainBrowser *db = NULL; - DBusMessage *message = NULL, *reply; + DBusMessage *message = NULL, *reply = NULL; DBusError error; char *path; int32_t i_interface, i_protocol, bt; + uint32_t u_flags; assert(client); assert(callback); @@ -124,6 +77,8 @@ AvahiDomainBrowser* avahi_domain_browser_new( db->callback = callback; db->userdata = userdata; db->path = NULL; + db->interface = interface; + db->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiDomainBrowser, domain_browsers, client->domain_browsers, db); @@ -132,8 +87,9 @@ AvahiDomainBrowser* avahi_domain_browser_new( goto fail; } - i_interface = interface; - i_protocol = protocol; + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + u_flags = (uint32_t) flags; bt = btype; if (!(dbus_message_append_args( @@ -142,6 +98,7 @@ AvahiDomainBrowser* avahi_domain_browser_new( DBUS_TYPE_INT32, &i_protocol, DBUS_TYPE_STRING, &domain, DBUS_TYPE_INT32, &bt, + DBUS_TYPE_UINT32, &flags, DBUS_TYPE_INVALID))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -192,6 +149,11 @@ fail: return NULL; } +AvahiClient* avahi_domain_browser_get_client (AvahiDomainBrowser *b) { + assert(b); + return b->client; +} + int avahi_domain_browser_free (AvahiDomainBrowser *b) { AvahiClient *client; int r = AVAHI_OK; @@ -200,7 +162,7 @@ int avahi_domain_browser_free (AvahiDomainBrowser *b) { client = b->client; if (b->path && client->state != AVAHI_CLIENT_DISCONNECTED) - r = simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER, "Free"); + r = avahi_client_simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER, "Free"); AVAHI_LLIST_REMOVE(AvahiDomainBrowser, domain_browsers, client->domain_browsers, b); @@ -210,18 +172,13 @@ int avahi_domain_browser_free (AvahiDomainBrowser *b) { return r; } -const char* avahi_domain_browser_get_dbus_path(AvahiDomainBrowser *b) { - assert(b); - - return b->path; -} - DBusHandlerResult avahi_domain_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { AvahiDomainBrowser *db = NULL; DBusError error; const char *path; - char *domain; + char *domain = NULL; int32_t interface, protocol; + uint32_t flags = 0; assert(client); assert(message); @@ -238,18 +195,49 @@ DBusHandlerResult avahi_domain_browser_event (AvahiClient *client, AvahiBrowserE if (!db) goto fail; - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_INVALID) || - dbus_error_is_set (&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); - goto fail; + interface = db->interface; + protocol = db->protocol; + + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; + + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(db->client, avahi_error_dbus_to_number(etxt)); + break; + } } - db->callback(db, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, domain, db->userdata); + db->callback(db, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, domain, (AvahiLookupResultFlags) flags, db->userdata); return DBUS_HANDLER_RESULT_HANDLED; @@ -264,14 +252,16 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new( AvahiIfIndex interface, AvahiProtocol protocol, const char *domain, + AvahiLookupFlags flags, AvahiServiceTypeBrowserCallback callback, void *userdata) { AvahiServiceTypeBrowser *b = NULL; - DBusMessage *message = NULL, *reply; + DBusMessage *message = NULL, *reply = NULL; DBusError error; char *path; int32_t i_interface, i_protocol; + uint32_t u_flags; assert(client); assert(callback); @@ -295,22 +285,33 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new( b->callback = callback; b->userdata = userdata; b->path = NULL; + b->domain = NULL; + b->interface = interface; + b->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiServiceTypeBrowser, service_type_browsers, client->service_type_browsers, b); + if (domain[0]) + if (!(b->domain = avahi_strdup(domain))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + if (!(message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "ServiceTypeBrowserNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; } - i_interface = interface; - i_protocol = protocol; + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + u_flags = (uint32_t) flags; if (!dbus_message_append_args( message, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_INT32, &i_interface, + DBUS_TYPE_INT32, &i_protocol, DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &u_flags, DBUS_TYPE_INVALID)) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -361,6 +362,11 @@ fail: return NULL; } +AvahiClient* avahi_service_type_browser_get_client (AvahiServiceTypeBrowser *b) { + assert(b); + return b->client; +} + int avahi_service_type_browser_free (AvahiServiceTypeBrowser *b) { AvahiClient *client; int r = AVAHI_OK; @@ -369,27 +375,23 @@ int avahi_service_type_browser_free (AvahiServiceTypeBrowser *b) { client = b->client; if (b->path && client->state != AVAHI_CLIENT_DISCONNECTED) - r = simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER, "Free"); + r = avahi_client_simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER, "Free"); AVAHI_LLIST_REMOVE(AvahiServiceTypeBrowser, service_type_browsers, b->client->service_type_browsers, b); avahi_free(b->path); + avahi_free(b->domain); avahi_free(b); return r; } -const char* avahi_service_type_browser_get_dbus_path(AvahiServiceTypeBrowser *b) { - assert(b); - - return b->path; -} - DBusHandlerResult avahi_service_type_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { AvahiServiceTypeBrowser *b = NULL; DBusError error; const char *path; - char *domain, *type; + char *domain, *type = NULL; int32_t interface, protocol; + uint32_t flags = 0; assert(client); assert(message); @@ -406,19 +408,49 @@ DBusHandlerResult avahi_service_type_browser_event (AvahiClient *client, AvahiBr if (!b) goto fail; - if (!dbus_message_get_args( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_INVALID) || - dbus_error_is_set(&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); - goto fail; + domain = b->domain; + interface = b->interface; + protocol = b->protocol; + + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; + + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(b->client, avahi_error_dbus_to_number(etxt)); + break; + } } - b->callback(b, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, type, domain, b->userdata); + b->callback(b, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, type, domain, (AvahiLookupResultFlags) flags, b->userdata); return DBUS_HANDLER_RESULT_HANDLED; @@ -435,14 +467,16 @@ AvahiServiceBrowser* avahi_service_browser_new( AvahiProtocol protocol, const char *type, const char *domain, + AvahiLookupFlags flags, AvahiServiceBrowserCallback callback, void *userdata) { AvahiServiceBrowser *b = NULL; - DBusMessage *message = NULL, *reply; + DBusMessage *message = NULL, *reply = NULL; DBusError error; char *path; int32_t i_protocol, i_interface; + uint32_t u_flags; assert(client); assert(type); @@ -467,17 +501,31 @@ AvahiServiceBrowser* avahi_service_browser_new( b->callback = callback; b->userdata = userdata; b->path = NULL; + b->type = b->domain = NULL; + b->interface = interface; + b->protocol = protocol; AVAHI_LLIST_PREPEND(AvahiServiceBrowser, service_browsers, client->service_browsers, b); + if (!(b->type = avahi_strdup(type))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + + if (domain && domain[0]) + if (!(b->domain = avahi_strdup(domain))) { + avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); + goto fail; + } + if (!(message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, "ServiceBrowserNew"))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; } - i_interface = interface; - i_protocol = protocol; - + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + u_flags = (uint32_t) flags; if (!dbus_message_append_args( message, @@ -485,6 +533,7 @@ AvahiServiceBrowser* avahi_service_browser_new( DBUS_TYPE_INT32, &i_protocol, DBUS_TYPE_STRING, &type, DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &u_flags, DBUS_TYPE_INVALID)) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -533,7 +582,12 @@ fail: return NULL; } - + +AvahiClient* avahi_service_browser_get_client (AvahiServiceBrowser *b) { + assert(b); + return b->client; +} + int avahi_service_browser_free (AvahiServiceBrowser *b) { AvahiClient *client; int r = AVAHI_OK; @@ -542,27 +596,24 @@ int avahi_service_browser_free (AvahiServiceBrowser *b) { client = b->client; if (b->path && client->state != AVAHI_CLIENT_DISCONNECTED) - r = simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "Free"); + r = avahi_client_simple_method_call(client, b->path, AVAHI_DBUS_INTERFACE_SERVICE_BROWSER, "Free"); AVAHI_LLIST_REMOVE(AvahiServiceBrowser, service_browsers, b->client->service_browsers, b); avahi_free(b->path); + avahi_free(b->type); + avahi_free(b->domain); avahi_free(b); return r; } -const char* avahi_service_browser_get_dbus_path(AvahiServiceBrowser *b) { - assert(b); - - return b->path; -} - -DBusHandlerResult avahi_service_browser_event (AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { +DBusHandlerResult avahi_service_browser_event(AvahiClient *client, AvahiBrowserEvent event, DBusMessage *message) { AvahiServiceBrowser *b = NULL; DBusError error; const char *path; - char *name, *type, *domain; + char *name = NULL, *type, *domain; int32_t interface, protocol; + uint32_t flags = 0; dbus_error_init (&error); @@ -573,20 +624,55 @@ DBusHandlerResult avahi_service_browser_event (AvahiClient *client, AvahiBrowser if (strcmp (b->path, path) == 0) break; - if (!dbus_message_get_args ( - message, &error, - DBUS_TYPE_INT32, &interface, - DBUS_TYPE_INT32, &protocol, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &type, - DBUS_TYPE_STRING, &domain, - DBUS_TYPE_INVALID) || - dbus_error_is_set(&error)) { - fprintf(stderr, "Failed to parse browser event.\n"); + if (!b) goto fail; + + type = b->type; + domain = b->domain; + interface = b->interface; + protocol = b->protocol; + + switch (event) { + case AVAHI_BROWSER_NEW: + case AVAHI_BROWSER_REMOVE: + + if (!dbus_message_get_args ( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &name, + DBUS_TYPE_STRING, &type, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_UINT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + break; + + case AVAHI_BROWSER_CACHE_EXHAUSTED: + case AVAHI_BROWSER_ALL_FOR_NOW: + break; + + case AVAHI_BROWSER_FAILURE: { + char *etxt; + + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_STRING, &etxt, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } + + avahi_client_set_errno(b->client, avahi_error_dbus_to_number(etxt)); + break; + } } - b->callback(b, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, name, type, domain, b->userdata); + b->callback(b, (AvahiIfIndex) interface, (AvahiProtocol) protocol, event, name, type, domain, (AvahiLookupResultFlags) flags, b->userdata); return DBUS_HANDLER_RESULT_HANDLED;