]> git.meshlink.io Git - catta/blobdiff - avahi-client/browser.c
* remove AVAHI_PUBLISH_IS_PROXY, it was a bad idea
[catta] / avahi-client / browser.c
index 9a7438e2e6e8b1210ecf99a4f3eb64204ad2e2a2..122d6f2f74b02676f0b4573dcdcb3f0ee431b4fd 100644 (file)
 #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);
 
@@ -576,20 +627,52 @@ 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;
+    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;