- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对简单的 D-Bus 概念有疑问。我使用 Glibmm D-Bus 绑定(bind)(Gio::DBus 命名空间)来访问 UDisks 接口(interface)。我想读取系统上找到的每个硬盘的一些属性,因此首先我需要枚举 UDisks 报告的所有磁盘,如下所示:
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)
对象,基本上是:“对象路径数组的一个结构”。从文档中我读到“对象路径”类型的处理方式与“字符串”类型相同,这就是为什么非类型化 VariantBase
这是在get_child(0)
期间创建的允许将自身转换到 Variant<ustring>
目的。使用此参数化变体,使用 var.get()
提取字符串非常简单。 .
但随后我尝试使用此方法从每个驱动器的属性中读取一些内容(在本例中为 NativePath
属性):
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)
签名。这意味着该对象是“变体”,因此我无法将其转换为任何内容。
对属性的内省(introspection)表明 NativePath
保存一个字符串值。那么为什么 call_sync()
方法返回一个变体类型的对象?我错过了什么吗?谁能告诉我,我怎样才能正确阅读NativePath
属性,不使用get_data()
方法和没有 memcpy
将数据放入我自己的缓冲区中?我希望尽可能做到类型安全。
还有一件事。当我使用data.print(true)
时方法,我得到了 NativePath
的正确内容编码形式的属性。这意味着引擎知道这是一个字符串。那么为什么它将其报告为变体呢?这是一个错误还是一个功能? :P
抱歉我的英语不好,我很困惑,感谢您的帮助。
最佳答案
好的,我有解决方案:这似乎是一个错误,或者至少这是一个我不理解的逻辑。
而不是打电话VariantContainerBase
的get_child(0)
,正确的做法是直接调用Glib函数g_variant_get_child()
,如 f.e.这个:
GVariant *output;
g_variant_get_child(data.gobj(), 0, "v", & output);
它将正确设置 output
的变体类型为 v
中的一个(在我的例子中,它将 output
的类型设置为 s
)。之后,当你获取 s
中的远程数据时类型,您可以将其转换为 Variant<ustring>
像这样:
Variant<Glib::ustring> item(output);
Glib::ustring text = item.get();
看起来有效。
关于linux - D-Bus、UDisk 和 Glibmm 的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977462/
我正在使用 gtkmm 为一个较小的应用程序开发一个插件。我正在使用的插件每分钟都会检查某些条件(日期已更改并且新的一天开始),如果条件为真则开始一些操作。在插件的初始化部分,我有以下使用 Glib:
我正在尝试使用 Glibmm 编写我的第一个应用程序,但我对如何连接和处理操作系统信号(如 SIGINT)感到困惑。我认为这是可能的,因为 Glib 似乎有办法做到这一点。我是否需要为 Glib 处理
尝试使用Glibmm-2.4输出中文返回“Invalid byte sequence in conversion input”。 #include #include #include int m
我在 Ubuntu/Oneiric 上运行最简单的程序时遇到问题: #include int main() { Glib::ustring s = "Test string"; } 使用生成
我对简单的 D-Bus 概念有疑问。我使用 Glibmm D-Bus 绑定(bind)(Gio::DBus 命名空间)来访问 UDisks 接口(interface)。我想读取系统上找到的每个硬盘的一
Glib::RefPtr 允许通过“->”取消引用,但不允许通过“*”取消引用。这是为什么? 我当然可以: class Foo {}; Glib::RefPtr fooPtr; fooPtr.o
我是一名优秀的程序员,十分优秀!