vlc | branch: master | Mirsal Ennaime <[email protected]> | 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; } _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
