CResourceStore: Make use of ranged for where applicable
Same behavior, less code.
This commit is contained in:
parent
e9dd2c57a6
commit
1b71d91ea7
|
@ -117,13 +117,13 @@ bool CResourceStore::SerializeDatabaseCache(IArchive& rArc)
|
||||||
|
|
||||||
if (rArc.IsReader())
|
if (rArc.IsReader())
|
||||||
{
|
{
|
||||||
for (auto Iter = EmptyDirectories.begin(); Iter != EmptyDirectories.end(); Iter++)
|
for (const auto& dir : EmptyDirectories)
|
||||||
{
|
{
|
||||||
// Don't create empty virtual directories that don't actually exist in the filesystem
|
// Don't create empty virtual directories that don't actually exist in the filesystem
|
||||||
TString AbsPath = ResourcesDir() + *Iter;
|
const TString AbsPath = ResourcesDir() + dir;
|
||||||
|
|
||||||
if (FileUtil::Exists(AbsPath))
|
if (FileUtil::Exists(AbsPath))
|
||||||
CreateVirtualDirectory(*Iter);
|
CreateVirtualDirectory(dir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +148,10 @@ bool CResourceStore::LoadDatabaseCache()
|
||||||
if (!BuildFromDirectory(true))
|
if (!BuildFromDirectory(true))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else return false;
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -181,31 +184,33 @@ bool CResourceStore::SaveDatabaseCache()
|
||||||
|
|
||||||
void CResourceStore::ConditionalSaveStore()
|
void CResourceStore::ConditionalSaveStore()
|
||||||
{
|
{
|
||||||
if (mDatabaseCacheDirty) SaveDatabaseCache();
|
if (mDatabaseCacheDirty)
|
||||||
|
SaveDatabaseCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CResourceStore::SetProject(CGameProject *pProj)
|
void CResourceStore::SetProject(CGameProject *pProj)
|
||||||
{
|
{
|
||||||
if (mpProj == pProj) return;
|
if (mpProj == pProj)
|
||||||
|
return;
|
||||||
|
|
||||||
if (mpProj)
|
if (mpProj)
|
||||||
CloseProject();
|
CloseProject();
|
||||||
|
|
||||||
mpProj = pProj;
|
mpProj = pProj;
|
||||||
|
|
||||||
if (mpProj)
|
if (!mpProj)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mDatabasePath = mpProj->ProjectRoot();
|
||||||
|
mpDatabaseRoot = new CVirtualDirectory(this);
|
||||||
|
mGame = mpProj->Game();
|
||||||
|
|
||||||
|
// Clear deleted files from previous runs
|
||||||
|
const TString DeletedPath = DeletedResourcePath();
|
||||||
|
|
||||||
|
if (FileUtil::Exists(DeletedPath))
|
||||||
{
|
{
|
||||||
mDatabasePath = mpProj->ProjectRoot();
|
FileUtil::ClearDirectory(DeletedPath);
|
||||||
mpDatabaseRoot = new CVirtualDirectory(this);
|
|
||||||
mGame = mpProj->Game();
|
|
||||||
|
|
||||||
// Clear deleted files from previous runs
|
|
||||||
TString DeletedPath = DeletedResourcePath();
|
|
||||||
|
|
||||||
if (FileUtil::Exists(DeletedPath))
|
|
||||||
{
|
|
||||||
FileUtil::ClearDirectory(DeletedPath);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,9 +226,9 @@ void CResourceStore::CloseProject()
|
||||||
{
|
{
|
||||||
warnf("%d resources still loaded on project close:", mLoadedResources.size());
|
warnf("%d resources still loaded on project close:", mLoadedResources.size());
|
||||||
|
|
||||||
for (auto Iter = mLoadedResources.begin(); Iter != mLoadedResources.end(); Iter++)
|
for (const auto& entry : mLoadedResources)
|
||||||
{
|
{
|
||||||
CResourceEntry *pEntry = Iter->second;
|
const CResourceEntry *pEntry = entry.second;
|
||||||
warnf("\t%s.%s", *pEntry->Name(), *pEntry->CookedExtension().ToString());
|
warnf("\t%s.%s", *pEntry->Name(), *pEntry->CookedExtension().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,7 +239,7 @@ void CResourceStore::CloseProject()
|
||||||
mResourceEntries.clear();
|
mResourceEntries.clear();
|
||||||
|
|
||||||
// Clear deleted files from previous runs
|
// Clear deleted files from previous runs
|
||||||
TString DeletedPath = DeletedResourcePath();
|
const TString DeletedPath = DeletedResourcePath();
|
||||||
|
|
||||||
if (FileUtil::Exists(DeletedPath))
|
if (FileUtil::Exists(DeletedPath))
|
||||||
{
|
{
|
||||||
|
@ -251,10 +256,11 @@ CVirtualDirectory* CResourceStore::GetVirtualDirectory(const TString& rkPath, bo
|
||||||
{
|
{
|
||||||
if (rkPath.IsEmpty())
|
if (rkPath.IsEmpty())
|
||||||
return mpDatabaseRoot;
|
return mpDatabaseRoot;
|
||||||
else if (mpDatabaseRoot)
|
|
||||||
|
if (mpDatabaseRoot)
|
||||||
return mpDatabaseRoot->FindChildDirectory(rkPath, AllowCreate);
|
return mpDatabaseRoot->FindChildDirectory(rkPath, AllowCreate);
|
||||||
else
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CResourceStore::CreateVirtualDirectory(const TString& rkPath)
|
void CResourceStore::CreateVirtualDirectory(const TString& rkPath)
|
||||||
|
@ -291,7 +297,7 @@ CResourceEntry* CResourceStore::FindEntry(const CAssetID& rkID) const
|
||||||
{
|
{
|
||||||
if (rkID.IsValid())
|
if (rkID.IsValid())
|
||||||
{
|
{
|
||||||
auto Found = mResourceEntries.find(rkID);
|
const auto Found = mResourceEntries.find(rkID);
|
||||||
|
|
||||||
if (Found != mResourceEntries.cend())
|
if (Found != mResourceEntries.cend())
|
||||||
{
|
{
|
||||||
|
@ -307,7 +313,7 @@ CResourceEntry* CResourceStore::FindEntry(const CAssetID& rkID) const
|
||||||
|
|
||||||
CResourceEntry* CResourceStore::FindEntry(const TString& rkPath) const
|
CResourceEntry* CResourceStore::FindEntry(const TString& rkPath) const
|
||||||
{
|
{
|
||||||
return (mpDatabaseRoot ? mpDatabaseRoot->FindChildResource(rkPath) : nullptr);
|
return mpDatabaseRoot ? mpDatabaseRoot->FindChildResource(rkPath) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CResourceStore::AreAllEntriesValid() const
|
bool CResourceStore::AreAllEntriesValid() const
|
||||||
|
@ -329,8 +335,8 @@ void CResourceStore::ClearDatabase()
|
||||||
if (!mLoadedResources.empty())
|
if (!mLoadedResources.empty())
|
||||||
{
|
{
|
||||||
debugf("ERROR: Resources still loaded:");
|
debugf("ERROR: Resources still loaded:");
|
||||||
for (auto Iter = mLoadedResources.begin(); Iter != mLoadedResources.end(); Iter++)
|
for (const auto& [asset, entry] : mLoadedResources)
|
||||||
debugf("\t[%s] %s", *Iter->first.ToString(), *Iter->second->CookedAssetPath(true));
|
debugf("\t[%s] %s", *asset.ToString(), *entry->CookedAssetPath(true));
|
||||||
ASSERT(false);
|
ASSERT(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,10 +358,9 @@ bool CResourceStore::BuildFromDirectory(bool ShouldGenerateCacheFile)
|
||||||
TStringList ResourceList;
|
TStringList ResourceList;
|
||||||
FileUtil::GetDirectoryContents(ResDir, ResourceList);
|
FileUtil::GetDirectoryContents(ResDir, ResourceList);
|
||||||
|
|
||||||
for (auto Iter = ResourceList.begin(); Iter != ResourceList.end(); Iter++)
|
for (const auto& Path : ResourceList)
|
||||||
{
|
{
|
||||||
TString Path = *Iter;
|
TString RelPath = Path.ChopFront(ResDir.Size());
|
||||||
TString RelPath = Path.ChopFront( ResDir.Size() );
|
|
||||||
|
|
||||||
if (FileUtil::IsFile(Path) && Path.EndsWith(".rsmeta"))
|
if (FileUtil::IsFile(Path) && Path.EndsWith(".rsmeta"))
|
||||||
{
|
{
|
||||||
|
@ -363,11 +368,11 @@ bool CResourceStore::BuildFromDirectory(bool ShouldGenerateCacheFile)
|
||||||
TString DirPath = RelPath.GetFileDirectory();
|
TString DirPath = RelPath.GetFileDirectory();
|
||||||
TString CookedFilename = RelPath.GetFileName(false); // This call removes the .rsmeta extension
|
TString CookedFilename = RelPath.GetFileName(false); // This call removes the .rsmeta extension
|
||||||
TString ResName = CookedFilename.GetFileName(false); // This call removes the cooked extension
|
TString ResName = CookedFilename.GetFileName(false); // This call removes the cooked extension
|
||||||
ASSERT( IsValidResourcePath(DirPath, ResName) );
|
ASSERT(IsValidResourcePath(DirPath, ResName));
|
||||||
|
|
||||||
// Determine resource type
|
// Determine resource type
|
||||||
TString CookedExtension = CookedFilename.GetFileExtension();
|
TString CookedExtension = CookedFilename.GetFileExtension();
|
||||||
CResTypeInfo *pTypeInfo = CResTypeInfo::TypeForCookedExtension( Game(), CFourCC(CookedExtension) );
|
CResTypeInfo* pTypeInfo = CResTypeInfo::TypeForCookedExtension(Game(), CFourCC(CookedExtension));
|
||||||
|
|
||||||
if (!pTypeInfo)
|
if (!pTypeInfo)
|
||||||
{
|
{
|
||||||
|
@ -517,7 +522,7 @@ CResource* CResourceStore::LoadResource(const TString& rkPath)
|
||||||
if (pEntry)
|
if (pEntry)
|
||||||
{
|
{
|
||||||
// Verify extension matches the entry + load resource
|
// Verify extension matches the entry + load resource
|
||||||
TString Ext = rkPath.GetFileExtension();
|
const TString Ext = rkPath.GetFileExtension();
|
||||||
|
|
||||||
if (!Ext.IsEmpty())
|
if (!Ext.IsEmpty())
|
||||||
{
|
{
|
||||||
|
@ -541,7 +546,7 @@ void CResourceStore::TrackLoadedResource(CResourceEntry *pEntry)
|
||||||
{
|
{
|
||||||
ASSERT(pEntry->IsLoaded());
|
ASSERT(pEntry->IsLoaded());
|
||||||
ASSERT(mLoadedResources.find(pEntry->ID()) == mLoadedResources.end());
|
ASSERT(mLoadedResources.find(pEntry->ID()) == mLoadedResources.end());
|
||||||
mLoadedResources[pEntry->ID()] = pEntry;
|
mLoadedResources.insert_or_assign(pEntry->ID(), pEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CResourceStore::DestroyUnreferencedResources()
|
void CResourceStore::DestroyUnreferencedResources()
|
||||||
|
@ -573,14 +578,14 @@ void CResourceStore::DestroyUnreferencedResources()
|
||||||
|
|
||||||
bool CResourceStore::DeleteResourceEntry(CResourceEntry *pEntry)
|
bool CResourceStore::DeleteResourceEntry(CResourceEntry *pEntry)
|
||||||
{
|
{
|
||||||
CAssetID ID = pEntry->ID();
|
const CAssetID ID = pEntry->ID();
|
||||||
|
|
||||||
if (pEntry->IsLoaded())
|
if (pEntry->IsLoaded())
|
||||||
{
|
{
|
||||||
if (!pEntry->Unload())
|
if (!pEntry->Unload())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto It = mLoadedResources.find(ID);
|
const auto It = mLoadedResources.find(ID);
|
||||||
ASSERT(It != mLoadedResources.end());
|
ASSERT(It != mLoadedResources.end());
|
||||||
mLoadedResources.erase(It);
|
mLoadedResources.erase(It);
|
||||||
}
|
}
|
||||||
|
@ -588,7 +593,7 @@ bool CResourceStore::DeleteResourceEntry(CResourceEntry *pEntry)
|
||||||
if (pEntry->Directory())
|
if (pEntry->Directory())
|
||||||
pEntry->Directory()->RemoveChildResource(pEntry);
|
pEntry->Directory()->RemoveChildResource(pEntry);
|
||||||
|
|
||||||
auto It = mResourceEntries.find(ID);
|
const auto It = mResourceEntries.find(ID);
|
||||||
ASSERT(It != mResourceEntries.end());
|
ASSERT(It != mResourceEntries.end());
|
||||||
mResourceEntries.erase(It);
|
mResourceEntries.erase(It);
|
||||||
|
|
||||||
|
@ -653,7 +658,7 @@ void CResourceStore::ImportNamesFromPakContentsTxt(const TString& rkTxtPath, boo
|
||||||
// Chop name to just after "x_rep"
|
// Chop name to just after "x_rep"
|
||||||
uint32 RepStart = Path.IndexOfPhrase("_rep");
|
uint32 RepStart = Path.IndexOfPhrase("_rep");
|
||||||
|
|
||||||
if (RepStart != -1)
|
if (RepStart != UINT32_MAX)
|
||||||
Path = Path.ChopFront(RepStart + 5);
|
Path = Path.ChopFront(RepStart + 5);
|
||||||
|
|
||||||
// If the "x_rep" folder doesn't exist in this path for some reason, but this is still a path, then just chop off the drive letter.
|
// If the "x_rep" folder doesn't exist in this path for some reason, but this is still a path, then just chop off the drive letter.
|
||||||
|
@ -661,24 +666,24 @@ void CResourceStore::ImportNamesFromPakContentsTxt(const TString& rkTxtPath, boo
|
||||||
else if (Path[1] == ':')
|
else if (Path[1] == ':')
|
||||||
Path = Path.ChopFront(3);
|
Path = Path.ChopFront(3);
|
||||||
|
|
||||||
PathMap[pEntry] = Path;
|
PathMap.insert_or_assign(pEntry, std::move(Path));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(pContentsFile);
|
fclose(pContentsFile);
|
||||||
|
|
||||||
// Assign names
|
// Assign names
|
||||||
for (auto Iter = PathMap.begin(); Iter != PathMap.end(); Iter++)
|
for (auto& [entry, path] : PathMap)
|
||||||
{
|
{
|
||||||
CResourceEntry *pEntry = Iter->first;
|
if (UnnamedOnly && entry->IsNamed())
|
||||||
if (UnnamedOnly && pEntry->IsNamed()) continue;
|
continue;
|
||||||
|
|
||||||
TString Path = Iter->second;
|
TString Dir = path.GetFileDirectory();
|
||||||
TString Dir = Path.GetFileDirectory();
|
TString Name = path.GetFileName(false);
|
||||||
TString Name = Path.GetFileName(false);
|
if (Dir.IsEmpty())
|
||||||
if (Dir.IsEmpty()) Dir = pEntry->DirectoryPath();
|
Dir = entry->DirectoryPath();
|
||||||
|
|
||||||
pEntry->MoveAndRename(Dir, Name);
|
entry->MoveAndRename(Dir, Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save
|
// Save
|
||||||
|
@ -689,13 +694,13 @@ bool CResourceStore::IsValidResourcePath(const TString& rkPath, const TString& r
|
||||||
{
|
{
|
||||||
// Path must not be an absolute path and must not go outside the project structure.
|
// Path must not be an absolute path and must not go outside the project structure.
|
||||||
// Name must not be a path.
|
// Name must not be a path.
|
||||||
return ( CVirtualDirectory::IsValidDirectoryPath(rkPath) &&
|
return CVirtualDirectory::IsValidDirectoryPath(rkPath) &&
|
||||||
FileUtil::IsValidName(rkName, false) &&
|
FileUtil::IsValidName(rkName, false) &&
|
||||||
!rkName.Contains('/') &&
|
!rkName.Contains('/') &&
|
||||||
!rkName.Contains('\\') );
|
!rkName.Contains('\\');
|
||||||
}
|
}
|
||||||
|
|
||||||
TString CResourceStore::StaticDefaultResourceDirPath(EGame Game)
|
TString CResourceStore::StaticDefaultResourceDirPath(EGame Game)
|
||||||
{
|
{
|
||||||
return (Game < EGame::CorruptionProto ? "Uncategorized/" : "uncategorized/");
|
return Game < EGame::CorruptionProto ? "Uncategorized/" : "uncategorized/";
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue