Пример получения данных из dbus
- struct song {
- gchar *title;
- gchar *artist;
- gchar *genre;
- };
- void get_song(struct song *currsong) {
- GDBusProxy *proxy;
- GDBusConnection *conn;
- GError *error = NULL;
- GVariant *answer, *value;
- GVariantIter *iter;
- gchar *key;
- conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
- g_assert_no_error(error);
- proxy = g_dbus_proxy_new_sync(conn,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL,
- "org.mpris.clementine",
- "/Player",
- "org.freedesktop.MediaPlayer",
- NULL,
- &error);
- g_assert_no_error(error);
- answer = g_dbus_proxy_call_sync(proxy,
- "GetMetadata",
- NULL,
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- NULL,
- &error);
- g_assert_no_error(error);
- g_assert(answer != NULL);
- g_variant_get(answer, "(a{sv})", &iter);
- while(g_variant_iter_loop(iter, "{sv}", &key, &value)) {
- if(strncmp(key, "title", 5) == 0) {
- g_variant_get(value, "s", &(currsong->title));
- }
- else if(strncmp(key, "genre", 5) == 0) {
- g_variant_get(value, "s", &(currsong->genre));
- }
- else if(strncmp(key, "artist", 6) == 0) {
- g_variant_get(value, "s", &(currsong->artist));
- }
- }
- g_variant_unref(answer);
- g_object_unref(proxy);
- g_object_unref(conn);
- }
Получаем данные о проигрываемом треке от Clementine из D-Bus. Используется биндинг D-Bus для GLib, поскольку API самого D-Bus слишком низкоуровнево.