Пример получения данных из dbus

  1. struct song {
  2.   gchar *title;
  3.   gchar *artist;
  4.   gchar *genre;
  5. };
  6.  
  7. void get_song(struct song *currsong) {
  8.   GDBusProxy *proxy;
  9.   GDBusConnection *conn;
  10.   GError *error = NULL;
  11.   GVariant *answer, *value;
  12.   GVariantIter *iter;
  13.   gchar *key;
  14.  
  15.   conn = g_bus_get_sync(G_BUS_TYPE_SESSION, NULL, &error);
  16.   g_assert_no_error(error);
  17.  
  18.   proxy = g_dbus_proxy_new_sync(conn,
  19.                 G_DBUS_PROXY_FLAGS_NONE,
  20.                 NULL,
  21.                 "org.mpris.clementine",
  22.                 "/Player",
  23.                 "org.freedesktop.MediaPlayer",
  24.                 NULL,
  25.                 &error);
  26.   g_assert_no_error(error);
  27.  
  28.   answer = g_dbus_proxy_call_sync(proxy,
  29.                   "GetMetadata",
  30.                   NULL,
  31.                   G_DBUS_CALL_FLAGS_NONE,
  32.                   -1,
  33.                   NULL,
  34.                   &error);
  35.   g_assert_no_error(error);
  36.   g_assert(answer != NULL);
  37.  
  38.   g_variant_get(answer, "(a{sv})", &iter);
  39.   while(g_variant_iter_loop(iter, "{sv}", &key, &value)) {
  40.     if(strncmp(key, "title", 5) == 0) {
  41.       g_variant_get(value, "s", &(currsong->title));
  42.     }
  43.     else if(strncmp(key, "genre", 5) == 0) {
  44.       g_variant_get(value, "s", &(currsong->genre));
  45.     }
  46.     else if(strncmp(key, "artist", 6) == 0) {
  47.       g_variant_get(value, "s", &(currsong->artist));
  48.     }
  49.   }
  50.  
  51.   g_variant_unref(answer);
  52.  
  53.   g_object_unref(proxy);
  54.   g_object_unref(conn);
  55. }
Получаем данные о проигрываемом треке от Clementine из D-Bus. Используется биндинг D-Bus для GLib, поскольку API самого D-Bus слишком низкоуровнево.

Реклама

Мы в соцсетях

tw tg yt gt