[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