|
- /* -*- Mode: C ; c-basic-offset: 4 -*- */
- /*
- Copyright (C) 2007-2008 Nedko Arnaudov
- Copyright (C) 2007-2008 Juuso Alasuutari
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License.
-
- This program 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 General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
- */
-
- #if defined(HAVE_CONFIG_H)
- #include "config.h"
- #endif
-
- #include <stdint.h>
- #include <string.h>
- #include <stdio.h>
- #include <assert.h>
- #include <dbus/dbus.h>
-
- #include "jackdbus.h"
-
- static char g_xml_data[102400];
-
- static
- void
- jack_controller_dbus_introspect(
- struct jack_dbus_method_call * call)
- {
- jack_dbus_construct_method_return_single(
- call,
- DBUS_TYPE_STRING,
- (message_arg_t)(const char *)g_xml_data);
- }
-
- JACK_DBUS_METHOD_ARGUMENTS_BEGIN(Introspect)
- JACK_DBUS_METHOD_ARGUMENT("xml_data", "s", true)
- JACK_DBUS_METHOD_ARGUMENTS_END
-
- JACK_DBUS_METHODS_BEGIN
- JACK_DBUS_METHOD_DESCRIBE(Introspect, jack_controller_dbus_introspect)
- JACK_DBUS_METHODS_END
-
- JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_introspectable, "org.freedesktop.DBus.Introspectable")
- JACK_DBUS_IFACE_EXPOSE_METHODS
- JACK_DBUS_IFACE_END
-
- static char * g_buffer_ptr;
-
- static
- void
- write_line_format(const char * format, ...)
- {
- va_list ap;
-
- va_start(ap, format);
- g_buffer_ptr += vsprintf(g_buffer_ptr, format, ap);
- va_end(ap);
- }
-
- static
- void
- write_line(const char * line)
- {
- write_line_format("%s\n", line);
- }
-
- void jack_controller_introspect_init() __attribute__((constructor));
-
- void
- jack_controller_introspect_init()
- {
- struct jack_dbus_interface_descriptor ** interface_ptr_ptr;
- const struct jack_dbus_interface_method_descriptor * method_ptr;
- const struct jack_dbus_interface_method_argument_descriptor * method_argument_ptr;
- const struct jack_dbus_interface_signal_descriptor * signal_ptr;
- const struct jack_dbus_interface_signal_argument_descriptor * signal_argument_ptr;
-
- g_buffer_ptr = g_xml_data;
-
- write_line("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"");
- write_line("\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">");
-
- write_line("<node name=\"" JACK_CONTROLLER_OBJECT_PATH "\">");
-
- interface_ptr_ptr = g_jackcontroller_interfaces;
-
- while (*interface_ptr_ptr != NULL)
- {
- write_line_format(" <interface name=\"%s\">\n", (*interface_ptr_ptr)->name);
-
- if ((*interface_ptr_ptr)->methods != NULL)
- {
- method_ptr = (*interface_ptr_ptr)->methods;
- while (method_ptr->name != NULL)
- {
- write_line_format(" <method name=\"%s\">\n", method_ptr->name);
-
- method_argument_ptr = method_ptr->arguments;
-
- while (method_argument_ptr->name != NULL)
- {
- write_line_format(
- " <arg name=\"%s\" type=\"%s\" direction=\"%s\" />\n",
- method_argument_ptr->name,
- method_argument_ptr->type,
- method_argument_ptr->direction_out ? "out" : "in");
- method_argument_ptr++;
- }
-
- write_line(" </method>");
- method_ptr++;
- }
- }
-
- if ((*interface_ptr_ptr)->signals != NULL)
- {
- signal_ptr = (*interface_ptr_ptr)->signals;
- while (signal_ptr->name != NULL)
- {
- write_line_format(" <signal name=\"%s\">\n", signal_ptr->name);
-
- signal_argument_ptr = signal_ptr->arguments;
-
- while (signal_argument_ptr->name != NULL)
- {
- write_line_format(
- " <arg name=\"%s\" type=\"%s\" />\n",
- signal_argument_ptr->name,
- signal_argument_ptr->type);
- signal_argument_ptr++;
- }
-
- write_line(" </signal>");
- signal_ptr++;
- }
- }
-
- write_line(" </interface>");
- interface_ptr_ptr++;
- }
-
- write_line("</node>");
-
- *g_buffer_ptr = 0;
- }
|