Mount directories read-only where possible
This commit is contained in:
+23
-3
@@ -264,9 +264,15 @@ PrefsManager::PrefsManager() :
|
||||
m_CourseSortOrder ( "CourseSortOrder", COURSE_SORT_SONGS ),
|
||||
m_bSubSortByNumSteps ( "SubSortByNumSteps", false ),
|
||||
m_GetRankingName ( "GetRankingName", RANKING_ON ),
|
||||
m_sAdditionalSongFolders ( "AdditionalSongFolders", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalFolders ( "AdditionalFolders", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalSongFoldersReadOnly( "AdditionalSongFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalSongFoldersWritable( "AdditionalSongFoldersWritable", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalCourseFoldersReadOnly( "AdditionalCourseFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalCourseFoldersWritable( "AdditionalCourseFoldersWritable", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalFoldersReadOnly ( "AdditionalFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalFoldersWritable ( "AdditionalFoldersWritable", "", nullptr, PreferenceType::Immutable ),
|
||||
m_sAdditionalSongFolders ( "AdditionalSongFolders", "", nullptr, PreferenceType::Deprecated ),
|
||||
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "", nullptr, PreferenceType::Deprecated ),
|
||||
m_sAdditionalFolders ( "AdditionalFolders", "", nullptr, PreferenceType::Deprecated ),
|
||||
m_sDefaultTheme ( "DefaultTheme", "default" ),
|
||||
m_sLastSeenVideoDriver ( "LastSeenVideoDriver", "" ),
|
||||
m_sVideoRenderers ( "VideoRenderers", "" ), // StepMania.cpp sets these on first run:
|
||||
@@ -405,6 +411,8 @@ void PrefsManager::ReadPrefsFromDisk()
|
||||
ReadGamePrefsFromIni( SpecialFiles::PREFERENCES_INI_PATH );
|
||||
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
|
||||
|
||||
TranslateDeprecatedFlags();
|
||||
|
||||
if( !m_sCurrentGame.Get().empty() )
|
||||
RestoreGamePrefs();
|
||||
}
|
||||
@@ -416,6 +424,8 @@ void PrefsManager::ResetToFactoryDefaults()
|
||||
IPreference::LoadAllDefaults();
|
||||
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
|
||||
|
||||
TranslateDeprecatedFlags();
|
||||
|
||||
SavePrefsToDisk();
|
||||
}
|
||||
|
||||
@@ -500,6 +510,16 @@ void PrefsManager::ReadDefaultsFromIni( const IniFile &ini, const RString &sSect
|
||||
IPreference::ReadAllDefaultsFromNode( ini.GetChild(sSection) );
|
||||
}
|
||||
|
||||
void PrefsManager::TranslateDeprecatedFlags()
|
||||
{
|
||||
if(!m_sAdditionalFolders.Get().empty())
|
||||
m_sAdditionalFoldersReadOnly.Set(m_sAdditionalFolders.Get());
|
||||
if(!m_sAdditionalSongFolders.Get().empty())
|
||||
m_sAdditionalSongFoldersReadOnly.Set(m_sAdditionalSongFolders.Get());
|
||||
if(!m_sAdditionalCourseFolders.Get().empty())
|
||||
m_sAdditionalCourseFoldersReadOnly.Set(m_sAdditionalCourseFolders.Get());
|
||||
}
|
||||
|
||||
void PrefsManager::SavePrefsToDisk()
|
||||
{
|
||||
IniFile ini;
|
||||
|
||||
+11
-3
@@ -275,9 +275,12 @@ public:
|
||||
Preference<bool> m_bSubSortByNumSteps;
|
||||
Preference<GetRankingName> m_GetRankingName;
|
||||
|
||||
Preference<RString> m_sAdditionalSongFolders;
|
||||
Preference<RString> m_sAdditionalCourseFolders;
|
||||
Preference<RString> m_sAdditionalFolders;
|
||||
Preference<RString> m_sAdditionalSongFoldersReadOnly;
|
||||
Preference<RString> m_sAdditionalSongFoldersWritable;
|
||||
Preference<RString> m_sAdditionalCourseFoldersReadOnly;
|
||||
Preference<RString> m_sAdditionalCourseFoldersWritable;
|
||||
Preference<RString> m_sAdditionalFoldersReadOnly;
|
||||
Preference<RString> m_sAdditionalFoldersWritable;
|
||||
|
||||
// failsafe
|
||||
Preference<RString> m_sDefaultTheme;
|
||||
@@ -352,6 +355,11 @@ public:
|
||||
protected:
|
||||
void ReadPrefsFromFile( const RString &sIni, const RString &sSection, bool bIsStatic );
|
||||
void ReadDefaultsFromFile( const RString &sIni, const RString &sSection );
|
||||
void TranslateDeprecatedFlags();
|
||||
|
||||
Preference<RString> m_sAdditionalSongFolders; // deprecated
|
||||
Preference<RString> m_sAdditionalCourseFolders; // deprecated
|
||||
Preference<RString> m_sAdditionalFolders; // deprecated
|
||||
};
|
||||
|
||||
/* This is global, because it can be accessed by crash handlers and error handlers
|
||||
|
||||
+4
-22
@@ -22,7 +22,6 @@ RageFileManager *FILEMAN = nullptr;
|
||||
/* Lock this before touching any of these globals (except FILEMAN itself). */
|
||||
static RageEvent *g_Mutex;
|
||||
|
||||
RString RageFileManagerUtil::sInitialWorkingDirectory;
|
||||
RString RageFileManagerUtil::sDirOfExecutable;
|
||||
|
||||
struct LoadedDriver
|
||||
@@ -276,7 +275,6 @@ static RString GetDirOfExecutable( RString argv0 )
|
||||
|
||||
static void ChangeToDirOfExecutable( const RString &argv0 )
|
||||
{
|
||||
RageFileManagerUtil::sInitialWorkingDirectory = GetCwd();
|
||||
RageFileManagerUtil::sDirOfExecutable = GetDirOfExecutable( argv0 );
|
||||
|
||||
/* Set the CWD. Any effects of this is platform-specific; most files are read and
|
||||
@@ -545,15 +543,15 @@ static void AdjustMountpoint( RString &sMountPoint )
|
||||
|
||||
}
|
||||
|
||||
static void AddFilesystemDriver( LoadedDriver *pLoadedDriver, bool bAddToEnd )
|
||||
static void AddFilesystemDriver( LoadedDriver *pLoadedDriver )
|
||||
{
|
||||
g_Mutex->Lock();
|
||||
g_pDrivers.insert( bAddToEnd? g_pDrivers.end():g_pDrivers.begin(), pLoadedDriver );
|
||||
g_pDrivers.push_back(pLoadedDriver);
|
||||
g_Mountpoints->LoadFromDrivers( g_pDrivers );
|
||||
g_Mutex->Unlock();
|
||||
}
|
||||
|
||||
bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_, bool bAddToEnd )
|
||||
bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_ )
|
||||
{
|
||||
RString sRoot = sRoot_;
|
||||
RString sMountPoint = sMountPoint_;
|
||||
@@ -593,26 +591,10 @@ bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const
|
||||
pLoadedDriver->m_sRoot = sRoot;
|
||||
pLoadedDriver->m_sMountPoint = sMountPoint;
|
||||
|
||||
AddFilesystemDriver( pLoadedDriver, bAddToEnd );
|
||||
AddFilesystemDriver( pLoadedDriver );
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Mount a custom filesystem. */
|
||||
void RageFileManager::Mount( RageFileDriver *pDriver, const RString &sMountPoint_, bool bAddToEnd )
|
||||
{
|
||||
RString sMountPoint = sMountPoint_;
|
||||
|
||||
AdjustMountpoint( sMountPoint );
|
||||
|
||||
LoadedDriver *pLoadedDriver = new LoadedDriver;
|
||||
pLoadedDriver->m_pDriver = pDriver;
|
||||
pLoadedDriver->m_sType = "";
|
||||
pLoadedDriver->m_sRoot = "";
|
||||
pLoadedDriver->m_sMountPoint = sMountPoint;
|
||||
|
||||
AddFilesystemDriver( pLoadedDriver, bAddToEnd );
|
||||
}
|
||||
|
||||
void RageFileManager::Unmount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_ )
|
||||
{
|
||||
RString sRoot = sRoot_;
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
/** @brief Constants for working with the RageFileManager. */
|
||||
namespace RageFileManagerUtil
|
||||
{
|
||||
extern RString sInitialWorkingDirectory;
|
||||
extern RString sDirOfExecutable;
|
||||
}
|
||||
|
||||
@@ -48,8 +47,7 @@ public:
|
||||
* @return the absolute path. */
|
||||
RString ResolvePath(const RString &path);
|
||||
|
||||
bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint, bool bAddToEnd = true );
|
||||
void Mount( RageFileDriver *pDriver, const RString &sMountPoint, bool bAddToEnd = true );
|
||||
bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint );
|
||||
void Unmount( const RString &sType, const RString &sRoot, const RString &sMountPoint );
|
||||
|
||||
/* Change the root of a filesystem. Only a couple drivers support this; it's
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
#include "global.h"
|
||||
#include "SpecialFiles.h"
|
||||
|
||||
const RString SpecialFiles::USER_PACKAGES_DIR = "UserPackages/";
|
||||
const RString SpecialFiles::PACKAGES_DIR = "Packages/";
|
||||
const RString SpecialFiles::KEYMAPS_PATH = "Save/Keymaps.ini";
|
||||
const RString SpecialFiles::EDIT_MODE_KEYMAPS_PATH = "Save/EditMode_Keymaps.ini";
|
||||
|
||||
@@ -4,16 +4,6 @@
|
||||
/** @brief The listing of the special files and directories in use. */
|
||||
namespace SpecialFiles
|
||||
{
|
||||
/**
|
||||
* @brief The user packages directory.
|
||||
*
|
||||
* This should be separate from system packages so that
|
||||
* we can write to it (installing a package).
|
||||
*/
|
||||
extern const RString USER_PACKAGES_DIR;
|
||||
/** @brief The system packages directory.
|
||||
*
|
||||
* This is not the user packages directory. */
|
||||
extern const RString PACKAGES_DIR;
|
||||
extern const RString KEYMAPS_PATH;
|
||||
/** @brief Edit Mode keymaps are separate from standard keymaps because
|
||||
|
||||
+21
-26
@@ -917,19 +917,30 @@ static void MountTreeOfZips( const RString &dir )
|
||||
GetDirListing( path + "/*.zip", zips, false, true );
|
||||
GetDirListing( path + "/*.smzip", zips, false, true );
|
||||
|
||||
for( unsigned i = 0; i < zips.size(); ++i )
|
||||
for (const auto& zip : zips)
|
||||
{
|
||||
if( !IsAFile(zips[i]) )
|
||||
if( !IsAFile(zip) )
|
||||
continue;
|
||||
|
||||
LOG->Trace( "VFS: found %s", zips[i].c_str() );
|
||||
FILEMAN->Mount( "zip", zips[i], "/" );
|
||||
LOG->Trace( "VFS: found %s", zip.c_str() );
|
||||
FILEMAN->Mount( "zip", zip, "/" );
|
||||
}
|
||||
|
||||
GetDirListing( path + "/*", dirs, true, true );
|
||||
}
|
||||
}
|
||||
|
||||
static void MountFolders(const RString &type, const RString &realPathList, const RString &mountPoint)
|
||||
{
|
||||
if (!realPathList.empty())
|
||||
{
|
||||
vector<RString> dirs;
|
||||
split(realPathList, ",", dirs, true);
|
||||
for (const auto& dir : dirs)
|
||||
FILEMAN->Mount(type, dir, mountPoint);
|
||||
}
|
||||
}
|
||||
|
||||
static void WriteLogHeader()
|
||||
{
|
||||
LOG->Info("%s%s", PRODUCT_FAMILY, product_version);
|
||||
@@ -1022,30 +1033,14 @@ int sm_main(int argc, char* argv[])
|
||||
WriteLogHeader();
|
||||
|
||||
// Set up alternative filesystem trees.
|
||||
if( PREFSMAN->m_sAdditionalFolders.Get() != "" )
|
||||
{
|
||||
vector<RString> dirs;
|
||||
split( PREFSMAN->m_sAdditionalFolders, ",", dirs, true );
|
||||
for( unsigned i=0; i < dirs.size(); i++)
|
||||
FILEMAN->Mount( "dir", dirs[i], "/" );
|
||||
}
|
||||
if( PREFSMAN->m_sAdditionalSongFolders.Get() != "" )
|
||||
{
|
||||
vector<RString> dirs;
|
||||
split( PREFSMAN->m_sAdditionalSongFolders, ",", dirs, true );
|
||||
for( unsigned i=0; i < dirs.size(); i++)
|
||||
FILEMAN->Mount( "dir", dirs[i], "/Songs" );
|
||||
}
|
||||
if( PREFSMAN->m_sAdditionalCourseFolders.Get() != "" )
|
||||
{
|
||||
vector<RString> dirs;
|
||||
split( PREFSMAN->m_sAdditionalCourseFolders, ",", dirs, true );
|
||||
for( unsigned i=0; i < dirs.size(); i++)
|
||||
FILEMAN->Mount( "dir", dirs[i], "/Courses" );
|
||||
}
|
||||
MountFolders("dirro", PREFSMAN->m_sAdditionalFoldersReadOnly.Get(), "/");
|
||||
MountFolders("dir", PREFSMAN->m_sAdditionalFoldersWritable.Get(), "/");
|
||||
MountFolders("dirro", PREFSMAN->m_sAdditionalSongFoldersReadOnly.Get(), "/Songs");
|
||||
MountFolders("dir", PREFSMAN->m_sAdditionalSongFoldersWritable.Get(), "/Songs");
|
||||
MountFolders("dirro", PREFSMAN->m_sAdditionalCourseFoldersReadOnly.Get(), "/Courses");
|
||||
MountFolders("dir", PREFSMAN->m_sAdditionalCourseFoldersWritable.Get(), "/Courses");
|
||||
|
||||
MountTreeOfZips( SpecialFiles::PACKAGES_DIR );
|
||||
MountTreeOfZips( SpecialFiles::USER_PACKAGES_DIR );
|
||||
|
||||
/* One of the above filesystems might contain files that affect preferences
|
||||
* (e.g. Data/Static.ini). Re-read preferences. */
|
||||
|
||||
@@ -4,10 +4,10 @@
|
||||
#include "RageUtil.h"
|
||||
#include "archutils/Unix/CrashHandler.h"
|
||||
#include "archutils/Unix/SignalHandler.h"
|
||||
#include "SpecialFiles.h"
|
||||
#include "ProductInfo.h"
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#include <ApplicationServices/ApplicationServices.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <mach/mach.h>
|
||||
@@ -318,13 +318,15 @@ static void PathForFolderType( char dir[PATH_MAX], OSType folderType )
|
||||
|
||||
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
|
||||
{
|
||||
char dir[PATH_MAX];
|
||||
struct stat st;
|
||||
bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st);
|
||||
FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/");
|
||||
|
||||
CFURLRef dataUrl = CFBundleCopyResourceURL( CFBundleGetMainBundle(), CFSTR("StepMania"), CFSTR("smzip"), nil);
|
||||
|
||||
FILEMAN->Mount( "dir", sDirOfExecutable, "/" );
|
||||
|
||||
if( dataUrl )
|
||||
{
|
||||
char dir[PATH_MAX];
|
||||
|
||||
CFStringRef dataPath = CFURLCopyFileSystemPath( dataUrl, kCFURLPOSIXPathStyle );
|
||||
CFStringGetCString( dataPath, dir, PATH_MAX, kCFStringEncodingUTF8 );
|
||||
|
||||
@@ -353,7 +355,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Characters", dir), "/Characters" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Courses", dir), "/Courses" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/NoteSkins", dir), "/NoteSkins" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Packages", dir), "/" + SpecialFiles::USER_PACKAGES_DIR );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Packages", dir), "/Packages" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Songs", dir), "/Songs" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/RandomMovies", dir), "/RandomMovies" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Themes", dir), "/Themes" );
|
||||
@@ -369,29 +371,25 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
// /Logs -> ~/Library/Logs/PRODUCT_ID
|
||||
PathForFolderType( dir, kDomainLibraryFolderType );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Logs/" PRODUCT_ID, dir), "/Logs" );
|
||||
|
||||
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
|
||||
if( resourcePath )
|
||||
{
|
||||
const char* resourcePathUTF8String = [resourcePath UTF8String];
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Packages", resourcePathUTF8String), "/" + SpecialFiles::USER_PACKAGES_DIR );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" );
|
||||
FILEMAN->Mount( "dir", ssprintf("%s/Data", resourcePathUTF8String), "/Data" );
|
||||
}
|
||||
|
||||
// /Desktop -> /Users/<user>/Desktop/PRODUCT_ID
|
||||
// PathForFolderType( dir, kDesktopFolderType );
|
||||
// FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID, dir), "/Desktop" );
|
||||
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
|
||||
if( resourcePath )
|
||||
{
|
||||
const char* resourcePathUTF8String = [resourcePath UTF8String];
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Packages", resourcePathUTF8String), "/Packages" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" );
|
||||
FILEMAN->Mount( "dirro", ssprintf("%s/Data", resourcePathUTF8String), "/Data" );
|
||||
}
|
||||
}
|
||||
|
||||
static inline int GetIntValue( CFTypeRef r )
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#include "global.h"
|
||||
#include "ArchHooks_Unix.h"
|
||||
#include "ProductInfo.h"
|
||||
#include "RageFileManager.h"
|
||||
#include "RageLog.h"
|
||||
#include "RageUtil.h"
|
||||
#include "RageThreads.h"
|
||||
#include "LocalizedString.h"
|
||||
#include "SpecialFiles.h"
|
||||
#include "archutils/Unix/SignalHandler.h"
|
||||
#include "archutils/Unix/GetSysInfo.h"
|
||||
#include "archutils/Common/PthreadHelpers.h"
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#include <sys/time.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
@@ -380,24 +381,11 @@ RString ArchHooks_Unix::GetClipboard()
|
||||
#endif
|
||||
}
|
||||
|
||||
#include "RageFileManager.h"
|
||||
#include <sys/stat.h>
|
||||
|
||||
static LocalizedString COULDNT_FIND_SONGS( "ArchHooks_Unix", "Couldn't find 'Songs'" );
|
||||
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
|
||||
{
|
||||
RString Root;
|
||||
struct stat st;
|
||||
if( !stat(sDirOfExecutable + "/Packages", &st) && st.st_mode&S_IFDIR )
|
||||
Root = sDirOfExecutable;
|
||||
else if( !stat(sDirOfExecutable + "/Songs", &st) && st.st_mode&S_IFDIR )
|
||||
Root = sDirOfExecutable;
|
||||
else if( !stat(RageFileManagerUtil::sInitialWorkingDirectory + "/Songs", &st) && st.st_mode&S_IFDIR )
|
||||
Root = RageFileManagerUtil::sInitialWorkingDirectory;
|
||||
else
|
||||
RageException::Throw( "%s", COULDNT_FIND_SONGS.GetValue().c_str() );
|
||||
|
||||
FILEMAN->Mount( "dir", Root, "/" );
|
||||
bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st);
|
||||
FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/");
|
||||
}
|
||||
|
||||
void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
@@ -417,7 +405,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Courses", "/Courses" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Logs", "/Logs" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/NoteSkins", "/NoteSkins" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Packages", "/" + SpecialFiles::USER_PACKAGES_DIR );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Packages", "/Packages" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Save", "/Save" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Screenshots", "/Screenshots" );
|
||||
FILEMAN->Mount( "dir", sUserDataPath + "/Songs", "/Songs" );
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
#include "archutils/Win32/SpecialDirs.h"
|
||||
#include "ProductInfo.h"
|
||||
#include "RageFileManager.h"
|
||||
#include "SpecialFiles.h"
|
||||
|
||||
// for timeGetTime
|
||||
#include <windows.h>
|
||||
@@ -56,8 +55,9 @@ static RString GetMountDir( const RString &sDirOfExecutable )
|
||||
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
|
||||
{
|
||||
RString sDir = GetMountDir( sDirOfExecutable );
|
||||
|
||||
FILEMAN->Mount( "dir", sDir, "/" );
|
||||
|
||||
bool portable = GetFileAttributes(sDir + "/Portable.ini", &st) != INVALID_FILE_ATTRIBUTES;
|
||||
FILEMAN->Mount(portable ? "dir" : "dirro", sDir, "/");
|
||||
}
|
||||
|
||||
void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
@@ -84,7 +84,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Courses", "/Courses" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Logs", "/Logs" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/NoteSkins", "/NoteSkins" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Packages", "/" + SpecialFiles::USER_PACKAGES_DIR );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Packages", "/Packages" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Save", "/Save" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Screenshots", "/Screenshots" );
|
||||
FILEMAN->Mount( "dir", sAppDataDir + "/Songs", "/Songs" );
|
||||
|
||||
@@ -122,9 +122,9 @@ bool MemoryCardDriver::DoOneUpdate( bool bMount, vector<UsbStorageDevice>& vStor
|
||||
* and then unmount it until Mount() is called. */
|
||||
d.m_State = UsbStorageDevice::STATE_READY;
|
||||
|
||||
FILEMAN->Mount( "dir", d.sOsMountDir, TEMP_MOUNT_POINT );
|
||||
FILEMAN->Mount( "dirro", d.sOsMountDir, TEMP_MOUNT_POINT );
|
||||
d.bIsNameAvailable = PROFILEMAN->FastLoadProfileNameFromMemoryCard( TEMP_MOUNT_POINT, d.sName );
|
||||
FILEMAN->Unmount( "dir", d.sOsMountDir, TEMP_MOUNT_POINT );
|
||||
FILEMAN->Unmount( "dirro", d.sOsMountDir, TEMP_MOUNT_POINT );
|
||||
}
|
||||
|
||||
this->Unmount( &d );
|
||||
|
||||
Reference in New Issue
Block a user