static int MarshalMetadata( intf_thread_t *p_intf, DBusMessageIter *container ) { DBusMessageIter a; input_thread_t *p_input = pl_CurrentInput( p_intf ); input_item_t *p_item = NULL; if( p_input != NULL ) { p_item = input_GetItem( p_input ); if( p_item ) { int result = GetInputMeta( p_item, container ); if (result != VLC_SUCCESS) { vlc_object_release( (vlc_object_t*) p_input ); return result; } } vlc_object_release( (vlc_object_t*) p_input ); } if (!p_item) { // avoid breaking the type marshalling if( !dbus_message_iter_open_container( container, DBUS_TYPE_ARRAY, "{sv}", &a ) || !dbus_message_iter_close_container( container, &a ) ) return VLC_ENOMEM; } return VLC_SUCCESS; }
static int MarshalMetadata( intf_thread_t *p_intf, DBusMessageIter *container ) { playlist_t *playlist = pl_Get( p_intf ); playlist_item_t *item; int result = VLC_SUCCESS; playlist_Lock( playlist ); item = playlist_CurrentPlayingItem( playlist ); if( item != NULL ) result = GetInputMeta( item, container ); else { // avoid breaking the type marshalling DBusMessageIter a; if( !dbus_message_iter_open_container( container, DBUS_TYPE_ARRAY, "{sv}", &a ) || !dbus_message_iter_close_container( container, &a ) ) result = VLC_ENOMEM; } playlist_Unlock( playlist ); return result; }
/** * PropertiesChangedSignal() synthetizes and sends the * org.freedesktop.DBus.Properties.PropertiesChanged signal */ static DBusHandlerResult PropertiesChangedSignal( intf_thread_t *p_intf, vlc_dictionary_t *p_changed_properties ) { DBusConnection *p_conn = p_intf->p_sys->p_conn; DBusMessageIter changed_properties, invalidated_properties, entry, variant; const char *psz_interface_name = DBUS_MPRIS_PLAYER_INTERFACE; char **ppsz_properties = NULL; int i_properties = 0; SIGNAL_INIT( DBUS_INTERFACE_PROPERTIES, DBUS_MPRIS_OBJECT_PATH, "PropertiesChanged" ); OUT_ARGUMENTS; ADD_STRING( &psz_interface_name ); dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "{sv}", &changed_properties ); i_properties = vlc_dictionary_keys_count( p_changed_properties ); ppsz_properties = vlc_dictionary_all_keys( p_changed_properties ); for( int i = 0; i < i_properties; i++ ) { dbus_message_iter_open_container( &changed_properties, DBUS_TYPE_DICT_ENTRY, NULL, &entry ); dbus_message_iter_append_basic( &entry, DBUS_TYPE_STRING, &ppsz_properties[i] ); if( !strcmp( ppsz_properties[i], "Metadata" ) ) { input_thread_t *p_input; p_input = playlist_CurrentInput( p_intf->p_sys->p_playlist ); dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "a{sv}", &variant ); if( p_input ) { input_item_t *p_item = input_GetItem( p_input ); GetInputMeta( p_item, &variant ); vlc_object_release( p_input ); } dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "PlaybackStatus" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "s", &variant ); MarshalPlaybackStatus( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "LoopStatus" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "s", &variant ); MarshalLoopStatus( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "Rate" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "d", &variant ); MarshalRate( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "Shuffle" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "b", &variant ); MarshalShuffle( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "Volume" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "d", &variant ); MarshalVolume( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "CanSeek" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "b", &variant ); MarshalCanSeek( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "CanPlay" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "b", &variant ); MarshalCanPlay( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } else if( !strcmp( ppsz_properties[i], "CanPause" ) ) { dbus_message_iter_open_container( &entry, DBUS_TYPE_VARIANT, "b", &variant ); MarshalCanPause( p_intf, &variant ); dbus_message_iter_close_container( &entry, &variant ); } dbus_message_iter_close_container( &changed_properties, &entry ); free( ppsz_properties[i] ); } dbus_message_iter_close_container( &args, &changed_properties ); dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "s", &invalidated_properties ); dbus_message_iter_close_container( &args, &invalidated_properties ); free( ppsz_properties ); SIGNAL_SEND; }