diff --git a/bin/pack/pack.bat b/bin/pack/pack.bat index 1dda57ce..3d311340 100644 --- a/bin/pack/pack.bat +++ b/bin/pack/pack.bat @@ -3,9 +3,10 @@ setlocal enabledelayedexpansion FOR /d %%i IN ("*") DO ( echo Packing %%i - rem "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" -m0=LZMA + rem "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" -m0=BZip2 rem "C:\Program Files\7-Zip-Zstandard\7za.exe" a "%%i.zip" ".\%%i\*" -m0=Zstd - "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" + "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" -m0=Copy + rem "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" if !errorlevel! neq 0 exit /b !errorlevel! cls diff --git a/src/EffectLib/EffectMesh.cpp b/src/EffectLib/EffectMesh.cpp index 91cae49b..672849e2 100644 --- a/src/EffectLib/EffectMesh.cpp +++ b/src/EffectLib/EffectMesh.cpp @@ -192,15 +192,14 @@ BOOL CEffectMesh::__LoadData_Ver002(int iSize, const BYTE * c_pbBuf) if (0 == strExtension.compare("ifl")) { - LPCVOID pMotionData; - CMappedFile File; + CEterPackManager::TPackDataPtr motionData; + CMemoryTextFileLoader textFileLoader; - if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData)) + if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData)) { - CMemoryTextFileLoader textFileLoader; std::vector stTokenVector; - textFileLoader.Bind(File.Size(), pMotionData); + textFileLoader.Bind(motionData->size(), motionData->data()); std::string strPathName; GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName); @@ -337,15 +336,14 @@ BOOL CEffectMesh::__LoadData_Ver001(int iSize, const BYTE * c_pbBuf) if (0 == strExtension.compare("ifl")) { - LPCVOID pMotionData; - CMappedFile File; + CEterPackManager::TPackDataPtr motionData; + CMemoryTextFileLoader textFileLoader; - if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData)) + if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData)) { - CMemoryTextFileLoader textFileLoader; std::vector stTokenVector; - textFileLoader.Bind(File.Size(), pMotionData); + textFileLoader.Bind(motionData->size(), motionData->data()); std::string strPathName; GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName); diff --git a/src/EterImageLib/TGAImage.cpp b/src/EterImageLib/TGAImage.cpp index 61261394..2fb09b9f 100644 --- a/src/EterImageLib/TGAImage.cpp +++ b/src/EterImageLib/TGAImage.cpp @@ -234,18 +234,6 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem) return true; } -bool CTGAImage::LoadFromDiskFile(const char * c_szFileName) -{ - CMappedFile file; - - const BYTE * c_pbMap; - - if (!file.Create(c_szFileName, (const void **) &c_pbMap, 0, 0)) - return false; - - return LoadFromMemory(file.Size(), c_pbMap); -} - int CTGAImage::GetRLEPixelCount(const DWORD * data) { int r = 0; diff --git a/src/EterImageLib/TGAImage.h b/src/EterImageLib/TGAImage.h index 9b1e58c2..beabdaf8 100644 --- a/src/EterImageLib/TGAImage.h +++ b/src/EterImageLib/TGAImage.h @@ -17,7 +17,6 @@ class CTGAImage : public CImage virtual void Create(int width, int height); virtual bool LoadFromMemory(int iSize, const BYTE * c_pbMem); - virtual bool LoadFromDiskFile(const char * c_szFileName); virtual bool SaveToDiskFile(const char* c_szFileName); void SetCompressed(bool isCompress = true); diff --git a/src/EterLib/FileLoaderThread.cpp b/src/EterLib/FileLoaderThread.cpp index 3b5c0673..39043197 100644 --- a/src/EterLib/FileLoaderThread.cpp +++ b/src/EterLib/FileLoaderThread.cpp @@ -47,9 +47,6 @@ void CFileLoaderThread::Destroy() CloseHandle(m_hSemaphore); m_hSemaphore = NULL; } - - stl_wipe(m_pRequestDeque); - stl_wipe(m_pCompleteDeque); } UINT CFileLoaderThread::Setup() @@ -111,13 +108,11 @@ UINT CFileLoaderThread::Execute(void * /*pvArg*/) return 1; } -void CFileLoaderThread::Request(std::string & c_rstFileName) // called in main thread +void CFileLoaderThread::Request(const std::string& c_rstFileName) // called in main thread { - TData * pData = new TData; - - pData->dwSize = 0; - pData->pvBuf = NULL; - pData->stFileName = c_rstFileName; + TData pData; + pData.fileName = c_rstFileName; + pData.data = nullptr; m_RequestMutex.Lock(); m_pRequestDeque.push_back(pData); @@ -131,7 +126,7 @@ void CFileLoaderThread::Request(std::string & c_rstFileName) // called in main t --m_iRestSemCount; } -bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread +bool CFileLoaderThread::Fetch(TData& data) // called in main thread { m_CompleteMutex.Lock(); @@ -141,7 +136,7 @@ bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread return false; } - *ppData = m_pCompleteDeque.front(); + data = m_pCompleteDeque.front(); m_pCompleteDeque.pop_front(); m_CompleteMutex.Unlock(); @@ -158,22 +153,16 @@ void CFileLoaderThread::Process() // called in loader thread return; } - TData * pData = m_pRequestDeque.front(); + auto request = m_pRequestDeque.front(); m_pRequestDeque.pop_front(); m_RequestMutex.Unlock(); - LPCVOID pvBuf; - - if (CEterPackManager::Instance().Get(pData->File, pData->stFileName.c_str(), &pvBuf)) - { - pData->dwSize = pData->File.Size(); - pData->pvBuf = new char [pData->dwSize]; - memcpy(pData->pvBuf, pvBuf, pData->dwSize); - } + if (!CEterPackManager::Instance().Get(request.fileName, request.data)) + request.data = nullptr; m_CompleteMutex.Lock(); - m_pCompleteDeque.push_back(pData); + m_pCompleteDeque.push_back(request); m_CompleteMutex.Unlock(); Sleep(g_iLoadingDelayTime); diff --git a/src/EterLib/FileLoaderThread.h b/src/EterLib/FileLoaderThread.h index e8f095b1..35932b60 100644 --- a/src/EterLib/FileLoaderThread.h +++ b/src/EterLib/FileLoaderThread.h @@ -2,20 +2,18 @@ #define __INC_YMIR_ETERLIB_FILELOADERTHREAD_H__ #include +#include +#include #include "Thread.h" #include "Mutex.h" -#include "../eterBase/MappedFile.h" class CFileLoaderThread { public: typedef struct SData { - std::string stFileName; - - CMappedFile File; - LPVOID pvBuf; - DWORD dwSize; + std::string fileName; + std::shared_ptr> data; } TData; public: @@ -25,8 +23,8 @@ class CFileLoaderThread int Create(void * arg); public: - void Request(std::string & c_rstFileName); - bool Fetch(TData ** ppData); + void Request(const std::string& c_rstFileName); + bool Fetch(TData& data); void Shutdown(); protected: @@ -49,10 +47,10 @@ class CFileLoaderThread void Process(); private: - std::deque m_pRequestDeque; + std::deque m_pRequestDeque; Mutex m_RequestMutex; - std::deque m_pCompleteDeque; + std::deque m_pCompleteDeque; Mutex m_CompleteMutex; HANDLE m_hSemaphore; diff --git a/src/EterLib/GrpImageTexture.cpp b/src/EterLib/GrpImageTexture.cpp index e63432fb..3243cedf 100644 --- a/src/EterLib/GrpImageTexture.cpp +++ b/src/EterLib/GrpImageTexture.cpp @@ -50,13 +50,11 @@ bool CGraphicImageTexture::CreateDeviceObjects() } else { - CMappedFile mappedFile; - LPCVOID c_pvMap; - - if (!CEterPackManager::Instance().Get(mappedFile, m_stFileName.c_str(), &c_pvMap)) + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(m_stFileName, data)) return false; - return CreateFromMemoryFile(mappedFile.Size(), c_pvMap, m_d3dFmt, m_dwFilter); + return CreateFromMemoryFile(data->size(), data->data(), m_d3dFmt, m_dwFilter); } m_bEmpty = false; diff --git a/src/EterLib/Resource.cpp b/src/EterLib/Resource.cpp index 1dbe7d01..41bfdb09 100644 --- a/src/EterLib/Resource.cpp +++ b/src/EterLib/Resource.cpp @@ -42,18 +42,17 @@ void CResource::Load() const char * c_szFileName = GetFileName(); - DWORD dwStart = ELTimer_GetMSec(); - CMappedFile file; - LPCVOID fileData; + DWORD dwStart = ELTimer_GetMSec(); + CEterPackManager::TPackDataPtr fileData; //Tracenf("Load %s", c_szFileName); - if (CEterPackManager::Instance().Get(file, c_szFileName, &fileData)) + if (CEterPackManager::Instance().Get(c_szFileName, fileData)) { m_dwLoadCostMiliiSecond = ELTimer_GetMSec() - dwStart; //Tracef("CResource::Load %s (%d bytes) in %d ms\n", c_szFileName, file.Size(), m_dwLoadCostMiliiSecond); - if (OnLoad(file.Size(), fileData)) + if (OnLoad(fileData->size(), fileData->data())) { me_state = STATE_EXIST; } @@ -81,12 +80,11 @@ void CResource::Reload() Clear(); Tracef("CResource::Reload %s\n", GetFileName()); - CMappedFile file; - LPCVOID fileData; + CEterPackManager::TPackDataPtr fileData; - if (CEterPackManager::Instance().Get(file, GetFileName(), &fileData)) + if (CEterPackManager::Instance().Get(GetFileName(), fileData)) { - if (OnLoad(file.Size(), fileData)) + if (OnLoad(fileData->size(), fileData->data())) { me_state = STATE_EXIST; } diff --git a/src/EterLib/ResourceManager.cpp b/src/EterLib/ResourceManager.cpp index d40dfa9d..6e3b67e6 100644 --- a/src/EterLib/ResourceManager.cpp +++ b/src/EterLib/ResourceManager.cpp @@ -61,17 +61,17 @@ void CResourceManager::ProcessBackgroundLoading() DWORD dwCurrentTime = ELTimer_GetMSec(); - CFileLoaderThread::TData * pData; - while (ms_loadingThread.Fetch(&pData)) + CFileLoaderThread::TData pData; + while (ms_loadingThread.Fetch(pData)) { //printf("LOD %s\n", pData->stFileName.c_str()); - CResource * pResource = GetResourcePointer(pData->stFileName.c_str()); + CResource * pResource = GetResourcePointer(pData.fileName.c_str()); if (pResource) { if (pResource->IsEmpty()) { - pResource->OnLoad(pData->dwSize, pData->pvBuf); + pResource->OnLoad(pData.data->size(), pData.data->data()); pResource->AddReferenceOnly(); // ¿©±â¼­ ¿Ã¶ó°£ ·¹ÆÛ·±½º Ä«¿îÆ®¸¦ ÀÏÁ¤ ½Ã°£ÀÌ Áö³­ µÚ¿¡ Ç®¾îÁÖ±â À§ÇÏ¿© @@ -79,10 +79,7 @@ void CResourceManager::ProcessBackgroundLoading() } } - m_WaitingMap.erase(GetCRC32(pData->stFileName.c_str(), pData->stFileName.size())); - - delete [] ((char *) pData->pvBuf); - delete pData; + m_WaitingMap.erase(GetCRC32(pData.fileName.c_str(), pData.fileName.size())); } // DO : ÀÏÁ¤ ½Ã°£ÀÌ Áö³ª°í ³­µÚ ¹Ì¸® ·ÎµùÇØ µÎ¾ú´ø ¸®¼Ò½ºÀÇ ·¹ÆÛ·±½º Ä«¿îÆ®¸¦ °¨¼Ò ½ÃŲ´Ù - [levites] diff --git a/src/EterLib/ResourceManager.h b/src/EterLib/ResourceManager.h index 143cff19..5d6b8783 100644 --- a/src/EterLib/ResourceManager.h +++ b/src/EterLib/ResourceManager.h @@ -2,6 +2,7 @@ #include "Resource.h" #include "FileLoaderThread.h" +#include "../EterBase/Singleton.h" #include #include diff --git a/src/EterLib/TextFileLoader.cpp b/src/EterLib/TextFileLoader.cpp index d6639011..20f16157 100644 --- a/src/EterLib/TextFileLoader.cpp +++ b/src/EterLib/TextFileLoader.cpp @@ -179,14 +179,13 @@ bool CTextFileLoader::Load(const char * c_szFileName) { m_strFileName = ""; - const VOID* pvData; - CMappedFile kFile; - if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; - if (m_dwBufCapacitysize()) { - m_dwBufCapacity=kFile.Size(); + m_dwBufCapacity = data->size(); if (m_acBufData) delete [] m_acBufData; @@ -194,8 +193,8 @@ bool CTextFileLoader::Load(const char * c_szFileName) m_acBufData=new char[m_dwBufCapacity]; } - m_dwBufSize=kFile.Size(); - memcpy(m_acBufData, pvData, m_dwBufSize); + m_dwBufSize = data->size(); + memcpy_s(m_acBufData, m_dwBufCapacity, data->data(), data->size()); m_strFileName = c_szFileName; m_dwcurLineIndex = 0; diff --git a/src/EterLib/Util.cpp b/src/EterLib/Util.cpp index 70988e67..80fcbf88 100644 --- a/src/EterLib/Util.cpp +++ b/src/EterLib/Util.cpp @@ -20,16 +20,14 @@ void PrintfTabs(FILE * File, int iTabCount, const char * c_szString, ...) bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap) { - LPCVOID pMotionData; - CMappedFile File; + CEterPackManager::TPackDataPtr motionData; + CMemoryTextFileLoader textFileLoader; - if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData)) + if (!CEterPackManager::Instance().Get(c_szFileName, motionData)) return false; - CMemoryTextFileLoader textFileLoader; CTokenVector stTokenVector; - - textFileLoader.Bind(File.Size(), pMotionData); + textFileLoader.Bind(motionData->size(), motionData->data()); for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) { @@ -50,18 +48,16 @@ bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap) bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap) { - LPCVOID pModelData; - CMappedFile File; + CEterPackManager::TPackDataPtr modelData; + CMemoryTextFileLoader textFileLoader; - if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData)) + if (!CEterPackManager::Instance().Get(c_szFileName, modelData)) return false; DWORD i; - - CMemoryTextFileLoader textFileLoader; CTokenVector stTokenVector; - textFileLoader.Bind(File.Size(), pModelData); + textFileLoader.Bind(modelData->size(), modelData->data()); for (i = 0; i < textFileLoader.GetLineCount(); ++i) { diff --git a/src/EterPack/EterPack.cpp b/src/EterPack/EterPack.cpp deleted file mode 100644 index 8858ff04..00000000 --- a/src/EterPack/EterPack.cpp +++ /dev/null @@ -1,1416 +0,0 @@ -#include "StdAfx.h" - -#include -#include -#include -#include - -#include "EterPack.h" -#include "Inline.h" - -#pragma warning(push, 3) -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma warning(pop) - -#include "../EterBase/utils.h" -#include "../EterBase/Debug.h" -#include "../EterBase/CRC32.h" - -#include -#include - -void CMakePackLog::SetFileName(const char* c_szFileName) -{ - m_stFileName=c_szFileName; - m_stFileName +=".log"; - m_stErrorFileName = c_szFileName; - m_stErrorFileName += ".err"; -} - -CMakePackLog& CMakePackLog::GetSingleton() -{ - static CMakePackLog s_kMakePackLog; - return s_kMakePackLog; -} - -CMakePackLog::CMakePackLog() -{ - m_fp=NULL; - m_fp_err = NULL; -} - -CMakePackLog::~CMakePackLog() -{ - if (NULL!=m_fp) - { - fclose(m_fp); - m_fp=NULL; - } - if (NULL != m_fp_err) - { - fclose(m_fp_err); - m_fp_err = NULL; - } -} - -bool CMakePackLog::__IsLogMode() -{ - if (m_stFileName.empty()) - return false; - - return true; -} - -void CMakePackLog::Writef(const char* c_szFormat, ...) -{ - if (!__IsLogMode()) - return; - - va_list args; - va_start(args, c_szFormat); - - char szBuf[1024]; - int nBufLen = _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); - szBuf[nBufLen++] = '\0'; - __Write(szBuf, nBufLen); -} - -void CMakePackLog::Writenf(const char* c_szFormat, ...) -{ - if (!__IsLogMode()) - return; - - va_list args; - va_start(args, c_szFormat); - - char szBuf[1024+1]; - int nBufLen = _vsnprintf(szBuf, sizeof(szBuf)-1, c_szFormat, args); - if (nBufLen > 0) - { - szBuf[nBufLen++] = '\n'; - szBuf[nBufLen++] = '\0'; - } - __Write(szBuf, nBufLen); -} - -void CMakePackLog::Write(const char* c_szBuf) -{ - if (!__IsLogMode()) - return; - - __Write(c_szBuf, strlen(c_szBuf)+1); -} - -void CMakePackLog::__Write(const char* c_szBuf, int nBufLen) -{ - if (!__IsLogMode()) - return; - - if (NULL==m_fp) - m_fp=fopen(m_stFileName.c_str(), "w"); - - fwrite(c_szBuf, nBufLen, 1, m_fp); - - printf("%s", c_szBuf); -} - - - -void CMakePackLog::WriteErrorf(const char* c_szFormat, ...) -{ - if (!__IsLogMode()) - return; - - va_list args; - va_start(args, c_szFormat); - - char szBuf[1024]; - int nBufLen = _vsnprintf(szBuf, sizeof(szBuf), c_szFormat, args); - szBuf[nBufLen++] = '\0'; - __WriteError(szBuf, nBufLen); -} - -void CMakePackLog::WriteErrornf(const char* c_szFormat, ...) -{ - if (!__IsLogMode()) - return; - - va_list args; - va_start(args, c_szFormat); - - char szBuf[1024+1]; - int nBufLen = _vsnprintf(szBuf, sizeof(szBuf)-1, c_szFormat, args); - if (nBufLen > 0) - { - szBuf[nBufLen++] = '\n'; - szBuf[nBufLen++] = '\0'; - } - __WriteError(szBuf, nBufLen); -} - -void CMakePackLog::WriteError(const char* c_szBuf) -{ - if (!__IsLogMode()) - return; - - __WriteError(c_szBuf, strlen(c_szBuf)+1); -} - -void CMakePackLog::__WriteError(const char* c_szBuf, int nBufLen) -{ - if (!__IsLogMode()) - return; - - if (NULL==m_fp_err) - m_fp_err=fopen(m_stErrorFileName.c_str(), "w"); - - fwrite(c_szBuf, nBufLen, 1, m_fp_err); - - printf("Error: %s", c_szBuf); -} - -void CMakePackLog::FlushError() -{ - std::wifstream iFile(m_stErrorFileName.c_str()); - std::istream_iterator iit(iFile); - std::istream_iterator eos; - - std::vector vText; - - std::copy (iit, eos, std::back_inserter(vText)); - - std::ostream_iterator > oit(std::wcout); - - std::sort (vText.begin(), vText.end()); - std::copy (vText.begin(), vText.end(), oit); -} -#ifdef __MAKE_PACK__ -FILE * CEterPack::ms_PackLogFile = NULL; -#endif -/////////////////////////////////////////////////////////////////////////////// -CEterPack::CEterPack() : m_indexCount(0), m_indexData(NULL), m_FragmentSize(0), m_bEncrypted(false), m_bReadOnly(false), m_bDecrypedIV(false) -{ - -} - -CEterPack::~CEterPack() -{ - Destroy(); -} - -void CEterPack::Destroy() -{ - m_bReadOnly = false; - m_bEncrypted = false; - m_indexCount = 0; - m_DataPositionMap.clear(); - - for (int i = 0; i < FREE_INDEX_MAX_SIZE + 1; ++i) - m_FreeIndexList[i].clear(); - - SAFE_DELETE_ARRAY(m_indexData); - - m_FragmentSize = 0; - - memset(m_dbName, 0, sizeof(m_dbName)); - memset(m_indexFileName, 0, sizeof(m_indexFileName)); -} - -bool CEterPack::Create(CEterFileDict& rkFileDict, const char * dbname, const char* pathName, bool bReadOnly, const BYTE* iv) -{ - if (iv) - { - m_stIV_Panama.assign((const char*) iv, 32); - m_bDecrypedIV = false; - } - - strncpy(m_dbName, dbname, DBNAME_MAX_LEN); - - strncpy(m_indexFileName, dbname, MAX_PATH); - strcat(m_indexFileName, ".eix"); - - m_stDataFileName = dbname; - m_stDataFileName += ".epk"; - - m_bReadOnly = bReadOnly; - - // bReadOnly ¸ðµå°¡ ¾Æ´Ï°í µ¥ÀÌÅÍ º£À̽º°¡ ¿­¸°´Ù¸é »ý¼º ½ÇÆÐ - if (!CreateIndexFile()) - return false; - - if (!CreateDataFile()) - return false; - - bool bOverwrite = (iv != NULL); - __BuildIndex(rkFileDict, bOverwrite); - - if (m_bReadOnly) - { - //m_bIsDataLoaded = true; - //if (!m_file.Create(m_stDataFileName.c_str(), (const void**)&m_file_data, 0, 0)) - // return false; - } - else - { - DecryptIndexFile(); - } - - return true; -} - -bool CEterPack::DecryptIV(DWORD dwPanamaKey) -{ - if (m_stIV_Panama.length() != 32) - return false; - - if (m_bDecrypedIV) // ÀÌ¹Ì ¾Ïȣȭ°¡ Ç®·ÈÀ¸¸é ´Ù½Ã ó¸® ¾ÈÇÔ - return true; - - DWORD* ivs = (DWORD*)&m_stIV_Panama[0]; - for (int i = 0; i != m_stIV_Panama.length() / sizeof(DWORD); ++i) - { - ivs[i] ^= dwPanamaKey + i * 16777619; - } - - m_bDecrypedIV = true; - return true; -} - -bool CEterPack::DecryptIndexFile() -{ - if (!m_bEncrypted) - return true; - - CFileBase file; - - if (!file.Create(m_indexFileName, CFileBase::FILEMODE_WRITE)) - return false; - - file.Write(&eterpack::c_IndexCC, sizeof(DWORD)); - file.Write(&eterpack::c_Version, sizeof(DWORD)); - file.Write(&m_indexCount, sizeof(long)); - file.Write(m_indexData, sizeof(TEterPackIndex) * m_indexCount); - - file.Close(); - - m_bEncrypted = false; - return true; -} - -static DWORD s_adwEterPackKey[] = -{ - 45129401, - 92367215, - 681285731, - 1710201, -}; - -static DWORD s_adwEterPackSecurityKey[] = -{ - 78952482, - 527348324, - 1632942, - 486274726, -}; - -bool CEterPack::EncryptIndexFile() -{ - CMappedFile file; - LPCVOID pvData; - - if (NULL == file.Create(m_indexFileName, &pvData, 0, 0)) - { - TraceError("EncryptIndex: Cannot open pack index file! %s", m_dbName); - return false; - } - - BYTE * pbData = new BYTE[file.Size()]; - memcpy(pbData, pvData, file.Size()); - - CLZObject zObj; - - if (!CLZO::Instance().CompressEncryptedMemory(zObj, pbData, file.Size(), s_adwEterPackKey)) - { - TraceError("EncryptIndex: Cannot encrypt! %s", m_dbName); - SAFE_DELETE_ARRAY(pbData); - return false; - } - - file.Destroy(); - - while (!DeleteFile(m_indexFileName)); - - FILE * fp; - - fp = fopen(m_indexFileName, "wb"); - - if (!fp) - { - TraceError("EncryptIndex: Cannot open file for writing! %s", m_dbName); - SAFE_DELETE_ARRAY(pbData); - return false; - } - - if (1 != fwrite(zObj.GetBuffer(), zObj.GetSize(), 1, fp)) - { - TraceError("Encryptindex: Cannot write to file! %s", m_indexFileName); - SAFE_DELETE_ARRAY(pbData); - fclose(fp); - return false; - } - - fclose(fp); - - m_bEncrypted = true; - delete [] pbData; - return true; -} - -bool CEterPack::__BuildIndex(CEterFileDict& rkFileDict, bool bOverwrite) -{ - //DWORD dwBeginTime = ELTimer_GetMSec(); - CMappedFile file; - LPCVOID pvData; - CLZObject zObj; - - if (NULL == file.Create(m_indexFileName, &pvData, 0, 0)) - { - TraceError("Cannot open pack index file! %s", m_dbName); - return false; - } - - if (file.Size() < eterpack::c_HeaderSize) - { - TraceError("Pack index file header error! %s", m_dbName); - return false; - } - - DWORD fourcc = *(DWORD *) pvData; - - BYTE * pbData; - UINT uiFileSize; - - if (fourcc == eterpack::c_IndexCC) - { - pbData = (BYTE *) pvData; - uiFileSize = file.Size(); - } - else if (fourcc == CLZObject::ms_dwFourCC) - { - m_bEncrypted = true; - - if (!CLZO::Instance().Decompress(zObj, (const BYTE *) pvData, s_adwEterPackKey)) - return false; - - if (zObj.GetSize() < eterpack::c_HeaderSize) - return false; - - pbData = zObj.GetBuffer(); - uiFileSize = zObj.GetSize(); - } - else - { - TraceError("Pack index file fourcc error! %s", m_dbName); - return false; - } - - pbData += sizeof(DWORD); - - DWORD ver = *(DWORD *) pbData; - pbData += sizeof(DWORD); - - if (ver != eterpack::c_Version) - { - TraceError("Pack index file version error! %s", m_dbName); - return false; - } - - m_indexCount = *(long *) pbData; - pbData += sizeof(long); - - if (uiFileSize < eterpack::c_HeaderSize + sizeof(TEterPackIndex) * m_indexCount) - { - TraceError("Pack index file size error! %s, indexCount %d", m_dbName, m_indexCount); - return false; - } - - //Tracef("Loading Pack file %s elements: %d ... ", m_dbName, m_indexCount); - - m_indexData = new TEterPackIndex[m_indexCount]; - memcpy(m_indexData, pbData, sizeof(TEterPackIndex) * m_indexCount); - - TEterPackIndex * index = m_indexData; - - for (int i = 0; i < m_indexCount; ++i, ++index) - { - if (!index->filename_crc) - { - PushFreeIndex(index); - } - else - { - if (index->real_data_size > index->data_size) - m_FragmentSize += index->real_data_size - index->data_size; - - m_DataPositionMap.insert(TDataPositionMap::value_type(index->filename_crc, index)); - - if (bOverwrite) // ¼­¹ö ¿¬µ¿ ÆÐÅ· ÆÄÀÏÀº ³ªÁß¿¡ µé¾î¿ÀÁö¸¸ ÃÖ»óÀ§·Î µî·ÏÇؾßÇÑ´Ù - rkFileDict.UpdateItem(this, index); - else - rkFileDict.InsertItem(this, index); - } - } - - //Tracef("Done. (spent %dms)\n", ELTimer_GetMSec() - dwBeginTime); - return true; -} -// -//void CEterPack::UpdateLastAccessTime() -//{ -// m_tLastAccessTime = time(NULL); -//} -// -//void CEterPack::ClearDataMemoryMap() -//{ -// // m_fileÀÌ data fileÀÌ´Ù... -// m_file.Destroy(); -// m_tLastAccessTime = 0; -// m_bIsDataLoaded = false; -//} - -bool CEterPack::Get(CMappedFile& out_file, const char * filename, LPCVOID * data) -{ - TEterPackIndex * index = FindIndex(filename); - - if (!index) - { - return false; - } - - //UpdateLastAccessTime(); - //if (!m_bIsDataLoaded) - //{ - // if (!m_file.Create(m_stDataFileName.c_str(), (const void**)&m_file_data, 0, 0)) - // return false; - // - // m_bIsDataLoaded = true; - //} - - // ±âÁ¸¿¡´Â CEterPack¿¡¼­ epk¸¦ memory map¿¡ ¿Ã·Á³õ°í, ¿äûÀÌ ¿À¸é ±× ºÎºÐÀ» ¸µÅ©Çؼ­ ³Ñ°Ü Áá¾ú´Âµ¥, - // ÀÌÁ¦´Â ¿äûÀÌ ¿À¸é, ÇÊ¿äÇÑ ºÎºÐ¸¸ memory map¿¡ ¿Ã¸®°í, ¿äûÀÌ ³¡³ª¸é ÇØÁ¦ÇÏ°Ô ÇÔ. - out_file.Create(m_stDataFileName.c_str(), data, index->data_position, index->data_size); - - bool bIsSecurityCheckRequired = ( index->compressed_type == COMPRESSED_TYPE_SECURITY || - index->compressed_type == COMPRESSED_TYPE_PANAMA ); - - if( bIsSecurityCheckRequired ) - { -#ifdef CHECKSUM_CHECK_MD5 - MD5_CTX context; - GenerateMD5Hash( (BYTE*)(*data), index->data_size, context ); - - if( memcmp( index->MD5Digest, context.digest, 16 ) != 0 ) - { - return false; - } -#else - DWORD dwCrc32 = GetCRC32((const char*)(*data), index->data_size); - - if( index->data_crc != dwCrc32 ) - { - return false; - } -#endif - } - - - if (COMPRESSED_TYPE_COMPRESS == index->compressed_type) - { - CLZObject * zObj = new CLZObject; - - if (!CLZO::Instance().Decompress(*zObj, static_cast(*data))) - { - TraceError("Failed to decompress : %s", filename); - delete zObj; - return false; - } - - out_file.BindLZObject(zObj); - *data = zObj->GetBuffer(); - } - else if (COMPRESSED_TYPE_SECURITY == index->compressed_type) - { - CLZObject * zObj = new CLZObject; - - if (!CLZO::Instance().Decompress(*zObj, static_cast(*data), s_adwEterPackSecurityKey)) - { - TraceError("Failed to encrypt : %s", filename); - delete zObj; - return false; - } - - out_file.BindLZObject(zObj); - *data = zObj->GetBuffer(); - } - return true; -} - -bool CEterPack::Get2(CMappedFile& out_file, const char * filename, TEterPackIndex * index, LPCVOID * data) -{ - if (!index) - { - return false; - } - - //UpdateLastAccessTime(); - //if (!m_bIsDataLoaded) - //{ - // if (!m_file.Create(m_stDataFileName.c_str(), (const void**)&m_file_data, 0, 0)) - // return false; - // - // m_bIsDataLoaded = true; - //} - out_file.Create(m_stDataFileName.c_str(), data, index->data_position, index->data_size); - - bool bIsSecurityCheckRequired = ( index->compressed_type == COMPRESSED_TYPE_SECURITY || - index->compressed_type == COMPRESSED_TYPE_PANAMA ); - - if( bIsSecurityCheckRequired ) - { -#ifdef CHECKSUM_CHECK_MD5 - MD5_CTX context; - GenerateMD5Hash( (BYTE*)(*data), index->data_size, context ); - - if( memcmp( index->MD5Digest, context.digest, 16 ) != 0 ) - { - return false; - } -#else - DWORD dwCrc32 = GetCRC32((const char*)(*data), index->data_size); - - if( index->data_crc != dwCrc32 ) - { - return false; - } -#endif - } - - - if (COMPRESSED_TYPE_COMPRESS == index->compressed_type) - { - CLZObject * zObj = new CLZObject; - - if (!CLZO::Instance().Decompress(*zObj, static_cast(*data))) - { - TraceError("Failed to decompress : %s", filename); - delete zObj; - return false; - } - - out_file.BindLZObject(zObj); - *data = zObj->GetBuffer(); - } - else if (COMPRESSED_TYPE_SECURITY == index->compressed_type) - { - CLZObject * zObj = new CLZObject; - - if (!CLZO::Instance().Decompress(*zObj, static_cast(*data), s_adwEterPackSecurityKey)) - { - TraceError("Failed to encrypt : %s", filename); - delete zObj; - return false; - } - - out_file.BindLZObject(zObj); - *data = zObj->GetBuffer(); - } - - return true; -} - - -bool CEterPack::Delete(TEterPackIndex * pIndex) -{ - CFileBase fileIndex; - - if (!fileIndex.Create(m_indexFileName, CFileBase::FILEMODE_WRITE)) - return false; - - PushFreeIndex(pIndex); - WriteIndex(fileIndex, pIndex); - return true; -} - -bool CEterPack::Delete(const char * filename) -{ - TEterPackIndex * pIndex = FindIndex(filename); - - if (!pIndex) - return false; - - return Delete(pIndex); -} - -bool CEterPack::Extract() -{ - CMappedFile dataMapFile; - LPCVOID data; - - if (!dataMapFile.Create(m_stDataFileName.c_str(), &data, 0, 0)) - return false; - - CLZObject zObj; - - for (TDataPositionMap::iterator i = m_DataPositionMap.begin(); - i != m_DataPositionMap.end(); - ++i) - { - TEterPackIndex* index = i->second; - CFileBase writeFile; - - inlinePathCreate(index->filename); - printf("%s\n", index->filename); - - writeFile.Create(index->filename, CFileBase::FILEMODE_WRITE); - - if (COMPRESSED_TYPE_COMPRESS == index->compressed_type) - { - if (!CLZO::Instance().Decompress(zObj, (const BYTE *) data + index->data_position)) - { - printf("cannot decompress"); - return false; - } - - writeFile.Write(zObj.GetBuffer(), zObj.GetSize()); - zObj.Clear(); - } - else if (COMPRESSED_TYPE_SECURITY == index->compressed_type) - { - if (!CLZO::Instance().Decompress(zObj, (const BYTE *) data + index->data_position, s_adwEterPackSecurityKey)) - { - printf("cannot decompress"); - return false; - } - - writeFile.Write(zObj.GetBuffer(), zObj.GetSize()); - zObj.Clear(); - } - else if (COMPRESSED_TYPE_NONE == index->compressed_type) - writeFile.Write((const char *) data + index->data_position, index->data_size); - - writeFile.Destroy(); - } - return true; -} - -bool CEterPack::GetNames(std::vector* retNames) -{ - CMappedFile dataMapFile; - LPCVOID data; - - if (!dataMapFile.Create(m_stDataFileName.c_str(), &data, 0, 0)) - return false; - - CLZObject zObj; - - for (TDataPositionMap::iterator i = m_DataPositionMap.begin(); - i != m_DataPositionMap.end(); - ++i) - { - TEterPackIndex* index = i->second; - - inlinePathCreate(index->filename); - - retNames->push_back(index->filename); - } - return true; -} - -bool CEterPack::Put(const char * filename, const char * sourceFilename, BYTE packType, const std::string& strRelateMapName ) -{ - CMappedFile mapFile; - LPCVOID data; - - if (sourceFilename) - { - if (!mapFile.Create(sourceFilename, &data, 0, 0)) - { - return false; - } - } - else if (!mapFile.Create(filename, &data, 0, 0)) - { - return false; - } - - BYTE* pMappedData = (BYTE*)data; - int iMappedDataSize = mapFile.Size(); - - return Put(filename, pMappedData, iMappedDataSize, packType); -} - -#ifdef CHECKSUM_CHECK_MD5 -void CEterPack::GenerateMD5Hash( BYTE* pData, int nLength, IN OUT MD5_CTX& mdContext ) -{ - MD5Init (&mdContext); - - const int nBlockSize = 1024; - - int nLoopCnt = nLength / nBlockSize; - int nRemainder = nLength % nBlockSize; - int i; - - for(i = 0; i < nLoopCnt; ++i ) - { - MD5Update (&mdContext, reinterpret_cast(pData + i*nBlockSize), nBlockSize); - } - - if( nRemainder > 0 ) - MD5Update (&mdContext, reinterpret_cast(pData + i*nBlockSize), nRemainder); - - MD5Final (&mdContext); -} -#endif -bool CEterPack::Put(const char * filename, LPCVOID data, long len, BYTE packType) -{ - if (m_bEncrypted) - { - TraceError("EterPack::Put : Cannot put to encrypted pack (filename: %s, DB: %s)", filename, m_dbName); - return false; - } - - CFileBase fileIndex; - - if (!fileIndex.Create(m_indexFileName, CFileBase::FILEMODE_WRITE)) - { - return false; - } - - CFileBase fileData; - - if (!fileData.Create(m_stDataFileName.c_str(), CFileBase::FILEMODE_WRITE)) - { - return false; - } - - TEterPackIndex * pIndex; - pIndex = FindIndex(filename); - - CLZObject zObj; - std::string encryptStr; - - if (packType == COMPRESSED_TYPE_SECURITY || - packType == COMPRESSED_TYPE_COMPRESS) - { - if (packType == COMPRESSED_TYPE_SECURITY) - { - if (!CLZO::Instance().CompressEncryptedMemory(zObj, data, len, s_adwEterPackSecurityKey)) - { - return false; - } - } - else - { - if (!CLZO::Instance().CompressMemory(zObj, data, len)) - { - return false; - } - } - - data = zObj.GetBuffer(); - len = zObj.GetSize(); - } - - -#ifdef CHECKSUM_CHECK_MD5 - MD5_CTX context; - GenerateMD5Hash( (BYTE*)(data), len, context ); -#else - DWORD data_crc; - data_crc = GetCRC32((const char *) data, len); -#endif - - // ±âÁ¸ µ¥ÀÌÅÍ°¡ ÀÖÀ¸¸é.. - if (pIndex) - { - // ±âÁ¸ data Å©±â°¡ ³ÖÀ» µ¥ÀÌÅÍ Å©±â¸¦ ¼ö¿ëÇÒ ¼ö ÀÖ´Ù¸é - if (pIndex->real_data_size >= len) - { - ++m_map_indexRefCount[pIndex->id]; - - // ±æÀÌ°¡ Ʋ¸®°Å³ª, checksumÀÌ Æ²¸± ¶§¸¸ ÀúÀå ÇÑ´Ù. - if ( (pIndex->data_size != len) || -#ifdef CHECKSUM_CHECK_MD5 - (memcmp( pIndex->MD5Digest, context.digest, 16 ) != 0) ) -#else - (pIndex->data_crc != data_crc) ) -#endif - { -#ifdef __MAKE_PACK__ - if (ms_PackLogFile) - fprintf(ms_PackLogFile, "Overwrite[%d/%d] %s\n", bCompress, bSecurity, pIndex->filename); - printf("Overwrite[%d/%d] %s\n", bCompress, bSecurity, pIndex->filename); -#endif - pIndex->data_size = len; -#ifdef CHECKSUM_CHECK_MD5 - memcpy( pIndex->MD5Digest, context.digest, 16 ); - -#else - pIndex->data_crc = data_crc; -#endif - - pIndex->compressed_type = packType; - - CMakePackLog::GetSingleton().Writef("Overwrite[type:%u] %s\n", pIndex->compressed_type, pIndex->filename); - - WriteIndex(fileIndex, pIndex); - WriteData(fileData, pIndex, data); - } - - return true; - } - - // ±âÁ¸ µ¥ÀÌÅÍ Å©±â°¡ »õ·Î µé¾î°¥ °Í º¸´Ù Àû´Ù¸é, »õ·Î À妽º¸¦ ÇÒ´çÇØ - // ³Ö¾î¾ß ÇÑ´Ù. ¿ø·¡ ÀÖ´ø À妽º´Â ºñ¿ö µÐ´Ù. - PushFreeIndex(pIndex); - WriteIndex(fileIndex, pIndex); - } - - // »õ µ¥ÀÌÅÍ - pIndex = NewIndex(fileIndex, filename, len); - pIndex->data_size = len; - -#ifdef CHECKSUM_CHECK_MD5 - memcpy( pIndex->MD5Digest, context.digest, 16 ); -#else - pIndex->data_crc = data_crc; -#endif - - - pIndex->data_position = GetNewDataPosition(fileData); - pIndex->compressed_type = packType; - - WriteIndex(fileIndex, pIndex); - WriteNewData(fileData, pIndex, data); - - ++m_map_indexRefCount[pIndex->id]; - -#ifdef __MAKE_PACK__ - if (ms_PackLogFile) - fprintf(ms_PackLogFile, "Write[%d/%d] %s\n", bCompress, bSecurity, pIndex->filename); - printf("Write[%d/%d] %s, position %ld realsize %ld size %ld\n", - bCompress, bSecurity, pIndex->filename, pIndex->data_position, pIndex->real_data_size, pIndex->data_size); -#endif - CMakePackLog::GetSingleton().Writef("Write[type:%u] %s\n", pIndex->compressed_type, pIndex->filename); - - return true; -} - -long CEterPack::GetFragmentSize() -{ - return m_FragmentSize; -} - -// Private methods -bool CEterPack::CreateIndexFile() -{ - FILE * fp; - - if (NULL != (fp = fopen(m_indexFileName, "rb"))) - { - fclose(fp); - return true; - } - else if (m_bReadOnly) - return false; - - // - // ÆÄÀÏÀÌ ¾øÀ¸¹Ç·Î »õ·Î ¸¸µç´Ù. - // - fp = fopen(m_indexFileName, "wb"); - - if (!fp) - return false; - - fwrite(&eterpack::c_IndexCC, sizeof(DWORD), 1, fp); - fwrite(&eterpack::c_Version, sizeof(DWORD), 1, fp); - fwrite(&m_indexCount, sizeof(long), 1, fp); - - fclose(fp); - return true; -} - - -void CEterPack::WriteIndex(CFileBase & file, TEterPackIndex * index) -{ - file.Seek(sizeof(DWORD) + sizeof(DWORD)); - file.Write(&m_indexCount, sizeof(long)); - file.Seek(eterpack::c_HeaderSize + (index->id * sizeof(TEterPackIndex))); - - if (!file.Write(index, sizeof(TEterPackIndex))) - { - assert(!"WriteIndex: fwrite failed"); - return; - } -} - -/* - * Free Block À̶õ µ¥ÀÌÅÍ¿¡¼­ Áö¿öÁø ºÎºÐÀ» ¸»ÇÑ´Ù. - * Free Block µéÀº °¢°¢ FREE_INDEX_BLOCK_SIZE (32768) ´ÜÀ§·Î ³ª´©¾îÁ® - * ¸®½ºÆ®·Î °ü¸®µÈ´Ù. - * - * ¿¹¸¦ µé¾î 128k ÀÇ µ¥ÀÌÅÍ´Â - * 128 * 1024 / FREE_INDEX_BLOCK_SIZE = 4 À̹ǷΠ- * ÃÖÁ¾ ÀûÀ¸·Î´Â m_FreeIndexList[4] ¿¡ µé¾î°£´Ù. - * - * FREE_INDEX_BLOCK_SIZE ÀÇ ÃÖ´ë °ªÀº FREE_INDEX_MAX_SIZE(512) ÀÌ´Ù. - * µû¶ó¼­ 16MB ÀÌ»óÀÇ µ¥ÀÌÅÍ´Â ¹«Á¶°Ç ¹è¿­ÀÇ 512 À§Ä¡¿¡ µé¾î°£´Ù. - */ -int CEterPack::GetFreeBlockIndex(long size) -{ - return min(FREE_INDEX_MAX_SIZE, size / FREE_INDEX_BLOCK_SIZE); -} - -void CEterPack::PushFreeIndex(TEterPackIndex* index) -{ - if (index->filename_crc != 0) - { - TDataPositionMap::iterator i = m_DataPositionMap.find(index->filename_crc); - - if (i != m_DataPositionMap.end()) - m_DataPositionMap.erase(i); - - index->filename_crc = 0; - memset(index->filename, 0, sizeof(index->filename)); - } - - int blockidx = GetFreeBlockIndex(index->real_data_size); - m_FreeIndexList[blockidx].push_back(index); - m_FragmentSize += index->real_data_size; - //printf("FreeIndex: size %d: blockidx: %d\n", index->real_data_size, blockidx); -} - -long CEterPack::GetNewIndexPosition(CFileBase & file) -{ - long pos = (file.Size() - eterpack::c_HeaderSize) / sizeof(TEterPackIndex); - ++m_indexCount; - return (pos); -} - -TEterPackIndex* CEterPack::NewIndex(CFileBase& file, const char* filename, long size) -{ - TEterPackIndex* index = NULL; - int block_size = size + (DATA_BLOCK_SIZE - (size % DATA_BLOCK_SIZE)); -// if ((index = FindIndex(filename))) // ÀÌ¹Ì À妽º°¡ Á¸ÀçÇÏ´ÂÁö È®ÀÎ -// return index; - - int blockidx = GetFreeBlockIndex(block_size); - - for (TFreeIndexList::iterator i = m_FreeIndexList[blockidx].begin(); - i != m_FreeIndexList[blockidx].end(); - ++i) - { - if ((*i)->real_data_size >= size) - { - index = *i; - m_FreeIndexList[blockidx].erase(i); - - assert(index->filename_crc == 0); - break; - } - } - - if (!index) - { - index = new TEterPackIndex; - index->real_data_size = block_size; - index->id = GetNewIndexPosition(file); - } - - strncpy(index->filename, filename, FILENAME_MAX_LEN); - index->filename[FILENAME_MAX_LEN] = '\0'; - inlineConvertPackFilename(index->filename); - - index->filename_crc = GetCRC32(index->filename, strlen(index->filename)); - - m_DataPositionMap.insert(TDataPositionMap::value_type(index->filename_crc, index)); - return index; -} - -TEterPackIndex* CEterPack::FindIndex(const char * filename) -{ - static char tmpFilename[MAX_PATH + 1]; - strncpy(tmpFilename, filename, MAX_PATH); - inlineConvertPackFilename(tmpFilename); - - DWORD filename_crc = GetCRC32(tmpFilename, strlen(tmpFilename)); - TDataPositionMap::iterator i = m_DataPositionMap.find(filename_crc); - - if (i == m_DataPositionMap.end()) - return NULL; - - return (i->second); -} - -bool CEterPack::IsExist(const char * filename) -{ - return FindIndex(filename) ? true : false; -} - -bool CEterPack::CreateDataFile() -{ - FILE * fp; - - if (NULL != (fp = fopen(m_stDataFileName.c_str(), "rb"))) - { - fclose(fp); - return true; - } - else if (m_bReadOnly) - return false; - - fp = fopen(m_stDataFileName.c_str(), "wb"); - - if (!fp) - return false; - - fclose(fp); - return true; -} - -long CEterPack::GetNewDataPosition(CFileBase& file) -{ - return file.Size(); -} - -bool CEterPack::ReadData(CFileBase & file, TEterPackIndex* index, LPVOID data, long maxsize) -{ - if (index->data_size > maxsize) - return false; - - file.Seek(index->data_position); - file.Read(data, index->data_size); - return true; -} - -bool CEterPack::WriteData(CFileBase & file, TEterPackIndex* index, LPCVOID data) -{ - file.Seek(index->data_position); - - if (!file.Write(data, index->data_size)) - { - assert(!"WriteData: fwrite data failed"); - return false; - } - - return true; -} - -bool CEterPack::WriteNewData(CFileBase& file, TEterPackIndex* index, LPCVOID data) -{ - file.Seek(index->data_position); - - if (!file.Write(data, index->data_size)) - { - assert(!"WriteData: fwrite data failed"); - return false; - } - - int empty_size = index->real_data_size - index->data_size; - - if (empty_size < 0) - { - printf("SYSERR: WriteNewData(): CRITICAL ERROR: empty_size lower than 0!\n"); - exit(1); - } - - if (empty_size == 0) - return true; - - char * empty_buf = (char *) calloc(empty_size, sizeof(char)); - - if (!file.Write(empty_buf, empty_size)) - { - assert(!"WriteData: fwrite empty data failed"); - return false; - } - - free(empty_buf); - return true; -} - -TDataPositionMap & CEterPack::GetIndexMap() -{ - return m_DataPositionMap; -} - -DWORD CEterPack::DeleteUnreferencedData() -{ - TDataPositionMap::iterator i = m_DataPositionMap.begin(); - DWORD dwCount = 0; - - while (i != m_DataPositionMap.end()) - { - TEterPackIndex * pIndex = (i++)->second; - - if (0 == m_map_indexRefCount[pIndex->id]) - { - printf("Unref File %s\n", pIndex->filename); - Delete(pIndex); - ++dwCount; - } - } - - return dwCount; -} - -const char * CEterPack::GetDBName() -{ - return m_dbName; -} - -void CEterPack::__CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize) -{ - // Å° ¾Ïȣȭ - if (keySize != 32) - return; - - std::string SrcStringForKey(filename); - unsigned int idx = GetCRC32(SrcStringForKey.c_str(), SrcStringForKey.length()) & 3; - - CryptoPP::HashTransformation* hm1 = NULL; - CryptoPP::HashTransformation* hm2 = NULL; - - static CryptoPP::Tiger tiger; - static CryptoPP::SHA1 sha1; - static CryptoPP::RIPEMD128 ripemd128; - static CryptoPP::Whirlpool whirlpool; - - switch (idx & 3) - { - case 0: - hm1 = &whirlpool; - break; - - case 1: - hm1 = &tiger; - break; - - case 2: - hm1 = &sha1; - break; - - case 3: - hm1 = &ripemd128; - break; - } - - CryptoPP::StringSource(SrcStringForKey, true, - new CryptoPP::HashFilter(*hm1, - //new CryptoPP::HexEncoder( - new CryptoPP::ArraySink(key, 16) - //) // HexEncoder - ) // HashFilter - ); // StringSource - - // ¸¸µé¾îÁø Å°ÀÇ Ã¹¹ø° 4¹ÙÀÌÆ®·Î ´ÙÀ½ 16¹ÙÀÌÆ® Å° »ý¼º ¾Ë°í¸®Áò ¼±Åà - unsigned int idx2 = *(unsigned int*) key; - - switch (idx2 & 3) - { - case 0: - hm2 = &sha1; - break; - - case 1: - hm2 = &ripemd128; - break; - - case 2: - hm2 = &whirlpool; - break; - - case 3: - hm2 = &tiger; - break; - } - - CryptoPP::StringSource(SrcStringForKey, true, - new CryptoPP::HashFilter(*hm2, - //new CryptoPP::HexEncoder( - new CryptoPP::ArraySink(key + 16, 16) - //) // HexEncoder - ) // HashFilter - ); // StringSource - // Å° »ý¼º ¿Ï·á -} - -bool CEterPack::__Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj) -{ - if (32 != m_stIV_Panama.length()) - { - // ÇØÄ¿°¡ ÀÌ ¸Þ¼¼Áö¸¦ º¸¸é ÈùÆ®¸¦ ¾òÀ»±îºÁ µð¹ö±×¿¡¼­¸¸ Ãâ·Â -#ifdef _DEBUG - TraceError("IV not set (filename: %s)", filename); -#endif - return false; - } - - CryptoPP::PanamaCipher::Encryption Encryptor; - - if (dataSize < Encryptor.MandatoryBlockSize()) - { -#ifdef _DEBUG - TraceError("Type 3 pack file must be bigger than %u bytes (filename: %s)", Encryptor.MandatoryBlockSize(), filename); -#endif - return false; - } - - BYTE key[32]; - - __CreateFileNameKey_Panama(filename, key, sizeof(key)); - Encryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32); - - // MandatoryBlockSize¿¡ ³ª´©¾î ¶³¾îÁö°Ô ¸¸µé°í ÃÖ´ë 2048 ¹ÙÀÌÆ®¸¸ - DWORD cryptSize = dataSize - (dataSize % Encryptor.MandatoryBlockSize()); - cryptSize = cryptSize > 2048 ? 2048 : cryptSize; - - std::string tmp; - - tmp.reserve(cryptSize); - - CryptoPP::ArraySource(data, cryptSize, true, - new CryptoPP::StreamTransformationFilter(Encryptor, - new CryptoPP::StringSink(tmp) - ) - ); - - if (tmp.length() != cryptSize) - { -#ifdef _DEBUG - TraceError("Type 3 pack crypt buffer size error (out %u should be %u)", tmp.length(), cryptSize); -#endif - return false; - } - - zObj.AllocBuffer(dataSize); - memcpy(zObj.GetBuffer(), tmp.c_str(), cryptSize); - - if (dataSize - cryptSize > 0) - memcpy(zObj.GetBuffer() + cryptSize, data + cryptSize, dataSize - cryptSize); - - return true; -} - -bool CEterPack::__Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj) -{ - if (32 != m_stIV_Panama.length()) - { - // ÇØÄ¿°¡ ÀÌ ¸Þ¼¼Áö¸¦ º¸¸é ÈùÆ®¸¦ ¾òÀ»±îºÁ µð¹ö±×¿¡¼­¸¸ Ãâ·Â -#ifdef _DEBUG - TraceError("IV not set (filename: %s)", filename); -#endif - return false; - } - - CryptoPP::PanamaCipher::Decryption Decryptor; - - BYTE key[32]; - - __CreateFileNameKey_Panama(filename, key, sizeof(key)); - Decryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32); - - // MandatoryBlockSize¿¡ ³ª´©¾î ¶³¾îÁö°Ô ¸¸µé°í ÃÖ´ë 2048 ¹ÙÀÌÆ®¸¸ - DWORD cryptSize = dataSize - (dataSize % Decryptor.MandatoryBlockSize()); - cryptSize = cryptSize > 2048 ? 2048 : cryptSize; - - std::string tmp; - - tmp.reserve(cryptSize); - - CryptoPP::ArraySource(data, cryptSize, true, - new CryptoPP::StreamTransformationFilter(Decryptor, - new CryptoPP::StringSink(tmp) - ) - ); - - if (tmp.length() != cryptSize) - { -#ifdef _DEBUG - TraceError("Type 3 pack crypt buffer size error (out %u should be %u)", tmp.length(), cryptSize); -#endif - return false; - } - - zObj.AllocBuffer(dataSize); - memcpy(zObj.GetBuffer(), tmp.c_str(), cryptSize); - - if (dataSize - cryptSize > 0) - memcpy(zObj.GetBuffer() + cryptSize, data + cryptSize, dataSize - cryptSize); - - return true; -} - - -///////////////////////// - -void CEterFileDict::InsertItem(CEterPack* pkPack, TEterPackIndex* pkInfo) -{ - Item item; - - item.pkPack = pkPack; - item.pkInfo = pkInfo; - - m_dict.insert(TDict::value_type(pkInfo->filename_crc, item)); -} - -void CEterFileDict::UpdateItem(CEterPack* pkPack, TEterPackIndex* pkInfo) -{ - Item item; - - item.pkPack = pkPack; - item.pkInfo = pkInfo; - - TDict::iterator f = m_dict.find(pkInfo->filename_crc); - if (f == m_dict.end()) - m_dict.insert(TDict::value_type(pkInfo->filename_crc, item)); - else - { - if (strcmp(f->second.pkInfo->filename, item.pkInfo->filename) == 0) - { - f->second = item; - } - else - { - TraceError("NAME_COLLISION: OLD: %s NEW: %s", f->second.pkInfo->filename, item.pkInfo->filename); - } - - } -} - -CEterFileDict::Item* CEterFileDict::GetItem(DWORD dwFileNameHash, const char * c_pszFileName) -{ - std::pair iter_pair = m_dict.equal_range(dwFileNameHash); - - TDict::iterator iter = iter_pair.first; - - while (iter != iter_pair.second) - { - Item& item = iter->second; - - if (0 == strcmp(c_pszFileName, item.pkInfo->filename)) - return &item; - - ++iter; - } - - return NULL; -} diff --git a/src/EterPack/EterPack.h b/src/EterPack/EterPack.h deleted file mode 100644 index 0c2d0999..00000000 --- a/src/EterPack/EterPack.h +++ /dev/null @@ -1,234 +0,0 @@ -#ifndef __INC_ETERPACKLIB_ETERPACK_H__ -#define __INC_ETERPACKLIB_ETERPACK_H__ - -#include -#include - -#include "../EterBase/MappedFile.h" - -#ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((DWORD)(BYTE) (ch0 ) | ((DWORD)(BYTE) (ch1) << 8) | \ - ((DWORD)(BYTE) (ch2) << 16) | ((DWORD)(BYTE) (ch3) << 24)) -#endif - - -//#define CHECKSUM_CHECK_MD5 - -#include "md5.h" - -namespace eterpack -{ - const DWORD c_PackCC = MAKEFOURCC('E', 'P', 'K', 'D'); - const DWORD c_IndexCC = MAKEFOURCC('E', 'P', 'K', 'D'); - const DWORD c_Version = 2; - // FourCC + Version + m_indexCount - const DWORD c_HeaderSize = sizeof(DWORD) + sizeof(DWORD) + sizeof(long); -}; - -enum EEterPackTypes -{ - DBNAME_MAX_LEN = 255, - FILENAME_MAX_LEN = 160, - FREE_INDEX_BLOCK_SIZE = 32768, - FREE_INDEX_MAX_SIZE = 512, - DATA_BLOCK_SIZE = 256, - - COMPRESSED_TYPE_NONE = 0, - COMPRESSED_TYPE_COMPRESS = 1, - COMPRESSED_TYPE_SECURITY = 2, - COMPRESSED_TYPE_PANAMA = 3, - COMPRESSED_TYPE_HYBRIDCRYPT = 4, - COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB = 5, - COMPRESSED_TYPE_COUNT = 6, -}; - -#pragma pack(push, 4) -typedef struct SEterPackIndex -{ - long id; - char filename[FILENAME_MAX_LEN + 1]; - DWORD filename_crc; - long real_data_size; - long data_size; -#ifdef CHECKSUM_CHECK_MD5 - BYTE MD5Digest[16]; -#else - DWORD data_crc; -#endif - long data_position; - char compressed_type; -} TEterPackIndex; -#pragma pack(pop) - -typedef std::unordered_map TDataPositionMap; -typedef std::list TFreeIndexList; - - -class CEterPack; - -class CEterFileDict -{ -public: - struct Item - { - Item() : pkPack(NULL), pkInfo(NULL) {} - - CEterPack* pkPack; - TEterPackIndex* pkInfo; - }; - - enum - { - BUCKET_SIZE = 16, - }; - - typedef std::unordered_multimap TDict; - -public: - void InsertItem(CEterPack* pkPack, TEterPackIndex* pkInfo); - void UpdateItem(CEterPack* pkPack, TEterPackIndex* pkInfo); - - Item* GetItem(DWORD dwFileNameHash, const char* c_pszFileName); - - const TDict& GetDict() const - { - return m_dict; - } - -private: - TDict m_dict; -}; - -class CEterPack -{ - public: - CEterPack(); - virtual ~CEterPack(); - - void Destroy(); - bool Create(CEterFileDict& rkFileDict, const char * dbname, const char * pathName, bool bReadOnly = true, const BYTE* iv = NULL); - bool DecryptIV(DWORD dwPanamaKey); - - const char * GetDBName(); - - bool Get(CMappedFile & mappedFile, const char * filename, LPCVOID * data); - bool Get2(CMappedFile & mappedFile, const char * filename, TEterPackIndex* index, LPCVOID * data); - - bool Put(const char * filename, const char * sourceFilename, BYTE packType, const std::string& strRelateMapName); - bool Put(const char * filename, LPCVOID data, long len, BYTE packType); - - bool Delete(const char * filename); - - bool Extract(); - - long GetFragmentSize(); - - bool IsExist(const char * filename); - - TDataPositionMap & GetIndexMap(); - - bool EncryptIndexFile(); - bool DecryptIndexFile(); - - DWORD DeleteUnreferencedData(); // ¸î°³°¡ »èÁ¦ µÇ¾ú´ÂÁö ¸®ÅÏ ÇÑ´Ù. - - bool GetNames(std::vector* retNames); - - private: - bool __BuildIndex(CEterFileDict& rkFileDict, bool bOverwirte=false); - - bool CreateIndexFile(); - TEterPackIndex * FindIndex(const char * filename); - long GetNewIndexPosition(CFileBase& file); - TEterPackIndex * NewIndex(CFileBase& file, const char * filename, long size); - void WriteIndex(CFileBase& file, TEterPackIndex * index); - int GetFreeBlockIndex(long size); - void PushFreeIndex(TEterPackIndex * index); - - bool CreateDataFile(); - long GetNewDataPosition(CFileBase& file); - bool ReadData(CFileBase& file, TEterPackIndex * index, LPVOID data, long maxsize); - bool WriteData(CFileBase& file, TEterPackIndex * index, LPCVOID data); - bool WriteNewData(CFileBase& file, TEterPackIndex * index, LPCVOID data); - - bool Delete(TEterPackIndex * pIndex); - - protected: - CMappedFile m_file; - - char* m_file_data; - unsigned m_file_size; - - long m_indexCount; - bool m_bEncrypted; - - char m_dbName[DBNAME_MAX_LEN+1]; - char m_indexFileName[MAX_PATH+1]; - TEterPackIndex * m_indexData; - long m_FragmentSize; - bool m_bReadOnly; - bool m_bDecrypedIV; - - std::unordered_map m_map_indexRefCount; - TDataPositionMap m_DataPositionMap; - TFreeIndexList m_FreeIndexList[FREE_INDEX_MAX_SIZE + 1]; // MAX µµ ¾ï¼¼½º ÇϹǷΠ+ 1 Å©±â¸¸Å­ ¸¸µç´Ù. - - std::string m_stDataFileName; - - private: - void __CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize); - bool __Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj); - bool __Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj); - std::string m_stIV_Panama; - - //private: - // bool m_bIsDataLoaded; - // // ±×³É time_t¸¦ ¾²¸é, 32bit time_t¸¦ »ç¿ëÇÏ´Â ¼Ò½º¿¡¼­´Â, - // // CEterPackÀÇ size¸¦ ½ÇÁ¦ size - 4·Î ÀνÄÇϱ⠶§¹®¿¡ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. - // __time64_t m_tLastAccessTime; - //public: - // __time64_t GetLastAccessTime() { return m_tLastAccessTime; } - // void UpdateLastAccessTime(); - // void ClearDataMemoryMap(); - -#ifdef CHECKSUM_CHECK_MD5 - void GenerateMD5Hash( BYTE* pData, int nLength, IN OUT MD5_CTX& context ); -#endif -}; - -class CMakePackLog -{ - public: - static CMakePackLog& GetSingleton(); - - public: - CMakePackLog(); - ~CMakePackLog(); - - void SetFileName(const char* c_szFileName); - - void Writef(const char* c_szFormat, ...); - void Writenf(const char* c_szFormat, ...); - void Write(const char* c_szBuf); - - void WriteErrorf(const char* c_szFormat, ...); - void WriteErrornf(const char* c_szFormat, ...); - void WriteError(const char* c_szBuf); - - void FlushError(); - - private: - void __Write(const char* c_szBuf, int nBufLen); - void __WriteError(const char* c_szBuf, int nBufLen); - bool __IsLogMode(); - - private: - FILE* m_fp; - FILE* m_fp_err; - - std::string m_stFileName; - std::string m_stErrorFileName; -}; - -#endif diff --git a/src/EterPack/EterPack.vcxproj b/src/EterPack/EterPack.vcxproj index ca5a5d18..a5767495 100644 --- a/src/EterPack/EterPack.vcxproj +++ b/src/EterPack/EterPack.vcxproj @@ -170,20 +170,6 @@ - - Disabled - EnableFastChecks - true - MaxSpeed - MaxSpeed - - - Disabled - EnableFastChecks - true - MaxSpeed - MaxSpeed - Disabled EnableFastChecks @@ -191,27 +177,14 @@ MaxSpeed MaxSpeed - - - - Disabled - EnableFastChecks - Create - true - MaxSpeed - MaxSpeed - - - - diff --git a/src/EterPack/EterPack.vcxproj.filters b/src/EterPack/EterPack.vcxproj.filters index b42976f8..b79c7850 100644 --- a/src/EterPack/EterPack.vcxproj.filters +++ b/src/EterPack/EterPack.vcxproj.filters @@ -14,24 +14,9 @@ - - Source Files - - - Source Files - Source Files - - Source Files - - - Source Files - - - File Providers - File Providers @@ -40,21 +25,12 @@ - - Header Files - - - Header Files - Header Files Header Files - - Header Files - Header Files diff --git a/src/EterPack/EterPackCursor.cpp b/src/EterPack/EterPackCursor.cpp deleted file mode 100644 index 288a90cc..00000000 --- a/src/EterPack/EterPackCursor.cpp +++ /dev/null @@ -1,59 +0,0 @@ -#include "StdAfx.h" -#include "EterPackCursor.h" -#include "Inline.h" - -CEterPackCursor::CEterPackCursor(CEterPack* pack) : m_pPack(pack), m_pData(NULL), m_ReadPoint(0) -{ -} - -CEterPackCursor::~CEterPackCursor() -{ - Close(); -} - -bool CEterPackCursor::Open(const char* filename) -{ - assert(m_pPack != NULL); - - char tmpFilename[MAX_PATH + 1]; - strncpy(tmpFilename, filename, MAX_PATH); - inlineConvertPackFilename(tmpFilename); - - if (!m_pPack->Get(m_file, tmpFilename, &m_pData)) - return false; - - return true; -} - -void CEterPackCursor::Close() -{ - m_file.Destroy(); - m_pData = NULL; - m_ReadPoint = 0; -} - -void CEterPackCursor::Seek(long offset) -{ - m_ReadPoint = max(0, min(Size(), offset)); -} - -bool CEterPackCursor::Read(LPVOID data, long size) -{ - if (m_file.IsNull()) - return false; - - if (m_ReadPoint + size > Size()) - return false; - - memcpy(data, (char*) m_pData + m_ReadPoint, size); - m_ReadPoint += size; - return true; -} - -long CEterPackCursor::Size() -{ - if (m_file.IsNull()) - return 0; - - return m_file.Size(); -} diff --git a/src/EterPack/EterPackCursor.h b/src/EterPack/EterPackCursor.h deleted file mode 100644 index 5ba802a5..00000000 --- a/src/EterPack/EterPackCursor.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef __INC_ETERPACKCURSOR_H__ -#define __INC_ETERPACKCURSOR_H__ - -#include "EterPack.h" - -class CEterPackCursor -{ - public: - CEterPackCursor(CEterPack * pack); - ~CEterPackCursor(); - - bool Open(const char* filename); - void Close(); - void Seek(long offset); - bool Read(LPVOID data, long size); - long Size(); - - private: - CEterPack * m_pPack; - CMappedFile m_file; - LPCVOID m_pData; - long m_ReadPoint; -}; - -#endif diff --git a/src/EterPack/EterPackManager.cpp b/src/EterPack/EterPackManager.cpp index b853861b..bdc98726 100644 --- a/src/EterPack/EterPackManager.cpp +++ b/src/EterPack/EterPackManager.cpp @@ -1,5 +1,7 @@ #include "StdAfx.h" +#include + #include #include @@ -14,18 +16,6 @@ #define PATH_ABSOLUTE_YMIRWORK1 "d:/ymir work/" #define PATH_ABSOLUTE_YMIRWORK2 "d:\\ymir work\\" - -void CEterPackManager::SetCacheMode() -{ - m_isCacheMode=true; -} - -void CEterPackManager::SetRelativePathMode() -{ - m_bTryRelativePath = true; -} - - // StringPath std::string ¹öÀü std::string CEterPackManager::ConvertFileName(std::string fileName) { @@ -58,50 +48,6 @@ bool CEterPackManager::CompareName(const char * c_szDirectoryName, DWORD /*dwLen return true; } -void CEterPackManager::LoadStaticCache(const char* c_szFileName) -{ - if (!m_isCacheMode) - return; - - std::string strFileName = ConvertFileName(c_szFileName); - - DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); - - std::unordered_map::iterator f = m_kMap_dwNameKey_kCache.find(dwFileNameHash); - if (m_kMap_dwNameKey_kCache.end() != f) - return; - - CMappedFile kMapFile; - const void* c_pvData; - if (!Get(kMapFile, c_szFileName, &c_pvData)) - return; - - SCache kNewCache; - kNewCache.m_dwBufSize = kMapFile.Size(); - kNewCache.m_abBufData = new BYTE[kNewCache.m_dwBufSize]; - memcpy(kNewCache.m_abBufData, c_pvData, kNewCache.m_dwBufSize); - m_kMap_dwNameKey_kCache.insert(std::unordered_map::value_type(dwFileNameHash, kNewCache)); -} - -CEterPackManager::SCache* CEterPackManager::__FindCache(DWORD dwFileNameHash) -{ - std::unordered_map::iterator f=m_kMap_dwNameKey_kCache.find(dwFileNameHash); - if (m_kMap_dwNameKey_kCache.end()==f) - return NULL; - - return &f->second; -} - -void CEterPackManager::__ClearCacheMap() -{ - std::unordered_map::iterator i; - - for (i = m_kMap_dwNameKey_kCache.begin(); i != m_kMap_dwNameKey_kCache.end(); ++i) - delete [] i->second.m_abBufData; - - m_kMap_dwNameKey_kCache.clear(); -} - struct TimeChecker { TimeChecker(const char* name) : name(name) @@ -117,27 +63,37 @@ struct TimeChecker DWORD baseTime; }; -bool CEterPackManager::Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) +bool CEterPackManager::Get(const std::string& fileName, TPackDataPtr& dataPtr) { //TimeChecker timeChecker(c_szFileName); //Logf(1, "Load %s\n", c_szFileName); if (m_iSearchMode == SEARCH_FILE_FIRST) { - if (GetFromFile(rMappedFile, c_szFileName, pData)) - { + if (GetFromFile(fileName, dataPtr)) return true; - } - return GetFromPack(rMappedFile, c_szFileName, pData); + return GetFromPack(fileName, dataPtr); } - if (GetFromPack(rMappedFile, c_szFileName, pData)) - { + if (GetFromPack(fileName, dataPtr)) return true; - } - return GetFromFile(rMappedFile, c_szFileName, pData); + return GetFromFile(fileName, dataPtr); +} + + +bool CEterPackManager::Get(const std::string& fileName, std::stringstream& dataStream) +{ + CEterPackManager::TPackDataPtr data; + if (!Get(fileName, data)) + return false; + + // Copy the data from the pack into the file sstream + dataStream.str(""); + std::copy(data->begin(), data->end(), std::ostream_iterator(dataStream)); + + return true; } struct FinderLock @@ -155,24 +111,15 @@ struct FinderLock CRITICAL_SECTION* p_cs; }; -bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) +bool CEterPackManager::GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr) { FinderLock lock(m_csFinder); - std::string strFileName = ConvertFileName(c_szFileName); + std::string strFileName = ConvertFileName(fileName); - DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); - SCache* pkCache = __FindCache(dwFileNameHash); + auto pkFileItem = m_FileMap.find(strFileName); - if (pkCache) - { - rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData); - return true; - } - - auto pkFileItem = m_FileDict.find(dwFileNameHash); - - if (pkFileItem == m_FileDict.end()) { + if (pkFileItem == m_FileMap.end()) { #ifdef _DEBUG TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str()); #endif @@ -181,56 +128,43 @@ bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szF } auto data = std::make_shared>(); - bool r = pkFileItem->second->getFile(strFileName, data); - - // Keep the file loaded by always forcing a reference in the smart pointer (temporary hack) - keepDataReferencedArray.push_back(data); + if (!pkFileItem->second->getFile(strFileName, data)) + return false; - rMappedFile.Link(data->size(), data->data()); - *pData = (LPCVOID *) data->data(); - return r; + // Set dataPtr to the retreived data pointer + dataPtr = data; + + return true; } -const time_t g_tCachingInterval = 10; // 10ÃÊ - -bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) +bool CEterPackManager::GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr) { -#ifndef _DEBUG - //const char *pcExt = strchr(c_szFileName, '.'); - //if (pcExt && - // _strnicmp(pcExt, ".py", 3) == 0 && // python ½ºÅ©¸³Æ® Áß - // stricmp(c_szFileName, "logininfo.py") != 0 && // ·Î±×ÀÎ Á¤º¸ ÆÄÀÏÀÌ ¾Æ´Ï°í - // strnicmp(c_szFileName, "locale", 6) != 0 - // ) - //{ - // return false; - //} -#endif + // Try to open the file + std::ifstream file(fileName, std::ios::binary); + if (!file.is_open()) + return false; - //if(m_bTryRelativePath) { - // if (strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK1, strlen(PATH_ABSOLUTE_YMIRWORK1)) == 0 || strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK2, strlen(PATH_ABSOLUTE_YMIRWORK2)) == 0) { - // if(rMappedFile.Create(c_szFileName+strlen(PATH_ABSOLUTE_YMIRWORK1), pData, 0, 0)) - // { - // return true; - // } - // } - //} - - return rMappedFile.Create(c_szFileName, pData, 0, 0) ? true : false; + // Read the file's contents + dataPtr = std::make_shared>( + std::istreambuf_iterator(file), + std::istreambuf_iterator() + ); + return true; } bool CEterPackManager::isExistInPack(const char * c_szFileName) { std::string strFileName = ConvertFileName(c_szFileName); - DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); - auto pkFileItem = m_FileDict.find(dwFileNameHash); + auto pkFileItem = m_FileMap.find(strFileName); - if (pkFileItem == m_FileDict.end()) + if (pkFileItem == m_FileMap.end()) return false; - if (pkFileItem->second) - return pkFileItem->second->fileExists(strFileName.c_str()); + if (!pkFileItem->second) + return false; + + return pkFileItem->second->fileExists(strFileName.c_str()); } bool CEterPackManager::isExist(const char * c_szFileName) @@ -240,16 +174,9 @@ bool CEterPackManager::isExist(const char * c_szFileName) if (isExistInPack(c_szFileName)) return true; - return _access(c_szFileName, 0) == 0 ? true : false; + return _access(c_szFileName, 0) == 0; } - //if(m_bTryRelativePath) { - // if (strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK1, strlen(PATH_ABSOLUTE_YMIRWORK1)) == 0 || strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK2, strlen(PATH_ABSOLUTE_YMIRWORK2)) == 0) { - // if(access(c_szFileName+strlen(PATH_ABSOLUTE_YMIRWORK1), 0) == 0) - // return true; - // } - //} - if (_access(c_szFileName, 0) == 0) return true; @@ -276,18 +203,20 @@ bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDire auto packFiles = pack->listFiles(); - for (auto const& fileName : packFiles) { - DWORD dwFileNameHash = GetCRC32(fileName.c_str(), fileName.length()); - m_FileDict.insert({ dwFileNameHash, pack }); - } + for (auto const& fileName : packFiles) + m_FileMap.insert({ fileName, pack }); - m_PackMap.insert(TEterPackMap::value_type(c_szName, pack)); + m_PackMap.insert({ c_szName, pack }); + + return true; } - catch (...) + catch (std::exception& e) { #ifdef _DEBUG - Tracef("The eterpack doesn't exist [%s]\n", c_szName); + Tracef("Unable to load file provider '%s': %s\n", c_szName, e.what()); #endif + + return false; } } @@ -301,14 +230,16 @@ int CEterPackManager::GetSearchMode() return m_iSearchMode; } -CEterPackManager::CEterPackManager() : m_bTryRelativePath(false), m_iSearchMode(SEARCH_FILE_FIRST), m_isCacheMode(false) +CEterPackManager::CEterPackManager() : m_iSearchMode(SEARCH_FILE_FIRST) { InitializeCriticalSection(&m_csFinder); } CEterPackManager::~CEterPackManager() { - __ClearCacheMap(); - DeleteCriticalSection(&m_csFinder); } + +const CEterPackManager::TFileMap& CEterPackManager::GetFileMap() { + return this->m_FileMap; +} diff --git a/src/EterPack/EterPackManager.h b/src/EterPack/EterPackManager.h index 051f6626..80c71c1b 100644 --- a/src/EterPack/EterPackManager.h +++ b/src/EterPack/EterPackManager.h @@ -6,16 +6,9 @@ #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 { @@ -25,49 +18,37 @@ class CEterPackManager : public CSingleton typedef std::list> TEterPackList; typedef std::unordered_map, stringhash> TEterPackMap; + typedef std::unordered_map, stringhash> TFileMap; + typedef std::shared_ptr> TPackDataPtr; 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 Get(const std::string& fileName, TPackDataPtr& dataPtr); + bool Get(const std::string& fileName, std::stringstream& dataStream); + 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); + const TFileMap& GetFileMap(); + 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(); + bool GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr); + bool GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr); 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; + TFileMap m_FileMap; + TEterPackMap m_PackMap; CRITICAL_SECTION m_csFinder; }; diff --git a/src/EterPack/FileProvider.cpp b/src/EterPack/FileProvider.cpp deleted file mode 100644 index c815c329..00000000 --- a/src/EterPack/FileProvider.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "FileProvider.h" diff --git a/src/EterPack/FileProvider.h b/src/EterPack/FileProvider.h index 9f8aef6f..bfb159b8 100644 --- a/src/EterPack/FileProvider.h +++ b/src/EterPack/FileProvider.h @@ -5,7 +5,6 @@ #include #include - class FileProvider { public: @@ -13,4 +12,3 @@ public: virtual bool fileExists(const std::string& fileName) = 0; virtual bool getFile(const std::string& fileName, std::shared_ptr>& fileData) = 0; }; - diff --git a/src/EterPack/Folder.cpp b/src/EterPack/Folder.cpp index 95694750..906f8a14 100644 --- a/src/EterPack/Folder.cpp +++ b/src/EterPack/Folder.cpp @@ -14,10 +14,8 @@ void Folder::ListFiles(const std::string& directory, const std::string& relative // Start searching for files and directories hFind = FindFirstFile(searchPath.c_str(), &findData); - if (hFind == INVALID_HANDLE_VALUE) { - std::cerr << L"Failed to open directory: " << directory << L"\n"; - return; - } + if (hFind == INVALID_HANDLE_VALUE) + throw std::runtime_error("Failed to open directory: " + directory); do { const std::string fileOrDirName = findData.cFileName; @@ -86,26 +84,15 @@ bool Folder::getFile(const std::string& fileName, std::shared_ptrfolderPath + "/" + realFileName; - // open the file: + // Try to open the file std::ifstream file(realFileName, std::ios::binary); + if (!file.is_open()) + return false; - // Stop eating new lines in binary mode!!! - file.unsetf(std::ios::skipws); - - // get its size: - std::streampos fileSize; - - file.seekg(0, std::ios::end); - fileSize = file.tellg(); - file.seekg(0, std::ios::beg); - - // reserve capacity - fileData->reserve(fileSize); - - // read the data: - fileData->insert(fileData->begin(), - std::istream_iterator(file), - std::istream_iterator()); - - return true; + // Read the file's contents + fileData = std::make_shared>( + std::istreambuf_iterator(file), + std::istreambuf_iterator() + ); + return true; } \ No newline at end of file diff --git a/src/EterPack/StdAfx.cpp b/src/EterPack/StdAfx.cpp deleted file mode 100644 index 804d0881..00000000 --- a/src/EterPack/StdAfx.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "stdafx.h" - diff --git a/src/EterPack/ZIP.cpp b/src/EterPack/ZIP.cpp index 28b835c8..df060897 100644 --- a/src/EterPack/ZIP.cpp +++ b/src/EterPack/ZIP.cpp @@ -12,10 +12,12 @@ ZIP::ZIP(const std::string& archivePath) if ((zipFile = zip_open(archivePath.c_str(), 0, &err)) == NULL) { zip_error_t error; + zip_error_init_with_code(&error, err); - fprintf(stderr, "Cannot open zip archive '%s': %s\n", archivePath.c_str(), zip_error_strerror(&error)); + std::string errorMessage = zip_error_strerror(&error); zip_error_fini(&error); - return; + + throw std::runtime_error("Cannot open ZIP archive '" + archivePath + "': " + errorMessage); } // Read the list of files in the archive @@ -28,7 +30,7 @@ ZIP::ZIP(const std::string& archivePath) std::string fileName(fileData.name); if (fileData.size == 0) { - // Folder + // This is a folder, skip it continue; } @@ -79,8 +81,15 @@ bool ZIP::getFile(const std::string& fileName, std::shared_ptr zip_stat_t fileInfo; zip_stat_index(zipFile, it->second, 0, &fileInfo); - fileData->resize(fileInfo.size); + // Initialize the buffer + fileData = std::make_shared>(fileInfo.size); + + // Attempt to read the data into the buffer auto retval = zip_fread(file, fileData->data(), fileData->size()); + + // Close the file + zip_fclose(file); + if (retval == -1) return false; diff --git a/src/EterPack/md5.c b/src/EterPack/md5.c deleted file mode 100644 index 2fe2f4e9..00000000 --- a/src/EterPack/md5.c +++ /dev/null @@ -1,1033 +0,0 @@ -/* - - *********************************************************************** - - ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** - - ** ** - - ** License to copy and use this software is granted provided that ** - - ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** - - ** Digest Algorithm" in all material mentioning or referencing this ** - - ** software or this function. ** - - ** ** - - ** License is also granted to make and use derivative works ** - - ** provided that such works are identified as "derived from the RSA ** - - ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** - - ** material mentioning or referencing the derived work. ** - - ** ** - - ** RSA Data Security, Inc. makes no representations concerning ** - - ** either the merchantability of this software or the suitability ** - - ** of this software for any particular purpose. It is provided "as ** - - ** is" without express or implied warranty of any kind. ** - - ** ** - - ** These notices must be retained in any copies of any part of this ** - - ** documentation and/or software. ** - - *********************************************************************** - - */ - - -#include "md5.h" - - - -/* - - *********************************************************************** - - ** Message-digest routines: ** - - ** To form the message digest for a message M ** - - ** (1) Initialize a context buffer mdContext using MD5Init ** - - ** (2) Call MD5Update on mdContext and M ** - - ** (3) Call MD5Final on mdContext ** - - ** The message digest is now in mdContext->digest[0...15] ** - - *********************************************************************** - - */ - - - -static unsigned char PADDING[64] = { - - 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - -}; - - - -#ifndef CPU386 /* Alternate defs exist for 386 assembler version */ - -/* F, G, H and I are basic MD5 functions */ - -#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) - -#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) - -#define H(x, y, z) ((x) ^ (y) ^ (z)) - -#define I(x, y, z) ((y) ^ ((x) | (~z))) - - - -/* ROTATE_LEFT rotates x left n bits */ - -#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) - - - -/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */ - -/* Rotation is separate from addition to prevent recomputation */ - -#define FF(a, b, c, d, x, s, ac) \ - (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - -#define GG(a, b, c, d, x, s, ac) \ - (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - -#define HH(a, b, c, d, x, s, ac) \ - (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - -#define II(a, b, c, d, x, s, ac) \ - (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \ - (a) = ROTATE_LEFT ((a), (s)); \ - (a) += (b); \ - -#endif /* CPU386 */ - - - -/* The routine MD5Init initializes the message-digest context - - mdContext. All fields are set to zero. - - */ - -void MD5Init (MD5_CTX *mdContext) -{ - - mdContext->i[0] = mdContext->i[1] = (UINT4)0; - - - - /* Load magic initialization constants. - - */ - - mdContext->buf[0] = (UINT4)0x67452301; - - mdContext->buf[1] = (UINT4)0xefcdab89; - - mdContext->buf[2] = (UINT4)0x98badcfe; - - mdContext->buf[3] = (UINT4)0x10325476; - -} - - - -/* The routine MD5Update updates the message-digest context to - - account for the presence of each of the characters inBuf[0..inLen-1] - - in the message whose digest is being computed. - - */ - -void MD5Update (MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen) -{ - - UINT4 in[16]; - - int mdi; - - unsigned int i, ii; - - - - /* compute number of bytes mod 64 */ - - mdi = (int)((mdContext->i[0] >> 3) & 0x3F); - - - - /* update number of bits */ - - if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0]) - - mdContext->i[1]++; - - mdContext->i[0] += ((UINT4)inLen << 3); - - mdContext->i[1] += ((UINT4)inLen >> 29); - - - -#ifdef LITTLE_ENDIAN - - /* Speedup for little-endian machines suggested in MD5 report --P Karn */ - - if(mdi == 0 && ((int)inBuf & 3) == 0){ - - while(inLen >= 64){ - - MD5Transform(mdContext->buf,(UINT4 *)inBuf); - - inLen -= 64; - - inBuf += 64; - - } - - } - -#endif /* LITTLE_ENDIAN */ - - while (inLen--) { - - /* add new character to buffer, increment mdi */ - - mdContext->in[mdi++] = *inBuf++; - - - - /* transform if necessary */ - - if (mdi == 0x40) { - - for (i = 0, ii = 0; i < 16; i++, ii += 4) - - in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | - - (((UINT4)mdContext->in[ii+2]) << 16) | - - (((UINT4)mdContext->in[ii+1]) << 8) | - - ((UINT4)mdContext->in[ii]); - - MD5Transform (mdContext->buf, in); - - mdi = 0; - - } - - } - -} - - - -/* The routine MD5Final terminates the message-digest computation and - - ends with the desired message digest in mdContext->digest[0...15]. - - */ - -void MD5Final (MD5_CTX *mdContext) -{ - - UINT4 in[16]; - - int mdi; - - unsigned int i, ii; - - unsigned int padLen; - - - - /* save number of bits */ - - in[14] = mdContext->i[0]; - - in[15] = mdContext->i[1]; - - - - /* compute number of bytes mod 64 */ - - mdi = (int)((mdContext->i[0] >> 3) & 0x3F); - - - - /* pad out to 56 mod 64 */ - - padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi); - - MD5Update (mdContext, PADDING, padLen); - - - - /* append length in bits and transform */ - - for (i = 0, ii = 0; i < 14; i++, ii += 4) - - in[i] = (((UINT4)mdContext->in[ii+3]) << 24) | - - (((UINT4)mdContext->in[ii+2]) << 16) | - - (((UINT4)mdContext->in[ii+1]) << 8) | - - ((UINT4)mdContext->in[ii]); - - MD5Transform (mdContext->buf, in); - - - - /* store buffer in digest */ - - for (i = 0, ii = 0; i < 4; i++, ii += 4) { - - mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF); - - mdContext->digest[ii+1] = - - (unsigned char)((mdContext->buf[i] >> 8) & 0xFF); - - mdContext->digest[ii+2] = - - (unsigned char)((mdContext->buf[i] >> 16) & 0xFF); - - mdContext->digest[ii+3] = - - (unsigned char)((mdContext->buf[i] >> 24) & 0xFF); - - } - -} - - - -#ifndef CPU386 /* Fast assembler version exists for 386/486 */ - - - -/* Basic MD5 step. Transforms buf based on in. - - */ - -void MD5Transform (buf, in) - -UINT4 *buf; - -UINT4 *in; - -{ - - UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; - - - - /* Round 1 */ - -#define S11 7 - -#define S12 12 - -#define S13 17 - -#define S14 22 - - FF ( a, b, c, d, in[ 0], S11, 3614090360); /* 1 */ - - FF ( d, a, b, c, in[ 1], S12, 3905402710); /* 2 */ - - FF ( c, d, a, b, in[ 2], S13, 606105819); /* 3 */ - - FF ( b, c, d, a, in[ 3], S14, 3250441966); /* 4 */ - - FF ( a, b, c, d, in[ 4], S11, 4118548399); /* 5 */ - - FF ( d, a, b, c, in[ 5], S12, 1200080426); /* 6 */ - - FF ( c, d, a, b, in[ 6], S13, 2821735955); /* 7 */ - - FF ( b, c, d, a, in[ 7], S14, 4249261313); /* 8 */ - - FF ( a, b, c, d, in[ 8], S11, 1770035416); /* 9 */ - - FF ( d, a, b, c, in[ 9], S12, 2336552879); /* 10 */ - - FF ( c, d, a, b, in[10], S13, 4294925233); /* 11 */ - - FF ( b, c, d, a, in[11], S14, 2304563134); /* 12 */ - - FF ( a, b, c, d, in[12], S11, 1804603682); /* 13 */ - - FF ( d, a, b, c, in[13], S12, 4254626195); /* 14 */ - - FF ( c, d, a, b, in[14], S13, 2792965006); /* 15 */ - - FF ( b, c, d, a, in[15], S14, 1236535329); /* 16 */ - - - - /* Round 2 */ - -#define S21 5 - -#define S22 9 - -#define S23 14 - -#define S24 20 - - GG ( a, b, c, d, in[ 1], S21, 4129170786); /* 17 */ - - GG ( d, a, b, c, in[ 6], S22, 3225465664); /* 18 */ - - GG ( c, d, a, b, in[11], S23, 643717713); /* 19 */ - - GG ( b, c, d, a, in[ 0], S24, 3921069994); /* 20 */ - - GG ( a, b, c, d, in[ 5], S21, 3593408605); /* 21 */ - - GG ( d, a, b, c, in[10], S22, 38016083); /* 22 */ - - GG ( c, d, a, b, in[15], S23, 3634488961); /* 23 */ - - GG ( b, c, d, a, in[ 4], S24, 3889429448); /* 24 */ - - GG ( a, b, c, d, in[ 9], S21, 568446438); /* 25 */ - - GG ( d, a, b, c, in[14], S22, 3275163606); /* 26 */ - - GG ( c, d, a, b, in[ 3], S23, 4107603335); /* 27 */ - - GG ( b, c, d, a, in[ 8], S24, 1163531501); /* 28 */ - - GG ( a, b, c, d, in[13], S21, 2850285829); /* 29 */ - - GG ( d, a, b, c, in[ 2], S22, 4243563512); /* 30 */ - - GG ( c, d, a, b, in[ 7], S23, 1735328473); /* 31 */ - - GG ( b, c, d, a, in[12], S24, 2368359562); /* 32 */ - - - - /* Round 3 */ - -#define S31 4 - -#define S32 11 - -#define S33 16 - -#define S34 23 - - HH ( a, b, c, d, in[ 5], S31, 4294588738); /* 33 */ - - HH ( d, a, b, c, in[ 8], S32, 2272392833); /* 34 */ - - HH ( c, d, a, b, in[11], S33, 1839030562); /* 35 */ - - HH ( b, c, d, a, in[14], S34, 4259657740); /* 36 */ - - HH ( a, b, c, d, in[ 1], S31, 2763975236); /* 37 */ - - HH ( d, a, b, c, in[ 4], S32, 1272893353); /* 38 */ - - HH ( c, d, a, b, in[ 7], S33, 4139469664); /* 39 */ - - HH ( b, c, d, a, in[10], S34, 3200236656); /* 40 */ - - HH ( a, b, c, d, in[13], S31, 681279174); /* 41 */ - - HH ( d, a, b, c, in[ 0], S32, 3936430074); /* 42 */ - - HH ( c, d, a, b, in[ 3], S33, 3572445317); /* 43 */ - - HH ( b, c, d, a, in[ 6], S34, 76029189); /* 44 */ - - HH ( a, b, c, d, in[ 9], S31, 3654602809); /* 45 */ - - HH ( d, a, b, c, in[12], S32, 3873151461); /* 46 */ - - HH ( c, d, a, b, in[15], S33, 530742520); /* 47 */ - - HH ( b, c, d, a, in[ 2], S34, 3299628645); /* 48 */ - - - - /* Round 4 */ - -#define S41 6 - -#define S42 10 - -#define S43 15 - -#define S44 21 - - II ( a, b, c, d, in[ 0], S41, 4096336452); /* 49 */ - - II ( d, a, b, c, in[ 7], S42, 1126891415); /* 50 */ - - II ( c, d, a, b, in[14], S43, 2878612391); /* 51 */ - - II ( b, c, d, a, in[ 5], S44, 4237533241); /* 52 */ - - II ( a, b, c, d, in[12], S41, 1700485571); /* 53 */ - - II ( d, a, b, c, in[ 3], S42, 2399980690); /* 54 */ - - II ( c, d, a, b, in[10], S43, 4293915773); /* 55 */ - - II ( b, c, d, a, in[ 1], S44, 2240044497); /* 56 */ - - II ( a, b, c, d, in[ 8], S41, 1873313359); /* 57 */ - - II ( d, a, b, c, in[15], S42, 4264355552); /* 58 */ - - II ( c, d, a, b, in[ 6], S43, 2734768916); /* 59 */ - - II ( b, c, d, a, in[13], S44, 1309151649); /* 60 */ - - II ( a, b, c, d, in[ 4], S41, 4149444226); /* 61 */ - - II ( d, a, b, c, in[11], S42, 3174756917); /* 62 */ - - II ( c, d, a, b, in[ 2], S43, 718787259); /* 63 */ - - II ( b, c, d, a, in[ 9], S44, 3951481745); /* 64 */ - - - - buf[0] += a; - - buf[1] += b; - - buf[2] += c; - - buf[3] += d; - -} - -#else /* CPU386 */ - -/* Fast 386 Borland C inline assembler version of the MD5Transform() function - - * from the RSA Data Security, Inc, MD5 Message Digest Algorithm. - - * - - * This version uses native 32 bit registers, so it needs a 386 or 486 CPU. - - * - - * Because this function does *lots* of 32-bit operations, this version is - - * MUCH faster than the reference C version compiled with a garden- - - * variety 16-bit MS-DOS C compiler. - - * - - * Written and placed into the public domain on - - * 22 February 1992 by Phil Karn, KA9Q - - */ - -/* I really shouldn't have to do this explicitly... */ - -#ifdef __COMPACT__ - - asm .MODEL COMPACT - -#elif __HUGE__ - - asm .MODEL HUGE - -#elif __LARGE__ - - asm .MODEL LARGE - -#elif __MEDIUM__ - - asm .MODEL MEDIUM - -#elif __SMALL__ - - asm .MODEL SMALL - -#elif __TINY__ - - asm .MODEL TINY - -#endif - - - -/* Code sequence common to all four rounds. - - * evaluates a = b + (a + edi + x + t) <<< s - - * Assumes a,b are registers, s,t are immediate constants - - * The 'lea' instruction is just a fast way to compute "a = a+t+edi" - - */ - -#define COM(a,b,x,s,t)\ - - asm lea a,t[a+edi];\ - - asm add a,x;\ - - asm rol a,s;\ - - asm add a,b; - - - -/* Round 1 functions */ - -/* edi = F(x,y,z) = (x & y) | (~x & z) */ - -#define F(x,y,z)\ - - asm mov edi,x;\ - - asm and edi,y;\ - - asm mov esi,x;\ - - asm not esi;\ - - asm and esi,z;\ - - asm or edi,esi - - - -/* a = b + ((a + F(x,y,z) + x + t) <<< s); */ - -#define FF(a,b,c,d,x,s,t)\ - - F(b,c,d);\ - - COM(a,b,x,s,t) - - - -/* Round 2 functions */ - -/* edi = G(x,y,z) = F(z,x,y) = (x & z) | (y & ~z) */ - -#define G(x,y,z) F(z,x,y) - - - -/* a = b + ((a + G(b,c,d) + x + t) <<< s) */ - -#define GG(a,b,c,d,x,s,t)\ - - G(b,c,d);\ - - COM(a,b,x,s,t) - - - -/* Round 3 functions */ - -/* edi = H(x,y,z) = x ^ y ^ z */ - -#define H(x,y,z)\ - - asm mov edi,x;\ - - asm xor edi,y;\ - - asm xor edi,z - - - -/* a = b + ((a + H(b,c,d) + x + t) <<< s) */ - -#define HH(a,b,c,d,x,s,t)\ - - H(b,c,d);\ - - COM(a,b,x,s,t) - - - -/* Round 4 functions */ - -/* edi = I(x,y,z) = y ^ (x | ~z) */ - -#define I(x,y,z)\ - - asm mov edi,z;\ - - asm not edi;\ - - asm or edi,x;\ - - asm xor edi,y - - - -/* a = b + ((a + I(b,c,d) + x + t) <<< s) */ - -#define II(a,b,c,d,x,s,t)\ - - I(b,c,d);\ - - COM(a,b,x,s,t) - - - -#define A eax - -#define B ebx - -#define C ecx - -#define D edx - - - -void - -MD5Transform(buf,input) - -UINT4 *buf; - -UINT4 *input; - -{ - - asm .386; /* Allow use of 32-bit general registers */ - - - - /* Save caller's registers */ - - asm push si; - - asm push di; - - asm push es; - - asm if @DataSize NE 0 - - asm push ds; - - asm endif - - - - /* Get buf argument */ - - asm if @DataSize NE 0 - - asm lds si,buf; - - asm else - - asm mov si,buf; - - asm endif - - asm mov A,dword ptr si[0*4]; /* A = buf[0] */ - - asm mov B,dword ptr si[1*4]; /* B = buf[1] */ - - asm mov C,dword ptr si[2*4]; /* C = buf[2] */ - - asm mov D,dword ptr si[3*4]; /* D = buf[3] */ - - - - /* Warning: This makes our other args inaccessible until bp - - * is restored! - - */ - - asm push bp; - - asm les bp,input - - - -/* Round 1. The *4 factors in the subscripts to bp account for the - - * byte offsets of each long element in the input array. - - */ - -#define S11 7 - -#define S12 12 - -#define S13 17 - -#define S14 22 - - FF(A,B,C,D,es:bp[ 0*4],S11,3614090360); /* 1 */ - - FF(D,A,B,C,es:bp[ 1*4],S12,3905402710); /* 2 */ - - FF(C,D,A,B,es:bp[ 2*4],S13, 606105819); /* 3 */ - - FF(B,C,D,A,es:bp[ 3*4],S14,3250441966); /* 4 */ - - FF(A,B,C,D,es:bp[ 4*4],S11,4118548399); /* 5 */ - - FF(D,A,B,C,es:bp[ 5*4],S12,1200080426); /* 6 */ - - FF(C,D,A,B,es:bp[ 6*4],S13,2821735955); /* 7 */ - - FF(B,C,D,A,es:bp[ 7*4],S14,4249261313); /* 8 */ - - FF(A,B,C,D,es:bp[ 8*4],S11,1770035416); /* 9 */ - - FF(D,A,B,C,es:bp[ 9*4],S12,2336552879); /* 10 */ - - FF(C,D,A,B,es:bp[10*4],S13,4294925233); /* 11 */ - - FF(B,C,D,A,es:bp[11*4],S14,2304563134); /* 12 */ - - FF(A,B,C,D,es:bp[12*4],S11,1804603682); /* 13 */ - - FF(D,A,B,C,es:bp[13*4],S12,4254626195); /* 14 */ - - FF(C,D,A,B,es:bp[14*4],S13,2792965006); /* 15 */ - - FF(B,C,D,A,es:bp[15*4],S14,1236535329); /* 16 */ - - - -/* Round 2 */ - -#define S21 5 - -#define S22 9 - -#define S23 14 - -#define S24 20 - - GG(A,B,C,D,es:bp[ 1*4],S21,4129170786); /* 17 */ - - GG(D,A,B,C,es:bp[ 6*4],S22,3225465664); /* 18 */ - - GG(C,D,A,B,es:bp[11*4],S23, 643717713); /* 19 */ - - GG(B,C,D,A,es:bp[ 0*4],S24,3921069994); /* 20 */ - - GG(A,B,C,D,es:bp[ 5*4],S21,3593408605); /* 21 */ - - GG(D,A,B,C,es:bp[10*4],S22, 38016083); /* 22 */ - - GG(C,D,A,B,es:bp[15*4],S23,3634488961); /* 23 */ - - GG(B,C,D,A,es:bp[ 4*4],S24,3889429448); /* 24 */ - - GG(A,B,C,D,es:bp[ 9*4],S21, 568446438); /* 25 */ - - GG(D,A,B,C,es:bp[14*4],S22,3275163606); /* 26 */ - - GG(C,D,A,B,es:bp[ 3*4],S23,4107603335); /* 27 */ - - GG(B,C,D,A,es:bp[ 8*4],S24,1163531501); /* 28 */ - - GG(A,B,C,D,es:bp[13*4],S21,2850285829); /* 29 */ - - GG(D,A,B,C,es:bp[ 2*4],S22,4243563512); /* 30 */ - - GG(C,D,A,B,es:bp[ 7*4],S23,1735328473); /* 31 */ - - GG(B,C,D,A,es:bp[12*4],S24,2368359562); /* 32 */ - - - -/* Round 3 */ - -#define S31 4 - -#define S32 11 - -#define S33 16 - -#define S34 23 - - HH(A,B,C,D,es:bp[ 5*4],S31,4294588738); /* 33 */ - - HH(D,A,B,C,es:bp[ 8*4],S32,2272392833); /* 34 */ - - HH(C,D,A,B,es:bp[11*4],S33,1839030562); /* 35 */ - - HH(B,C,D,A,es:bp[14*4],S34,4259657740); /* 36 */ - - HH(A,B,C,D,es:bp[ 1*4],S31,2763975236); /* 37 */ - - HH(D,A,B,C,es:bp[ 4*4],S32,1272893353); /* 38 */ - - HH(C,D,A,B,es:bp[ 7*4],S33,4139469664); /* 39 */ - - HH(B,C,D,A,es:bp[10*4],S34,3200236656); /* 40 */ - - HH(A,B,C,D,es:bp[13*4],S31, 681279174); /* 41 */ - - HH(D,A,B,C,es:bp[ 0*4],S32,3936430074); /* 42 */ - - HH(C,D,A,B,es:bp[ 3*4],S33,3572445317); /* 43 */ - - HH(B,C,D,A,es:bp[ 6*4],S34, 76029189); /* 44 */ - - HH(A,B,C,D,es:bp[ 9*4],S31,3654602809); /* 45 */ - - HH(D,A,B,C,es:bp[12*4],S32,3873151461); /* 46 */ - - HH(C,D,A,B,es:bp[15*4],S33, 530742520); /* 47 */ - - HH(B,C,D,A,es:bp[ 2*4],S34,3299628645); /* 48 */ - - - -/* Round 4 */ - -#define S41 6 - -#define S42 10 - -#define S43 15 - -#define S44 21 - - II(A,B,C,D,es:bp[ 0*4],S41,4096336452); /* 49 */ - - II(D,A,B,C,es:bp[ 7*4],S42,1126891415); /* 50 */ - - II(C,D,A,B,es:bp[14*4],S43,2878612391); /* 51 */ - - II(B,C,D,A,es:bp[ 5*4],S44,4237533241); /* 52 */ - - II(A,B,C,D,es:bp[12*4],S41,1700485571); /* 53 */ - - II(D,A,B,C,es:bp[ 3*4],S42,2399980690); /* 54 */ - - II(C,D,A,B,es:bp[10*4],S43,4293915773); /* 55 */ - - II(B,C,D,A,es:bp[ 1*4],S44,2240044497); /* 56 */ - - II(A,B,C,D,es:bp[ 8*4],S41,1873313359); /* 57 */ - - II(D,A,B,C,es:bp[15*4],S42,4264355552); /* 58 */ - - II(C,D,A,B,es:bp[ 6*4],S43,2734768916); /* 59 */ - - II(B,C,D,A,es:bp[13*4],S44,1309151649); /* 60 */ - - II(A,B,C,D,es:bp[ 4*4],S41,4149444226); /* 61 */ - - II(D,A,B,C,es:bp[11*4],S42,3174756917); /* 62 */ - - II(C,D,A,B,es:bp[ 2*4],S43, 718787259); /* 63 */ - - II(B,C,D,A,es:bp[ 9*4],S44,3951481745); /* 64 */ - - - - asm pop bp; /* We can address our args again */ - - asm if @DataSize NE 0 - - asm lds si,buf - - asm else - - asm mov si,buf; - - asm endif - - asm add dword ptr si[0*4],A; /* buf[0] += A */ - - asm add dword ptr si[1*4],B; /* buf[1] += B */ - - asm add dword ptr si[2*4],C; /* buf[2] += C */ - - asm add dword ptr si[3*4],D; /* buf[3] += D */ - - - - /* Restore caller's registers */ - - asm if @DataSize NE 0 - - asm pop ds - - asm endif - - - - asm pop es; - - asm pop di; - - asm pop si; - -} - -#endif /* CPU386 */ - - - -/* - - *********************************************************************** - - ** End of md5.c ** - - ******************************** (cut) ******************************** - - */ \ No newline at end of file diff --git a/src/EterPack/md5.h b/src/EterPack/md5.h deleted file mode 100644 index 9ed936f9..00000000 --- a/src/EterPack/md5.h +++ /dev/null @@ -1,128 +0,0 @@ -#ifndef __INC_ETERPACKLIB_MD5_H__ -#define __INC_ETERPACKLIB_MD5_H__ - -/* - - *********************************************************************** - - ** md5.h -- header file for implementation of MD5 ** - - ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** - - ** Created: 2/17/90 RLR ** - - ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** - - ** Revised (for MD5): RLR 4/27/91 ** - - ** -- G modified to have y&~z instead of y&z ** - - ** -- FF, GG, HH modified to add in last register done ** - - ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** - - ** -- distinct additive constant for each step ** - - ** -- round 4 added, working mod 7 ** - - *********************************************************************** - - */ - -/* - - *********************************************************************** - - ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** - - ** ** - - ** License to copy and use this software is granted provided that ** - - ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** - - ** Digest Algorithm" in all material mentioning or referencing this ** - - ** software or this function. ** - - ** ** - - ** License is also granted to make and use derivative works ** - - ** provided that such works are identified as "derived from the RSA ** - - ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** - - ** material mentioning or referencing the derived work. ** - - ** ** - - ** RSA Data Security, Inc. makes no representations concerning ** - - ** either the merchantability of this software or the suitability ** - - ** of this software for any particular purpose. It is provided "as ** - - ** is" without express or implied warranty of any kind. ** - - ** ** - - ** These notices must be retained in any copies of any part of this ** - - ** documentation and/or software. ** - - *********************************************************************** - - */ - - - -/* typedef a 32-bit type */ - -typedef unsigned long int UINT4; - - - -/* Data structure for MD5 (Message-Digest) computation */ - -typedef struct { - - UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ - - UINT4 buf[4]; /* scratch buffer */ - - unsigned char in[64]; /* input buffer */ - - unsigned char digest[16]; /* actual digest after MD5Final call */ - -} MD5_CTX; - - -#if defined (__cplusplus) -extern "C" { -#endif - -void MD5Init (MD5_CTX *); - -void MD5Update (MD5_CTX *,unsigned char *,unsigned int); - -void MD5Final (MD5_CTX *); - -void MD5Transform(UINT4 *,UINT4 *); - -#if defined (__cplusplus) -}; -#endif - -/* - - *********************************************************************** - - ** End of md5.h ** - - ******************************** (cut) ******************************** - - */ - - -#endif \ No newline at end of file diff --git a/src/GameLib/AreaTerrain.cpp b/src/GameLib/AreaTerrain.cpp index eb86a165..a4ae1f05 100644 --- a/src/GameLib/AreaTerrain.cpp +++ b/src/GameLib/AreaTerrain.cpp @@ -106,10 +106,8 @@ bool CTerrain::LoadShadowMap(const char * c_pszFileName) DWORD dwStart = ELTimer_GetMSec(); Tracef("LoadShadowMap %s ", c_pszFileName); - CMappedFile file; - LPCVOID c_pvData; - - if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData)) + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(c_pszFileName, data)) { TraceError(" CTerrain::LoadShadowMap - %s OPEN ERROR", c_pszFileName); return false; @@ -117,13 +115,13 @@ bool CTerrain::LoadShadowMap(const char * c_pszFileName) DWORD dwShadowMapSize = sizeof(WORD) * 256 * 256; - if (file.Size() != dwShadowMapSize) + if (data->size() != dwShadowMapSize) { TraceError(" CTerrain::LoadShadowMap - %s SIZE ERROR", c_pszFileName); return false; } - memcpy(m_awShadowMap, c_pvData, dwShadowMapSize); + memcpy_s(m_awShadowMap, dwShadowMapSize, data->data(), data->size()); Tracef("%d ms\n", ELTimer_GetMSec() - dwStart); return true; diff --git a/src/GameLib/ItemManager.cpp b/src/GameLib/ItemManager.cpp index 8e96b0e5..c50067d5 100644 --- a/src/GameLib/ItemManager.cpp +++ b/src/GameLib/ItemManager.cpp @@ -95,14 +95,12 @@ CItemData * CItemManager::MakeItemData(DWORD dwIndex) bool CItemManager::LoadItemList(const char * c_szFileName) { - CMappedFile File; - LPCVOID pData; - - if (!CEterPackManager::Instance().Get(File, c_szFileName, &pData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader textFileLoader; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; - CMemoryTextFileLoader textFileLoader; - textFileLoader.Bind(File.Size(), pData); + textFileLoader.Bind(data->size(), data->data()); CTokenVector TokenVector; for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) @@ -196,16 +194,15 @@ const std::string& __SnapString(const std::string& c_rstSrc, std::string& rstTem bool CItemManager::LoadItemDesc(const char* c_szFileName) { - const VOID* pvData; - CMappedFile kFile; - if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader kTextFileLoader; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) { Tracenf("CItemManager::LoadItemDesc(c_szFileName=%s) - Load Error", c_szFileName); return false; } - CMemoryTextFileLoader kTextFileLoader; - kTextFileLoader.Bind(kFile.Size(), pvData); + kTextFileLoader.Bind(data->size(), data->data()); std::string stTemp; @@ -254,22 +251,27 @@ DWORD GetHashCode( const char* pString ) bool CItemManager::LoadItemTable(const char* c_szFileName) { - CMappedFile file; - LPCVOID pvData; - - if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData)) + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; DWORD dwFourCC, dwElements, dwDataSize; DWORD dwVersion=0; DWORD dwStride=0; - file.Read(&dwFourCC, sizeof(DWORD)); + data.read((char*)&dwFourCC, sizeof(DWORD)); + if (!data) + return false; if (dwFourCC == MAKEFOURCC('M', 'I', 'P', 'X')) { - file.Read(&dwVersion, sizeof(DWORD)); - file.Read(&dwStride, sizeof(DWORD)); + data.read((char*)&dwVersion, sizeof(DWORD)); + if (!data) + return false; + + data.read((char*)&dwStride, sizeof(DWORD)); + if (!data) + return false; if (dwVersion != 1) { @@ -289,19 +291,25 @@ bool CItemManager::LoadItemTable(const char* c_szFileName) return false; } - file.Read(&dwElements, sizeof(DWORD)); - file.Read(&dwDataSize, sizeof(DWORD)); + data.read((char*)&dwElements, sizeof(DWORD)); + if (!data) + return false; - BYTE * pbData = new BYTE[dwDataSize]; - file.Read(pbData, dwDataSize); + data.read((char*)&dwDataSize, sizeof(DWORD)); + if (!data) + return false; + + auto pbData = std::make_shared>(dwDataSize); + data.read((char*)pbData->data(), pbData->size()); + if (!data) + return false; ///// CLZObject zObj; - if (!CLZO::Instance().Decompress(zObj, pbData, s_adwItemProtoKey)) + if (!CLZO::Instance().Decompress(zObj, pbData->data(), s_adwItemProtoKey)) { - delete [] pbData; return false; } @@ -382,7 +390,6 @@ bool CItemManager::LoadItemTable(const char* c_szFileName) // pItemData->SetItemTableData(table); // } - delete [] pbData; return true; } diff --git a/src/GameLib/MapManager.cpp b/src/GameLib/MapManager.cpp index 356a45ea..4f1f20ff 100644 --- a/src/GameLib/MapManager.cpp +++ b/src/GameLib/MapManager.cpp @@ -597,14 +597,14 @@ void CMapManager::GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY) void CMapManager::__LoadMapInfoVector() { - CMappedFile kFile; - LPCVOID pData; - if (!CEterPackManager::Instance().Get(kFile, m_stAtlasInfoFileName.c_str(), &pData)) - if (!CEterPackManager::Instance().Get(kFile, "AtlasInfo.txt", &pData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader textFileLoader; + + if (!CEterPackManager::Instance().Get(m_stAtlasInfoFileName, data)) + if (!CEterPackManager::Instance().Get("AtlasInfo.txt", data)) return; - CMemoryTextFileLoader textFileLoader; - textFileLoader.Bind(kFile.Size(), pData); + textFileLoader.Bind(data->size(), data->data()); char szMapName[256]; int x, y; diff --git a/src/GameLib/MapOutdoorLoad.cpp b/src/GameLib/MapOutdoorLoad.cpp index 99d55cd1..cf8d4e07 100644 --- a/src/GameLib/MapOutdoorLoad.cpp +++ b/src/GameLib/MapOutdoorLoad.cpp @@ -452,19 +452,18 @@ bool CMapOutdoor::LoadMonsterAreaInfo() char c_szFileName[256]; sprintf(c_szFileName, "%s\\regen.txt", GetMapDataDirectory().c_str()); - LPCVOID pModelData; - CMappedFile File; + CEterPackManager::TPackDataPtr modelData; + CMemoryTextFileLoader textFileLoader; - if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData)) + if (!CEterPackManager::Instance().Get(c_szFileName, modelData)) { //TraceError(" CMapOutdoorAccessor::LoadMonsterAreaInfo Load File %s ERROR", c_szFileName); return false; } - - CMemoryTextFileLoader textFileLoader; + CTokenVector stTokenVector; - textFileLoader.Bind(File.Size(), pModelData); + textFileLoader.Bind(modelData->size(), modelData->data()); for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) { diff --git a/src/GameLib/Property.cpp b/src/GameLib/Property.cpp index abafe14c..28f63b84 100644 --- a/src/GameLib/Property.cpp +++ b/src/GameLib/Property.cpp @@ -136,54 +136,6 @@ void GetTimeString(char * str, time_t ct) tm.tm_sec); } -bool CProperty::Save(const char * c_pszFileName) -{ - CTempFile file; - - DWORD fourcc = MAKEFOURCC('Y', 'P', 'R', 'T'); - file.Write(&fourcc, sizeof(DWORD)); - file.Write("\r\n", 2); - - if (0 == m_stCRC.length()) - { - char szCRC[MAX_PATH + 16 + 1]; - - GetTimeString(szCRC, time(0)); - strcpy(szCRC + strlen(szCRC), c_pszFileName); - - m_dwCRC = CPropertyManager::Instance().GetUniqueCRC(szCRC); - _snprintf(szCRC, sizeof(szCRC), "%u", m_dwCRC); - - m_stCRC.assign(szCRC); - } - - file.Write(m_stCRC.c_str(), m_stCRC.length()); - file.Write("\r\n", 2); - - CTokenVectorMap::iterator itor = m_stTokenMap.begin(); - char buf[4096 + 1]; - - while (itor != m_stTokenMap.end()) - { - CTokenVector & tokenVector = itor->second; - - int len = _snprintf(buf, sizeof(buf), "%s\t", itor->first.c_str()); - file.Write(buf, len); - - for (DWORD i = 0; i < tokenVector.size(); ++i) - { - len = _snprintf(buf, sizeof(buf), "\t\"%s\"", tokenVector[i].c_str()); - file.Write(buf, len); - } - - file.Write("\r\n", 2); - ++itor; - } - - file.Close(); - return CPropertyManager::Instance().Put(c_pszFileName, file.GetFileName()); -} - bool CProperty::ReadFromMemory(const void * c_pvData, int iLen, const char * c_pszFileName) { const char * pcData = (const char *) c_pvData; diff --git a/src/GameLib/Property.h b/src/GameLib/Property.h index bf20d38f..5268f663 100644 --- a/src/GameLib/Property.h +++ b/src/GameLib/Property.h @@ -19,8 +19,6 @@ class CProperty void PutVector(const char * c_pszKey, const CTokenVector & c_rTokenVector); void PutString(const char * c_pszKey, const char * c_pszString); - bool Save(const char * c_pszFileName); - DWORD GetSize(); DWORD GetCRC(); diff --git a/src/GameLib/PropertyManager.cpp b/src/GameLib/PropertyManager.cpp index 7aa8e85a..e239613f 100644 --- a/src/GameLib/PropertyManager.cpp +++ b/src/GameLib/PropertyManager.cpp @@ -4,7 +4,7 @@ #include "PropertyManager.h" #include "Property.h" -CPropertyManager::CPropertyManager() : m_isFileMode(true) +CPropertyManager::CPropertyManager() { } @@ -13,90 +13,34 @@ CPropertyManager::~CPropertyManager() Clear(); } -bool CPropertyManager::Initialize(const char * c_pszPackFileName) +void CPropertyManager::Initialize() { - if (c_pszPackFileName) + auto fileMap = CEterPackManager::Instance().GetFileMap(); + + for (auto& itor : fileMap) { - if (!m_pack.Create(m_fileDict, c_pszPackFileName, "", true)) + if (itor.first.rfind("property/reserve", 0) == 0) { - LogBoxf("Cannot open property pack file (filename %s)", c_pszPackFileName); - return false; - } - - m_isFileMode = false; - - TDataPositionMap & indexMap = m_pack.GetIndexMap(); - - TDataPositionMap::iterator itor = indexMap.begin(); - - typedef std::map TDataPositionMap; - - int i = 0; - - while (indexMap.end() != itor) - { - TEterPackIndex * pIndex = itor->second; - ++itor; - - if (!stricmp("property/reserve", pIndex->filename)) - { - LoadReservedCRC(pIndex->filename); - continue; - } - - if (!Register(pIndex->filename)) - continue; - - ++i; - } - } - else - { - m_isFileMode = true; - // NOTE : ¿©±â¼­ Property¸¦ µî·Ï½ÃÅ°¸é WorldEditor¿¡¼­ ÀÌ»óÀÌ »ý±è ; - // ¶ÇÇÑ, Property Tree List¿¡µµ µî·ÏÀ» ½ÃÄÑ¾ß µÇ±â ¶§¹®¿¡ ¹Ù±ùÂÊ¿¡¼­.. - [levites] - } - - return true; -} - -bool CPropertyManager::BuildPack() -{ - if (!m_pack.Create(m_fileDict, "property", "")) - return false; - - WIN32_FIND_DATA fdata; - HANDLE hFind = FindFirstFile("property\\*", &fdata); - - if (hFind == INVALID_HANDLE_VALUE) - return false; - - do - { - if (fdata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + LoadReservedCRC(itor.first.c_str()); continue; + } - char szSourceFileName[256 + 1]; - _snprintf(szSourceFileName, sizeof(szSourceFileName), "property\\%s", fdata.cFileName); - - m_pack.Put(fdata.cFileName, szSourceFileName,COMPRESSED_TYPE_NONE,""); + if (itor.first.rfind("property/", 0) == 0) { + if (!Register(itor.first.c_str())) + continue; + } } - while (FindNextFile(hFind, &fdata)); - - FindClose(hFind); - return true; } bool CPropertyManager::LoadReservedCRC(const char * c_pszFileName) { - CMappedFile file; - LPCVOID c_pvData; + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader textFileLoader; - if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData)) + if (!CEterPackManager::Instance().Get(c_pszFileName, data)) return false; - CMemoryTextFileLoader textFileLoader; - textFileLoader.Bind(file.Size(), c_pvData); + textFileLoader.Bind(data->size(), data->data()); for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) { @@ -136,15 +80,13 @@ DWORD CPropertyManager::GetUniqueCRC(const char * c_szSeed) bool CPropertyManager::Register(const char * c_pszFileName, CProperty ** ppProperty) { - CMappedFile file; - LPCVOID c_pvData; - - if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData)) + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(c_pszFileName, data)) return false; CProperty * pProperty = new CProperty(c_pszFileName); - if (!pProperty->ReadFromMemory(c_pvData, file.Size(), c_pszFileName)) + if (!pProperty->ReadFromMemory(data->data(), data->size(), c_pszFileName)) { delete pProperty; return false; @@ -188,67 +130,6 @@ bool CPropertyManager::Get(DWORD dwCRC, CProperty ** ppProperty) return true; } -bool CPropertyManager::Put(const char * c_pszFileName, const char * c_pszSourceFileName) -{ - if (!CopyFile(c_pszSourceFileName, c_pszFileName, FALSE)) - return false; - - if (!m_isFileMode) // ÆÑ ÆÄÀÏ¿¡µµ ³ÖÀ½ - { - if (!m_pack.Put(c_pszFileName, NULL, COMPRESSED_TYPE_NONE,"")) - { - assert(!"CPropertyManager::Put cannot write to pack file"); - return false; - } - } - - Register(c_pszFileName); - return true; -} - -bool CPropertyManager::Erase(DWORD dwCRC) -{ - TPropertyCRCMap::iterator itor = m_PropertyByCRCMap.find(dwCRC); - - if (m_PropertyByCRCMap.end() == itor) - return false; - - CProperty * pProperty = itor->second; - m_PropertyByCRCMap.erase(itor); - - DeleteFile(pProperty->GetFileName()); - ReserveCRC(pProperty->GetCRC()); - - if (!m_isFileMode) // ÆÄÀÏ ¸ðµå°¡ ¾Æ´Ï¸é ÆÑ¿¡¼­µµ Áö¿ò - m_pack.Delete(pProperty->GetFileName()); - - FILE * fp = fopen("property/reserve", "a+"); - - if (!fp) - LogBox("¿¹¾à CRC ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù."); - else - { - char szCRC[64 + 1]; - _snprintf(szCRC, sizeof(szCRC), "%u\r\n", pProperty->GetCRC()); - - fputs(szCRC, fp); - fclose(fp); - } - - delete pProperty; - return true; -} - -bool CPropertyManager::Erase(const char * c_pszFileName) -{ - CProperty * pProperty = NULL; - - if (Get(c_pszFileName, &pProperty)) - return Erase(pProperty->GetCRC()); - - return false; -} - void CPropertyManager::Clear() { stl_wipe_second(m_PropertyByCRCMap); diff --git a/src/GameLib/PropertyManager.h b/src/GameLib/PropertyManager.h index 0ad11c15..b7234bcd 100644 --- a/src/GameLib/PropertyManager.h +++ b/src/GameLib/PropertyManager.h @@ -1,7 +1,5 @@ #pragma once -#include "../eterPack/EterPack.h" - class CPropertyManager : public CSingleton { public: @@ -10,34 +8,20 @@ class CPropertyManager : public CSingleton void Clear(); - void SetPack(CEterPack * pPack); - bool BuildPack(); - bool LoadReservedCRC(const char * c_pszFileName); void ReserveCRC(DWORD dwCRC); DWORD GetUniqueCRC(const char * c_szSeed); - bool Initialize(const char * c_pszPackFileName = NULL); + void Initialize(); bool Register(const char * c_pszFileName, CProperty ** ppProperty = NULL); bool Get(DWORD dwCRC, CProperty ** ppProperty); bool Get(const char * c_pszFileName, CProperty ** ppProperty); -// bool Add(const char * c_pszFileName); -// bool Remove(DWORD dwCRC); - - bool Put(const char * c_pszFileName, const char * c_pszSourceFileName); - - bool Erase(DWORD dwCRC); - bool Erase(const char * c_pszFileName); - protected: typedef std::map TPropertyCRCMap; typedef std::set TCRCSet; - bool m_isFileMode; TPropertyCRCMap m_PropertyByCRCMap; TCRCSet m_ReservedCRCSet; - CEterPack m_pack; - CEterFileDict m_fileDict; }; diff --git a/src/GameLib/RaceManager.cpp b/src/GameLib/RaceManager.cpp index 9a28aa30..9083c8c9 100644 --- a/src/GameLib/RaceManager.cpp +++ b/src/GameLib/RaceManager.cpp @@ -237,14 +237,13 @@ bool CRaceManager::__LoadRaceMotionList(CRaceData& rkRaceData, const char* pathN s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL5", CRaceMotionData::NAME_SKILL+125)); } - const void* pvData; - CMappedFile kMappedFile; - if (!CEterPackManager::Instance().Get(kMappedFile, motionListFileName, &pvData)) - return false; - - + CEterPackManager::TPackDataPtr data; CMemoryTextFileLoader kTextFileLoader; - kTextFileLoader.Bind(kMappedFile.Size(), pvData); + + if (!CEterPackManager::Instance().Get(motionListFileName, data)) + return false; + + kTextFileLoader.Bind(data->size(), data->data()); rkRaceData.RegisterMotionMode(CRaceMotionData::MODE_GENERAL); diff --git a/src/MilesLib/SoundData.cpp b/src/MilesLib/SoundData.cpp index 91c99f1a..98e0f4f0 100644 --- a/src/MilesLib/SoundData.cpp +++ b/src/MilesLib/SoundData.cpp @@ -5,7 +5,7 @@ #include "../eterBase/Timer.h" bool CSoundData::ms_isSoundFile[SOUND_FILE_MAX_NUM]; -CMappedFile CSoundData::ms_SoundFile[SOUND_FILE_MAX_NUM]; +std::stringstream CSoundData::ms_SoundFile[SOUND_FILE_MAX_NUM]; const char * CSoundData::GetFileName() { @@ -139,9 +139,7 @@ U32 AILCALLBACK CSoundData::open_callback(char const * filename, U32 *file_handl if (-1 == iIndex) return 0; - LPCVOID pMap; - - if (!CEterPackManager::Instance().Get(ms_SoundFile[iIndex], filename, &pMap)) + if (!CEterPackManager::Instance().Get(filename, ms_SoundFile[iIndex])) return 0; ms_isSoundFile[iIndex] = true; @@ -155,7 +153,7 @@ void AILCALLBACK CSoundData::close_callback(U32 file_handle) if (!isSlotIndex(file_handle)) return; - ms_SoundFile[file_handle].Destroy(); + ms_SoundFile[file_handle].str(""); ms_isSoundFile[file_handle] = false; } @@ -164,7 +162,8 @@ S32 AILCALLBACK CSoundData::seek_callback(U32 file_handle, S32 offset, U32 type) if (!isSlotIndex(file_handle)) return 0; - return ms_SoundFile[file_handle].Seek(offset, type); + ms_SoundFile[file_handle].seekg(offset, type); + return ms_SoundFile[file_handle].tellg(); } U32 AILCALLBACK CSoundData::read_callback(U32 file_handle, void * buffer, U32 bytes) @@ -172,9 +171,8 @@ U32 AILCALLBACK CSoundData::read_callback(U32 file_handle, void * buffer, U32 by if (!isSlotIndex(file_handle)) return 0; - DWORD dwRealSize = min(ms_SoundFile[file_handle].Size(), bytes); - ms_SoundFile[file_handle].Read(buffer, dwRealSize); - return dwRealSize; + ms_SoundFile[file_handle].read((char*) buffer, bytes); + return ms_SoundFile[file_handle].gcount(); } void CSoundData::SetPackMode() diff --git a/src/MilesLib/SoundData.h b/src/MilesLib/SoundData.h index 13ddb1c5..9c22c13c 100644 --- a/src/MilesLib/SoundData.h +++ b/src/MilesLib/SoundData.h @@ -1,6 +1,7 @@ #ifndef __MILESLIB_CSOUNDDATA_H__ #define __MILESLIB_CSOUNDDATA_H__ +#include #include #include "../eterBase/MappedFile.h" @@ -53,7 +54,7 @@ class CSoundData static int GetEmptySlotIndex(); static bool ms_isSoundFile[SOUND_FILE_MAX_NUM]; - static CMappedFile ms_SoundFile[SOUND_FILE_MAX_NUM]; + static std::stringstream ms_SoundFile[SOUND_FILE_MAX_NUM]; }; #endif \ No newline at end of file diff --git a/src/PRTerrainLib/Terrain.cpp b/src/PRTerrainLib/Terrain.cpp index c4812b88..213dcac5 100644 --- a/src/PRTerrainLib/Terrain.cpp +++ b/src/PRTerrainLib/Terrain.cpp @@ -76,18 +76,23 @@ bool CTerrainImpl::LoadHeightMap(const char*c_szFileName) { Tracef("LoadRawHeightMapFile %s ", c_szFileName); - CMappedFile kMappedFile; - LPCVOID lpcvFileData; - - if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData)) + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) { Tracen("Error"); TraceError("CTerrainImpl::LoadHeightMap - %s OPEN ERROR", c_szFileName); return false; } - memcpy(m_awRawHeightMap, lpcvFileData, sizeof(WORD)*HEIGHTMAP_RAW_XSIZE*HEIGHTMAP_RAW_YSIZE); - + data.read((char*) m_awRawHeightMap, sizeof(WORD)*HEIGHTMAP_RAW_XSIZE*HEIGHTMAP_RAW_YSIZE); + if (!data) + { + // Could not read data + TraceError("CTerrainImpl::LoadHeightMap - %s READ ERROR", c_szFileName); + return false; + } + + // Data read successfully return true; } @@ -96,18 +101,13 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName) DWORD dwStart = ELTimer_GetMSec(); Tracef("LoadAttrMapFile %s ", c_szFileName); - CMappedFile kMappedFile; - LPCVOID lpcvFileData; - - if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData)) + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) { TraceError("CTerrainImpl::LoadAttrMap - %s OPEN ERROR", c_szFileName); return false; } - DWORD dwFileSize = kMappedFile.Size(); - BYTE * abFileData = (BYTE *) lpcvFileData; - // LoadAttrMap { #pragma pack(push) @@ -119,16 +119,15 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName) WORD m_wHeight; }; #pragma pack(pop) - - if (dwFileSize < sizeof(SAttrMapHeader)) + + SAttrMapHeader kAttrMapHeader; + data.read((char*) &kAttrMapHeader, sizeof(kAttrMapHeader)); + if (!data) { TraceError(" CTerrainImpl::LoadAttrMap - %s FILE SIZE ERROR", c_szFileName); return false; } - SAttrMapHeader kAttrMapHeader; - memcpy(&kAttrMapHeader, abFileData, sizeof(kAttrMapHeader)); - const WORD c_wAttrMapMagic = 2634; if (c_wAttrMapMagic != kAttrMapHeader.m_wMagic) { @@ -148,40 +147,40 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName) return false; } - DWORD dwFileRestSize=dwFileSize-sizeof(kAttrMapHeader); - DWORD dwFileNeedSize=sizeof(m_abyAttrMap); - if (dwFileRestSize != dwFileNeedSize) + data.read((char*)m_abyAttrMap, sizeof(m_abyAttrMap)); + if (!data) { - TraceError("CTerrainImpl::LoadAttrMap - %s FILE DATA SIZE(rest %d != need %d) ERROR", c_szFileName, dwFileRestSize, dwFileNeedSize); + TraceError("CTerrainImpl::LoadAttrMap - %s FILE DATA SIZE ERROR", c_szFileName); return false; } - - BYTE* abSrcAttrData= abFileData+sizeof(kAttrMapHeader); - memcpy(m_abyAttrMap, abSrcAttrData, sizeof(m_abyAttrMap)); } Tracef("%d\n", ELTimer_GetMSec() - dwStart); return true; } -bool CTerrainImpl::RAW_LoadTileMap(const char * c_szFileName) +bool CTerrainImpl::RAW_LoadTileMap(const char* c_szFileName) { Tracef("LoadSplatFile %s ", c_szFileName); - - CMappedFile kMappedFile; - LPCVOID lpcvFileData; - - if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData)) + + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) { Tracen("Error"); TraceError("CTerrainImpl::RAW_LoadTileMap - %s OPEN ERROR", c_szFileName); return false; } - - memcpy(m_abyTileMap, lpcvFileData, sizeof(BYTE)*(TILEMAP_RAW_XSIZE)*(TILEMAP_RAW_YSIZE)); - - return true; + data.read((char*)m_abyTileMap, sizeof(BYTE) * (TILEMAP_RAW_XSIZE) * (TILEMAP_RAW_YSIZE)); + if (!data) + { + // Could not read data + TraceError("CTerrainImpl::RAW_LoadTileMap - %s READ ERROR", c_szFileName); + return false; + } + + // Data read successfully + return true; } bool CTerrainImpl::LoadWaterMap(const char * c_szFileName) @@ -206,18 +205,16 @@ bool CTerrainImpl::LoadWaterMap(const char * c_szFileName) bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName) { - CMappedFile kMappedFile; - LPCVOID lpcvFileData; - - if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData)) + std::stringstream data; + size_t fileSize = 0; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) { Tracen("Error"); TraceError("CTerrainImpl::LoadWaterMap - %s OPEN ERROR", c_szFileName); return false; - } + } - DWORD dwFileSize = kMappedFile.Size(); - BYTE* abFileData = (BYTE*)lpcvFileData; + fileSize = data.str().length(); { #pragma pack(push) @@ -231,15 +228,14 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName) }; #pragma pack(pop) - if (dwFileSize < sizeof(SWaterMapHeader)) + SWaterMapHeader kWaterMapHeader; + data.read((char*)&kWaterMapHeader, sizeof(kWaterMapHeader)); + if (!data) { TraceError("CTerrainImpl::LoadWaterMap - %s FILE SIZE ERROR", c_szFileName); return false; } - SWaterMapHeader kWaterMapHeader; - memcpy(&kWaterMapHeader, abFileData, sizeof(kWaterMapHeader)); - const WORD c_wWaterMapMagic = 5426; if (c_wWaterMapMagic != kWaterMapHeader.m_wMagic) @@ -262,22 +258,23 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName) m_byNumWater = kWaterMapHeader.m_byLayerCount; - DWORD dwFileRestSize = dwFileSize - sizeof(kWaterMapHeader); + DWORD dwFileRestSize = fileSize - sizeof(kWaterMapHeader); DWORD dwFileNeedSize = sizeof(m_abyWaterMap) + sizeof(long) * m_byNumWater; DWORD dwFileNeedSize2 = sizeof(m_abyWaterMap) + sizeof(WORD) * m_byNumWater; if (dwFileRestSize == dwFileNeedSize2) { WORD wWaterHeight[MAX_WATER_NUM + 1]; - BYTE * abSrcWaterData = abFileData + sizeof(kWaterMapHeader); - memcpy(m_abyWaterMap, abSrcWaterData, sizeof(m_abyWaterMap)); - - BYTE * abSrcWaterHeight = abSrcWaterData + sizeof(m_abyWaterMap); + data.read((char*)m_abyWaterMap, sizeof(m_abyWaterMap)); + if (!data) + return false; m_byNumWater = MIN(MAX_WATER_NUM, m_byNumWater); if (m_byNumWater) { - memcpy(wWaterHeight, abSrcWaterHeight, sizeof(WORD) * m_byNumWater); + data.read((char*)wWaterHeight, sizeof(WORD) * m_byNumWater); + if (!data) + return false; for (int i = 0; i < m_byNumWater; ++i) m_lWaterHeight[i] = wWaterHeight[i]; @@ -289,13 +286,15 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName) return false; } - BYTE * abSrcWaterData = abFileData + sizeof(kWaterMapHeader); - memcpy(m_abyWaterMap, abSrcWaterData, sizeof(m_abyWaterMap)); + data.read((char*)m_abyWaterMap, sizeof(m_abyWaterMap)); + if (!data) + return false; - BYTE * abSrcWaterHeight = abSrcWaterData + sizeof(m_abyWaterMap); - - if (m_byNumWater) - memcpy(m_lWaterHeight, abSrcWaterHeight, sizeof(long) * m_byNumWater); + if (m_byNumWater) { + data.read((char*)m_lWaterHeight, sizeof(long)* m_byNumWater); + if (!data) + return false; + } } return true; diff --git a/src/ScriptLib/PythonLauncher.cpp b/src/ScriptLib/PythonLauncher.cpp index 9012474c..4ee247f1 100644 --- a/src/ScriptLib/PythonLauncher.cpp +++ b/src/ScriptLib/PythonLauncher.cpp @@ -196,21 +196,19 @@ bool CPythonLauncher::RunCompiledFile(const char* c_szFileName) } -bool CPythonLauncher::RunMemoryTextFile(const char* c_szFileName, UINT uFileSize, const VOID* c_pvFileData) +bool CPythonLauncher::RunMemoryTextFile(const char* c_szFileName, std::shared_ptr> fileData) { NANOBEGIN - const CHAR* c_pcFileData=(const CHAR*)c_pvFileData; - std::string stConvFileData; - stConvFileData.reserve(uFileSize); + stConvFileData.reserve(fileData->size()); stConvFileData+="exec(compile('''"; // ConvertPythonTextFormat { - for (UINT i=0; isize(); ++i) { - if (c_pcFileData[i]!=13) - stConvFileData+=c_pcFileData[i]; + if ((*fileData)[i] != 13) + stConvFileData+= (*fileData)[i]; } } @@ -227,29 +225,14 @@ bool CPythonLauncher::RunMemoryTextFile(const char* c_szFileName, UINT uFileSize bool CPythonLauncher::RunFile(const char* c_szFileName) { - char* acBufData=NULL; - DWORD dwBufSize=0; - - { - CMappedFile file; - const VOID* pvData; - CEterPackManager::Instance().Get(file, c_szFileName, &pvData); + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) + return false; - dwBufSize=file.Size(); - if (dwBufSize==0) - return false; + if (data->size() == 0) + return false; - acBufData=new char[dwBufSize]; - memcpy(acBufData, pvData, dwBufSize); - } - - bool ret=false; - - ret=RunMemoryTextFile(c_szFileName, dwBufSize, acBufData); - - delete [] acBufData; - - return ret; + return RunMemoryTextFile(c_szFileName, data); } bool CPythonLauncher::RunLine(const char* c_szSrc) diff --git a/src/ScriptLib/PythonLauncher.h b/src/ScriptLib/PythonLauncher.h index 1495813b..37c5e6cd 100644 --- a/src/ScriptLib/PythonLauncher.h +++ b/src/ScriptLib/PythonLauncher.h @@ -15,7 +15,7 @@ class CPythonLauncher : public CSingleton void SetTraceFunc(int (*pFunc)(PyObject * obj, PyFrameObject * f, int what, PyObject *arg)); bool RunLine(const char* c_szLine); bool RunFile(const char* c_szFileName); - bool RunMemoryTextFile(const char* c_szFileName, UINT uFileSize, const VOID* c_pvFileData); + bool RunMemoryTextFile(const char* c_szFileName, std::shared_ptr> fileData); bool RunCompiledFile(const char* c_szFileName); const char* GetError(); diff --git a/src/SpeedTreeLib/SpeedTreeForest.cpp b/src/SpeedTreeLib/SpeedTreeForest.cpp index 6512770b..7da7ec7b 100644 --- a/src/SpeedTreeLib/SpeedTreeForest.cpp +++ b/src/SpeedTreeLib/SpeedTreeForest.cpp @@ -75,16 +75,15 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, pTree = itor->second; else { - CMappedFile file; - LPCVOID c_pvData; + CEterPackManager::TPackDataPtr data; // NOTE : ÆÄÀÏÀÌ ¾øÀ»¶§´Â return FALSE ¾Æ´Ñ°¡¿ä? - [levites] - if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData)) + if (!CEterPackManager::Instance().Get(c_pszFileName, data)) return FALSE; pTree = new CSpeedTreeWrapper; - if (!pTree->LoadTree(c_pszFileName, (const BYTE *) c_pvData, file.Size())) + if (!pTree->LoadTree(c_pszFileName, (const BYTE *) data->data(), data->size())) { delete pTree; pTree = nullptr; @@ -92,8 +91,6 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree, } m_pMainTreeMap.insert(std::map::value_type(dwCRC, pTree)); - - file.Destroy(); } *ppMainTree = pTree; diff --git a/src/UserInterface/PythonApplicationModule.cpp b/src/UserInterface/PythonApplicationModule.cpp index a5e0645c..af994f6b 100644 --- a/src/UserInterface/PythonApplicationModule.cpp +++ b/src/UserInterface/PythonApplicationModule.cpp @@ -1042,12 +1042,11 @@ class CTextLineLoader public: CTextLineLoader(const char * c_szFileName) { - const VOID* pvData; - CMappedFile kFile; - if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return; - m_kTextFileLoader.Bind(kFile.Size(), pvData); + m_kTextFileLoader.Bind(data->size(), data->data()); } DWORD GetLineCount() diff --git a/src/UserInterface/PythonBackground.cpp b/src/UserInterface/PythonBackground.cpp index fbef52c0..198bd7a0 100644 --- a/src/UserInterface/PythonBackground.cpp +++ b/src/UserInterface/PythonBackground.cpp @@ -241,19 +241,7 @@ void CPythonBackground::Initialize() void CPythonBackground::__CreateProperty() { - if (CEterPackManager::SEARCH_FILE_FIRST == CEterPackManager::Instance().GetSearchMode() && - _access("property", 0) == 0) - { - m_PropertyManager.Initialize(NULL); - - CPropertyLoader PropertyLoader; - PropertyLoader.SetPropertyManager(&m_PropertyManager); - PropertyLoader.Create("*.*", "Property"); - } - else - { - m_PropertyManager.Initialize("pack/property"); - } + m_PropertyManager.Initialize(); } ////////////////////////////////////////////////////////////////////// diff --git a/src/UserInterface/PythonEventManager.cpp b/src/UserInterface/PythonEventManager.cpp index 345a0047..156133aa 100644 --- a/src/UserInterface/PythonEventManager.cpp +++ b/src/UserInterface/PythonEventManager.cpp @@ -106,16 +106,11 @@ void CPythonEventManager::__InitEventSet(TEventSet& rEventSet) int CPythonEventManager::RegisterEventSet(const char * c_szFileName) { - CMappedFile File; - LPCVOID pMap; - - if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMap)) + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return -1; - std::string strEventString; - strEventString.resize(File.Size()+1); - - File.Read(&strEventString[0], File.Size()); + std::string strEventString = data.str(); TEventSet * pEventSet = m_EventSetPool.Alloc(); if (!pEventSet) diff --git a/src/UserInterface/PythonNetworkStreamPhaseLoading.cpp b/src/UserInterface/PythonNetworkStreamPhaseLoading.cpp index f563d25c..746e1740 100644 --- a/src/UserInterface/PythonNetworkStreamPhaseLoading.cpp +++ b/src/UserInterface/PythonNetworkStreamPhaseLoading.cpp @@ -33,13 +33,12 @@ bool CPythonNetworkStream::IsInsultIn(const char* c_szMsg) bool CPythonNetworkStream::LoadInsultList(const char* c_szInsultListFileName) { - CMappedFile file; - const VOID* pvData; - if (!CEterPackManager::Instance().Get(file, c_szInsultListFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader kMemTextFileLoader; + if (!CEterPackManager::Instance().Get(c_szInsultListFileName, data)) return false; - CMemoryTextFileLoader kMemTextFileLoader; - kMemTextFileLoader.Bind(file.Size(), pvData); + kMemTextFileLoader.Bind(data->size(), data->data()); m_kInsultChecker.Clear(); for (DWORD dwLineIndex=0; dwLineIndex=4) return false; - CMappedFile file; - const VOID* pvData; - if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData)) + std::stringstream data; + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; DWORD dwEngCount=26; @@ -65,16 +63,17 @@ bool CPythonNetworkStream::LoadConvertTable(DWORD dwEmpireID, const char* c_szFi DWORD dwHanSize=dwHanCount*2; DWORD dwFileSize=dwEngCount*2+dwHanSize; - if (file.Size()>(dwDataSize); + + data.read((char*)pbData->data(), pbData->size()); + if (!data) + return false; - BYTE * pbData = new BYTE[dwDataSize]; - file.Read(pbData, dwDataSize); ///// CLZObject zObj; - if (!CLZO::Instance().Decompress(zObj, pbData, s_adwMobProtoKey)) - { - delete [] pbData; + if (!CLZO::Instance().Decompress(zObj, pbData->data(), s_adwMobProtoKey)) return false; - } if ((zObj.GetSize() % sizeof(TMobTable)) != 0) { @@ -64,7 +70,6 @@ bool CPythonNonPlayer::LoadNonPlayerData(const char * c_szFileName) m_NonPlayerDataMap.insert(TNonPlayerDataMap::value_type(pNonPlayerData->dwVnum, pNonPlayerData)); } - delete [] pbData; return true; } diff --git a/src/UserInterface/PythonPackModule.cpp b/src/UserInterface/PythonPackModule.cpp index e3bad81a..a02b6f2f 100644 --- a/src/UserInterface/PythonPackModule.cpp +++ b/src/UserInterface/PythonPackModule.cpp @@ -63,11 +63,9 @@ PyObject * packGet(PyObject * poSelf, PyObject * poArgs) (stricmp(pcExt, ".pyc") == 0) || (stricmp(pcExt, ".txt") == 0)) { - CMappedFile file; - const void * pData = NULL; - - if (CEterPackManager::Instance().Get(file,strFileName,&pData)) - return Py_BuildValue("s#",pData, file.Size()); + CEterPackManager::TPackDataPtr data; + if (CEterPackManager::Instance().Get(strFileName, data)) + return Py_BuildValue("s#", data->data(), data->size()); } } diff --git a/src/UserInterface/PythonSkill.cpp b/src/UserInterface/PythonSkill.cpp index 0a1f3aed..086d1694 100644 --- a/src/UserInterface/PythonSkill.cpp +++ b/src/UserInterface/PythonSkill.cpp @@ -89,13 +89,13 @@ void string_replace_word(const char* base, int base_len, const char* src, int sr bool CPythonSkill::RegisterSkillTable(const char * c_szFileName) { - const VOID* pvData; - CMappedFile kFile; - if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader textFileLoader; + + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; - CMemoryTextFileLoader textFileLoader; - textFileLoader.Bind(kFile.Size(), pvData); + textFileLoader.Bind(data->size(), data->data()); // OVERWRITE_SKILLPROTO_POLY std::string src_poly_rand; @@ -279,13 +279,13 @@ void CPythonSkill::__RegisterNormalIconImage(TSkillData & rData, const char * c_ extern const DWORD c_iSkillIndex_Riding; bool CPythonSkill::RegisterSkillDesc(const char * c_szFileName) { - const VOID* pvData; - CMappedFile kFile; - if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData)) + CEterPackManager::TPackDataPtr data; + CMemoryTextFileLoader textFileLoader; + + if (!CEterPackManager::Instance().Get(c_szFileName, data)) return false; - CMemoryTextFileLoader textFileLoader; - textFileLoader.Bind(kFile.Size(), pvData); + textFileLoader.Bind(data->size(), data->data()); CTokenVector TokenVector; for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) diff --git a/src/UserInterface/UserInterface.cpp b/src/UserInterface/UserInterface.cpp index 056889bd..a37cc789 100644 --- a/src/UserInterface/UserInterface.cpp +++ b/src/UserInterface/UserInterface.cpp @@ -256,10 +256,6 @@ bool PackInitialize(const char * c_pszFolder) #endif CTextFileLoader::SetCacheMode(); -#if defined(USE_RELATIVE_PATH) - CEterPackManager::Instance().SetRelativePathMode(); -#endif - CEterPackManager::Instance().SetCacheMode(); CEterPackManager::Instance().SetSearchMode(bPackFirst); CSoundData::SetPackMode(); // Miles ÆÄÀÏ ÄݹéÀ» ¼ÂÆÃ