X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-client%2Fbrowser.c;h=1aaae8c48c4aa44373ef3bab3554648c29de06e2;hb=8185ec8431c51946095d3f11e80545e3519f67cf;hp=9a7438e2e6e8b1210ecf99a4f3eb64204ad2e2a2;hpb=1d6cecfe69fa2faea1c81ccd899bac24aad64273;p=catta diff --git a/avahi-client/browser.c b/avahi-client/browser.c index 9a7438e..1aaae8c 100644 --- a/avahi-client/browser.c +++ b/avahi-client/browser.c @@ -38,69 +38,21 @@ #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; + int32_t i_interface, i_protocol, i_flags, bt; assert(client); assert(callback); @@ -132,8 +84,9 @@ AvahiDomainBrowser* avahi_domain_browser_new( goto fail; } - i_interface = interface; - i_protocol = protocol; + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + i_flags = (int32_t) flags; bt = btype; if (!(dbus_message_append_args( @@ -142,6 +95,7 @@ AvahiDomainBrowser* avahi_domain_browser_new( DBUS_TYPE_INT32, &i_protocol, DBUS_TYPE_STRING, &domain, DBUS_TYPE_INT32, &bt, + DBUS_TYPE_INT32, &flags, DBUS_TYPE_INVALID))) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -192,6 +146,12 @@ 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 +160,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 +170,12 @@ 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; - int32_t interface, protocol; + char *domain = NULL; + int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC, flags = 0; assert(client); assert(message); @@ -238,18 +192,21 @@ 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; + if (event == AVAHI_BROWSER_NEW || event == AVAHI_BROWSER_REMOVE) { + if (!dbus_message_get_args( + message, &error, + DBUS_TYPE_INT32, &interface, + DBUS_TYPE_INT32, &protocol, + DBUS_TYPE_STRING, &domain, + DBUS_TYPE_INT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set (&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } } - 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 +221,15 @@ 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; + int32_t i_interface, i_protocol, i_flags; assert(client); assert(callback); @@ -303,14 +261,16 @@ AvahiServiceTypeBrowser* avahi_service_type_browser_new( goto fail; } - i_interface = interface; - i_protocol = protocol; + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + i_flags = (int32_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_INT32, &i_flags, DBUS_TYPE_INVALID)) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -361,6 +321,12 @@ 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,7 +335,7 @@ 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); @@ -378,18 +344,12 @@ int avahi_service_type_browser_free (AvahiServiceTypeBrowser *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; - int32_t interface, protocol; + char *domain = NULL, *type = NULL; + int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC, flags = 0; assert(client); assert(message); @@ -406,19 +366,22 @@ 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; + if (event == AVAHI_BROWSER_NEW || event == 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_INT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } } - 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 +398,15 @@ 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; + int32_t i_protocol, i_interface, i_flags; assert(client); assert(type); @@ -475,9 +439,9 @@ AvahiServiceBrowser* avahi_service_browser_new( goto fail; } - i_interface = interface; - i_protocol = protocol; - + i_interface = (int32_t) interface; + i_protocol = (int32_t) protocol; + i_flags = (int32_t) flags; if (!dbus_message_append_args( message, @@ -485,6 +449,7 @@ AvahiServiceBrowser* avahi_service_browser_new( DBUS_TYPE_INT32, &i_protocol, DBUS_TYPE_STRING, &type, DBUS_TYPE_STRING, &domain, + DBUS_TYPE_INT32, &i_flags, DBUS_TYPE_INVALID)) { avahi_client_set_errno(client, AVAHI_ERR_NO_MEMORY); goto fail; @@ -533,7 +498,13 @@ 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,7 +513,7 @@ 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); @@ -551,18 +522,13 @@ int avahi_service_browser_free (AvahiServiceBrowser *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) { AvahiServiceBrowser *b = NULL; DBusError error; const char *path; - char *name, *type, *domain; - int32_t interface, protocol; + char *name = NULL, *type = NULL, *domain = NULL; + int32_t interface = AVAHI_IF_UNSPEC, protocol = AVAHI_PROTO_UNSPEC, flags = 0; dbus_error_init (&error); @@ -576,20 +542,23 @@ DBusHandlerResult avahi_service_browser_event (AvahiClient *client, AvahiBrowser if (!b) goto fail; - 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"); - goto fail; + if (event == AVAHI_BROWSER_NEW || event == 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_INT32, &flags, + DBUS_TYPE_INVALID) || + dbus_error_is_set(&error)) { + fprintf(stderr, "Failed to parse browser event.\n"); + goto fail; + } } - 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;