Add w32 mountpoint resolving based on disc number correctly this time.
authorbluebrother <bluebrother@a1c6a512-1295-4272-9138-f99709370657>
Sun, 29 Jun 2008 09:50:20 +0000 (29 09:50 +0000)
committerbluebrother <bluebrother@a1c6a512-1295-4272-9138-f99709370657>
Sun, 29 Jun 2008 09:50:20 +0000 (29 09:50 +0000)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17873 a1c6a512-1295-4272-9138-f99709370657

rbutil/rbutilqt/autodetection.cpp
rbutil/rbutilqt/utils.cpp
rbutil/rbutilqt/utils.h

index 431cb02..7399907 100644 (file)
 #include <tchar.h>
 #include <windows.h>
 #include <setupapi.h>
+#include <winioctl.h>
 #endif
 #include "detect.h"
+#include "utils.h"
 
 Autodetection::Autodetection(QObject* parent): QObject(parent)
 {
@@ -157,14 +159,12 @@ bool Autodetection::detect()
     if(n == 1) {
         qDebug() << "Ipod found:" << ipod.modelstr << "at" << ipod.diskname;
         m_device = ipod.targetname;
-#if !defined(Q_OS_WIN32)
         m_mountpoint = resolveMountPoint(ipod.diskname);
-#endif
-#if defined(Q_OS_WIN32)
-        m_mountpoint = getMountpointByDevice(ipod.diskname);
-#endif
         return true;
     }
+    else {
+        qDebug() << "ipodpatcher: no Ipod found." << n;
+    }
 
     //try sansapatcher
     struct sansa_t sansa;
@@ -172,14 +172,12 @@ bool Autodetection::detect()
     if(n == 1) {
         qDebug() << "Sansa found:" << sansa.targetname << "at" << sansa.diskname;
         m_device = QString("sansa%1").arg(sansa.targetname);
-#if !defined(Q_OS_WIN32)
         m_mountpoint = resolveMountPoint(sansa.diskname);
-#endif
-#if defined(Q_OS_WIN32)
-        m_mountpoint = getMountpointByDevice(sansa.diskname);
-#endif
         return true;
     }
+    else {
+        qDebug() << "sansapatcher: no Sansa found." << n;
+    }
 
     if(m_mountpoint.isEmpty() && m_device.isEmpty() && m_errdev.isEmpty() && m_incompat.isEmpty())
         return false;
@@ -256,8 +254,43 @@ QString Autodetection::resolveMountPoint(QString device)
         mntinf++;
     }
 #endif
-    return QString("");
 
+#if defined(Q_OS_WIN32)
+    QString result;
+    unsigned int driveno = device.replace(QRegExp("^.*([0-9]+)"), "\\1").toInt();
+
+    for(int letter = 'A'; letter <= 'Z'; letter++) {
+        DWORD written;
+        HANDLE h;
+        TCHAR uncpath[MAX_PATH];
+        UCHAR buffer[0x400];
+        PVOLUME_DISK_EXTENTS extents = (PVOLUME_DISK_EXTENTS)buffer;
+
+        _stprintf(uncpath, _TEXT("\\\\.\\%c:"), letter);
+        h = CreateFile(uncpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
+                NULL, OPEN_EXISTING, 0, NULL);
+        if(h == INVALID_HANDLE_VALUE) {
+            //qDebug() << "error getting extents for" << uncpath;
+            continue;
+        }
+        // get the extents
+        if(DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
+                    NULL, 0, extents, sizeof(buffer), &written, NULL)) {
+            for(unsigned int a = 0; a < extents->NumberOfDiskExtents; a++) {
+                qDebug() << "Disk:" << extents->Extents[a].DiskNumber;
+                if(extents->Extents[a].DiskNumber == driveno) {
+                    result = letter;
+                    qDebug("drive found for volume %i: %c", driveno, letter);
+                    break;
+                }
+            }
+
+        }
+
+    }
+    return result + ":/";
+#endif
+    return QString("");
 }
 
 
index 3e3a591..a6a80c6 100644 (file)
@@ -99,41 +99,3 @@ QString resolvePathCase(QString path)
     return realpath;
 }
 
-#if defined(Q_OS_WIN32)
-QString getMountpointByDevice(int drive)
-{
-    QString result;
-    for(int letter = 'A'; letter <= 'Z'; letter++) {
-        DWORD written;
-        HANDLE h;
-        TCHAR uncpath[MAX_PATH];
-        UCHAR buffer[0x400];
-        PVOLUME_DISK_EXTENTS extents = (PVOLUME_DISK_EXTENTS)buffer;
-
-        _stprintf(uncpath, _TEXT("\\\\.\\%c:"), letter);
-        h = CreateFile(uncpath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
-                NULL, OPEN_EXISTING, 0, NULL);
-        if(h == INVALID_HANDLE_VALUE) {
-            qDebug() << "error getting extents for" << uncpath;
-            continue;
-        }
-        // get the extents
-        if(DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
-                    NULL, 0, extents, sizeof(buffer), &written, NULL)) {
-            for(int a = 0; a < extents->NumberOfDiskExtents; a++) {
-                qDebug() << "Disk:" << extents->Extents[a].DiskNumber;
-                if(extents->Extents[a].DiskNumber == drive) {
-                    result = letter;
-                    qDebug("found: %c", letter);
-                    break;
-                }
-            }
-
-        }
-
-    }
-    return result;
-
-}
-#endif
-
index 904f590..19cdca9 100644 (file)
@@ -29,9 +29,5 @@
 bool recRmdir( const QString &dirName );
 QString resolvePathCase(QString path);
 
-#if defined(Q_OS_WIN32)
-QString getMountpointByDevice(int drive);
-#endif
-
 #endif