134 lines
3.5 KiB
C++
134 lines
3.5 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
TempDirectory.cpp
|
|
|
|
Paul Licameli split from FileNames.cpp
|
|
|
|
**********************************************************************/
|
|
|
|
#include "TempDirectory.h"
|
|
|
|
#include "FileNames.h"
|
|
#include "widgets/ErrorDialog.h"
|
|
|
|
static wxString &TempDirPath()
|
|
{
|
|
static wxString path;
|
|
return path;
|
|
}
|
|
|
|
/// Returns the directory used for temp files.
|
|
/// \todo put a counter in here to see if it gets used a lot.
|
|
/// if it does, then maybe we should cache the path name
|
|
/// each time.
|
|
wxString TempDirectory::TempDir()
|
|
{
|
|
auto &path = TempDirPath();
|
|
if (gPrefs && path.empty())
|
|
path =
|
|
gPrefs->Read(PreferenceKey(FileNames::Operation::Temp,
|
|
FileNames::PathType::_None), wxT(""));
|
|
|
|
if (FileNames::IsOnFATFileSystem(path))
|
|
{
|
|
ShowErrorDialog(
|
|
nullptr,
|
|
XO("Unsuitable"),
|
|
XO("The temporary files directory is on a FAT formatted drive.\n"
|
|
"Resetting to default location."),
|
|
"Error:_Unsuitable_drive"
|
|
);
|
|
|
|
path = DefaultTempDir();
|
|
UpdateDefaultPath(FileNames::Operation::Temp, path);
|
|
}
|
|
|
|
return FileNames::MkDir(path);
|
|
}
|
|
|
|
void TempDirectory::ResetTempDir()
|
|
{
|
|
TempDirPath().clear();
|
|
}
|
|
|
|
/** \brief Default temp directory */
|
|
static FilePath sDefaultTempDir;
|
|
|
|
const FilePath &TempDirectory::DefaultTempDir()
|
|
{
|
|
return sDefaultTempDir;
|
|
}
|
|
|
|
void TempDirectory::SetDefaultTempDir( const FilePath &tempDir )
|
|
{
|
|
sDefaultTempDir = tempDir;
|
|
}
|
|
|
|
// We now disallow temp directory name that puts it where cleaner apps will
|
|
// try to clean out the files.
|
|
bool TempDirectory::IsTempDirectoryNameOK( const FilePath & Name )
|
|
{
|
|
if( Name.empty() )
|
|
return false;
|
|
|
|
wxFileName tmpFile;
|
|
tmpFile.AssignTempFileName(wxT("nn"));
|
|
// use Long Path to expand out any abbreviated long substrings.
|
|
wxString BadPath = tmpFile.GetLongPath();
|
|
::wxRemoveFile(tmpFile.GetFullPath());
|
|
|
|
#ifdef __WXMAC__
|
|
// This test is to fix bug 1220 on a 1.x to 2.x to 2.1.3 upgrade.
|
|
// It is less permissive than we could be as it stops a path
|
|
// with this string ANYWHERE within it rather than excluding just
|
|
// the paths that the earlier Audacities used to create.
|
|
if( Name.Contains( "/tmp/") )
|
|
return false;
|
|
BadPath = BadPath.BeforeLast( '/' ) + "/";
|
|
wxFileName cmpFile( Name );
|
|
wxString NameCanonical = cmpFile.GetLongPath( ) + "/";
|
|
#else
|
|
BadPath = BadPath.BeforeLast( '\\' ) + "\\";
|
|
wxFileName cmpFile( Name );
|
|
wxString NameCanonical = cmpFile.GetLongPath( ) + "\\";
|
|
#endif
|
|
|
|
if (FATFilesystemDenied(NameCanonical,
|
|
XO("The temporary files directory is on a FAT formatted drive.\n"
|
|
"Resetting to default location.")))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return !(NameCanonical.StartsWith( BadPath ));
|
|
}
|
|
|
|
wxString TempDirectory::UnsavedProjectFileName()
|
|
{
|
|
wxFileName fn(TempDir(),
|
|
FileNames::CreateUniqueName(wxT("New Project"), FileNames::UnsavedProjectExtension()));
|
|
|
|
return fn.GetFullPath();
|
|
}
|
|
|
|
bool TempDirectory::FATFilesystemDenied( const FilePath &path,
|
|
const TranslatableString &msg,
|
|
wxWindow *window /* = nullptr */ )
|
|
{
|
|
if (FileNames::IsOnFATFileSystem(path))
|
|
{
|
|
ShowErrorDialog(
|
|
window,
|
|
XO("Unsuitable"),
|
|
XO("%s\n\nFor tips on suitable drives, click the help button.").Format(msg),
|
|
"Error:_Unsuitable_drive"
|
|
);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|