void Free()
void Commit()
int32 GetState()
- void AddService(int32 interface, int32 protocol, string type, string name, string domain, string host, uint16 port, string txt[])
+ void AddService(int32 interface, int32 protocol, string name, string type, string domain, string host, uint16 port, string txt[])
void AddAddress(int32 interface, int32 protocol, string name, string address)
SIGNAL StateChanged(int32 state)
--- /dev/null
+<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
+<!DOCTYPE node SYSTEM "introspect.dtd">
+<node>
+
+ <!-- $Id$ -->
+
+ <interface name="org.freedesktop.DBus.Introspectable">
+ <method name="Introspect">
+ <arg name="data" type="s" direction="out" />
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.Avahi.DomainBrowser">
+
+ <method name="Free"/>
+
+ <signal name="ItemNew">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ <signal name="ItemRemove">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ </interface>
+</node>
+
--- /dev/null
+<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
+<!DOCTYPE node SYSTEM "introspect.dtd">
+<node>
+
+ <!-- $Id$ -->
+
+ <interface name="org.freedesktop.DBus.Introspectable">
+ <method name="Introspect">
+ <arg name="data" type="s" direction="out"/>
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.Avahi.EntryGroup">
+ <method name="Free"/>
+ <method name="Commit"/>
+
+ <method name="GetState">
+ <arg name="state" type="i" direction="out"/>
+ </method>
+ <signal name="StateChanged">
+ <arg name="state" type="i"/>
+ </signal>
+
+ <method name="AddService">
+ <arg name="interface" type="i" direction="in"/>
+ <arg name="protocol" type="i" direction="in"/>
+ <arg name="name" type="s" direction="in"/>
+ <arg name="type" type="s" direction="in"/>
+ <arg name="domain" type="s" direction="in"/>
+ <arg name="host" type="s" direction="in"/>
+ <arg name="port" type="q" direction="in"/>
+ <arg name="txt" type="as" direction="in"/>
+ </method>
+
+ <method name="AddAddress">
+ <arg name="interface" type="i" direction="in"/>
+ <arg name="protocol" type="i" direction="in"/>
+ <arg name="name" type="s" direction="in"/>
+ <arg name="address" type="s" direction="in"/>
+ </method>
+
+ </interface>
+</node>
pkgsysconfdir=$(sysconfdir)/avahi
servicedir=$(pkgsysconfdir)/services
+introspectiondir=$(pkgdatadir)/introspection
+dbusservicedir=$(DBUS_SYS_DIR)
AM_CFLAGS= \
-I$(top_srcdir) \
-DAVAHI_DAEMON_RUNTIME_DIR=\"$(avahi_runtime_dir)/avahi-daemon/\" \
-DAVAHI_SOCKET=\"$(avahi_socket)\" \
- -DAVAHI_SERVICE_DIRECTORY=\"$(servicedir)\" \
- -DAVAHI_CONFIG_FILE=\"$(pkgsysconfdir)/avahi-daemon.conf\"
+ -DAVAHI_SERVICE_DIR=\"$(servicedir)\" \
+ -DAVAHI_CONFIG_FILE=\"$(pkgsysconfdir)/avahi-daemon.conf\" \
+ -DAVAHI_DBUS_INTROSPECTION_DIR=\"$(introspectiondir)\"
AM_LDADD=-lexpat
pkgdata_DATA = \
avahi-service.dtd
-EXTRA_DIST = avahi-service.dtd avahi-daemon.conf example.service dbus-test.py Server.introspect server-introspect-xml.c
-BUILT_SOURCES = server-introspect-xml.c
+EXTRA_DIST = \
+ avahi-service.dtd \
+ avahi-daemon.conf \
+ example.service \
+ dbus-test.py \
+ avahi-dbus.conf \
+ Server.introspect \
+ EntryGroup.introspect \
+ DomainBrowser.introspect \
+ ServiceTypeBrowser.introspect \
+ ServiceBrowser.introspect
if ENABLE_DBUS
avahi_daemon_SOURCES += dbus-protocol.c dbus-protocol.h
-dbusservicedir = $(DBUS_SYS_DIR)
dbusservice_DATA = avahi-dbus.conf
-EXTRA_DIST += $(dbusservice_DATA)
+introspection_DATA = \
+ Server.introspect \
+ EntryGroup.introspect \
+ DomainBrowser.introspect \
+ ServiceTypeBrowser.introspect \
+ ServiceBrowser.introspect
+
endif
avahi_daemon_CFLAGS = $(AM_CFLAGS)
xmllint --noout --valid example.service
xmllint --noout --valid Server.introspect
xmllint --noout --valid EntryGroup.introspect
-
-server-introspect-xml.c: Server.introspect
- python embedd-file.py -s $< server_introspect_xml > $@
+ xmllint --noout --valid DomainBrowser.introspect
+ xmllint --noout --valid ServiceTypeBrowser.introspect
+ xmllint --noout --valid ServiceBrowser.introspect
<interface name="org.freedesktop.DBus.Introspectable">
<method name="Introspect">
- <arg name="data" direction="out" type="s"/>
+ <arg name="data" type="s" direction="out"/>
</method>
</interface>
--- /dev/null
+<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
+<!DOCTYPE node SYSTEM "introspect.dtd">
+<node>
+
+ <!-- $Id$ -->
+
+ <interface name="org.freedesktop.DBus.Introspectable">
+ <method name="Introspect">
+ <arg name="data" type="s" direction="out" />
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.Avahi.ServiceBrowser">
+
+ <method name="Free"/>
+
+ <signal name="ItemNew">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="name" type="s"/>
+ <arg name="type" type="s"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ <signal name="ItemRemove">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="name" type="s"/>
+ <arg name="type" type="s"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ </interface>
+</node>
--- /dev/null
+<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
+<!DOCTYPE node SYSTEM "introspect.dtd">
+<node>
+
+ <!-- $Id$ -->
+
+ <interface name="org.freedesktop.DBus.Introspectable">
+ <method name="Introspect">
+ <arg name="data" type="s" direction="out" />
+ </method>
+ </interface>
+
+ <interface name="org.freedesktop.Avahi.ServiceTypeBrowser">
+
+ <method name="Free"/>
+
+ <signal name="ItemNew">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="type" type="s"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ <signal name="ItemRemove">
+ <arg name="interface" type="i"/>
+ <arg name="protocol" type="i"/>
+ <arg name="type" type="s"/>
+ <arg name="domain" type="s"/>
+ </signal>
+
+ </interface>
+</node>
#include "dbus-protocol.h"
#include "main.h"
-/* Include generated introspection data */
-#include "server-introspect-xml.c"
-
typedef struct Server Server;
typedef struct Client Client;
typedef struct EntryGroupInfo EntryGroupInfo;
return DBUS_HANDLER_RESULT_HANDLED;
}
+static DBusHandlerResult handle_introspect(DBusConnection *c, DBusMessage *m, const gchar *fname) {
+ gchar *path = NULL;
+ gchar *contents;
+ GError *gerror = NULL;
+ DBusError error;
+
+ g_assert(c);
+ g_assert(m);
+ g_assert(fname);
+
+ dbus_error_init(&error);
+
+ if (!dbus_message_get_args(m, &error, DBUS_TYPE_INVALID)) {
+ avahi_log_warn("Error parsing Introspect message: %s", error.message);
+ goto fail;
+ }
+
+ path = g_strdup_printf("%s/%s", AVAHI_DBUS_INTROSPECTION_DIR, fname);
+
+ if (!(g_file_get_contents(path, &contents, NULL, &gerror))) {
+ avahi_log_warn("Failed to load introspection data: %s", gerror->message);
+ g_error_free(gerror);
+ g_free(path);
+ goto fail;
+ }
+
+ g_free(path);
+
+ respond_string(c, m, contents);
+ g_free(contents);
+
+ return DBUS_HANDLER_RESULT_HANDLED;
+
+fail:
+ if (dbus_error_is_set(&error))
+ dbus_error_free(&error);
+
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+}
+
static DBusHandlerResult msg_signal_filter_impl(DBusConnection *c, DBusMessage *m, void *userdata) {
GMainLoop *loop = userdata;
DBusError error;
dbus_message_get_path(m),
dbus_message_get_member(m));
+ /* Introspection */
+ if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
+ return handle_introspect(c, m, "EntryGroup.introspect");
+
/* Access control */
if (strcmp(dbus_message_get_sender(m), i->client->name))
return respond_error(c, m, DBUS_ERROR_ACCESS_DENIED, NULL);
dbus_message_get_path(m),
dbus_message_get_member(m));
+ /* Introspection */
+ if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
+ return handle_introspect(c, m, "DomainBrowser.introspect");
+
/* Access control */
if (strcmp(dbus_message_get_sender(m), i->client->name))
return respond_error(c, m, DBUS_ERROR_ACCESS_DENIED, NULL);
dbus_message_get_path(m),
dbus_message_get_member(m));
+ /* Introspection */
+ if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
+ return handle_introspect(c, m, "ServiceTypeBrowser.introspect");
+
/* Access control */
if (strcmp(dbus_message_get_sender(m), i->client->name))
return respond_error(c, m, DBUS_ERROR_ACCESS_DENIED, NULL);
dbus_message_get_path(m),
dbus_message_get_member(m));
+ /* Introspection */
+ if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
+ return handle_introspect(c, m, "ServiceBrowser.introspect");
+
/* Access control */
if (strcmp(dbus_message_get_sender(m), i->client->name))
return respond_error(c, m, DBUS_ERROR_ACCESS_DENIED, NULL);
service_resolver_free(i);
}
+
static DBusHandlerResult msg_server_impl(DBusConnection *c, DBusMessage *m, void *userdata) {
DBusError error;
dbus_message_get_path(m),
dbus_message_get_member(m));
- if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect")) {
-
- if (!dbus_message_get_args(m, &error, DBUS_TYPE_INVALID)) {
- avahi_log_warn("Error parsing Introspect message");
- goto fail;
- }
-
- return respond_string(c, m, server_introspect_xml);
+ if (dbus_message_is_method_call(m, DBUS_INTERFACE_INTROSPECTABLE, "Introspect"))
+ return handle_introspect(c, m, "Server.introspect");
- } else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetHostName")) {
+ else if (dbus_message_is_method_call(m, AVAHI_DBUS_INTERFACE_SERVER, "GetHostName")) {
if (!dbus_message_get_args(m, &error, DBUS_TYPE_INVALID)) {
avahi_log_warn("Error parsing Server::GetHostName message");
avahi_log_warn("Missed message %s::%s()", dbus_message_get_interface(m), dbus_message_get_member(m));
-
fail:
if (dbus_error_is_set(&error))
dbus_error_free(&error);
}
memset(&globbuf, 0, sizeof(globbuf));
- if (glob(AVAHI_SERVICE_DIRECTORY "/*.service", GLOB_ERR, NULL, &globbuf) != 0)
+ if (glob(AVAHI_SERVICE_DIR "/*.service", GLOB_ERR, NULL, &globbuf) != 0)
avahi_log_error("Failed to read service directory.");
else {
for (p = globbuf.gl_pathv; *p; p++)
todo:
* finish DBUS stuff:
- - introspection
- enforce limits
- allow NUL bytes in TXT records
* release!