mirror of
https://github.com/1dot13/source.git
synced 2026-08-12 14:10:23 +02:00
*** 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
This commit is contained in:
@@ -0,0 +1,187 @@
|
||||
#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();
|
||||
}
|
||||
Reference in New Issue
Block a user