Hi,now I made a first patch for the unix autodetection function during application runtime.
At current stage it displays debug messages only.I think there is a way to get "allDrives" using dbus for detection at application start, but i didn't check this yet.
We can fetch the corresponding driver file (/dev/sdX) and the mountpoint. I don't know if there is any way to get the vendor/product ids.Maybe it's enough to check if vendor/model strings are "Sony Hi-MD" and if connection interface is usb to accept the drive as himd device.
Thomas
>From 2e46fb4fce7ce9d8fdc138bf413c199873408372 Mon Sep 17 00:00:00 2001 From: Thomas Arp <manner.moe@gmx.de> Date: Sun, 23 Dec 2012 15:33:28 +0100 Subject: [PATCH] implemented unix autodetection function during application runtime, does not change anything yet, just displaying debug messages. --- qhimdtransfer/qhimdtransfer.pro | 2 + qhimdtransfer/qhimdunixdetection.cpp | 149 ++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 qhimdtransfer/qhimdunixdetection.cpp diff --git a/qhimdtransfer/qhimdtransfer.pro b/qhimdtransfer/qhimdtransfer.pro index 236b5e9..d88486c 100644 --- a/qhimdtransfer/qhimdtransfer.pro +++ b/qhimdtransfer/qhimdtransfer.pro @@ -63,6 +63,8 @@ SOURCES += main.cpp \ qhimdmodel.cpp \ qhimddetection.cpp win32:SOURCES += qhimdwindetection.cpp +unix:SOURCES += qhimdunixdetection.cpp +unix:QT += dbus else:SOURCES += qhimddummydetection.cpp RESOURCES += icons.qrc PKGCONFIG += sox \ diff --git a/qhimdtransfer/qhimdunixdetection.cpp b/qhimdtransfer/qhimdunixdetection.cpp new file mode 100644 index 0000000..d573394 --- /dev/null +++ b/qhimdtransfer/qhimdunixdetection.cpp @@ -0,0 +1,149 @@ +#include <QtCore/QDebug> +#include <QtGui/QWidget> +#include <QtDBus/QtDBus> +#include <qhimddetection.h> + +#define UDISK_SERVICE "org.freedesktop.UDisks" +#define UDISK_PATH "/org/freedesktop/UDisks" +#define UDISK_INTERFACE "org.freedesktop.UDisks" +#define UDISK_PROPERTIES "org.freedesktop.DBus.Properties" +#define UDISK_DEVICE "org.freedesktop.UDisks.Device" + +/* define property names */ +#define PROP_IS_DRIVE "DeviceIsDrive" +#define PROP_IS_MOUNTED "DeviceIsMounted" +#define PROP_DEV_FILE "DeviceFile" +#define PROP_MOUNTPATH "DeviceMountPaths" +#define PROP_D_VENDOR "DriveVendor" +#define PROP_D_MODEL "DriveModel" +#define PROP_D_CON_INT "DriveConnectionInterface" + +class QHiMDUnixDetection : public QHiMDDetection{ + Q_OBJECT + + QDBusConnection dbus_c; +public: + QHiMDUnixDetection(QObject * parent = NULL); + ~QHiMDUnixDetection() {} + +private: + QVariant get_property(QDBusObjectPath dbp, QString property); + bool isDrive(QDBusObjectPath dbp); + QString devicePath(QDBusObjectPath dbp); + QString driveVendor(QDBusObjectPath dbp); + QString driveModel(QDBusObjectPath dbp); + QString interface(QDBusObjectPath dbp); + bool isMounted(QDBusObjectPath dbp); + QString mountpoint(QDBusObjectPath dbp); + +private slots: + void deviceAdded(QDBusObjectPath dbop); + void deviceRemoved(QDBusObjectPath dbop); +}; + +QHiMDDetection * createDetection(QObject * parent) +{ + return new QHiMDUnixDetection(parent); +} + +QHiMDUnixDetection::QHiMDUnixDetection(QObject *parent) + : QHiMDDetection(parent), dbus_c( QDBusConnection::connectToBus( QDBusConnection::SystemBus, "system" ) ) +{ + if(!dbus_c.connect(UDISK_SERVICE, UDISK_PATH, UDISK_INTERFACE, "DeviceAdded", this, SLOT(deviceAdded(QDBusObjectPath)))) + qDebug() << "cannot receive DeviceAdded signals"; + + if(!dbus_c.connect(UDISK_SERVICE, UDISK_PATH, UDISK_INTERFACE, "DeviceRemoved", this, SLOT(deviceRemoved(QDBusObjectPath)))) + qDebug() << "cannot receive DeviceRemoved signals"; +} + +QVariant QHiMDUnixDetection::get_property(QDBusObjectPath dbp, QString property) +{ + QDBusMessage msg = QDBusMessage::createMethodCall(UDISK_SERVICE, dbp.path(), UDISK_PROPERTIES, "Get"); + QDBusVariant var; + QList<QVariant> args; + QDBusMessage reply; + QString sig; + + /* set arguments */ + args.append(UDISK_DEVICE); + args.append(property); + msg.setArguments(args); + + /* send message */ + reply = dbus_c.call(msg); + + sig = 'v'; + if (!reply.signature().compare(sig)) + { + if (reply.arguments().length() > 0) + { + /* return first argument only should be fine for our reasons */ + var = reply.arguments().at(0).value<QDBusVariant>(); + return var.variant(); + } + } + return QVariant(); +} + +bool QHiMDUnixDetection::isDrive(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_IS_MOUNTED).toBool(); +} + +QString QHiMDUnixDetection::devicePath(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_DEV_FILE).toString(); +} + +QString QHiMDUnixDetection::driveVendor(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_D_VENDOR).toString(); +} + +QString QHiMDUnixDetection::driveModel(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_D_MODEL).toString(); +} + +QString QHiMDUnixDetection::interface(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_D_CON_INT).toString(); +} + +bool QHiMDUnixDetection::isMounted(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_IS_MOUNTED).toBool(); +} + +QString QHiMDUnixDetection::mountpoint(QDBusObjectPath dbp) +{ + return get_property(dbp, PROP_MOUNTPATH).toString(); +} + +void QHiMDUnixDetection::deviceAdded(QDBusObjectPath dev) +{ + qDebug() << "device added : " << dev.path(); + + /* this can be used for scsi acces (formatting etc.) */ + qDebug() << " system device driver file: " + devicePath(dev); + + /* wait for device to be mounted, this could take some time for himd devices, + if value is < 20 isDrive() and isMounted() may return false if mounting procedure didn't finish + excpecially on older devices of generation 1 (tested with RH1 and NH1)*/ + sleep(20); + + if(isDrive(dev)) { + qDebug() << QString(" Vendor/Model: %1 %2").arg(driveVendor(dev)).arg(driveModel(dev)); + qDebug() << QString(" connection interface: %1").arg(interface(dev)); + qDebug() << QString(" mountpoint is : %1").arg(isMounted(dev) ? mountpoint(dev) : "(not mounted)"); + } +} + +void QHiMDUnixDetection::deviceRemoved(QDBusObjectPath dev) +{ + qDebug() << "device removed : " << dev.path(); +} + +/* created moc file manually, this is needed if there is no header file for classes using signals/slots + else getting linker errors */ +#include "moc_qhimdunixdetection.cpp" -- 1.7.9.5