mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
- 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
188 lines
3.6 KiB
C++
188 lines
3.6 KiB
C++
#include "vfs_dir_file.h"
|
|
#include "../Interface/vfs_directory_interface.h"
|
|
#include "../iteratedir.h"
|
|
|
|
vfs::Path vfs::CVFSFile::GetFullPath()
|
|
{
|
|
if(_pLoc_)
|
|
{
|
|
return _pLoc_->GetFullPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
return m_sFileName;
|
|
}
|
|
}
|
|
|
|
bool vfs::CVFSFile::Delete()
|
|
{
|
|
Close();
|
|
vfs::Path fname;
|
|
if(_pLoc_)
|
|
{
|
|
fname = static_cast<IDirectory<CVFSFile::write_type>*>(_pLoc_)->GetRealPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
fname = m_sFileName;
|
|
}
|
|
return os::DeleteRealFile(fname);
|
|
}
|
|
|
|
bool vfs::CVFSFile::OpenRead()
|
|
{
|
|
// std::cout << "[CVFSFile::OpenRead] open file <" << m_sFileName() << ">\n" ;
|
|
if( !m_oFile.good() )
|
|
{
|
|
std::cout << "ERROR" << std::endl;
|
|
return false;
|
|
}
|
|
if(m_bIsOpen_read)
|
|
{
|
|
return true;
|
|
}
|
|
std::ios::openmode Mode;
|
|
vfs::Path sFileName;
|
|
if(_pLoc_)
|
|
{
|
|
sFileName = static_cast<IDirectory<CFile::write_type>*>(_pLoc_)->GetRealPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
sFileName = m_sFileName;
|
|
}
|
|
// try to open
|
|
Mode = std::ios::in|std::ios::binary;
|
|
#ifdef WIN32
|
|
m_oFile.open(sFileName().c_wcs().c_str(),Mode);
|
|
#else
|
|
m_oFile.open(sFileName().utf8().c_str(),Mode);
|
|
#endif
|
|
if( !(m_bIsOpen_read = m_oFile.is_open()) )
|
|
{
|
|
m_oFile.clear();
|
|
return false;
|
|
}
|
|
return m_oFile.good();
|
|
}
|
|
|
|
bool vfs::CVFSFile::OpenWrite(bool bCreateWhenNotExist, bool bTruncate)
|
|
{
|
|
// std::cout << "[CVFSFile::OpenWrite] opening file <" << m_sFileName << "> .. ";
|
|
if(!m_oFile.good())
|
|
{
|
|
// std::cout << "ERROR" << std::endl;
|
|
return false;
|
|
}
|
|
if(m_bIsOpen_write)
|
|
{
|
|
// std::cout << "already open" << std::endl;
|
|
return m_oFile.good();
|
|
}
|
|
vfs::Path sFileName;
|
|
if(_pLoc_)
|
|
{
|
|
sFileName = static_cast<IDirectory<CFile::write_type>*>(_pLoc_)->GetRealPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
sFileName = m_sFileName;
|
|
}
|
|
std::ios::openmode Mode;
|
|
Mode = std::ios::in|std::ios::out|std::ios::binary;
|
|
if(bTruncate)
|
|
{
|
|
Mode |= std::ios::trunc;
|
|
}
|
|
#ifdef WIN32
|
|
m_oFile.open(sFileName().c_wcs().c_str(),Mode);
|
|
#else
|
|
m_oFile.open(sFileName().utf8().c_str(),Mode);
|
|
#endif
|
|
if( !(m_bIsOpen_write = m_oFile.is_open()) )
|
|
{
|
|
m_oFile.clear();
|
|
if(bCreateWhenNotExist)
|
|
{
|
|
// create file
|
|
Mode = std::ios::out|std::ios::binary;
|
|
if(bTruncate)
|
|
{
|
|
Mode |= std::ios::trunc;
|
|
}
|
|
#ifdef WIN32
|
|
m_oFile.open(sFileName().c_wcs().c_str(),Mode);
|
|
#else
|
|
m_oFile.open(sFileName().utf8().c_str(),Mode);
|
|
#endif
|
|
if( !(m_bIsOpen_write = m_oFile.is_open()) )
|
|
{
|
|
return false;
|
|
}
|
|
m_oFile.close();
|
|
Mode |= std::ios::in;
|
|
#ifdef WIN32
|
|
m_oFile.open(sFileName().c_wcs().c_str(),Mode);
|
|
#else
|
|
m_oFile.open(sFileName().utf8().c_str(),Mode);
|
|
#endif
|
|
if( !(m_bIsOpen_write = m_oFile.is_open()) )
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return m_oFile.good();
|
|
}
|
|
|
|
|
|
vfs::Path vfs::CVFSTextFile::GetFullPath()
|
|
{
|
|
if(_pLoc_)
|
|
{
|
|
return static_cast<IDirectory<CFile::write_type>*>(_pLoc_)->GetRealPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
return m_sFileName;
|
|
}
|
|
}
|
|
|
|
bool vfs::CVFSTextFile::OpenRead()
|
|
{
|
|
if( !m_oFile.good() )
|
|
{
|
|
return false;
|
|
}
|
|
if(m_bIsOpen_read)
|
|
{
|
|
return true;
|
|
}
|
|
vfs::Path sFileName;
|
|
if(_pLoc_)
|
|
{
|
|
sFileName = static_cast<IDirectory<CFile::write_type>*>(_pLoc_)->GetRealPath() + m_sFileName;
|
|
}
|
|
else
|
|
{
|
|
sFileName = m_sFileName;
|
|
}
|
|
std::ios::openmode Mode;
|
|
Mode = std::ios::in;
|
|
#ifdef WIN32
|
|
m_oFile.open(sFileName().c_wcs().c_str(),Mode);
|
|
#else
|
|
m_oFile.open(sFileName().utf8().c_str(),Mode);
|
|
#endif
|
|
if( !(m_bIsOpen_read = m_oFile.is_open()) )
|
|
{
|
|
m_oFile.clear();
|
|
return false;
|
|
}
|
|
return m_oFile.good();
|
|
}
|