[vlc-commits] dbus: Correctly implement the GetTracksMetadata method

Mirsal Ennaime git at videolan.org
Thu May 19 16:18:15 CEST 2011


vlc | branch: master | Mirsal Ennaime <mirsal at mirsal.fr> | Thu May 19 14:43:52 2011 +0200| [7b77afbc9f0d9c8fa5e6128afa0f1116eb34b6f9] | committer: Mirsal Ennaime

dbus: Correctly implement the GetTracksMetadata method

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7b77afbc9f0d9c8fa5e6128afa0f1116eb34b6f9
---

 modules/control/dbus/dbus_tracklist.c |   58 +++++++++++++++++++++++---------
 1 files changed, 41 insertions(+), 17 deletions(-)

diff --git a/modules/control/dbus/dbus_tracklist.c b/modules/control/dbus/dbus_tracklist.c
index 183fe14..e4454eb 100644
--- a/modules/control/dbus/dbus_tracklist.c
+++ b/modules/control/dbus/dbus_tracklist.c
@@ -83,35 +83,59 @@ DBUS_METHOD( GetCurrentTrack )
     REPLY_SEND;
 }
 
-DBUS_METHOD( GetMetadata )
+DBUS_METHOD( GetTracksMetadata )
 {
     REPLY_INIT;
     OUT_ARGUMENTS;
-    DBusError error;
-    dbus_error_init( &error );
 
-    dbus_int32_t i_position;
-    playlist_t *p_playlist = PL;
+    int i_track_id = -1;
+    const char *psz_track_id = NULL;
 
-    dbus_message_get_args( p_from, &error,
-           DBUS_TYPE_INT32, &i_position,
-           DBUS_TYPE_INVALID );
+    playlist_t   *p_playlist = PL;
+    input_item_t *p_input = NULL;
 
-    if( dbus_error_is_set( &error ) )
+    DBusMessageIter in_args, track_ids, meta;
+
+    dbus_message_iter_init( p_from, &in_args );
+
+    if( DBUS_TYPE_ARRAY != dbus_message_iter_get_arg_type( &in_args ) )
     {
-        msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s",
-                error.message );
-        dbus_error_free( &error );
+        msg_Err( (vlc_object_t*) p_this, "Invalid arguments" );
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
     }
 
-    PL_LOCK;
-    if( i_position < p_playlist->current.i_size )
+    dbus_message_iter_recurse( &in_args, &track_ids );
+    dbus_message_iter_open_container( &args, DBUS_TYPE_ARRAY, "a{sv}", &meta );
+
+    while( DBUS_TYPE_OBJECT_PATH ==
+           dbus_message_iter_get_arg_type( &track_ids ) )
     {
-        GetInputMeta( p_playlist->current.p_elems[i_position]->p_input, &args );
+        dbus_message_iter_get_basic( &track_ids, &psz_track_id );
+
+        if( 1 != sscanf( psz_track_id, MPRIS_TRACKID_FORMAT, &i_track_id ) )
+        {
+            msg_Err( (vlc_object_t*) p_this, "Invalid track id: %s",
+                                             psz_track_id );
+            continue;
+        }
+
+        PL_LOCK;
+        for( int i = 0; i < playlist_CurrentSize( p_playlist ); i++ )
+        {
+            p_input = p_playlist->current.p_elems[i]->p_input;
+
+            if( i_track_id == p_input->i_id )
+            {
+                GetInputMeta( p_input, &meta );
+                break;
+            }
+        }
+        PL_UNLOCK;
+
+        dbus_message_iter_next( &track_ids );
     }
 
-    PL_UNLOCK;
+    dbus_message_iter_close_container( &args, &meta );
     REPLY_SEND;
 }
 
@@ -263,7 +287,7 @@ handle_tracklist ( DBusConnection *p_conn, DBusMessage *p_from, void *p_this )
 
     /* here D-Bus method names are associated to an handler */
 
-    METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetMetadata",     GetMetadata );
+    METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetTracksMetadata", GetTracksMetadata );
     METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetCurrentTrack", GetCurrentTrack );
     METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "GetLength",       GetLength );
     METHOD_FUNC( DBUS_MPRIS_TRACKLIST_INTERFACE, "AddTrack",        AddTrack );



More information about the vlc-commits mailing list