diff --git a/stepmania/src/MemoryCardManager.h b/stepmania/src/MemoryCardManager.h index f68d394ce3..e500c84ed1 100644 --- a/stepmania/src/MemoryCardManager.h +++ b/stepmania/src/MemoryCardManager.h @@ -40,6 +40,8 @@ public: void FlushAllDisks(); // force all files to be written to mounted memory cards bool PathIsMemCard( CString sDir ) const; + + CString GetName( PlayerNumber pn ) const { return m_Device[pn].sName; } protected: void AssignUnassignedCards(); // do our best to assign a Device to each player diff --git a/stepmania/src/ProfileManager.cpp b/stepmania/src/ProfileManager.cpp index 265f22f29f..ffff01f900 100644 --- a/stepmania/src/ProfileManager.cpp +++ b/stepmania/src/ProfileManager.cpp @@ -133,21 +133,36 @@ bool ProfileManager::LoadProfileFromMemoryCard( PlayerNumber pn, bool bLoadNames // mount slot if( MEMCARDMAN->GetCardState(pn) == MEMORY_CARD_STATE_READY ) { - CString sDir = MEM_CARD_MOUNT_POINT[pn]; + if( bLoadNamesOnly ) + { + CString sMemCardDir = MEM_CARD_MOUNT_POINT[pn]; + CString sProfileDir = sMemCardDir + PREFSMAN->m_sMemoryCardProfileSubdir + '/'; - // tack on a subdirectory so that we don't write everything to the root - sDir += PREFSMAN->m_sMemoryCardProfileSubdir; - sDir += '/'; + m_sProfileDir[pn] = sProfileDir; + m_bWasLoadedFromMemoryCard[pn] = true; - bool bResult; - bResult = LoadProfile( pn, sDir, true, bLoadNamesOnly ); - if( bResult ) + m_Profile[pn].InitAll(); + m_Profile[pn].m_sDisplayName = MEMCARDMAN->GetName(pn); return true; - - CreateMemoryCardProfile( pn ); + } + else + { + CString sDir = MEM_CARD_MOUNT_POINT[pn]; + + // tack on a subdirectory so that we don't write everything to the root + sDir += PREFSMAN->m_sMemoryCardProfileSubdir; + sDir += '/'; + + bool bResult; + bResult = LoadProfile( pn, sDir, true, bLoadNamesOnly ); + if( bResult ) + return true; - bResult = LoadProfile( pn, sDir, true, bLoadNamesOnly ); - return bResult; + CreateMemoryCardProfile( pn ); + + bResult = LoadProfile( pn, sDir, true, bLoadNamesOnly ); + return bResult; + } } #endif return false; diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriver.h b/stepmania/src/arch/MemoryCard/MemoryCardDriver.h index 1eb80740a6..e824aee962 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriver.h +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriver.h @@ -21,6 +21,8 @@ struct UsbStorageDevice CString sSerial; int iUsbStorageIndex; CString sOsMountDir; // WITHOUT trailing slash + CString sName; // Name in the profile on the memory card. + // This is passed here because it's read in the mounting thread. bool IsBlank() { return sOsMountDir.empty(); } diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp index 4f3e13c6c8..8be371268c 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Linux.cpp @@ -3,6 +3,8 @@ #include "RageLog.h" #include "RageUtil.h" #include "RageFileManager.h" +#include "Profile.h" +#include "PrefsManager.h" #include #include @@ -13,6 +15,8 @@ #include +const CString TEMP_MOUNT_POINT = "@mctemp/"; + static const char *USB_DEVICE_LIST_FILE = "/proc/bus/usb/devices"; static const char *ETC_MTAB = "/etc/mtab"; @@ -144,6 +148,15 @@ void MemoryCardDriverThreaded_Linux::MountThreadMain() bool bMountedSuccessfully = ExecuteCommand( sCommand ); d.bWriteTestSucceeded = bMountedSuccessfully && TestWrite( d.sOsMountDir ); + + // read name + this->Mount( &usbd, TEMP_MOUNT_POINT ); + FILEMAN->FlushDirCache( TEMP_MOUNT_POINT ); + Profile profile; + CString sProfileDir = TEMP_MOUNT_POINT + PREFSMAN->m_sMemoryCardProfileSubdir + '/'; + profile.LoadEditableDataFromDir( sProfileDir ); + usbd.sName = profile.GetDisplayName(); + LOG->Trace( "write test %s", d.bWriteTestSucceeded ? "succeeded" : "failed" ); } @@ -376,8 +389,8 @@ void MemoryCardDriverThreaded_Linux::Mount( UsbStorageDevice* pDevice, CString s { if( Mounts[i].Type.CompareNoCase( "dir" ) ) continue; // wrong type - if( Mounts[i].Root.CompareNoCase( pDevice->sOsMountDir ) ) - continue; // wrong root + if( Mounts[i].MountPoint.CompareNoCase( sMountPoint ) ) + continue; // wrong mount point FILEMAN->Unmount( Mounts[i].Type, Mounts[i].Root, Mounts[i].MountPoint ); } diff --git a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Windows.cpp b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Windows.cpp index becb99f729..8cd566f595 100644 --- a/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Windows.cpp +++ b/stepmania/src/arch/MemoryCard/MemoryCardDriverThreaded_Windows.cpp @@ -5,8 +5,13 @@ #include #include "RageFileManager.h" #include "RageLog.h" +#include "Profile.h" +#include "PrefsManager.h" #include +const CString TEMP_MOUNT_POINT = "@mctemp/"; + + MemoryCardDriverThreaded_Windows::MemoryCardDriverThreaded_Windows() { StartThread(); @@ -72,6 +77,15 @@ void MemoryCardDriverThreaded_Windows::MountThreadMain() UsbStorageDeviceEx usbd; usbd.sOsMountDir = sDrive; usbd.bWriteTestSucceeded = TestWrite( sDrive ); + + // read name + this->Mount( &usbd, TEMP_MOUNT_POINT ); + FILEMAN->FlushDirCache( TEMP_MOUNT_POINT ); + Profile profile; + CString sProfileDir = TEMP_MOUNT_POINT + PREFSMAN->m_sMemoryCardProfileSubdir + '/'; + profile.LoadEditableDataFromDir( sProfileDir ); + usbd.sName = profile.GetDisplayName(); + vNewStorageDevices.push_back( usbd ); } } @@ -100,8 +114,8 @@ void MemoryCardDriverThreaded_Windows::Mount( UsbStorageDevice* pDevice, CString { if( Mounts[i].Type.CompareNoCase( "dir" ) ) continue; // wrong type - if( Mounts[i].Root.CompareNoCase( pDevice->sOsMountDir ) ) - continue; // wrong root + if( Mounts[i].MountPoint.CompareNoCase( sMountPoint ) ) + continue; // wrong mount point FILEMAN->Unmount( Mounts[i].Type, Mounts[i].Root, Mounts[i].MountPoint ); }