1 /*****************************************************************************
2 * dbus-root.c : dbus control module (mpris v1.0) - root object
3 *****************************************************************************
4 * Copyright © 2006-2008 Rafaël Carré
5 * Copyright © 2007-2010 Mirsal Ennaime
6 * Copyright © 2009-2010 The VideoLAN team
9 * Authors: Mirsal Ennaime <mirsal at mirsal fr>
10 * Rafaël Carré <funman at videolanorg>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 *****************************************************************************/
31 #include <vlc_common.h>
32 #include <vlc_interface.h>
37 #include "dbus_root.h"
38 #include "dbus_common.h"
40 DBUS_METHOD( Identity )
46 char *psz_identity = VLC_IDENTITY;
49 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "s", &v );
50 dbus_message_iter_append_basic( &v, DBUS_TYPE_STRING, &psz_identity );
52 if( !dbus_message_iter_close_container( &args, &v ) )
53 return DBUS_HANDLER_RESULT_NEED_MEMORY;
58 DBUS_METHOD( CanQuit )
64 const dbus_bool_t b_ret = TRUE;
67 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "b", &v );
68 dbus_message_iter_append_basic( &v, DBUS_TYPE_BOOLEAN, &b_ret );
70 if( !dbus_message_iter_close_container( &args, &v ) )
71 return DBUS_HANDLER_RESULT_NEED_MEMORY;
76 DBUS_METHOD( CanRaise )
82 const dbus_bool_t b_ret = FALSE;
85 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "b", &v );
86 dbus_message_iter_append_basic( &v, DBUS_TYPE_BOOLEAN, &b_ret );
88 if( !dbus_message_iter_close_container( &args, &v ) )
89 return DBUS_HANDLER_RESULT_NEED_MEMORY;
94 DBUS_METHOD( HasTrackList )
100 const dbus_bool_t b_ret = FALSE;
103 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "b", &v );
104 dbus_message_iter_append_basic( &v, DBUS_TYPE_BOOLEAN, &b_ret );
106 if( !dbus_message_iter_close_container( &args, &v ) )
107 return DBUS_HANDLER_RESULT_NEED_MEMORY;
112 DBUS_METHOD( DesktopEntry )
114 VLC_UNUSED( p_this );
118 const char* psz_ret = PACKAGE;
121 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "s", &v );
122 dbus_message_iter_append_basic( &v, DBUS_TYPE_STRING, &psz_ret );
124 if( !dbus_message_iter_close_container( &args, &v ) )
125 return DBUS_HANDLER_RESULT_NEED_MEMORY;
130 DBUS_METHOD( SupportedMimeTypes )
132 VLC_UNUSED( p_this );
136 DBusMessageIter ret, v;
137 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "s", &v );
138 size_t i_len = sizeof( ppsz_supported_mime_types ) / sizeof( char* );
140 if( !dbus_message_iter_open_container( &v, DBUS_TYPE_ARRAY, "s", &ret ) )
141 return DBUS_HANDLER_RESULT_NEED_MEMORY;
143 for( size_t i = 0; i < i_len; ++i )
144 if( !dbus_message_iter_append_basic( &ret, DBUS_TYPE_STRING,
145 &ppsz_supported_mime_types[i] ) )
146 return DBUS_HANDLER_RESULT_NEED_MEMORY;
148 if( !dbus_message_iter_close_container( &v, &ret ) )
149 return DBUS_HANDLER_RESULT_NEED_MEMORY;
151 if( !dbus_message_iter_close_container( &args, &v ) )
152 return DBUS_HANDLER_RESULT_NEED_MEMORY;
157 DBUS_METHOD( SupportedUriSchemes )
159 VLC_UNUSED( p_this );
163 DBusMessageIter ret, v;
164 dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "s", &v );
165 size_t i_len = sizeof( ppsz_supported_uri_schemes ) / sizeof( char* );
167 if( !dbus_message_iter_open_container( &v, DBUS_TYPE_ARRAY, "s", &ret ) )
168 return DBUS_HANDLER_RESULT_NEED_MEMORY;
170 for( size_t i = 0; i < i_len; ++i )
171 if( !dbus_message_iter_append_basic( &ret, DBUS_TYPE_STRING,
172 &ppsz_supported_uri_schemes[i] ) )
173 return DBUS_HANDLER_RESULT_NEED_MEMORY;
175 if( !dbus_message_iter_close_container( &v, &ret ) )
176 return DBUS_HANDLER_RESULT_NEED_MEMORY;
178 if( !dbus_message_iter_close_container( &args, &v ) )
179 return DBUS_HANDLER_RESULT_NEED_MEMORY;
187 libvlc_Quit(INTF->p_libvlc);
191 #define PROPERTY_MAPPING_BEGIN if( 0 ) {}
192 #define PROPERTY_FUNC( interface, property, function ) \
193 else if( !strcmp( psz_interface_name, interface ) && \
194 !strcmp( psz_property_name, property ) ) \
195 return function( p_conn, p_from, p_this );
196 #define PROPERTY_MAPPING_END return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
198 DBUS_METHOD( GetProperty )
202 char *psz_interface_name = NULL;
203 char *psz_property_name = NULL;
205 dbus_error_init( &error );
206 dbus_message_get_args( p_from, &error,
207 DBUS_TYPE_STRING, &psz_interface_name,
208 DBUS_TYPE_STRING, &psz_property_name,
211 if( dbus_error_is_set( &error ) )
213 msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s",
215 dbus_error_free( &error );
216 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
219 msg_Dbg( (vlc_object_t*) p_this, "Getting property %s",
222 PROPERTY_MAPPING_BEGIN
223 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "Identity", Identity )
224 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "DesktopEntry", DesktopEntry )
225 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "SupportedMimeTypes", SupportedMimeTypes )
226 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "SupportedUriSchemes", SupportedUriSchemes )
227 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "HasTrackList", HasTrackList )
228 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "CanQuit", CanQuit )
229 PROPERTY_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "CanRaise", CanRaise )
233 #undef PROPERTY_MAPPING_BEGIN
234 #undef PROPERTY_GET_FUNC
235 #undef PROPERTY_MAPPING_END
237 #define METHOD_MAPPING_BEGIN if( 0 ) {}
238 #define METHOD_FUNC( interface, method, function ) \
239 else if( dbus_message_is_method_call( p_from, interface, method ) )\
240 return function( p_conn, p_from, p_this )
241 #define METHOD_MAPPING_END return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
244 handle_root ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
247 METHOD_FUNC( DBUS_INTERFACE_PROPERTIES, "Get", GetProperty );
248 METHOD_FUNC( DBUS_MPRIS_ROOT_INTERFACE, "Quit", Quit );
252 #undef METHOD_MAPPING_BEGIN
254 #undef METHOD_MAPPING_END