首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >D总线、UDisks和Glibmm绑定

D总线、UDisks和Glibmm绑定
EN

Stack Overflow用户
提问于 2012-01-23 19:31:47
回答 1查看 773关注 0票数 0

我对一个简单的D总线概念有个问题。我使用Glibmm D总线绑定(Gio::DBus命名空间)访问UDisks接口。我想读取系统中找到的每个硬盘的一些属性,所以首先我需要枚举UDisks正在报告的所有磁盘,如下所示:

代码语言:javascript
复制
Glib::RefPtr<Gio::DBus::Connection> bus;

int main() {
    using namespace Glib;
    using namespace Gio;

    Glib::init();
    Gio::init();

    bus = DBus::Connection::get_sync(Gio::DBus::BUS_TYPE_SYSTEM);
    RefPtr<DBus::Proxy> udisks_proxy = DBus::Proxy::create_sync(bus, "org.freedesktop.UDisks", "/org/freedesktop/UDisks", "org.freedesktop.UDisks");

    VariantContainerBase devices_variant = udisks_proxy->call_sync("EnumerateDevices");
    VariantIter iterator(devices_variant.get_child(0));

    Variant<ustring> var;
    while(iterator.next_value(var)) {
        ustring name = var.get();

        LOG("device: '%s", name.c_str());
        process_device(name);
    }

    return 0;
}

这似乎是可以的,因为call_sync()返回一个VariantContainerBase,它保存(ao)对象,基本上是:“一个对象路径数组的结构”。我从文档中看到,“对象路径”类型的处理方式与“字符串”类型相同,这就是为什么在get_child(0)期间创建的非类型化get_child(0)允许自己被抛入Variant<ustring>对象的原因。使用这个参数化的变体,使用var.get()提取字符串非常简单。

但是,接下来我尝试使用以下方法从每个驱动器的属性中读取一些内容(在本例中是NativePath属性):

代码语言:javascript
复制
void process_device(const Glib::ustring& objpath) {
    using namespace Glib;
    using namespace Gio;

    RefPtr<DBus::Proxy> attrs = DBus::Proxy::create_sync(bus, "org.freedesktop.UDisks", objpath, "org.freedesktop.DBus.Properties");

    std::vector<VariantBase> args;
    args.push_back(Variant<ustring>::create(objpath));
    args.push_back(Variant<ustring>::create("NativePath"));
    VariantContainerBase data = attrs->call_sync("Get", VariantContainerBase::create_tuple(args));

    LOG("return type: %s", data.get_type_string().c_str());
}

问题是VariantContainerBase对象包含(v)签名。这意味着对象是“变体”,所以我不能将它转换为任何东西。

对属性的内省显示,NativePath持有一个字符串值。那么为什么call_sync()方法要返回一个变体类型的对象呢?我是不是遗漏了什么?有人能告诉我,我如何正确地读取NativePath属性,而无需使用get_data()方法,也不需要将数据放入自己的缓冲区?我想尽可能地使用类型安全的方法。

还有一件事。当我使用data.print(true)方法时,我以编码的形式获得NativePath属性的适当内容。这意味着引擎知道这是一个字符串。那么它为什么把它报告为变体呢?它是一个bug还是一个特性?:P

对不起,我的英语,我的混乱,并感谢任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-24 10:24:31

好的,我有一个解决方案:这似乎是一个bug,或者至少这是一个我不明白的逻辑。

与调用VariantContainerBaseget_child(0)不同,正确的方法是调用一个直接的Glib函数g_variant_get_child(),如f.e.this:

代码语言:javascript
复制
GVariant *output;
g_variant_get_child(data.gobj(), 0, "v", & output);

它将正确地将output的变体类型设置为v内部的变体类型(在我的示例中,它将output的类型设置为s)。

代码语言:javascript
复制
Variant<Glib::ustring> item(output);
Glib::ustring text = item.get();

好像很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8977462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档