-#define AVAHI_DBUS_NAME "org.freedesktop.Avahi"
-#define AVAHI_DBUS_INTERFACE_SERVER AVAHI_DBUS_NAME".Server"
-#define AVAHI_DBUS_PATH_SERVER "/org/freedesktop/Avahi/Server"
-#define AVAHI_DBUS_INTERFACE_ENTRY_GROUP AVAHI_DBUS_NAME".EntryGroup"
-#define AVAHI_DBUS_INTERFACE_DOMAIN_BROWSER AVAHI_DBUS_NAME".DomainBrowser"
-#define AVAHI_DBUS_INTERFACE_SERVICE_TYPE_BROWSER AVAHI_DBUS_NAME".ServiceTypeBrowser"
-#define AVAHI_DBUS_INTERFACE_SERVICE_BROWSER AVAHI_DBUS_NAME".ServiceBrowser"
-
-/* Needs wrapping:
- - AvahiServiceResolver
- - AvahiDomainBrowser
- - AvahiServiceTypeBrowser
- - AvahiServiceBrowser */
-
-typedef struct Server Server;
-typedef struct Client Client;
-typedef struct EntryGroupInfo EntryGroupInfo;
-typedef struct HostNameResolverInfo HostNameResolverInfo;
-typedef struct AddressResolverInfo AddressResolverInfo;
-typedef struct DomainBrowserInfo DomainBrowserInfo;
-typedef struct ServiceTypeBrowserInfo ServiceTypeBrowserInfo;
-typedef struct ServiceBrowserInfo ServiceBrowserInfo;
-typedef struct ServiceResolverInfo ServiceResolverInfo;
-
-struct EntryGroupInfo {
- guint id;
- Client *client;
- AvahiEntryGroup *entry_group;
- gchar *path;
-
- AVAHI_LLIST_FIELDS(EntryGroupInfo, entry_groups);
-};
-
-struct HostNameResolverInfo {
- Client *client;
- AvahiHostNameResolver *host_name_resolver;
- DBusMessage *message;
-
- AVAHI_LLIST_FIELDS(HostNameResolverInfo, host_name_resolvers);
-};
-
-struct AddressResolverInfo {
- Client *client;
- AvahiAddressResolver *address_resolver;
- DBusMessage *message;
-
- AVAHI_LLIST_FIELDS(AddressResolverInfo, address_resolvers);
-};
-
-struct DomainBrowserInfo {
- guint id;
- Client *client;
- AvahiDomainBrowser *domain_browser;
- gchar *path;
-
- AVAHI_LLIST_FIELDS(DomainBrowserInfo, domain_browsers);
-};
-
-struct ServiceTypeBrowserInfo {
- guint id;
- Client *client;
- AvahiServiceTypeBrowser *service_type_browser;
- gchar *path;
-
- AVAHI_LLIST_FIELDS(ServiceTypeBrowserInfo, service_type_browsers);
-};
-
-struct ServiceBrowserInfo {
- guint id;
- Client *client;
- AvahiServiceBrowser *service_browser;
- gchar *path;
-
- AVAHI_LLIST_FIELDS(ServiceBrowserInfo, service_browsers);
-};
-
-struct ServiceResolverInfo {
- Client *client;
- AvahiServiceResolver *service_resolver;
- DBusMessage *message;
-
- AVAHI_LLIST_FIELDS(ServiceResolverInfo, service_resolvers);
-};
-
-struct Client {
- guint id;
- gchar *name;
- guint current_id;
-
- AVAHI_LLIST_FIELDS(Client, clients);
- AVAHI_LLIST_HEAD(EntryGroupInfo, entry_groups);
- AVAHI_LLIST_HEAD(HostNameResolverInfo, host_name_resolvers);
- AVAHI_LLIST_HEAD(AddressResolverInfo, address_resolvers);
- AVAHI_LLIST_HEAD(DomainBrowserInfo, domain_browsers);
- AVAHI_LLIST_HEAD(ServiceTypeBrowserInfo, service_type_browsers);
- AVAHI_LLIST_HEAD(ServiceBrowserInfo, service_browsers);
- AVAHI_LLIST_HEAD(ServiceResolverInfo, service_resolvers);
-};
-
-struct Server {
- DBusConnection *bus;
- AVAHI_LLIST_HEAD(Client, clients);
- guint current_id;
-};
-
-static Server *server = NULL;
-
-static void entry_group_free(EntryGroupInfo *i) {
- g_assert(i);
-
- if (i->entry_group)
- avahi_entry_group_free(i->entry_group);
- dbus_connection_unregister_object_path(server->bus, i->path);
- g_free(i->path);
- AVAHI_LLIST_REMOVE(EntryGroupInfo, entry_groups, i->client->entry_groups, i);
- g_free(i);
- }
-
-static void host_name_resolver_free(HostNameResolverInfo *i) {
- g_assert(i);
-
- if (i->host_name_resolver)
- avahi_host_name_resolver_free(i->host_name_resolver);
- dbus_message_unref(i->message);
- AVAHI_LLIST_REMOVE(HostNameResolverInfo, host_name_resolvers, i->client->host_name_resolvers, i);
- g_free(i);
-}
-
-static void address_resolver_free(AddressResolverInfo *i) {
- g_assert(i);
-
- if (i->address_resolver)
- avahi_address_resolver_free(i->address_resolver);
- dbus_message_unref(i->message);
- AVAHI_LLIST_REMOVE(AddressResolverInfo, address_resolvers, i->client->address_resolvers, i);
- g_free(i);
-}
-
-static void domain_browser_free(DomainBrowserInfo *i) {
- g_assert(i);
-
- if (i->domain_browser)
- avahi_domain_browser_free(i->domain_browser);
- dbus_connection_unregister_object_path(server->bus, i->path);
- g_free(i->path);
- AVAHI_LLIST_REMOVE(DomainBrowserInfo, domain_browsers, i->client->domain_browsers, i);
- g_free(i);
-}
-
-static void service_type_browser_free(ServiceTypeBrowserInfo *i) {
- g_assert(i);
-
- if (i->service_type_browser)
- avahi_service_type_browser_free(i->service_type_browser);
- dbus_connection_unregister_object_path(server->bus, i->path);
- g_free(i->path);
- AVAHI_LLIST_REMOVE(ServiceTypeBrowserInfo, service_type_browsers, i->client->service_type_browsers, i);
- g_free(i);
-}