我正在学习如何使用这个g_varient_new(),这让我很困惑。我读过https://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-new,但我无法轻易理解。
我有一个代码:
#define MM_DBUS_SERVICE "org.freedesktop.ModemManager1"
#define MM_DBUS_PATH "/org/freedesktop/ModemManager1/Modem/0"
#define MM_DBUS_GET_PROPERTIES "org.freedesktop.DBus.Properties"
....
int i;
GError *error = NULL;
GVariant *ret;
char **paths;
ret = g_dbus_proxy_call_sync (proxy,
"org.freedesktop.DBus.Properties.Get",
g_variant_new ("(ss)",
"org.freedesktop.ModemManager1.Modem",
"SignalQuality"),
G_DBUS_CALL_FLAGS_NONE, -1,
NULL, &error);
if (!ret) {
g_dbus_error_strip_remote_error (error);
g_print ("failed: %s\n", error->message);
g_error_free (error);
return;
}
g_variant_get (ret, "(v)", &paths);
g_variant_unref (ret);
for (i = 0; paths[i]; i++) {
g_print ("Printing \n");
g_print ("%s\n", paths[i]);
}
g_strfreev (paths);
它编译得很好但是当它运行时我得到seg_fault。 测试 打印
打印 分段错误
我期待此调用的结果是:
dbus-send --system --print-reply --dest=org.freedesktop.ModemManager1 "/org/freedesktop/ModemManager1/Modem/0" org.freedesktop.DBus.Properties.Get string:org.freedesktop.ModemManager1.Modem string:"SignalQuality"
method return sender=:1.1 -> dest=:1.121 reply_serial=2
variant struct {
uint32 38
boolean true
}
如何从调用中获取变体数据结构及其中的数据?我应该如何形成g_variat_new()调用来实现这个目标?
由于
答案 0 :(得分:4)
我认为,首先你需要解构元组:
GVariant *inner;
g_variant_get (ret, "(v)", &inner);
然后使用:
分解元组guint32 num;
gboolean b;
g_variant_get (inner, "(ub)", &num, &b);
检查this
您还可以使用函数g_variant_get_type_string(parameters)和g_variant_is_of_type (parameters, G_VARIANT_TYPE (type_string))。第一个是调试和查找数据格式,即格式字符串,第二个是预防措施,如果将来更改DBus API而不是崩溃,您可以生成有意义的 g_warning()并采取动作(例如,从函数返回一些错误)。