3

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番目の引数として何を入力する必要がありますか?何も機能しません!本当におもしろい!

4

1 に答える 1

5

OK、少なくとも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しているのは、x64で実行されている最新のUdisk(2)ものです-ArchLinux。多分誰かがそれを使うこともできます。

于 2012-09-17T18:45:56.493 に答える