1 /*****************************************************************************
2 * dbus.h : D-Bus control interface
3 *****************************************************************************
4 * Copyright (C) 2006 Rafaël Carré
7 * Author: Rafaël Carré <funman at videolanorg>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
26 #define DBUS_METHOD( method_function ) \
27 static DBusHandlerResult method_function \
28 ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
30 #define DBUS_SIGNAL( signal_function ) \
31 static DBusHandlerResult signal_function \
32 ( DBusConnection *p_conn, void *p_data )
35 DBusMessage* p_msg = dbus_message_new_method_return( p_from ); \
36 if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
37 dbus_uint32_t i_serial = 0
40 if( !dbus_connection_send( p_conn, p_msg, &i_serial ) ) \
41 return DBUS_HANDLER_RESULT_NEED_MEMORY; \
42 dbus_connection_flush( p_conn ); \
43 dbus_message_unref( p_msg ); \
44 return DBUS_HANDLER_RESULT_HANDLED
46 #define SIGNAL_INIT( signal ) \
47 DBusMessage *p_msg = dbus_message_new_signal( VLC_DBUS_OBJECT_PATH, \
48 VLC_DBUS_INTERFACE, signal ); \
49 if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
50 dbus_uint32_t i_serial = 0
53 if( !dbus_connection_send( p_conn, p_msg, &i_serial ) ) \
54 return DBUS_HANDLER_RESULT_NEED_MEMORY; \
55 dbus_message_unref( p_msg ); \
56 dbus_connection_flush( p_conn ); \
57 return DBUS_HANDLER_RESULT_HANDLED
59 #define OUT_ARGUMENTS \
60 DBusMessageIter args; \
61 dbus_message_iter_init_append( p_msg, &args )
63 #define DBUS_ADD( dbus_type, value ) \
64 if( !dbus_message_iter_append_basic( &args, dbus_type, value ) ) \
65 return DBUS_HANDLER_RESULT_NEED_MEMORY
67 #define ADD_STRING( s ) DBUS_ADD( DBUS_TYPE_STRING, s )
68 #define ADD_BOOL( b ) DBUS_ADD( DBUS_TYPE_BOOLEAN, b )
69 #define ADD_UINT32( i ) DBUS_ADD( DBUS_TYPE_UINT32, i )
70 #define ADD_UINT16( i ) DBUS_ADD( DBUS_TYPE_UINT16, i )
71 #define ADD_BYTE( b ) DBUS_ADD( DBUS_TYPE_BYTE, b )
73 /* XML data to answer org.freedesktop.DBus.Introspectable.Introspect requests */
75 const char* psz_introspection_xml_data =
76 "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
77 "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
79 " <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
80 " <method name=\"Introspect\">\n"
81 " <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
84 " <interface name=\"org.videolan.vlc\">\n"
85 " <method name=\"GetPlayStatus\">\n"
86 " <arg type=\"s\" direction=\"out\" />\n"
88 " <method name=\"GetPlayingItem\">\n"
89 " <arg type=\"s\" direction=\"out\" />\n"
91 " <method name=\"TogglePause\">\n"
92 " <arg type=\"b\" direction=\"out\" />\n"
94 " <method name=\"AddMRL\">\n"
95 " <arg type=\"s\" direction=\"in\" />\n"
96 " <arg type=\"b\" direction=\"in\" />\n"
98 " <method name=\"Nothing\">\n"
100 " <method name=\"Quit\">\n"
102 " <method name=\"Prev\">\n"
104 " <method name=\"Next\">\n"
106 " <method name=\"Stop\">\n"
108 " <method name=\"VolumeSet\">\n"
109 " <arg type=\"q\" direction=\"in\" />\n"
111 " <method name=\"VolumeGet\">\n"
112 " <arg type=\"q\" direction=\"out\" />\n"
114 " <method name=\"PositionSet\">\n"
115 " <arg type=\"q\" direction=\"in\" />\n"
117 " <method name=\"PositionGet\">\n"
118 " <arg type=\"q\" direction=\"out\" />\n"
124 /* Handling of messages received onn VLC_DBUS_OBJECT_PATH */
125 DBUS_METHOD( handle_messages ); /* handler function */
127 /* vtable passed to dbus_connection_register_object_path() */
128 static DBusObjectPathVTable vlc_dbus_vtable = {
129 NULL, /* Called when vtable is unregistered or its connection is freed*/
130 handle_messages, /* handler function */