#include "global.h" /* ----------------------------------------------------------------------------- Class: MemoryCardManager Desc: See Header. Copyright (c) 2001-2003 by the person(s) listed below. All rights reserved. Chris Danford Chris Gomez ----------------------------------------------------------------------------- */ #include "MemoryCardManager.h" #include "arch/MemoryCard/MemoryCardDriver.h" // for UsbStorageDevice #include "arch/arch.h" #include "ScreenManager.h" #include "ThemeManager.h" #include "PrefsManager.h" #include "RageLog.h" #include "ScreenManager.h" #include "ProfileManager.h" MemoryCardManager* MEMCARDMAN = NULL; // global and accessable from anywhere in our program MemoryCardManager::MemoryCardManager() { m_pDriver = MakeMemoryCardDriver(); m_bCardsLocked = false; for( int p=0; pGetStorageDevices( m_vStorageDevices ); m_soundReady.Load( THEME->GetPathToS("MemoryCardManager ready") ); m_soundError.Load( THEME->GetPathToS("MemoryCardManager error") ); m_soundTooLate.Load( THEME->GetPathToS("MemoryCardManager too late") ); m_soundDisconnect.Load( THEME->GetPathToS("MemoryCardManager disconnect") ); AssignUnassignedCards(); } MemoryCardManager::~MemoryCardManager() { delete m_pDriver; } void MemoryCardManager::Update( float fDelta ) { if( m_pDriver->StorageDevicesChanged() ) { vector vOld = m_vStorageDevices; // copy m_pDriver->GetStorageDevices( m_vStorageDevices ); vector &vNew = m_vStorageDevices; vector vConnects; // fill these in below vector vDisconnects; // fill these in below // check for disconnects { for( unsigned i=0; iTrace( ssprintf("Disconnected bus %d port %d device %d path %s", old.iBus, old.iPortOnHub, old.iDeviceOnBus, old.sOsMountDir.c_str()) ); vDisconnects.push_back( old ); } } } // check for connects { for( unsigned i=0; iTrace( ssprintf("Connected bus %d port %d device %d path %s", newd.iBus, newd.iPortOnHub, newd.iDeviceOnBus, newd.sOsMountDir.c_str()) ); vConnects.push_back( newd ); } } } // unassign cards that were disconnected { for( int p=0; pProfileWasLoadedFromMemoryCard((PlayerNumber)p) ) PROFILEMAN->UnloadProfile( (PlayerNumber)p ); } } } AssignUnassignedCards(); if( !m_bCardsLocked ) { for( int p=0; pLoadProfileFromMemoryCard( (PlayerNumber)p ); } SCREENMAN->RefreshCreditsMessages(); } } MemoryCardState MemoryCardManager::GetCardState( PlayerNumber pn ) { if( m_Device[pn].IsBlank() ) return MEMORY_CARD_STATE_NO_CARD; else if( m_bTooLate[pn] ) return MEMORY_CARD_STATE_TOO_LATE; else if( m_bWriteError[pn] ) return MEMORY_CARD_STATE_WRITE_ERROR; else return MEMORY_CARD_STATE_READY; } CString MemoryCardManager::GetOsMountDir( PlayerNumber pn ) { if( m_Device[pn].IsBlank() ) return ""; else return m_Device[pn].sOsMountDir; } void MemoryCardManager::LockCards( bool bLock ) { m_bCardsLocked = bLock; if( !bLock ) { // clear too late flag for( int p=0; p vUnassignedDevices = m_vStorageDevices; // copy // remove cards that are already assigned { for( int p=0; p::iterator it = find(vUnassignedDevices.begin(),vUnassignedDevices.end(),m_Device[p]); ASSERT( it != vUnassignedDevices.end() ) // the assigned card better be connected! vUnassignedDevices.erase( it ); } } // try to assign each device to a player { for( int p=0; pm_sMemoryCardOsMountPoint[p].empty() ) { for( i=0; im_sMemoryCardOsMountPoint[p]) == 0 ) // match goto match; } } // search for USB bus match for( i=0; im_iMemoryCardUsbBus[p] != -1 && PREFSMAN->m_iMemoryCardUsbBus[p] != usd.iBus ) continue; // not a match if( PREFSMAN->m_iMemoryCardUsbPort[p] != -1 && PREFSMAN->m_iMemoryCardUsbPort[p] != usd.iPortOnHub ) continue; // not a match goto match; } LOG->Trace( "Player %d memory card: none", p+1 ); continue; // no matches match: m_Device[p] = vUnassignedDevices[i]; // save a copy LOG->Trace( "Player %d memory card: '%s'", p+1, m_Device[p].sOsMountDir.c_str() ); vUnassignedDevices.erase( vUnassignedDevices.begin()+i ); // remove the device so we don't match it for another player m_bTooLate[p] = m_bCardsLocked; m_bWriteError[p] = false; if( !m_bCardsLocked ) if( !m_pDriver->MountAndTestWrite(&m_Device[p]) ) m_bWriteError[p] = true; // play sound if( m_bWriteError[p] ) m_soundError.Play(); else if( m_bTooLate[p] ) m_soundTooLate.Play(); else m_soundReady.Play(); } } } void MemoryCardManager::FlushAllDisks() { for( int p=0; pFlush(&m_Device[p]); } }