diff --git a/stepmania/src/RageFileManager.cpp b/stepmania/src/RageFileManager.cpp index 2f0f2c113b..310c42b32b 100644 --- a/stepmania/src/RageFileManager.cpp +++ b/stepmania/src/RageFileManager.cpp @@ -282,6 +282,11 @@ void RageFileManager::MountInitialFilesystems() HOOKS->MountInitialFilesystems( RageFileManagerUtil::sDirOfExecutable ); } +void RageFileManager::MountUserFilesystems() +{ + HOOKS->MountUserFilesystems( RageFileManagerUtil::sDirOfExecutable ); +} + RageFileManager::~RageFileManager() { /* Note that drivers can use previously-loaded drivers, eg. to load a ZIP diff --git a/stepmania/src/RageFileManager.h b/stepmania/src/RageFileManager.h index a2f92547ae..a784265499 100644 --- a/stepmania/src/RageFileManager.h +++ b/stepmania/src/RageFileManager.h @@ -18,6 +18,7 @@ public: RageFileManager( const RString &argv0 ); ~RageFileManager(); void MountInitialFilesystems(); + void MountUserFilesystems(); void GetDirListing( const RString &sPath, vector &AddTo, bool bOnlyDirs, bool bReturnPathToo ); bool Move( const RString &sOldPath, const RString &sNewPath ); diff --git a/stepmania/src/SpecialFiles.h b/stepmania/src/SpecialFiles.h index b83ce7a94e..d1e04a2151 100644 --- a/stepmania/src/SpecialFiles.h +++ b/stepmania/src/SpecialFiles.h @@ -5,7 +5,7 @@ namespace SpecialFiles { - extern const RString USER_PACKAGES_DIR; + extern const RString USER_PACKAGES_DIR; // user packages should be a separate dir from system packages so that we can write to it (installing a package) extern const RString PACKAGES_DIR; // system packages (not user packages) extern const RString KEYMAPS_PATH; extern const RString PREFERENCES_INI_PATH; diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index e152f6e350..112cf07215 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -949,6 +949,10 @@ int main(int argc, char* argv[]) /* Almost everything uses this to read and write files. Load this early. */ FILEMAN = new RageFileManager( argv[0] ); FILEMAN->MountInitialFilesystems(); + bool bPortable = DoesFileExist("Portable.ini"); + if( !bPortable ) + FILEMAN->MountUserFilesystems(); + /* Set this up next. Do this early, since it's needed for RageException::Throw. */ LOG = new RageLog; diff --git a/stepmania/src/arch/ArchHooks/ArchHooks.h b/stepmania/src/arch/ArchHooks/ArchHooks.h index 930499418f..c43122b964 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks.h +++ b/stepmania/src/arch/ArchHooks/ArchHooks.h @@ -93,6 +93,11 @@ public: */ static void MountInitialFilesystems( const RString &sDirOfExecutable ); + /* + * Add file search paths for user-writable directories. + */ + static void MountUserFilesystems( const RString &sDirOfExecutable ); + /* * Platform-specific code calls this to indicate focus changes. */ diff --git a/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp b/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp index f800ddde2d..f3dc6d64d6 100644 --- a/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp +++ b/stepmania/src/arch/ArchHooks/ArchHooks_Win32Static.cpp @@ -40,7 +40,7 @@ int64_t ArchHooks::GetMicrosecondsSinceStart( bool bAccurate ) return ret; } -void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) +static RString GetMountDir( const RString &sDirOfExecutable ) { /* All Windows data goes in the directory one level above the executable. */ CHECKPOINT_M( ssprintf( "DOE \"%s\"", sDirOfExecutable.c_str()) ); @@ -49,15 +49,18 @@ void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) CHECKPOINT_M( ssprintf( "... %i asParts", asParts.size()) ); ASSERT_M( asParts.size() > 1, ssprintf("Strange sDirOfExecutable: %s", sDirOfExecutable.c_str()) ); RString sDir = join( "/", asParts.begin(), asParts.end()-1 ); + return sDir; +} + +void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) +{ + RString sDir = GetMountDir( sDirOfExecutable ); FILEMAN->Mount( "dir", sDir, "/" ); +} - /* Experimental: Check for a sentinel file and then operate in portable mode. */ - // TODO: Make this cross-platform? - bool bPortable = DoesFileExist("Portable.ini"); - RString sPortableDir = sDir + "/Portable"; - - // Mount everything game-writable (not counting the editor) to the user's directory. - RString sAppDataDir = bPortable ? sPortableDir : SpecialDirs::GetAppDataDir() + PRODUCT_ID; +void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable ) +{ + RString sAppDataDir = SpecialDirs::GetAppDataDir() + PRODUCT_ID; FILEMAN->Mount( "dir", sAppDataDir + "/Cache", "/Cache" ); FILEMAN->Mount( "dir", sAppDataDir + "/Logs", "/Logs" ); FILEMAN->Mount( "dir", sAppDataDir + "/Save", "/Save" );