[linux-minidisc] implementing unix himd autodetection function
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