Subversion Repositories spk

Rev

Rev 114 | Rev 274 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#pragma once

#include "File.h"
#include "Utils/StringList.h"
#include <map>

class CBaseFile;
class CXspFile;

namespace Utils {
        class CStringList;
}
namespace SPK {
        class CTextDB;

tclass CVirtualFileSystem
{
public:
        typedef std::map<Utils::String, Utils::String> FileList;
        typedef std::map<Utils::String, Utils::String>::iterator FileListItr;

private:
        Utils::String   m_sAddon;
        Utils::String   m_sDir;
        bool            m_bLoaded;

        FileList *m_pModMap;
        FileList *m_pMap;

        CTextDB  *m_pTexts;
        CTextDB  *m_pModTexts;

        Utils::CStringList      *_lShips;
        Utils::CStringList      *_lShields;
        Utils::CStringList      *_lLasers;
        Utils::CStringList      *_lMissiles;
        Utils::CStringList      *_lCockpits;
        Utils::CStringList      *_lComponentSections;
        Utils::CStringList      *_lDummySections;
        Utils::CStringList      *_lBodiesSections;

        int m_iLang;

public:
        CVirtualFileSystem(void);
        ~CVirtualFileSystem(void);

        // setters
        void setAddon(const Utils::String &addon);
        void setLanguage(int iLang);

        // extractions
        void extractTexts(CXspFile *pPackage, int textId);
        C_File *extractGameFileToPackage(CBaseFile *pPackage, const Utils::String &sFile, FileType iFileType, const Utils::String &sTo);
        C_File *extractGameFileToPackage(CBaseFile *pPackage, const Utils::String &sFile, FileType iFileType);
        Utils::String ExtractGameFile(const Utils::String &file, const Utils::String &to);

        // loading
        bool LoadFilesystem(const Utils::String &dir, int maxPatch = 0);
        bool LoadFilesystem(const Utils::String &dir, const Utils::String &mod, int maxPatch = 0);
        bool loadMod(const Utils::String &mod);
        bool addMod(const Utils::String &mod);

        // getters
        const Utils::String &directory() const;
        bool isFileAvailable(const Utils::String &file) const;
        Utils::String getTShipsEntry(const Utils::String &sId);
        Utils::String findText(int iLang, int iPage, int iID) const;
        bool textExists(int iLang, int iPage, int iID) const;
        bool isTextUpdated() const;

        // Updates
        void updateModTexts(int iPage);
        void updateModTexts(int iFromPage, int iToPage);
        void updateTexts(int iPage);
        void updateTexts(int iFromPage, int iToPage);

        void clearMods(bool bIncludeStandard = false);

        // Iterators
        Utils::CStringList *getTShipsEntries();
        Utils::String firstShield();
        Utils::String nextShield();
        Utils::String firstComponentSection();
        Utils::String nextComponentSection();
        Utils::String firstDummySection();
        Utils::String nextDummySection();
        Utils::String firstBodiesSection();
        Utils::String nextBodiesSection();
        std::pair<Utils::String, Utils::String> firstLaser();
        std::pair<Utils::String, Utils::String> nextLaser();
        std::pair<Utils::String, Utils::String> firstMissile();
        std::pair<Utils::String, Utils::String> nextMissile();
        Utils::String firstCockpit();
        Utils::String nextCockpit();

        ///////////////////////////////////////////////////////////////
        // Debug Functions
        void DEBUG_LogContents(const Utils::String &sFile);     

private:
        void _updateTexts(int iFromPage, int iToPage, FileList *pFileList, CTextDB *pTextList);
        Utils::String _convertExtension(const Utils::String &sFile) const;
        void _clear();
        void _addFile(const Utils::String &sFile, const Utils::String &sDest, FileList *pList);
        void _addModFile(const Utils::String &sFile, const Utils::String &sMod, FileList *pList);
        Utils::String _findFile(const Utils::String &file) const;
        void _addDir(const Utils::String &sStart, const Utils::String &sDir);
        Utils::String _extractFromCat(const Utils::String &sCat, const Utils::String &sFile, const Utils::String &sTo);
        Utils::String _extract(const Utils::String &sFile, const Utils::String &sTo);

        Utils::CStringList *_updateList(const Utils::String &typesFile, int iTextPos);
        void _updateShields();
        void _updateLasers();
        void _updateMissiles();
        void _updateCockpits();
        void _updateComponentSections();
        void _updateDummySections();
        void _updateBodiesSections();
        void _updateShips();

        Utils::String _returnText(Utils::SStringList *s);
        Utils::String _returnID(Utils::SStringList *s);
        Utils::String _returnLine(Utils::SStringList *s);
        std::pair<Utils::String, Utils::String> _returnPair(Utils::SStringList *s);
        Utils::CStringList *_updateSectionList(const Utils::String &sFile, bool singleEntry);

        void _removeSameFile(const Utils::String &sFile, const Utils::String &sDest, const Utils::String &ext, FileList *pList);

};

}