Я хотел бы смонтировать файловую систему, используя QT и DBUS. Я подписался на сигнал «DeviceAdded», используя этот небольшой фрагмент:
void DBusWatcher::deviceAdded(const QDBusObjectPath &o) {
QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", o.path(), "org.freedesktop.DBus.Properties", "GetAll");
QList<QVariant> args;
args.append("org.freedesktop.UDisks.Device");
call.setArguments(args);
QDBusPendingReply<QVariantMap> reply = DBusConnection::systemBus().asyncCall(call);
reply.waitForFinished();
QVariantMap map = reply.value();
// ...
}
Это работает довольно хорошо. У меня вопрос, как мне смонтировать эту штуку? Все, что у меня есть, что-то вроде этого — и это не работает вообще — и без ошибок.
QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", "dont know what to put here!", "org.freedesktop.UDisks.Device", "FilesystemMount");
А теперь, какое действие я должен использовать для QDBusConnection :: systemBus (): call, asyncCall, callWithCallback? Что нужно поставить в качестве второго аргумента в createMethodCall? Ничего не работает! Действительно расстраивает!
Хорошо, после борьбы в течение по крайней мере 2 дней я наконец получил это! Я смотрел в razer-qt
источники, я посмотрел в kdelibs
источники, но как-то все их dbus
вещи не работали. Вот фрагмент, которым я очень доволен:
void DBusWatcher::deviceAdded(const QDBusObjectPath &o) {
QDBusMessage call = QDBusMessage::createMethodCall("org.freedesktop.UDisks", o.path(), "org.freedesktop.DBus.Properties", "GetAll");
QList<QVariant> args;
args.append("org.freedesktop.UDisks.Device");
call.setArguments(args);
QDBusPendingReply<QVariantMap> reply = QDBusConnection::systemBus().asyncCall(call);
reply.waitForFinished();
QVariantMap map = reply.value();
// now do what you want with the map ;)
// You will find all available information to the device attached
}
// a class wide pointer to the systembus
// initialized within the constructor of the class
// and deleted in the destructor
dbus = new QDBusInterface(
"org.freedesktop.UDisks",
"here comes the path from the QDBusObjectPath.path() object",
"org.freedesktop.UDisks.Device",
QDBusConnection::systemBus(),
this
);
void DbusAction::mountFilesystem() {
if(dbus->isValid()) {
QList<QVariant> args;
args << QVariant(QString()) << QVariant(QStringList());
QDBusMessage msg = dbus->callWithArgumentList(QDBus::AutoDetect, "FilesystemMount", args);
if(msg.type() == QDBusMessage::ReplyMessage) {
QString path = msg.arguments().at(0).toString();
if(!path.isEmpty()) {
emit deviceMounted(path);
} else {
qDebug() << "sorry, but the path returned is empty";
}
} else {
qDebug() << msg.errorMessage();
}
}
}
я использую Openbox
и последний Udisk(2)
вещи, работающие на x64-ArchLinux. Может быть, кто-то может использовать это тоже.
Других решений пока нет …