* Move avahi-core/llist.h to avahi-common/llist.h, not installed.
[platform/upstream/avahi.git] / avahi-client / client.c
index 290d767..f5de858 100644 (file)
@@ -1,8 +1,33 @@
+/* $Id$ */
+
+/***
+  This file is part of avahi.
+  avahi is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2.1 of the
+  License, or (at your option) any later version.
+  avahi is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
+  Public License for more details.
+  You should have received a copy of the GNU Lesser General Public
+  License along with avahi; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
 #include <avahi-client/client.h>
 #include <avahi-common/dbus.h>
+#include <avahi-common/llist.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <glib.h>
 #include <string.h>
 
 #define DBUS_API_SUBJECT_TO_CHANGE
 
 #include <stdlib.h>
 
-struct _AvahiClientPriv
+struct _AvahiClient
 {
     DBusConnection *bus;
+    AVAHI_LLIST_HEAD(AvahiEntryGroup, groups);
+};
+
+struct _AvahiEntryGroup {
+    char *path;
+    AvahiClient *parent;
+    AVAHI_LLIST_FIELDS(AvahiEntryGroup, groups);
 };
 
 static DBusHandlerResult
@@ -56,28 +88,6 @@ out:
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
 
-static gint _dbus_add_match (DBusConnection *bus, char *type, char *interface, char *sender, char *path)
-{
-    DBusError error;
-    char *filter;
-
-    g_assert (bus != NULL);
-
-    dbus_error_init (&error);
-    filter = g_strdup_printf ("type='%s', interface='%s', sender='%s', path='%s'", type, interface, sender, path);
-    dbus_bus_add_match (bus, filter, &error);
-    g_free (filter);
-
-    if (dbus_error_is_set (&error))
-    {
-        fprintf (stderr, "Error adding filter match: %s\n", error.message);
-        dbus_error_free (&error);
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
 AvahiClient *
 avahi_client_new ()
 {
@@ -85,16 +95,17 @@ avahi_client_new ()
     DBusError error;
 
     tmp = g_new (AvahiClient, 1);
-    tmp->priv = g_new (AvahiClientPriv, 1);
 
-    g_assert (tmp != NULL);
-    g_assert (tmp->priv != NULL);
-    
+    if (tmp == NULL)
+        goto fail;
+
+    AVAHI_LLIST_HEAD_INIT(AvahiEntryGroup, tmp->groups);
+
     dbus_error_init (&error);
 
-    tmp->priv->bus = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
+    tmp->bus = dbus_bus_get (DBUS_BUS_SYSTEM, &error);
 
-    dbus_connection_setup_with_g_main (tmp->priv->bus, NULL);
+    dbus_connection_setup_with_g_main (tmp->bus, NULL);
 
     if (dbus_error_is_set (&error)) {
         fprintf(stderr, "Error getting system d-bus: %s\n", error.message);
@@ -102,21 +113,47 @@ avahi_client_new ()
         goto fail;
     }
 
-    dbus_connection_set_exit_on_disconnect (tmp->priv->bus, FALSE);
+    dbus_connection_set_exit_on_disconnect (tmp->bus, FALSE);
 
-    if (!dbus_connection_add_filter (tmp->priv->bus, filter_func, tmp, NULL))
+    if (!dbus_connection_add_filter (tmp->bus, filter_func, tmp, NULL))
     {
         fprintf (stderr, "Failed to add d-bus filter\n");
         goto fail;
     }
 
-    if (!_dbus_add_match (tmp->priv->bus, "signal", AVAHI_DBUS_INTERFACE_SERVER, AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER)) goto fail;
-    if (!_dbus_add_match (tmp->priv->bus, "signal", DBUS_INTERFACE_DBUS, DBUS_SERVICE_DBUS, DBUS_PATH_DBUS)) goto fail;
+    dbus_bus_add_match (tmp->bus,
+            "type='signal', "
+            "interface='" AVAHI_DBUS_INTERFACE_SERVER "', "
+            "sender='" AVAHI_DBUS_NAME "', "
+            "path='" AVAHI_DBUS_PATH_SERVER "'",
+            &error);
+
+    if (dbus_error_is_set (&error))
+    {
+        fprintf (stderr, "Error adding filter match: %s\n", error.message);
+        dbus_error_free (&error);
+        goto fail;
+
+    }   
+
+    dbus_bus_add_match (tmp->bus,
+            "type='signal', "
+            "interface='" DBUS_INTERFACE_DBUS "', "
+            "sender='" DBUS_SERVICE_DBUS "', "
+            "path='" DBUS_PATH_DBUS "'",
+            &error);
+
+    if (dbus_error_is_set (&error))
+    {
+        fprintf (stderr, "Error adding filter match: %s\n", error.message);
+        dbus_error_free (&error);
+        goto fail;
+
+    }   
 
     return tmp;
 
 fail:
-    if (tmp->priv) free (tmp->priv);
     if (tmp) free (tmp);
     return NULL;
 }
@@ -127,7 +164,7 @@ avahi_client_get_string_reply_and_block (AvahiClient *client, char *method, char
     DBusMessage *message;
     DBusMessage *reply;
     DBusError error;
-    char *ret;
+    char *ret, *new;
 
     g_assert (client != NULL);
     g_assert (method != NULL);
@@ -135,7 +172,6 @@ avahi_client_get_string_reply_and_block (AvahiClient *client, char *method, char
     dbus_error_init (&error);
 
     message = dbus_message_new_method_call (AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, method);
-    fprintf (stderr, "message = dbus_message_new_method_call (%s, %s, %s, %s)\n", AVAHI_DBUS_NAME, AVAHI_DBUS_PATH_SERVER, AVAHI_DBUS_INTERFACE_SERVER, method);
 
     if (param != NULL)
     {
@@ -146,7 +182,7 @@ avahi_client_get_string_reply_and_block (AvahiClient *client, char *method, char
         }
     }
     
-    reply = dbus_connection_send_with_reply_and_block (client->priv->bus, message, -1, &error);
+    reply = dbus_connection_send_with_reply_and_block (client->bus, message, -1, &error);
 
     if (dbus_error_is_set (&error))
     {
@@ -172,7 +208,9 @@ avahi_client_get_string_reply_and_block (AvahiClient *client, char *method, char
         return NULL;
     }
 
-    return ret;
+    new = strdup (ret);
+
+    return new;
 }
 
 char*
@@ -199,14 +237,19 @@ avahi_client_get_host_name_fqdn (AvahiClient *client)
     return avahi_client_get_string_reply_and_block (client, "GetHostNameFqdn", NULL);
 }
 
-char*
-avahi_client_get_alternative_host_name (AvahiClient *client, char *host)
+AvahiEntryGroup*
+avahi_entry_group_new (AvahiClient *client)
 {
-    return avahi_client_get_string_reply_and_block (client, "GetAlternativeHostName", host);
-}
+    AvahiEntryGroup *tmp;
 
-char*
-avahi_client_get_alternative_service_name (AvahiClient *client, char *service)
-{
-    return avahi_client_get_string_reply_and_block (client, "GetAlternativeServiceName", service);
+    tmp = malloc (sizeof (AvahiEntryGroup));
+
+    tmp->parent = client;
+
+    AVAHI_LLIST_PREPEND(AvahiEntryGroup, groups, client->groups, tmp);
+
+    return tmp;
+fail:
+    if (tmp) free (tmp);
+    return NULL;
 }