#pragma once #include #include #include "../eterBase/Singleton.h" #include "../eterBase/Stl.h" #include "FileProvider.h" #include "EterPack.h" class CEterPackManager : public CSingleton { public: struct SCache { BYTE* m_abBufData; DWORD m_dwBufSize; }; public: enum ESearchModes { SEARCH_FILE_FIRST, SEARCH_PACK_FIRST }; typedef std::list> TEterPackList; typedef std::unordered_map, stringhash> TEterPackMap; public: CEterPackManager(); virtual ~CEterPackManager(); void SetCacheMode(); void SetRelativePathMode(); void LoadStaticCache(const char* c_szFileName); void SetSearchMode(bool bPackFirst); int GetSearchMode(); bool Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData); bool GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData); bool GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData); bool isExist(const char * c_szFileName); bool isExistInPack(const char * c_szFileName); bool RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV = NULL); std::string ConvertFileName(std::string fileName); protected: bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName); std::shared_ptr FindPack(const char* c_szPathName); SCache* __FindCache(DWORD dwFileNameHash); void __ClearCacheMap(); protected: bool m_bTryRelativePath; bool m_isCacheMode; int m_iSearchMode; std::unordered_map> m_FileDict; TEterPackMap m_PackMap; std::unordered_map m_kMap_dwNameKey_kCache; std::vector>> keepDataReferencedArray; CRITICAL_SECTION m_csFinder; };