LINUX.ORG.RU

Отслеживание CD-дисков и флешек.

 , , ,


0

1

Есть приложение, написанное на Qt. Оно должно определять, когда вставляют флешки и диски, далее находить полный список таких устройств и искать на них определённые файлы.

На Windows реализовано с помощью QWinEvent. Подскажите, как это можно реализовать на Linux (Mint и другие, основанные на Debian)? Так же ещё надо определить, в каких приводах вставлен диск, а в каких нет.


Нашел вот такой пример кода, который помечен на stackoverflow, как рабочее решение.

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 the f*** what you want to do 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();
        }
    }
}

Но я не понимаю, как им воспользоваться. Во-первых, какому классу должны принадлежать эти методы (в этом примере, который сам является вырезкой из какого-то кода, каждый метод принадлежит разному классу). Во-вторых, где должен храниться dbus, и что конкретно ему надо передать вторым аргументом.

K_AA
() автор топика

Если не хочется связываться с udisk, можешь загрузить
easymount и посмотреть как там сделано. Не шедевр, конечно, но работает (непосредственно через libudev). Копипастить не получится, но взять за основу и написать собственную обвязку - вполне.

ABW ★★★★★
()
Ответ на: комментарий от ABW

О, спасибо! Именно примера, который можно разобрать и взять за основу, мне и не хватало)

K_AA
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.