Files
source/VFS/vfs_vloc.cpp
T
Wanne 47db604b50 *** Merged Code from Multiplayer Branch Revision 2960 ***
- Virtual File System (VFS) by birdflu. This is needed for Multiplayer and is also used for Single Player. Very neat system :-)
- Multiplayer Version 1.1 + some additional features and bugfixes
* INFO: If you compile a new EXE and want to test, be sure to also use the latest SVN GameDir files in your JA2 install directory *




git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@2961 3b4a5df2-a311-0410-b5c6-a8a6f20db521
2009-06-04 21:01:45 +00:00

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)
//{
// delete it->second;
//}
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);
}