mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-11 22:51:06 +02:00
202 lines
7.0 KiB
C++
202 lines
7.0 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
DirManager.h
|
|
|
|
Dominic Mazzoni
|
|
|
|
**********************************************************************/
|
|
|
|
#ifndef _DIRMANAGER_
|
|
#define _DIRMANAGER_
|
|
|
|
#include <wx/list.h>
|
|
#include <wx/string.h>
|
|
#include <wx/filename.h>
|
|
#include <wx/hashmap.h>
|
|
|
|
#include "WaveTrack.h"
|
|
|
|
class wxHashTable;
|
|
class BlockFile;
|
|
class SequenceTest;
|
|
|
|
#define FSCKstatus_CLOSE_REQ 0x1
|
|
#define FSCKstatus_CHANGED 0x2
|
|
#define FSCKstatus_SAVE_AUP 0x4 // used in combination with FSCKstatus_CHANGED
|
|
|
|
WX_DECLARE_HASH_MAP(int, int, wxIntegerHash, wxIntegerEqual, DirHash);
|
|
WX_DECLARE_HASH_MAP(wxString, BlockFile*, wxStringHash, wxStringEqual, BlockHash);
|
|
|
|
wxMemorySize GetFreeMemory();
|
|
|
|
class DirManager: public XMLTagHandler {
|
|
public:
|
|
|
|
// MM: Construct DirManager with refcount=1
|
|
DirManager();
|
|
|
|
// MM: Only called by Deref() when refcount reaches zero.
|
|
virtual ~DirManager();
|
|
|
|
static void SetTempDir(wxString _temp) { globaltemp = _temp; }
|
|
|
|
// MM: Ref count mechanism for the DirManager itself
|
|
void Ref();
|
|
void Deref();
|
|
|
|
// Returns true on success.
|
|
// If SetProject is told NOT to create the directory
|
|
// but it doesn't already exist, SetProject fails and returns false.
|
|
bool SetProject(wxString& newProjPath, wxString& newProjName, const bool bCreate);
|
|
|
|
wxString GetProjectDataDir();
|
|
wxString GetProjectName();
|
|
|
|
wxLongLong GetFreeDiskSpace();
|
|
|
|
BlockFile *NewSimpleBlockFile(samplePtr sampleData,
|
|
sampleCount sampleLen,
|
|
sampleFormat format,
|
|
bool allowDeferredWrite = false);
|
|
|
|
BlockFile *NewAliasBlockFile( wxString aliasedFile, sampleCount aliasStart,
|
|
sampleCount aliasLen, int aliasChannel);
|
|
|
|
BlockFile *NewODAliasBlockFile( wxString aliasedFile, sampleCount aliasStart,
|
|
sampleCount aliasLen, int aliasChannel);
|
|
|
|
BlockFile *NewODDecodeBlockFile( wxString aliasedFile, sampleCount aliasStart,
|
|
sampleCount aliasLen, int aliasChannel, int decodeType);
|
|
|
|
/// Returns true if the blockfile pointed to by b is contained by the DirManager
|
|
bool ContainsBlockFile(BlockFile *b);
|
|
/// Check for existing using filename using complete filename
|
|
bool ContainsBlockFile(wxString filepath);
|
|
|
|
// Adds one to the reference count of the block file,
|
|
// UNLESS it is "locked", then it makes a new copy of
|
|
// the BlockFile.
|
|
BlockFile *CopyBlockFile(BlockFile *b);
|
|
|
|
BlockFile *LoadBlockFile(const wxChar **attrs, sampleFormat format);
|
|
void SaveBlockFile(BlockFile *f, int depth, FILE *fp);
|
|
|
|
#if LEGACY_PROJECT_FILE_SUPPORT
|
|
BlockFile *LoadBlockFile(wxTextFile * in, sampleFormat format);
|
|
void SaveBlockFile(BlockFile * f, wxTextFile * out);
|
|
#endif
|
|
|
|
bool MoveToNewProjectDirectory(BlockFile *f);
|
|
bool CopyToNewProjectDirectory(BlockFile *f);
|
|
|
|
bool EnsureSafeFilename(wxFileName fName);
|
|
|
|
void Ref(BlockFile * f);
|
|
void Deref(BlockFile * f);
|
|
|
|
// For debugging only
|
|
int GetRefCount(BlockFile * f);
|
|
|
|
void SetLoadingTarget(BlockFile **target) { mLoadingTarget = target; }
|
|
void SetLoadingFormat(sampleFormat format) { mLoadingFormat = format; }
|
|
void SetLoadingBlockLength(sampleCount len) { mLoadingBlockLen = len; }
|
|
void SetMaxSamples(sampleCount max) { mMaxSamples = max; }
|
|
bool HandleXMLTag(const wxChar *tag, const wxChar **attrs);
|
|
XMLTagHandler *HandleXMLChild(const wxChar *tag) { return NULL; }
|
|
void WriteXML(XMLWriter &xmlFile) { };
|
|
bool AssignFile(wxFileName &filename,wxString value,bool check);
|
|
|
|
// Clean the temp dir. Note that now where we have auto recovery the temp
|
|
// dir is not cleaned at start up anymore. But it is cleaned when the
|
|
// program is exited normally.
|
|
static void CleanTempDir();
|
|
|
|
// Check the project for errors and possibly prompt user
|
|
// bForceError: Always show log error alert even if no errors are found here.
|
|
// Important when you know that there are already errors in the log.
|
|
// bAutoRecoverMode: Do not show any option dialogs for how to deal with errors found here.
|
|
// Too complicated during auto-recover. Just correct problems the "safest" way.
|
|
int ProjectFSCK(const bool bForceError, const bool bAutoRecoverMode);
|
|
|
|
void FindMissingAliasedFiles(
|
|
BlockHash& missingAliasedFileAUFHash, // output: (.auf) AliasBlockFiles whose aliased files are missing
|
|
BlockHash& missingAliasedFilePathHash); // output: full paths of missing aliased files
|
|
void FindMissingAUFs(
|
|
BlockHash& missingAUFHash); // output: missing (.auf) AliasBlockFiles
|
|
void FindMissingAUs(
|
|
BlockHash& missingAUHash); // missing data (.au) blockfiles
|
|
// Find .au and .auf files that are not in the project.
|
|
void FindOrphanBlockFiles(
|
|
const wxArrayString& filePathArray, // input: all files in project directory
|
|
wxArrayString& orphanFilePathArray); // output: orphan files
|
|
|
|
|
|
// Remove all orphaned blockfiles without user interaction. This is
|
|
// generally safe, because orphaned blockfiles are not referenced by the
|
|
// project and thus worthless anyway.
|
|
void RemoveOrphanBlockfiles();
|
|
|
|
// Get directory where data files are in. Note that projects are normally
|
|
// not interested in this information, but it is important for the
|
|
// auto-save functionality
|
|
wxString GetDataFilesDir() const;
|
|
|
|
// This should only be used by the auto save functionality
|
|
void SetLocalTempDir(wxString path);
|
|
|
|
// Do not delete any temporary files on exit. This is only called if
|
|
// auto recovery is cancelled and should be retried later
|
|
static void SetDontDeleteTempFiles() { dontDeleteTempFiles = true; }
|
|
|
|
// Write all write-cached block files to disc, if any
|
|
void WriteCacheToDisk();
|
|
|
|
// Fill cache of blockfiles, if caching is enabled (otherwise do nothing)
|
|
void FillBlockfilesCache();
|
|
|
|
private:
|
|
|
|
wxFileName MakeBlockFileName();
|
|
wxFileName MakeBlockFilePath(wxString value);
|
|
|
|
bool MoveOrCopyToNewProjectDirectory(BlockFile *f, bool copy);
|
|
|
|
int mRef; // MM: Current refcount
|
|
|
|
BlockHash mBlockFileHash; // repository for blockfiles
|
|
DirHash dirTopPool; // available toplevel dirs
|
|
DirHash dirTopFull; // full toplevel dirs
|
|
DirHash dirMidPool; // available two-level dirs
|
|
DirHash dirMidFull; // full two-level dirs
|
|
|
|
void BalanceInfoDel(wxString);
|
|
void BalanceInfoAdd(wxString);
|
|
void BalanceFileAdd(int);
|
|
int BalanceMidAdd(int, int);
|
|
|
|
wxString projName;
|
|
wxString projPath;
|
|
wxString projFull;
|
|
|
|
wxString lastProject;
|
|
|
|
wxArrayString aliasList;
|
|
|
|
BlockFile **mLoadingTarget;
|
|
sampleFormat mLoadingFormat;
|
|
sampleCount mLoadingBlockLen;
|
|
|
|
sampleCount mMaxSamples;
|
|
|
|
static wxString globaltemp;
|
|
wxString mytemp;
|
|
static int numDirManagers;
|
|
static bool dontDeleteTempFiles;
|
|
|
|
friend class SequenceTest;
|
|
};
|
|
|
|
#endif
|