diff --git a/tools/mpris-player.c b/tools/mpris-player.c
index 0307861..cdff267 100644
--- a/tools/mpris-player.c
+++ b/tools/mpris-player.c
static gboolean option_export = FALSE;
struct tracklist {
- char *playlist;
GDBusProxy *proxy;
GSList *items;
};
GDBusProxy *folder;
GDBusProxy *device;
GDBusProxy *transport;
+ char *playlist;
struct tracklist *tracklist;
};
struct tracklist *tracklist = player->tracklist;
g_slist_free(tracklist->items);
- g_free(tracklist->playlist);
+ g_dbus_proxy_unref(tracklist->proxy);
g_free(tracklist);
player->tracklist = NULL;
}
if (player->transport)
g_dbus_proxy_unref(player->transport);
+ g_free(player->playlist);
g_free(player->bus_name);
g_free(player);
}
return;
}
+ g_dbus_emit_property_changed(player->conn, MPRIS_PLAYER_PATH,
+ MPRIS_PLAYLISTS_INTERFACE,
+ "ActivePlaylist");
+
g_dbus_proxy_method_call(tracklist->proxy, "ListItems",
list_items_setup, NULL, NULL, NULL);
}
static void change_folder_setup(DBusMessageIter *iter, void *user_data)
{
struct player *player = user_data;
- struct tracklist *tracklist = player->tracklist;
dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH,
- &tracklist->playlist);
+ &player->playlist);
}
static DBusMessage *playlist_activate(DBusConnection *conn,
struct tracklist *tracklist = player->tracklist;
const char *path;
+ if (tracklist == NULL)
+ return g_dbus_create_error(msg,
+ ERROR_INTERFACE ".InvalidArguments",
+ "Invalid Arguments");
+
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_OBJECT_PATH, &path,
DBUS_TYPE_INVALID))
ERROR_INTERFACE ".InvalidArguments",
"Invalid Arguments");
- if (!g_str_equal(path, tracklist->playlist))
+ if (!g_str_equal(path, player->playlist))
return g_dbus_create_error(msg,
ERROR_INTERFACE ".InvalidArguments",
"Invalid Arguments");
const char *string;
const char *empty = "";
+ if (tracklist == NULL)
+ return g_dbus_create_error(msg,
+ ERROR_INTERFACE ".InvalidArguments",
+ "Invalid Arguments");
+
if (!dbus_message_get_args(msg, NULL,
DBUS_TYPE_UINT32, &index,
DBUS_TYPE_UINT32, &count,
dbus_message_iter_open_container(&entry, DBUS_TYPE_STRUCT, NULL,
&value);
dbus_message_iter_append_basic(&value, DBUS_TYPE_OBJECT_PATH,
- &tracklist->playlist);
+ &player->playlist);
if (g_dbus_proxy_get_property(tracklist->proxy, "Name", &name)) {
dbus_message_iter_get_basic(&name, &string);
dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING,
&string);
} else {
dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING,
- &tracklist->playlist);
+ &player->playlist);
}
dbus_message_iter_append_basic(&value, DBUS_TYPE_STRING, &empty);
dbus_message_iter_close_container(&entry, &value);
dbus_message_iter_open_container(&value, DBUS_TYPE_STRUCT, NULL,
&entry);
dbus_message_iter_append_basic(&entry, DBUS_TYPE_OBJECT_PATH,
- &tracklist->playlist);
+ &player->playlist);
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING,
- &tracklist->playlist);
+ &player->playlist);
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &empty);
dbus_message_iter_close_container(&value, &entry);
dbus_message_iter_close_container(iter, &value);
return NULL;
}
-static void register_tracklist(struct player *player, const char *path)
+static void register_tracklist(GDBusProxy *proxy)
{
+ struct player *player;
struct tracklist *tracklist;
- GDBusProxy *proxy;
- if (player->tracklist != NULL)
+ player = find_player(proxy);
+ if (player == NULL)
return;
- proxy = g_dbus_proxy_new(client, g_dbus_proxy_get_path(player->proxy),
- BLUEZ_MEDIA_FOLDER_INTERFACE);
- if (proxy == NULL)
+ if (player->tracklist != NULL)
return;
tracklist = g_new0(struct tracklist, 1);
- tracklist->proxy = proxy;
- tracklist->playlist = g_strdup(path);
+ tracklist->proxy = g_dbus_proxy_ref(proxy);
player->tracklist = tracklist;
+
+ if (player->playlist == NULL)
+ return;
+
+ g_dbus_emit_property_changed(player->conn, MPRIS_PLAYER_PATH,
+ MPRIS_PLAYLISTS_INTERFACE,
+ "PlaylistCount");
+
+ g_dbus_proxy_method_call(tracklist->proxy, "ChangeFolder",
+ change_folder_setup, change_folder_reply,
+ player, NULL);
+}
+
+static void player_set_playlist(struct player *player, const char *path)
+{
+ struct tracklist *tracklist = player->tracklist;
+
+ g_free(player->playlist);
+ player->playlist = g_strdup(path);
+
+ if (player->tracklist == NULL)
+ return;
+
+ g_dbus_emit_property_changed(player->conn, MPRIS_PLAYER_PATH,
+ MPRIS_PLAYLISTS_INTERFACE,
+ "PlaylistCount");
+
+ g_dbus_proxy_method_call(tracklist->proxy, "ChangeFolder",
+ change_folder_setup, change_folder_reply,
+ player, NULL);
}
static void register_player(GDBusProxy *proxy)
if (transport)
player->transport = g_dbus_proxy_ref(transport);
+ if (g_dbus_proxy_get_property(proxy, "Playlist", &iter)) {
+ dbus_message_iter_get_basic(&iter, &path);
+ player_set_playlist(player, path);
+ }
+
return;
fail:
return;
path = g_dbus_proxy_get_path(proxy);
- if (g_str_equal(path, tracklist->playlist) ||
- !g_str_has_prefix(path, tracklist->playlist))
+ if (g_str_equal(path, player->playlist) ||
+ !g_str_has_prefix(path, player->playlist))
return;
l = g_slist_last(tracklist->items);
} else if (!strcmp(interface, BLUEZ_MEDIA_TRANSPORT_INTERFACE)) {
printf("Bluetooth Transport %s found\n", path);
register_transport(proxy);
+ } else if (!strcmp(interface, BLUEZ_MEDIA_FOLDER_INTERFACE)) {
+ printf("Bluetooth Folder %s found\n", path);
+ register_tracklist(proxy);
} else if (!strcmp(interface, BLUEZ_MEDIA_ITEM_INTERFACE)) {
struct player *player;
if (strcasecmp(name, "Playlist") == 0) {
const char *path;
dbus_message_iter_get_basic(iter, &path);
- return register_tracklist(player, path);
+ return player_set_playlist(player, path);
}
property = property_to_mpris(name);