1
/*****************************************************************************
2
* dbus.h : D-Bus control interface
3
*****************************************************************************
4
* Copyright (C) 2006 Rafaël Carré
7
* Authors: Rafaël Carré <funman at videolanorg>
8
* Mirsal ENNAIME <mirsal dot ennaime at gmail dot com>
10
* This program is free software; you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation; either version 2 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the Free Software
22
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23
*****************************************************************************/
26
#define VLC_MPRIS_VERSION_MAJOR 1
27
#define VLC_MPRIS_VERSION_MINOR 0
29
/* DBUS IDENTIFIERS */
31
/* name registered on the session bus */
32
#define VLC_MPRIS_DBUS_SERVICE "org.mpris.vlc"
33
#define MPRIS_DBUS_INTERFACE "org.freedesktop.MediaPlayer"
34
#define MPRIS_DBUS_ROOT_PATH "/"
35
#define MPRIS_DBUS_PLAYER_PATH "/Player"
36
#define MPRIS_DBUS_TRACKLIST_PATH "/TrackList"
40
#define DBUS_METHOD( method_function ) \
41
static DBusHandlerResult method_function \
42
( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
44
#define DBUS_SIGNAL( signal_function ) \
45
static DBusHandlerResult signal_function \
46
( DBusConnection *p_conn, void *p_data )
49
DBusMessage* p_msg = dbus_message_new_method_return( p_from ); \
50
if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
53
if( !dbus_connection_send( p_conn, p_msg, NULL ) ) \
54
return DBUS_HANDLER_RESULT_NEED_MEMORY; \
55
dbus_connection_flush( p_conn ); \
56
dbus_message_unref( p_msg ); \
57
return DBUS_HANDLER_RESULT_HANDLED
59
#define SIGNAL_INIT( signal ) \
60
DBusMessage *p_msg = dbus_message_new_signal( MPRIS_DBUS_PLAYER_PATH, \
61
MPRIS_DBUS_INTERFACE, signal ); \
62
if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY; \
65
if( !dbus_connection_send( p_conn, p_msg, NULL ) ) \
66
return DBUS_HANDLER_RESULT_NEED_MEMORY; \
67
dbus_message_unref( p_msg ); \
68
dbus_connection_flush( p_conn ); \
69
return DBUS_HANDLER_RESULT_HANDLED
71
#define OUT_ARGUMENTS \
72
DBusMessageIter args; \
73
dbus_message_iter_init_append( p_msg, &args )
75
#define DBUS_ADD( dbus_type, value ) \
76
if( !dbus_message_iter_append_basic( &args, dbus_type, value ) ) \
77
return DBUS_HANDLER_RESULT_NEED_MEMORY
79
#define ADD_STRING( s ) DBUS_ADD( DBUS_TYPE_STRING, s )
80
#define ADD_BOOL( b ) DBUS_ADD( DBUS_TYPE_BOOLEAN, b )
81
#define ADD_INT32( i ) DBUS_ADD( DBUS_TYPE_INT32, i )
82
#define ADD_BYTE( b ) DBUS_ADD( DBUS_TYPE_BYTE, b )
84
/* XML data to answer org.freedesktop.DBus.Introspectable.Introspect requests */
86
const char* psz_introspection_xml_data_root =
87
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
88
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
90
" <node name=\"Player\"/>\n"
91
" <node name=\"TrackList\"/>\n"
92
" <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
93
" <method name=\"Introspect\">\n"
94
" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
97
" <interface name=\"org.freedesktop.MediaPlayer\">\n"
98
" <method name=\"Identity\">\n"
99
" <arg type=\"s\" direction=\"out\" />\n"
101
" <method name=\"MprisVersion\">\n"
102
" <arg type=\"(qq)\" direction=\"out\" />\n"
104
" <method name=\"Quit\">\n"
110
const char* psz_introspection_xml_data_player =
111
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
112
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
114
" <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
115
" <method name=\"Introspect\">\n"
116
" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
119
" <interface name=\"org.freedesktop.MediaPlayer\">\n"
120
" <method name=\"GetStatus\">\n"
121
" <arg type=\"(iiii)\" direction=\"out\" />\n"
123
" <method name=\"Prev\">\n"
125
" <method name=\"Next\">\n"
127
" <method name=\"Stop\">\n"
129
" <method name=\"Play\">\n"
131
" <method name=\"Pause\">\n"
133
" <method name=\"Repeat\">\n"
134
" <arg type=\"b\" direction=\"in\" />\n"
136
" <method name=\"VolumeSet\">\n"
137
" <arg type=\"i\" direction=\"in\" />\n"
139
" <method name=\"VolumeGet\">\n"
140
" <arg type=\"i\" direction=\"out\" />\n"
142
" <method name=\"PositionSet\">\n"
143
" <arg type=\"i\" direction=\"in\" />\n"
145
" <method name=\"PositionGet\">\n"
146
" <arg type=\"i\" direction=\"out\" />\n"
148
" <method name=\"GetMetadata\">\n"
149
" <arg type=\"a{sv}\" direction=\"out\" />\n"
151
" <method name=\"GetCaps\">\n"
152
" <arg type=\"i\" direction=\"out\" />\n"
154
" <signal name=\"TrackChange\">\n"
155
" <arg type=\"a{sv}\"/>\n"
157
" <signal name=\"StatusChange\">\n"
158
" <arg type=\"(iiii)\"/>\n"
160
" <signal name=\"CapsChange\">\n"
161
" <arg type=\"i\"/>\n"
167
const char* psz_introspection_xml_data_tracklist =
168
"<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n"
169
"\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">\n"
171
" <interface name=\"org.freedesktop.DBus.Introspectable\">\n"
172
" <method name=\"Introspect\">\n"
173
" <arg name=\"data\" direction=\"out\" type=\"s\"/>\n"
176
" <interface name=\"org.freedesktop.MediaPlayer\">\n"
177
" <method name=\"AddTrack\">\n"
178
" <arg type=\"s\" direction=\"in\" />\n"
179
" <arg type=\"b\" direction=\"in\" />\n"
180
" <arg type=\"i\" direction=\"out\" />\n"
182
" <method name=\"DelTrack\">\n"
183
" <arg type=\"i\" direction=\"in\" />\n"
185
" <method name=\"GetMetadata\">\n"
186
" <arg type=\"i\" direction=\"in\" />\n"
187
" <arg type=\"a{sv}\" direction=\"out\" />\n"
189
" <method name=\"GetCurrentTrack\">\n"
190
" <arg type=\"i\" direction=\"out\" />\n"
192
" <method name=\"GetLength\">\n"
193
" <arg type=\"i\" direction=\"out\" />\n"
195
" <method name=\"SetLoop\">\n"
196
" <arg type=\"b\" direction=\"in\" />\n"
198
" <method name=\"SetRandom\">\n"
199
" <arg type=\"b\" direction=\"in\" />\n"
201
" <signal name=\"TrackListChange\">\n"
202
" <arg type=\"i\" />\n"
208
#define MPRIS_DBUS_ROOT_PATH "/"
209
#define MPRIS_DBUS_PLAYER_PATH "/Player"
210
#define MPRIS_DBUS_TRACKLIST_PATH "/TrackList"
212
/* Handle messages reception */
213
DBUS_METHOD( handle_root );
214
DBUS_METHOD( handle_player );
215
DBUS_METHOD( handle_tracklist );
217
static const DBusObjectPathVTable vlc_dbus_root_vtable = {
218
NULL, handle_root, /* handler function */
219
NULL, NULL, NULL, NULL
222
static const DBusObjectPathVTable vlc_dbus_player_vtable = {
223
NULL, handle_player, /* handler function */
224
NULL, NULL, NULL, NULL
227
static const DBusObjectPathVTable vlc_dbus_tracklist_vtable = {
228
NULL, handle_tracklist, /* handler function */
229
NULL, NULL, NULL, NULL