[vlc-commits] dbus: Implement the mpris2 tracklist interface properties
Mirsal Ennaime
git at videolan.org
Sat Jun 4 20:39:01 CEST 2011
vlc | branch: master | Mirsal Ennaime <mirsal at mirsal.fr> | Tue May 24 01:50:17 2011 +0200| [393d7e42ad6496946a4233a70421f3f3e781e26b] | committer: Mirsal Ennaime
dbus: Implement the mpris2 tracklist interface properties
* Add a dispatcher method for tracklist properties
* Implement Tracks and CanEditTracks
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=393d7e42ad6496946a4233a70421f3f3e781e26b
---
modules/control/dbus/dbus_tracklist.c | 128 +++++++++++++++++++++++++++++++--
1 files changed, 121 insertions(+), 7 deletions(-)
diff --git a/modules/control/dbus/dbus_tracklist.c b/modules/control/dbus/dbus_tracklist.c
index 8bf66dd..cf36250 100644
--- a/modules/control/dbus/dbus_tracklist.c
+++ b/modules/control/dbus/dbus_tracklist.c
@@ -216,6 +216,79 @@ DBUS_METHOD( RemoveTrack )
REPLY_SEND;
}
+DBUS_METHOD( Tracks )
+{ /* Tracks property */
+ VLC_UNUSED( p_this );
+
+ REPLY_INIT;
+ OUT_ARGUMENTS;
+
+ DBusMessageIter tracks, v;
+ char *psz_track_id = NULL;
+ playlist_t *p_playlist = PL;
+ input_item_t *p_input = NULL;
+
+ dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "ao", &v );
+ dbus_message_iter_open_container( &v, DBUS_TYPE_ARRAY, "o", &tracks );
+
+ PL_LOCK;
+
+ for( int i = 0; i < playlist_CurrentSize( p_playlist ); i++ )
+ {
+ p_input = p_playlist->current.p_elems[i]->p_input;
+
+ if( ( -1 == asprintf( &psz_track_id,
+ MPRIS_TRACKID_FORMAT,
+ p_input->i_id ) ) ||
+ !dbus_message_iter_append_basic( &tracks,
+ DBUS_TYPE_OBJECT_PATH,
+ &psz_track_id ) )
+ {
+ PL_UNLOCK;
+ dbus_message_iter_abandon_container( &v, &tracks );
+ dbus_message_iter_abandon_container( &args, &v );
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ }
+
+ free( psz_track_id );
+ }
+
+ PL_UNLOCK;
+
+ if( !dbus_message_iter_close_container( &v, &tracks ) ||
+ !dbus_message_iter_close_container( &args, &v ) )
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ REPLY_SEND;
+}
+
+DBUS_METHOD( CanEditTracks )
+{ /* CanEditTracks property */
+ VLC_UNUSED( p_this );
+ REPLY_INIT;
+ OUT_ARGUMENTS;
+
+ DBusMessageIter v;
+ const dbus_bool_t b_ret = TRUE;
+
+ if( !dbus_message_iter_open_container( &args, DBUS_TYPE_VARIANT, "b", &v ) )
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ if( !dbus_message_iter_append_basic( &v, DBUS_TYPE_BOOLEAN, &b_ret ) )
+ {
+ dbus_message_iter_abandon_container( &args, &v );
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ }
+
+ if( !dbus_message_iter_close_container( &args, &v ) )
+ {
+ dbus_message_iter_abandon_container( &args, &v );
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+ }
+
+ REPLY_SEND;
+}
+
/******************************************************************************
* TrackListChange: tracklist order / length change signal
*****************************************************************************/
@@ -236,6 +309,48 @@ DBUS_SIGNAL( TrackListChangeSignal )
SIGNAL_SEND;
}
+#define PROPERTY_MAPPING_BEGIN if( 0 ) {}
+#define PROPERTY_FUNC( interface, property, function ) \
+ else if( !strcmp( psz_interface_name, interface ) && \
+ !strcmp( psz_property_name, property ) ) \
+ return function( p_conn, p_from, p_this );
+#define PROPERTY_MAPPING_END return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+DBUS_METHOD( GetProperty )
+{
+ DBusError error;
+
+ char *psz_interface_name = NULL;
+ char *psz_property_name = NULL;
+
+ dbus_error_init( &error );
+ dbus_message_get_args( p_from, &error,
+ DBUS_TYPE_STRING, &psz_interface_name,
+ DBUS_TYPE_STRING, &psz_property_name,
+ DBUS_TYPE_INVALID );
+
+ if( dbus_error_is_set( &error ) )
+ {
+ msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s",
+ error.message );
+ dbus_error_free( &error );
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ msg_Dbg( (vlc_object_t*) p_this, "Getting property %s",
+ psz_property_name );
+
+ PROPERTY_MAPPING_BEGIN
+ PROPERTY_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "Tracks", Tracks )
+ PROPERTY_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "CanEditTracks",
+ CanEditTracks )
+ PROPERTY_MAPPING_END
+}
+
+#undef PROPERTY_MAPPING_BEGIN
+#undef PROPERTY_GET_FUNC
+#undef PROPERTY_MAPPING_END
+
#define METHOD_FUNC( interface, method, function ) \
else if( dbus_message_is_method_call( p_from, interface, method ) )\
return function( p_conn, p_from, p_this )
@@ -245,16 +360,15 @@ handle_tracklist ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
{
if(0);
-/* METHOD_FUNC( DBUS_INTERFACE_PROPERTIES, "Get", GetProperty );
- METHOD_FUNC( DBUS_INTERFACE_PROPERTIES, "Set", SetProperty );
- METHOD_FUNC( DBUS_INTERFACE_PROPERTIES, "GetAll", GetAllProperties ); */
+ METHOD_FUNC( DBUS_INTERFACE_PROPERTIES, "Get", GetProperty );
/* here D-Bus method names are associated to an handler */
- METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetTracksMetadata", GetTracksMetadata );
- METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "AddTrack", AddTrack );
- METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "RemoveTrack", RemoveTrack );
- METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GoTo", GoTo );
+ METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GoTo", GoTo );
+ METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "AddTrack", AddTrack );
+ METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "RemoveTrack", RemoveTrack );
+ METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetTracksMetadata",
+ GetTracksMetadata );
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
More information about the vlc-commits
mailing list