OSDN Git Service

tools/mpris-player: Add support for MPRIS TrackList.TrackAdded signal
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Wed, 24 Apr 2013 09:06:11 +0000 (12:06 +0300)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 16 May 2013 12:03:16 +0000 (15:03 +0300)
tools/mpris-player.c

index 3fa9cd6..d4e6d14 100644 (file)
@@ -1690,6 +1690,12 @@ static const GDBusMethodTable tracklist_methods[] = {
        { },
 };
 
+static const GDBusSignalTable tracklist_signals[] = {
+       { GDBUS_SIGNAL("TrackAdded", GDBUS_ARGS({"metadata", "a{sv}"},
+                                               {"after", "o"})) },
+       { }
+};
+
 static void append_path(gpointer data, gpointer user_data)
 {
        GDBusProxy *proxy = data;
@@ -1813,7 +1819,7 @@ static void register_tracklist(struct player *player, const char *playlist)
        if (!g_dbus_register_interface(player->conn, MPRIS_PLAYER_PATH,
                                                MPRIS_TRACKLIST_INTERFACE,
                                                tracklist_methods,
-                                               NULL,
+                                               tracklist_signals,
                                                tracklist_properties,
                                                player, NULL)) {
                fprintf(stderr, "Could not register interface %s",
@@ -1973,6 +1979,10 @@ static void register_item(struct player *player, GDBusProxy *proxy)
 {
        struct tracklist *tracklist;
        const char *path;
+       DBusMessage *signal;
+       DBusMessageIter iter, args, metadata;
+       GSList *l;
+       GDBusProxy *after;
 
        tracklist = player->tracklist;
        if (tracklist == NULL)
@@ -1983,11 +1993,46 @@ static void register_item(struct player *player, GDBusProxy *proxy)
                                !g_str_has_prefix(path, tracklist->playlist))
                return;
 
+       l = g_slist_last(tracklist->items);
        tracklist->items = g_slist_append(tracklist->items, proxy);
 
        g_dbus_emit_property_changed(player->conn, MPRIS_PLAYER_PATH,
                                                MPRIS_TRACKLIST_INTERFACE,
                                                "Tracks");
+
+       if (l == NULL)
+               return;
+
+       signal = dbus_message_new_signal(MPRIS_PLAYER_PATH,
+                                       MPRIS_TRACKLIST_INTERFACE,
+                                       "TrackAdded");
+       if (!signal) {
+               fprintf(stderr, "Unable to allocate new %s.TrackAdded signal",
+                                               MPRIS_TRACKLIST_INTERFACE);
+               return;
+       }
+
+       dbus_message_iter_init_append(signal, &args);
+
+       if (!g_dbus_proxy_get_property(proxy, "Metadata", &iter)) {
+               dbus_message_unref(signal);
+               return;
+       }
+
+       dbus_message_iter_open_container(&args, DBUS_TYPE_ARRAY,
+                       DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+                       DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
+                       DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &metadata);
+
+       parse_metadata(&iter, &metadata, parse_track_entry);
+
+       dbus_message_iter_close_container(&args, &metadata);
+
+       after = l->data;
+       path = g_dbus_proxy_get_path(after);
+       dbus_message_iter_append_basic(&args, DBUS_TYPE_OBJECT_PATH, &path);
+
+       g_dbus_send_message(player->conn, signal);
 }
 
 static void proxy_added(GDBusProxy *proxy, void *user_data)