【问题标题】:C and dbus dictionaries with glib带有 glib 的 C 和 dbus 字典
【发布时间】:2012-01-28 15:29:01
【问题描述】:

我目前正在构建一个需要与 d-bus 接口的程序。我正在使用 glib dbus 库。我有一个返回 dbus 字典类型的方法,如下所示:

array [
  dict entry(
     string "Metadata"
     variant             array [
           dict entry(
              string "mpris:artUrl"
              variant                      string "http://open.spotify.com/thumb/05e9ad92c22953e6c778536613605b67faa5a095"
           )
           dict entry(
              string "mpris:length"
              variant                      uint64 238000000
           )

我的问题是,我到底如何在我的 C 程序中得到这个?我已经用注册的编组器尝试了通常的“dbus_g_proxy_connect_signal”,但运气不佳!

编辑:我添加了一些示例代码(不工作,但可以编译)

#include <string.h>
#include <glib.h>
#include <dbus/dbus.h>
#include <dbus/dbus-glib.h>

#define DBUS_SERVICE      "com.spotify.qt"
#define DBUS_PATH         "/"
#define DBUS_INTERFACE    "org.freedesktop.MediaPlayer2"

#define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable",     G_TYPE_STRING, G_TYPE_VALUE))
//Global bus connection
DBusGConnection *bus;
DBusGProxy *proxy;
//Main gloop
GMainLoop *loop = NULL;

//Callback function. 
static void callbackfunc(DBusGProxy *player_proxy, GHashTable *table){
GValue *value;
/* fetch values from hash table */
value = (GValue *) g_hash_table_lookup(table, "artist");
if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
    g_print("\nArtist: %s\n",g_value_get_string(value));
}
value = (GValue *) g_hash_table_lookup(table, "album");
if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
  g_print("\nAlbum: %s\n",g_value_get_string(value));
}
value = (GValue *) g_hash_table_lookup(table, "title");
if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
  g_print("\nTitle: %s\n",g_value_get_string(value));
}
}

int main (int argc, char **argv){
GError *error = NULL;
g_type_init ();

/* Get (on) the bus :p */
bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error);
if (bus == NULL) {
    g_printerr("Failed to open connection to bus: %s", error->message);
    g_error_free(error);
    return -1;
}

/* Create a proxy object for the bus driver */
proxy = dbus_g_proxy_new_for_name (bus,
                                   DBUS_SERVICE,
                                   DBUS_PATH,
                                   DBUS_INTERFACE);

if (!proxy) {
    g_printerr("Couldn't connect: %s", error->message);
    g_error_free(error);
    return -1;
}

/* Create the main loop instance */
loop = g_main_loop_new (NULL, FALSE);

dbus_g_proxy_add_signal(proxy, "GetMetadata",
        DBUS_TYPE_G_STRING_VALUE_HASHTABLE, G_TYPE_INVALID);

dbus_g_proxy_connect_signal(proxy, "GetMetadata",
                                G_CALLBACK(callbackfunc), NULL, NULL);

g_print("Going into main function\n");
/* Main loop */
g_main_loop_run (loop);

return 0;
} 

【问题讨论】:

  • 在新代码中,您确实应该使用GIO 而不是已弃用的 glib-dbus...

标签: c dictionary glib dbus


【解决方案1】:

我将移植我的代码以使用 GIO 而不是 glib-dbus,我曾经设法让它与 glib-dbus 一起使用:

if (dbus_g_proxy_call(p_proxy_md, "GetMetadata", NULL, G_TYPE_INVALID,   DBUS_TYPE_G_STRING_VALUE_HASHTABLE, &table, G_TYPE_INVALID)) {
value = (GValue *) g_hash_table_lookup(table, "xesam:title");
sprintf(currentTrack.trackname,"%s",g_value_get_string(value));
value = (GValue *) g_hash_table_lookup(table, "xesam:album");
sprintf(currentTrack.album,"%s",g_value_get_string(value));
tmp = g_hash_table_lookup(table, "xesam:artist");
if (tmp != NULL)
  {
    GStrv strv = g_value_get_boxed(g_hash_table_lookup(table, "xesam:artist"));
    sprintf(currentTrack.artist,"%s",*strv);

  }
}  
sprintf(notifybody,"By %s on %s",currentTrack.artist,currentTrack.album);
music_noti = notify_notification_new(currentTrack.trackname,notifybody, NULL);
notify_notification_set_timeout(music_noti,1500);
notify_notification_set_icon_from_pixbuf(music_noti, notifyicon);
notify_notification_show(music_noti, NULL);
notify_uninit();
}

【讨论】:

    【解决方案2】:

    不使用 GLIB 或任何外部库,我发现的最佳方法在 this post 中进行了概述。

    它需要提前知道数据类型的结构,这有点烦人。但是,您可以使用 dbus-monitor 查看 DBUS 首先发送的内容。然后你必须为数组的每一级创建一个迭代器。请参阅DBUS message documentation 了解如何使用迭代器。

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 2014-10-31
      • 2012-06-16
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2012-09-09
      • 2011-01-08
      • 2016-06-30
      相关资源
      最近更新 更多