FU Logo
  • Startseite
  • Kontakt
  • Impressum
  • Home
  • Listenauswahl
  • Anleitungen

[linux-minidisc] implementing unix himd autodetection function

<-- thread -->
<-- date -->
  • From: Thomas Arp <manner.moe@gmx.de>
  • To: linux-minidisc@lists.fu-berlin.de
  • Date: Sun, 23 Dec 2012 15:47:57 +0100
  • Subject: [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

<-- thread -->
<-- date -->
  • Follow-Ups:
    • Re: [linux-minidisc] implementing unix himd autodetection function
      • From: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
  • References:
    • [linux-minidisc] implementing netmd support in the gui application
      • From: "Thomas Arp" <manner.moe@gmx.de>
    • Re: [linux-minidisc] implementing netmd support in the gui application
      • From: Thomas Arp <manner.moe@gmx.de>
  • linux-minidisc - December 2012 - Archives indexes sorted by:
    [ thread ] [ subject ] [ author ] [ date ]
  • Complete archive of the linux-minidisc mailing list
  • More info on this list...

Hilfe

  • FAQ
  • Dienstbeschreibung
  • ZEDAT Beratung
  • postmaster@lists.fu-berlin.de

Service-Navigation

  • Startseite
  • Listenauswahl

Einrichtung Mailingliste

  • ZEDAT-Portal
  • Mailinglisten Portal