#include "vfs_vloc.h" #include "vfs_vfile.h" #include "vfs_profile.h" #include "vfs.h" /************************************************************************/ class vfs::CVirtualLocation::VFileIterator : public vfs::CVirtualLocation::Iterator::IImplementation { friend class vfs::CVirtualLocation; typedef vfs::CVirtualLocation::Iterator::IImplementation tBaseClass; VFileIterator(vfs::CVirtualLocation* pLoc): tBaseClass(), m_pLoc(pLoc) { THROWIFFALSE(pLoc, L""); _vfile_iter = m_pLoc->m_VFiles.begin(); } public: VFileIterator() : tBaseClass(), m_pLoc(NULL) {}; virtual ~VFileIterator() {}; virtual vfs::CVirtualFile* value() { if(m_pLoc && _vfile_iter != m_pLoc->m_VFiles.end()) { return _vfile_iter->second; } return NULL; } virtual void next() { if(m_pLoc && _vfile_iter != m_pLoc->m_VFiles.end()) { _vfile_iter++; } } protected: virtual tBaseClass* clone() { VFileIterator* iter = new VFileIterator(m_pLoc); iter->_vfile_iter = _vfile_iter; return iter; } private: vfs::CVirtualLocation* m_pLoc; vfs::CVirtualLocation::tVFiles::iterator _vfile_iter; }; /************************************************************************/ vfs::CVirtualLocation::CVirtualLocation(vfs::Path const& path) : cPath(path), m_exclusive(false) {}; vfs::CVirtualLocation::~CVirtualLocation() { tVFiles::iterator it = m_VFiles.begin(); for(; it != m_VFiles.end(); ++it) { it->second->destroy(); } m_VFiles.clear(); } void vfs::CVirtualLocation::setIsExclusive(bool exclusive) { m_exclusive = exclusive; } bool vfs::CVirtualLocation::getIsExclusive() { return m_exclusive; } void vfs::CVirtualLocation::addFile(vfs::IBaseFile* file, utf8string const& profileName) { tVFiles::iterator it = m_VFiles.find(file->getName()); vfs::CVirtualFile *pVFile = NULL; if(it == m_VFiles.end()) { vfs::Path fp = file->getPath(); vfs::CProfileStack& stack = *(getVFS()->getProfileStack()); pVFile = vfs::CVirtualFile::create(fp,stack); it = m_VFiles.insert(m_VFiles.end(), std::pair(file->getName(),pVFile)); } it->second->add(file,profileName,true); } vfs::IBaseFile* vfs::CVirtualLocation::getFile(vfs::Path const& filename, utf8string const& profileName) const { tVFiles::const_iterator cit = m_VFiles.find(filename); if(cit != m_VFiles.end() && cit->second) { if(profileName.empty()) { if(m_exclusive) { return cit->second->file(vfs::CVirtualFile::SF_STOP_ON_WRITABLE_PROFILE); } else { return cit->second->file(vfs::CVirtualFile::SF_TOP); } } else { // you know what you are doing return cit->second->file(profileName); } } return NULL; } vfs::CVirtualFile* vfs::CVirtualLocation::getVirtualFile(vfs::Path const& filename) { tVFiles::const_iterator cit = m_VFiles.find(filename); if(cit != m_VFiles.end()) { return cit->second; } return NULL; } bool vfs::CVirtualLocation::removeFile(vfs::IBaseFile* file) { if(file) { vfs::Path sDir,sFile; file->getPath().splitLast(sDir,sFile); tVFiles::iterator it = m_VFiles.find(sFile); if(it != m_VFiles.end()) { if(!it->second->remove(file)) { //CVirtualFile* vfile = it->second; //delete vfile; m_VFiles.erase(it); } return true; } } return false; } vfs::CVirtualLocation::Iterator vfs::CVirtualLocation::iterate() { return Iterator(new VFileIterator(this)); }