无法使用迭代器迭代具有数组类型的GVariant

时间:2016-02-01 13:26:18

标签: c++ glib dbus gdbus

我正在尝试使用GDBus调用远程方法而不是DBus。我的问题是方法调用是成功的,但是方法的返回值(作为GVariant提供)包含一个数组作为其元素。当我尝试使用GVariantIter迭代它时,它会导致分段错误。但是如果我使用g_variant_print()将它打印到stdout,它就会成功打印数据。我究竟做错了什么 ?指定的格式字符串是正确的,我已使用g_variant_get_type_string()检查它。我的代码片段如下所示。

        GVariantIter* iter;
        gint16 res, mts, vlm;
        guint16 sid;
        char * sname ;
        GVariant* avail ;
        guint16 clsid;
        GVariant* retvalue = g_dbus_proxy_call_sync (proxy, 
                                    "Method", 
                                    "", //no parameters
                                    G_DBUS_CALL_FLAGS_NONE, 
                                    -1, 
                                    NULL, 
                                    &error 
                                  );

        g_variant_get(retvalue, "(na(qs(nn)nnq))",&res, &iter);
        while ( g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid, &sname, &avail, &mts, &vlm,  &clsid) )
        {
            // Operate on the variables
        }

1 个答案:

答案 0 :(得分:2)

如果我没有弄错的话,

g_dbus_proxy_call_sync()会在元组内返回你的GVariant。您需要做的是在创建迭代器之前打开元组。

在调用g_dbus_proxy_call_sync之后尝试执行此操作:

GVariantIter *iter;
GVariant *temp;

temp = g_variant_get_child_value (retvalue, 0);

iter = g_variant_iter_new (temp);

while (g_variant_iter_loop (iter, "(qs(nn)nnq)", &sid,
  &sname, &avail, &mts, &vlm,  &clsid)) 
{
  //operate
}