diff options
author | Dominik Wenger <domonoky@googlemail.com> | 2007-06-22 18:53:27 +0000 |
---|---|---|
committer | Dominik Wenger <domonoky@googlemail.com> | 2007-06-22 18:53:27 +0000 |
commit | 69241529ffa4b45b3ebf408e4ed81b6a4142728f (patch) | |
tree | e8aa1bcb5827ad4f6e8e16f105eaf7fc0d5ae764 | |
parent | 00cc66c6332f66b13f7bce4fc7791261735b1ba7 (diff) |
rbutil: reworked device detection, now uses rockbox-info.txt and the patchers to detect the device.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13687 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | rbutil/autodetection.cpp | 299 | ||||
-rw-r--r-- | rbutil/autodetection.h | 86 | ||||
-rw-r--r-- | rbutil/rbutil.cbp | 2 | ||||
-rw-r--r-- | rbutil/rbutilCtrls.cpp | 40 |
4 files changed, 208 insertions, 219 deletions
diff --git a/rbutil/autodetection.cpp b/rbutil/autodetection.cpp index 1d85d961b9..53469ff91b 100644 --- a/rbutil/autodetection.cpp +++ b/rbutil/autodetection.cpp @@ -24,178 +24,177 @@ * General autodetection code ****************************************************/ - -UsbDeviceInfo detectDevicesViaPatchers() +bool ipodpatcherDetect(UsbDeviceInfo* tempdevice) { - UsbDeviceInfo tempdevice; - tempdevice.device_index= 0; - tempdevice.path=wxT(""); - tempdevice.status =0; - - /* scann for ipods */ - + /* use ipodpatcher for ipod detecting */ struct ipod_t ipod; int n = ipod_scan(&ipod); - if(n == 1) + if(n == 1) /* we found an ipod */ { wxString temp(ipod.targetname,wxConvUTF8); int index = gv->plat_bootloadername.Index(temp); // use the bootloader names.. - tempdevice.device_index = index; + tempdevice->device_index = index; + tempdevice->status=DEVICEFOUND; + /* find mount point if possible */ #if !(defined( __WXMSW__ ) || defined( __DARWIN__)) //linux code wxString tmp = resolve_mount_point(wxString(ipod.diskname,wxConvUTF8)+wxT("2")); if( tmp != wxT("") ) - tempdevice.path = tmp; -#endif -#if defined( __WXMSW__ ) //Windows code - wxString tmp = guess_mount_point(); - if( tmp != wxT("") ) - tempdevice.path = tmp; + tempdevice->path = tmp; #endif - return tempdevice; + return true; + } - else if (n > 1) + else if (n > 1) /* to many ipods */ + { + tempdevice->status = TOMANYDEVICES; + return true; + } + else /* no ipod */ { - tempdevice.status = TOMANYDEVICES; - return tempdevice; + return false; } - /* scann for sansas */ +} + +bool sansapatcherDetect(UsbDeviceInfo* tempdevice) +{ + /* scann for sansas */ struct sansa_t sansa; - int n2 = sansa_scan(&sansa); - if(n2==1) + int n = sansa_scan(&sansa); + if(n==1) { - tempdevice.device_index = gv->plat_id.Index(wxT("sansae200")); + tempdevice->device_index = gv->plat_id.Index(wxT("sansae200")); + tempdevice->status = DEVICEFOUND; /* find mount point if possible */ #if !(defined( __WXMSW__ ) || defined( __DARWIN__)) //linux code wxString tmp = resolve_mount_point(wxString(ipod.diskname,wxConvUTF8)+wxT("1")); if( tmp != wxT("") ) - tempdevice.path = tmp; -#endif -#if defined( __WXMSW__ ) // windows code - wxString tmp = guess_mount_point(); - if( tmp != wxT("") ) - tempdevice.path = tmp; + tempdevice->path = tmp; #endif - return tempdevice; + return true; } else if (n > 1) { - tempdevice.status = TOMANYDEVICES; - return tempdevice; + tempdevice->status = TOMANYDEVICES; + return true; } + else + { + return false; + } +} - tempdevice.status = NODEVICE; - return tempdevice; +bool rockboxinfoDetect(wxString filename,UsbDeviceInfo* tempdevice) +{ + wxTextFile rockboxinfo(filename); + rockboxinfo.Open(); + wxString line = rockboxinfo.GetFirstLine(); + wxString targetstring; + if(line.StartsWith(wxT("Target: "), &targetstring)) + { + int index = gv->plat_id.Index(targetstring); + if(index < 0) return false; -} + tempdevice->device_index = index; + wxString myPath; + if(filename.EndsWith(wxT(".rockbox" PATH_SEP "rockbox-info.txt"),&myPath)); + tempdevice->path = myPath; + tempdevice->status = DEVICEFOUND; + return true; + } + else + { + return false; + } -/*************************************************** -* Windows code for autodetection -****************************************************/ -#if defined( __WXMSW__ ) +} + -wxString guess_mount_point() +bool detectDevices(UsbDeviceInfo* tempdevice) { - wxString mountpoint = wxT(""); - TCHAR szDrvName[33]; - DWORD maxDriveSet, curDriveSet; - DWORD drive; - TCHAR szBuf[300]; - HANDLE hDevice; - PSTORAGE_DEVICE_DESCRIPTOR pDevDesc; - - maxDriveSet = GetLogicalDrives(); - curDriveSet = maxDriveSet; - for ( drive = 0; drive < 32; ++drive ) - { - if ( maxDriveSet & (1 << drive) ) - { - DWORD temp = 1<<drive; - _stprintf( szDrvName, _T("%c:\\"), 'A'+drive ); - switch ( GetDriveType( szDrvName ) ) - { - case 0: // The drive type cannot be determined. - case 1: // The root directory does not exist. - case DRIVE_CDROM: // The drive is a CD-ROM drive. - case DRIVE_REMOTE: // The drive is a remote (network) drive. - case DRIVE_RAMDISK: // The drive is a RAM disk. - case DRIVE_REMOVABLE: // The drive can be removed from the drive. - break; - case DRIVE_FIXED: // The disk cannot be removed from the drive. - sprintf(szBuf, "\\\\?\\%c:", 'A'+drive); - hDevice = CreateFile(szBuf, GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); - - if (hDevice != INVALID_HANDLE_VALUE) - { - pDevDesc = (PSTORAGE_DEVICE_DESCRIPTOR)new BYTE[sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1]; - pDevDesc->Size = sizeof(STORAGE_DEVICE_DESCRIPTOR) + 512 - 1; - - if(GetDisksProperty(hDevice, pDevDesc)) - { - if(pDevDesc->BusType == BusTypeUsb) - { - mountpoint.Printf(wxT("%c:\\"), chFirstDriveFromMask(temp)); - } - } - delete pDevDesc; - CloseHandle(hDevice); - } - break; - } - } - } - return mountpoint; + tempdevice->device_index= 0; + tempdevice->path=wxT(""); + tempdevice->status =NODEVICE; + + /* try ipodpatcher */ + if(ipodpatcherDetect(tempdevice)) + { + return true; + } + + /* try sansapatcher */ + if(sansapatcherDetect(tempdevice)) + { + return true; + } + + /*try via files on the devices */ + wxArrayString mountpoints = getPossibleMountPoints(); + + for(unsigned int i=0;i<mountpoints.GetCount();i++) + { + if(wxDir::Exists(mountpoints[i])) + { + /*check for rockbox-info.txt */ + wxString filename; + filename.Printf("%s" PATH_SEP ".rockbox" PATH_SEP "rockbox-info.txt",mountpoints[i].c_str()); + if(wxFile::Exists(filename)) + { + if(rockboxinfoDetect(filename,tempdevice)) + return true; + } + } + } + + return false; } -/**************************************************************************** -* FUNCTION: GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc) -* PURPOSE: get the info of specified device -*****************************************************************************/ -BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc) + + +/*************************************************** +* Windows code for autodetection +****************************************************/ +#if defined( __WXMSW__ ) + +wxArrayString getPossibleMountPoints() { - STORAGE_PROPERTY_QUERY Query; // input param for query - DWORD dwOutBytes; // IOCTL output length - BOOL bResult; // IOCTL return val - - // specify the query type - Query.PropertyId = StorageDeviceProperty; - Query.QueryType = PropertyStandardQuery; - - // Query using IOCTL_STORAGE_QUERY_PROPERTY - bResult = ::DeviceIoControl(hDevice, // device handle - IOCTL_STORAGE_QUERY_PROPERTY, // info of device property - &Query, sizeof(STORAGE_PROPERTY_QUERY), // input data buffer - pDevDesc, pDevDesc->Size, // output data buffer - &dwOutBytes, // out's length - (LPOVERLAPPED)NULL); - - return bResult; + wxArrayString tempList; + tempList.Add(wxT("D:\\")); + tempList.Add(wxT("E:\\")); + tempList.Add(wxT("F:\\")); + tempList.Add(wxT("G:\\")); + tempList.Add(wxT("H:\\")); + tempList.Add(wxT("I:\\")); + tempList.Add(wxT("J:\\")); + tempList.Add(wxT("K:\\")); + tempList.Add(wxT("L:\\")); + tempList.Add(wxT("M:\\")); + tempList.Add(wxT("N:\\")); + tempList.Add(wxT("O:\\")); + tempList.Add(wxT("P:\\")); + tempList.Add(wxT("Q:\\")); + tempList.Add(wxT("R:\\")); + tempList.Add(wxT("S:\\")); + tempList.Add(wxT("T:\\")); + tempList.Add(wxT("U:\\")); + tempList.Add(wxT("V:\\")); + tempList.Add(wxT("W:\\")); + tempList.Add(wxT("X:\\")); + tempList.Add(wxT("Y:\\")); + tempList.Add(wxT("Z:\\")); + + return tempList; } -/********************************************* -* Converts the driveMask to a drive letter -*******************************************/ -char chFirstDriveFromMask (ULONG unitmask) -{ - char i; - for (i = 0; i < 26; ++i) - { - if (unitmask & 0x1) - break; - unitmask = unitmask >> 1; - } - return (i + 'A'); -} #endif /* windows code */ /********************************************************** @@ -203,7 +202,22 @@ char chFirstDriveFromMask (ULONG unitmask) *******************************************************/ #if !(defined( __WXMSW__ ) || defined( __DARWIN__)) +wxArrayString getPossibleMountPoints() +{ + wxArrayString tempList; + FILE *fp = fopen( "/proc/mounts", "r" ); + if( !fp ) return wxT(""); + char *dev, *dir; + while( fscanf( fp, "%as %as %*s %*s %*s %*s", &dev, &dir ) != EOF ) + { + wxString directory = wxString( dir, wxConvUTF8 ); + tempList.Add(directory); + free( dev ); + free( dir ); + } + fclose( fp ); +} wxString resolve_mount_point( const wxString device ) { @@ -228,4 +242,31 @@ wxString resolve_mount_point( const wxString device ) -#endif +#endif /* linux code */ + +/********************************************************** +* MAC code for autodetection +*******************************************************/ +#if defined( __DARWIN__) + +wxArrayString getPossibleMountPoints() +{ + wxArrayString tempList; + + wxDir volumes; + + if(volumes.Open(wxT("/Volumes"))) + { + wxString filename; + bool cont = volumes.GetFirst(&filename, wxEmptyString, wxDIR_DIRS); + while ( cont ) + { + tempList.Add(filename); + cont = dir.GetNext(&filename); + } + } + return tempList; + +} + +#endif /* Mac Code */ diff --git a/rbutil/autodetection.h b/rbutil/autodetection.h index dc2d7d2490..a69b9e4bca 100644 --- a/rbutil/autodetection.h +++ b/rbutil/autodetection.h @@ -29,6 +29,7 @@ #define TOMANYDEVICES 2 #define NODEVICE 1 +#define DEVICEFOUND 0 struct UsbDeviceInfo { @@ -37,87 +38,24 @@ struct UsbDeviceInfo int status; }; -UsbDeviceInfo detectDevicesViaPatchers(); + +bool detectDevices(UsbDeviceInfo* tempdevice); + +wxArrayString getPossibleMountPoints(); /* this funktion has to be implemented for every OS /******************************** -* Windows code for USB Device detection and information +* Windows header for USB Device detection and information **************************************/ #if defined( __WXMSW__ ) -#include <dbt.h> // For DeviceChange. -#include <winioctl.h> // For DeviceIOCtl. - -// IOCTL control code -#define IOCTL_STORAGE_QUERY_PROPERTY CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS) - -//// The following structures all can find at MSDN. -// enumeration type specifies the various types of storage buses -typedef enum _STORAGE_BUS_TYPE { - BusTypeUnknown = 0x00, - BusTypeScsi, - BusTypeAtapi, - BusTypeAta, - BusType1394, - BusTypeSsa, - BusTypeFibre, - BusTypeUsb, - BusTypeRAID, - BusTypeMaxReserved = 0x7F -} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE; -// retrieve the storage device descriptor data for a device. -typedef struct _STORAGE_DEVICE_DESCRIPTOR { - ULONG Version; - ULONG Size; - UCHAR DeviceType; - UCHAR DeviceTypeModifier; - BOOLEAN RemovableMedia; - BOOLEAN CommandQueueing; - ULONG VendorIdOffset; - ULONG ProductIdOffset; - ULONG ProductRevisionOffset; - ULONG SerialNumberOffset; - STORAGE_BUS_TYPE BusType; - ULONG RawPropertiesLength; - UCHAR RawDeviceProperties[1]; - -} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR; -// retrieve the properties of a storage device or adapter. -typedef enum _STORAGE_QUERY_TYPE { - PropertyStandardQuery = 0, - PropertyExistsQuery, - PropertyMaskQuery, - PropertyQueryMaxDefined - -} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE; - -// retrieve the properties of a storage device or adapter. -typedef enum _STORAGE_PROPERTY_ID { - StorageDeviceProperty = 0, - StorageAdapterProperty, - StorageDeviceIdProperty - -} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID; -// retrieve the properties of a storage device or adapter. -typedef struct _STORAGE_PROPERTY_QUERY { - STORAGE_PROPERTY_ID PropertyId; - STORAGE_QUERY_TYPE QueryType; - UCHAR AdditionalParameters[1]; - -} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY; - - -wxString guess_mount_point(); - -BOOL GetDisksProperty(HANDLE hDevice, PSTORAGE_DEVICE_DESCRIPTOR pDevDesc); -char chFirstDriveFromMask (ULONG unitmask); #endif /*__WXMSW__ */ /************************************************************************+ -*Linux code for autodetection +*Linux header for autodetection **************************************************************************/ @@ -131,6 +69,16 @@ wxString resolve_mount_point( const wxString device ); +/************************************************************************+ +*MAc header for autodetection +**************************************************************************/ + + +#if defined( __DARWIN__) + + + +#endif /* MAc Code */ diff --git a/rbutil/rbutil.cbp b/rbutil/rbutil.cbp index 55e4ea72b1..9351795977 100644 --- a/rbutil/rbutil.cbp +++ b/rbutil/rbutil.cbp @@ -93,6 +93,8 @@ </Linker> <Unit filename="Makefile" /> <Unit filename="archos.ico" /> + <Unit filename="autodetection.cpp" /> + <Unit filename="autodetection.h" /> <Unit filename="bootloaders.cpp" /> <Unit filename="bootloaders.h" /> <Unit filename="copying.txt" /> diff --git a/rbutil/rbutilCtrls.cpp b/rbutil/rbutilCtrls.cpp index 887f2e7fb1..441d046ca8 100644 --- a/rbutil/rbutilCtrls.cpp +++ b/rbutil/rbutilCtrls.cpp @@ -439,35 +439,33 @@ void DeviceSelectorCtrl::OnAutoDetect(wxCommandEvent& event) void DeviceSelectorCtrl::AutoDetect() { + UsbDeviceInfo device; + if(detectDevices(&device)) + { - UsbDeviceInfo device = detectDevicesViaPatchers(); + if(device.status == DEVICEFOUND) + { + m_deviceCbx->SetValue(gv->plat_name[device.device_index]); + gv->curplat=gv->plat_id[device.device_index]; - if( device.status == NODEVICE) - { - WARN_DIALOG(wxT("No Device detected. (This function currently only works for Ipods and Sansas)."), + if(device.path != wxT("")) + { + gv->curdestdir = device.path; + } + } + else if(device.status == TOMANYDEVICES) + { + WARN_DIALOG(wxT("More then one device detected, please connect only One"), wxT("Detecting a Device")); - return; + return; + } } - - if( device.status == TOMANYDEVICES) + else { - WARN_DIALOG(wxT("More then one device detected, please connect only One"), + WARN_DIALOG(wxT("No Device detected. (This function only works if you have already installed rockbox or if you use a ipod or a sansa)."), wxT("Detecting a Device")); return; - - } - - if (device.status == 0 ) /* everything is ok */ - { - m_deviceCbx->SetValue(gv->plat_name[device.device_index]); - gv->curplat=gv->plat_id[device.device_index]; - - if(device.path != wxT("")) - { - gv->curdestdir = device.path; - } - } } |