mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
enable intro videos in VFS mode workaround for original intro hack allow to get real path of a file (only CVFSFile) streamline Allocator usage in VFile small non-VFS mode fixes in MPHostScreen.cpp Synced "Cutting Fences" in a multiplayer game git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2973 3b4a5df2-a311-0410-b5c6-a8a6f20db521
149 lines
3.2 KiB
C++
149 lines
3.2 KiB
C++
#include "vfs_vloc.h"
|
|
#include "vfs_vfile.h"
|
|
#include "vfs_profile.h"
|
|
#include "vfs.h"
|
|
|
|
/************************************************************************/
|
|
|
|
vfs::CVirtualLocation::Iterator::Iterator(CVirtualLocation* pLoc)
|
|
: m_pLoc(pLoc)
|
|
{
|
|
_vfile_iter = m_pLoc->m_mapVFiles.begin();
|
|
}
|
|
|
|
vfs::CVirtualLocation::Iterator::Iterator()
|
|
: m_pLoc(NULL)
|
|
{
|
|
}
|
|
|
|
vfs::CVirtualLocation::Iterator::~Iterator()
|
|
{
|
|
}
|
|
|
|
vfs::CVirtualFile* vfs::CVirtualLocation::Iterator::value()
|
|
{
|
|
if(m_pLoc && _vfile_iter != m_pLoc->m_mapVFiles.end())
|
|
{
|
|
return _vfile_iter->second;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void vfs::CVirtualLocation::Iterator::next()
|
|
{
|
|
if(m_pLoc && _vfile_iter != m_pLoc->m_mapVFiles.end())
|
|
{
|
|
_vfile_iter++;
|
|
}
|
|
}
|
|
|
|
bool vfs::CVirtualLocation::Iterator::end()
|
|
{
|
|
if(m_pLoc)
|
|
{
|
|
return _vfile_iter == m_pLoc->m_mapVFiles.end();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/************************************************************************/
|
|
|
|
vfs::CVirtualLocation::CVirtualLocation(vfs::Path const& sPath)
|
|
: Path(sPath), m_bExclusive(false)
|
|
{};
|
|
|
|
vfs::CVirtualLocation::~CVirtualLocation()
|
|
{
|
|
tVFiles::iterator it = m_mapVFiles.begin();
|
|
for(; it != m_mapVFiles.end(); ++it)
|
|
{
|
|
it->second->Destroy();
|
|
}
|
|
m_mapVFiles.clear();
|
|
}
|
|
|
|
void vfs::CVirtualLocation::SetIsExclusive(bool bExclusive)
|
|
{
|
|
m_bExclusive = bExclusive;
|
|
}
|
|
bool vfs::CVirtualLocation::GetIsExclusive()
|
|
{
|
|
return m_bExclusive;
|
|
}
|
|
|
|
void vfs::CVirtualLocation::AddFile(vfs::IBaseFile* pFile, utf8string const& sProfileName)
|
|
{
|
|
tVFiles::iterator it = m_mapVFiles.find(pFile->GetFileName());
|
|
CVirtualFile *pVFile = NULL;
|
|
if(it == m_mapVFiles.end())
|
|
{
|
|
vfs::Path& fp = pFile->GetFullPath();
|
|
vfs::CProfileStack& stack = *(GetVFS()->GetProfileStack());
|
|
pVFile = vfs::CVirtualFile::Create(fp,stack);
|
|
it = m_mapVFiles.insert(m_mapVFiles.end(), std::pair<vfs::Path,vfs::CVirtualFile*>(pFile->GetFileName(),pVFile));
|
|
}
|
|
it->second->Add(pFile,sProfileName,true);
|
|
}
|
|
|
|
vfs::IBaseFile* vfs::CVirtualLocation::GetFile(vfs::Path const& sFilename, utf8string const& sProfileName) const
|
|
{
|
|
tVFiles::const_iterator cit = m_mapVFiles.find(sFilename);
|
|
if(cit != m_mapVFiles.end() && cit->second)
|
|
{
|
|
if(sProfileName.empty())
|
|
{
|
|
if(m_bExclusive)
|
|
{
|
|
return cit->second->File(vfs::CVirtualFile::SF_STOP_ON_WRITEABLE_PROFILE);
|
|
}
|
|
else
|
|
{
|
|
return cit->second->File(vfs::CVirtualFile::SF_TOP);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// you know what you are doing
|
|
return cit->second->File(sProfileName);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
vfs::CVirtualFile* vfs::CVirtualLocation::GetVFile(vfs::Path const& sFilename)
|
|
{
|
|
tVFiles::const_iterator cit = m_mapVFiles.find(sFilename);
|
|
if(cit != m_mapVFiles.end())
|
|
{
|
|
return cit->second;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
bool vfs::CVirtualLocation::RemoveFile(vfs::IBaseFile* pFile)
|
|
{
|
|
if(pFile)
|
|
{
|
|
vfs::Path sDir,sFile;
|
|
pFile->GetFullPath().SplitLast(sDir,sFile);
|
|
tVFiles::iterator it = m_mapVFiles.find(sFile);
|
|
if(it != m_mapVFiles.end())
|
|
{
|
|
if(!it->second->Remove(pFile))
|
|
{
|
|
CVirtualFile* vfile = it->second;
|
|
//delete vfile;
|
|
m_mapVFiles.erase(it);
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
vfs::CVirtualLocation::Iterator vfs::CVirtualLocation::iterate()
|
|
{
|
|
return Iterator(this);
|
|
}
|
|
|