Used shared pointers and string streams to read data from the CEterPackManager
This commit is contained in:
parent
603f2207ef
commit
c21c99393d
@ -3,9 +3,10 @@
|
|||||||
setlocal enabledelayedexpansion
|
setlocal enabledelayedexpansion
|
||||||
FOR /d %%i IN ("*") DO (
|
FOR /d %%i IN ("*") DO (
|
||||||
echo Packing %%i
|
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
|
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!
|
if !errorlevel! neq 0 exit /b !errorlevel!
|
||||||
|
|
||||||
cls
|
cls
|
||||||
|
@ -192,15 +192,14 @@ BOOL CEffectMesh::__LoadData_Ver002(int iSize, const BYTE * c_pbBuf)
|
|||||||
|
|
||||||
if (0 == strExtension.compare("ifl"))
|
if (0 == strExtension.compare("ifl"))
|
||||||
{
|
{
|
||||||
LPCVOID pMotionData;
|
CEterPackManager::TPackDataPtr motionData;
|
||||||
CMappedFile File;
|
|
||||||
|
|
||||||
if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData))
|
|
||||||
{
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
|
||||||
|
if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData))
|
||||||
|
{
|
||||||
std::vector<std::string> stTokenVector;
|
std::vector<std::string> stTokenVector;
|
||||||
|
|
||||||
textFileLoader.Bind(File.Size(), pMotionData);
|
textFileLoader.Bind(motionData->size(), motionData->data());
|
||||||
|
|
||||||
std::string strPathName;
|
std::string strPathName;
|
||||||
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
|
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
|
||||||
@ -337,15 +336,14 @@ BOOL CEffectMesh::__LoadData_Ver001(int iSize, const BYTE * c_pbBuf)
|
|||||||
|
|
||||||
if (0 == strExtension.compare("ifl"))
|
if (0 == strExtension.compare("ifl"))
|
||||||
{
|
{
|
||||||
LPCVOID pMotionData;
|
CEterPackManager::TPackDataPtr motionData;
|
||||||
CMappedFile File;
|
|
||||||
|
|
||||||
if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData))
|
|
||||||
{
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
|
||||||
|
if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData))
|
||||||
|
{
|
||||||
std::vector<std::string> stTokenVector;
|
std::vector<std::string> stTokenVector;
|
||||||
|
|
||||||
textFileLoader.Bind(File.Size(), pMotionData);
|
textFileLoader.Bind(motionData->size(), motionData->data());
|
||||||
|
|
||||||
std::string strPathName;
|
std::string strPathName;
|
||||||
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
|
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
|
||||||
|
@ -234,18 +234,6 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
|
|||||||
return true;
|
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 CTGAImage::GetRLEPixelCount(const DWORD * data)
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
|
@ -17,7 +17,6 @@ class CTGAImage : public CImage
|
|||||||
|
|
||||||
virtual void Create(int width, int height);
|
virtual void Create(int width, int height);
|
||||||
virtual bool LoadFromMemory(int iSize, const BYTE * c_pbMem);
|
virtual bool LoadFromMemory(int iSize, const BYTE * c_pbMem);
|
||||||
virtual bool LoadFromDiskFile(const char * c_szFileName);
|
|
||||||
virtual bool SaveToDiskFile(const char* c_szFileName);
|
virtual bool SaveToDiskFile(const char* c_szFileName);
|
||||||
|
|
||||||
void SetCompressed(bool isCompress = true);
|
void SetCompressed(bool isCompress = true);
|
||||||
|
@ -47,9 +47,6 @@ void CFileLoaderThread::Destroy()
|
|||||||
CloseHandle(m_hSemaphore);
|
CloseHandle(m_hSemaphore);
|
||||||
m_hSemaphore = NULL;
|
m_hSemaphore = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
stl_wipe(m_pRequestDeque);
|
|
||||||
stl_wipe(m_pCompleteDeque);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT CFileLoaderThread::Setup()
|
UINT CFileLoaderThread::Setup()
|
||||||
@ -111,13 +108,11 @@ UINT CFileLoaderThread::Execute(void * /*pvArg*/)
|
|||||||
return 1;
|
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;
|
TData pData;
|
||||||
|
pData.fileName = c_rstFileName;
|
||||||
pData->dwSize = 0;
|
pData.data = nullptr;
|
||||||
pData->pvBuf = NULL;
|
|
||||||
pData->stFileName = c_rstFileName;
|
|
||||||
|
|
||||||
m_RequestMutex.Lock();
|
m_RequestMutex.Lock();
|
||||||
m_pRequestDeque.push_back(pData);
|
m_pRequestDeque.push_back(pData);
|
||||||
@ -131,7 +126,7 @@ void CFileLoaderThread::Request(std::string & c_rstFileName) // called in main t
|
|||||||
--m_iRestSemCount;
|
--m_iRestSemCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread
|
bool CFileLoaderThread::Fetch(TData& data) // called in main thread
|
||||||
{
|
{
|
||||||
m_CompleteMutex.Lock();
|
m_CompleteMutex.Lock();
|
||||||
|
|
||||||
@ -141,7 +136,7 @@ bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppData = m_pCompleteDeque.front();
|
data = m_pCompleteDeque.front();
|
||||||
m_pCompleteDeque.pop_front();
|
m_pCompleteDeque.pop_front();
|
||||||
|
|
||||||
m_CompleteMutex.Unlock();
|
m_CompleteMutex.Unlock();
|
||||||
@ -158,22 +153,16 @@ void CFileLoaderThread::Process() // called in loader thread
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TData * pData = m_pRequestDeque.front();
|
auto request = m_pRequestDeque.front();
|
||||||
m_pRequestDeque.pop_front();
|
m_pRequestDeque.pop_front();
|
||||||
|
|
||||||
m_RequestMutex.Unlock();
|
m_RequestMutex.Unlock();
|
||||||
|
|
||||||
LPCVOID pvBuf;
|
if (!CEterPackManager::Instance().Get(request.fileName, request.data))
|
||||||
|
request.data = nullptr;
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_CompleteMutex.Lock();
|
m_CompleteMutex.Lock();
|
||||||
m_pCompleteDeque.push_back(pData);
|
m_pCompleteDeque.push_back(request);
|
||||||
m_CompleteMutex.Unlock();
|
m_CompleteMutex.Unlock();
|
||||||
|
|
||||||
Sleep(g_iLoadingDelayTime);
|
Sleep(g_iLoadingDelayTime);
|
||||||
|
@ -2,20 +2,18 @@
|
|||||||
#define __INC_YMIR_ETERLIB_FILELOADERTHREAD_H__
|
#define __INC_YMIR_ETERLIB_FILELOADERTHREAD_H__
|
||||||
|
|
||||||
#include <deque>
|
#include <deque>
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "Mutex.h"
|
#include "Mutex.h"
|
||||||
#include "../eterBase/MappedFile.h"
|
|
||||||
|
|
||||||
class CFileLoaderThread
|
class CFileLoaderThread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef struct SData
|
typedef struct SData
|
||||||
{
|
{
|
||||||
std::string stFileName;
|
std::string fileName;
|
||||||
|
std::shared_ptr<std::vector<char>> data;
|
||||||
CMappedFile File;
|
|
||||||
LPVOID pvBuf;
|
|
||||||
DWORD dwSize;
|
|
||||||
} TData;
|
} TData;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@ -25,8 +23,8 @@ class CFileLoaderThread
|
|||||||
int Create(void * arg);
|
int Create(void * arg);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void Request(std::string & c_rstFileName);
|
void Request(const std::string& c_rstFileName);
|
||||||
bool Fetch(TData ** ppData);
|
bool Fetch(TData& data);
|
||||||
void Shutdown();
|
void Shutdown();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -49,10 +47,10 @@ class CFileLoaderThread
|
|||||||
void Process();
|
void Process();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::deque<TData *> m_pRequestDeque;
|
std::deque<TData> m_pRequestDeque;
|
||||||
Mutex m_RequestMutex;
|
Mutex m_RequestMutex;
|
||||||
|
|
||||||
std::deque<TData *> m_pCompleteDeque;
|
std::deque<TData> m_pCompleteDeque;
|
||||||
Mutex m_CompleteMutex;
|
Mutex m_CompleteMutex;
|
||||||
|
|
||||||
HANDLE m_hSemaphore;
|
HANDLE m_hSemaphore;
|
||||||
|
@ -50,13 +50,11 @@ bool CGraphicImageTexture::CreateDeviceObjects()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CMappedFile mappedFile;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID c_pvMap;
|
if (!CEterPackManager::Instance().Get(m_stFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(mappedFile, m_stFileName.c_str(), &c_pvMap))
|
|
||||||
return false;
|
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;
|
m_bEmpty = false;
|
||||||
|
@ -43,17 +43,16 @@ void CResource::Load()
|
|||||||
const char * c_szFileName = GetFileName();
|
const char * c_szFileName = GetFileName();
|
||||||
|
|
||||||
DWORD dwStart = ELTimer_GetMSec();
|
DWORD dwStart = ELTimer_GetMSec();
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr fileData;
|
||||||
LPCVOID fileData;
|
|
||||||
|
|
||||||
//Tracenf("Load %s", c_szFileName);
|
//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;
|
m_dwLoadCostMiliiSecond = ELTimer_GetMSec() - dwStart;
|
||||||
//Tracef("CResource::Load %s (%d bytes) in %d ms\n", c_szFileName, file.Size(), m_dwLoadCostMiliiSecond);
|
//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;
|
me_state = STATE_EXIST;
|
||||||
}
|
}
|
||||||
@ -81,12 +80,11 @@ void CResource::Reload()
|
|||||||
Clear();
|
Clear();
|
||||||
Tracef("CResource::Reload %s\n", GetFileName());
|
Tracef("CResource::Reload %s\n", GetFileName());
|
||||||
|
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr fileData;
|
||||||
LPCVOID 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;
|
me_state = STATE_EXIST;
|
||||||
}
|
}
|
||||||
|
@ -61,17 +61,17 @@ void CResourceManager::ProcessBackgroundLoading()
|
|||||||
|
|
||||||
DWORD dwCurrentTime = ELTimer_GetMSec();
|
DWORD dwCurrentTime = ELTimer_GetMSec();
|
||||||
|
|
||||||
CFileLoaderThread::TData * pData;
|
CFileLoaderThread::TData pData;
|
||||||
while (ms_loadingThread.Fetch(&pData))
|
while (ms_loadingThread.Fetch(pData))
|
||||||
{
|
{
|
||||||
//printf("LOD %s\n", pData->stFileName.c_str());
|
//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)
|
||||||
{
|
{
|
||||||
if (pResource->IsEmpty())
|
if (pResource->IsEmpty())
|
||||||
{
|
{
|
||||||
pResource->OnLoad(pData->dwSize, pData->pvBuf);
|
pResource->OnLoad(pData.data->size(), pData.data->data());
|
||||||
pResource->AddReferenceOnly();
|
pResource->AddReferenceOnly();
|
||||||
|
|
||||||
// 여기서 올라간 레퍼런스 카운트를 일정 시간이 지난 뒤에 풀어주기 위하여
|
// 여기서 올라간 레퍼런스 카운트를 일정 시간이 지난 뒤에 풀어주기 위하여
|
||||||
@ -79,10 +79,7 @@ void CResourceManager::ProcessBackgroundLoading()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_WaitingMap.erase(GetCRC32(pData->stFileName.c_str(), pData->stFileName.size()));
|
m_WaitingMap.erase(GetCRC32(pData.fileName.c_str(), pData.fileName.size()));
|
||||||
|
|
||||||
delete [] ((char *) pData->pvBuf);
|
|
||||||
delete pData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// DO : 일정 시간이 지나고 난뒤 미리 로딩해 두었던 리소스의 레퍼런스 카운트를 감소 시킨다 - [levites]
|
// DO : 일정 시간이 지나고 난뒤 미리 로딩해 두었던 리소스의 레퍼런스 카운트를 감소 시킨다 - [levites]
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "FileLoaderThread.h"
|
#include "FileLoaderThread.h"
|
||||||
|
#include "../EterBase/Singleton.h"
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -179,14 +179,13 @@ bool CTextFileLoader::Load(const char * c_szFileName)
|
|||||||
{
|
{
|
||||||
m_strFileName = "";
|
m_strFileName = "";
|
||||||
|
|
||||||
const VOID* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kFile;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (m_dwBufCapacity<kFile.Size())
|
if (m_dwBufCapacity < data->size())
|
||||||
{
|
{
|
||||||
m_dwBufCapacity=kFile.Size();
|
m_dwBufCapacity = data->size();
|
||||||
|
|
||||||
if (m_acBufData)
|
if (m_acBufData)
|
||||||
delete [] m_acBufData;
|
delete [] m_acBufData;
|
||||||
@ -194,8 +193,8 @@ bool CTextFileLoader::Load(const char * c_szFileName)
|
|||||||
m_acBufData=new char[m_dwBufCapacity];
|
m_acBufData=new char[m_dwBufCapacity];
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dwBufSize=kFile.Size();
|
m_dwBufSize = data->size();
|
||||||
memcpy(m_acBufData, pvData, m_dwBufSize);
|
memcpy_s(m_acBufData, m_dwBufCapacity, data->data(), data->size());
|
||||||
|
|
||||||
m_strFileName = c_szFileName;
|
m_strFileName = c_szFileName;
|
||||||
m_dwcurLineIndex = 0;
|
m_dwcurLineIndex = 0;
|
||||||
|
@ -20,16 +20,14 @@ void PrintfTabs(FILE * File, int iTabCount, const char * c_szString, ...)
|
|||||||
|
|
||||||
bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
|
bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
|
||||||
{
|
{
|
||||||
LPCVOID pMotionData;
|
CEterPackManager::TPackDataPtr motionData;
|
||||||
CMappedFile File;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData))
|
if (!CEterPackManager::Instance().Get(c_szFileName, motionData))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
|
||||||
CTokenVector stTokenVector;
|
CTokenVector stTokenVector;
|
||||||
|
textFileLoader.Bind(motionData->size(), motionData->data());
|
||||||
textFileLoader.Bind(File.Size(), pMotionData);
|
|
||||||
|
|
||||||
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
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)
|
bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap)
|
||||||
{
|
{
|
||||||
LPCVOID pModelData;
|
CEterPackManager::TPackDataPtr modelData;
|
||||||
CMappedFile File;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData))
|
if (!CEterPackManager::Instance().Get(c_szFileName, modelData))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DWORD i;
|
DWORD i;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
|
||||||
CTokenVector stTokenVector;
|
CTokenVector stTokenVector;
|
||||||
|
|
||||||
textFileLoader.Bind(File.Size(), pModelData);
|
textFileLoader.Bind(modelData->size(), modelData->data());
|
||||||
|
|
||||||
for (i = 0; i < textFileLoader.GetLineCount(); ++i)
|
for (i = 0; i < textFileLoader.GetLineCount(); ++i)
|
||||||
{
|
{
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,234 +0,0 @@
|
|||||||
#ifndef __INC_ETERPACKLIB_ETERPACK_H__
|
|
||||||
#define __INC_ETERPACKLIB_ETERPACK_H__
|
|
||||||
|
|
||||||
#include <list>
|
|
||||||
#include <unordered_map>
|
|
||||||
|
|
||||||
#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<DWORD, TEterPackIndex *> TDataPositionMap;
|
|
||||||
typedef std::list<TEterPackIndex *> 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<DWORD, Item> 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<std::string>* 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<DWORD, DWORD> 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
|
|
@ -170,20 +170,6 @@
|
|||||||
</Lib>
|
</Lib>
|
||||||
</ItemDefinitionGroup>
|
</ItemDefinitionGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="EterPack.cpp">
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
|
|
||||||
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EterPackCursor.cpp">
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
|
|
||||||
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EterPackManager.cpp">
|
<ClCompile Include="EterPackManager.cpp">
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
|
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
|
||||||
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
|
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
|
||||||
@ -191,27 +177,14 @@
|
|||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
|
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
|
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="FileProvider.cpp" />
|
|
||||||
<ClCompile Include="Folder.cpp" />
|
<ClCompile Include="Folder.cpp" />
|
||||||
<ClCompile Include="md5.c" />
|
|
||||||
<ClCompile Include="StdAfx.cpp">
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
|
|
||||||
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
|
|
||||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
|
||||||
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
|
|
||||||
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="ZIP.cpp" />
|
<ClCompile Include="ZIP.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="EterPack.h" />
|
|
||||||
<ClInclude Include="EterPackCursor.h" />
|
|
||||||
<ClInclude Include="EterPackManager.h" />
|
<ClInclude Include="EterPackManager.h" />
|
||||||
<ClInclude Include="FileProvider.h" />
|
<ClInclude Include="FileProvider.h" />
|
||||||
<ClInclude Include="Folder.h" />
|
<ClInclude Include="Folder.h" />
|
||||||
<ClInclude Include="Inline.h" />
|
<ClInclude Include="Inline.h" />
|
||||||
<ClInclude Include="md5.h" />
|
|
||||||
<ClInclude Include="StdAfx.h" />
|
<ClInclude Include="StdAfx.h" />
|
||||||
<ClInclude Include="ZIP.h" />
|
<ClInclude Include="ZIP.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -14,24 +14,9 @@
|
|||||||
</Filter>
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="EterPack.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EterPackCursor.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="EterPackManager.cpp">
|
<ClCompile Include="EterPackManager.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="md5.c">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="StdAfx.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="FileProvider.cpp">
|
|
||||||
<Filter>File Providers</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="Folder.cpp">
|
<ClCompile Include="Folder.cpp">
|
||||||
<Filter>File Providers</Filter>
|
<Filter>File Providers</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -40,21 +25,12 @@
|
|||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="EterPack.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="EterPackCursor.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="EterPackManager.h">
|
<ClInclude Include="EterPackManager.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="Inline.h">
|
<ClInclude Include="Inline.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="md5.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="StdAfx.h">
|
<ClInclude Include="StdAfx.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -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();
|
|
||||||
}
|
|
@ -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
|
|
@ -1,5 +1,7 @@
|
|||||||
#include "StdAfx.h"
|
#include "StdAfx.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -14,18 +16,6 @@
|
|||||||
#define PATH_ABSOLUTE_YMIRWORK1 "d:/ymir work/"
|
#define PATH_ABSOLUTE_YMIRWORK1 "d:/ymir work/"
|
||||||
#define PATH_ABSOLUTE_YMIRWORK2 "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 ¹öÀü
|
// StringPath std::string ¹öÀü
|
||||||
std::string CEterPackManager::ConvertFileName(std::string fileName)
|
std::string CEterPackManager::ConvertFileName(std::string fileName)
|
||||||
{
|
{
|
||||||
@ -58,50 +48,6 @@ bool CEterPackManager::CompareName(const char * c_szDirectoryName, DWORD /*dwLen
|
|||||||
return true;
|
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<DWORD, SCache>::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<DWORD, SCache>::value_type(dwFileNameHash, kNewCache));
|
|
||||||
}
|
|
||||||
|
|
||||||
CEterPackManager::SCache* CEterPackManager::__FindCache(DWORD dwFileNameHash)
|
|
||||||
{
|
|
||||||
std::unordered_map<DWORD, SCache>::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<DWORD, SCache>::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
|
struct TimeChecker
|
||||||
{
|
{
|
||||||
TimeChecker(const char* name) : name(name)
|
TimeChecker(const char* name) : name(name)
|
||||||
@ -117,27 +63,37 @@ struct TimeChecker
|
|||||||
DWORD baseTime;
|
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);
|
//TimeChecker timeChecker(c_szFileName);
|
||||||
//Logf(1, "Load %s\n", c_szFileName);
|
//Logf(1, "Load %s\n", c_szFileName);
|
||||||
|
|
||||||
if (m_iSearchMode == SEARCH_FILE_FIRST)
|
if (m_iSearchMode == SEARCH_FILE_FIRST)
|
||||||
{
|
{
|
||||||
if (GetFromFile(rMappedFile, c_szFileName, pData))
|
if (GetFromFile(fileName, dataPtr))
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
return GetFromPack(fileName, dataPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetFromPack(rMappedFile, c_szFileName, pData);
|
if (GetFromPack(fileName, dataPtr))
|
||||||
}
|
|
||||||
|
|
||||||
if (GetFromPack(rMappedFile, c_szFileName, pData))
|
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
return GetFromFile(fileName, dataPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return GetFromFile(rMappedFile, c_szFileName, pData);
|
|
||||||
|
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<char>(dataStream));
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FinderLock
|
struct FinderLock
|
||||||
@ -155,24 +111,15 @@ struct FinderLock
|
|||||||
CRITICAL_SECTION* p_cs;
|
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);
|
FinderLock lock(m_csFinder);
|
||||||
|
|
||||||
std::string strFileName = ConvertFileName(c_szFileName);
|
std::string strFileName = ConvertFileName(fileName);
|
||||||
|
|
||||||
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
|
auto pkFileItem = m_FileMap.find(strFileName);
|
||||||
SCache* pkCache = __FindCache(dwFileNameHash);
|
|
||||||
|
|
||||||
if (pkCache)
|
if (pkFileItem == m_FileMap.end()) {
|
||||||
{
|
|
||||||
rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto pkFileItem = m_FileDict.find(dwFileNameHash);
|
|
||||||
|
|
||||||
if (pkFileItem == m_FileDict.end()) {
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str());
|
TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str());
|
||||||
#endif
|
#endif
|
||||||
@ -181,55 +128,42 @@ bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szF
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto data = std::make_shared<std::vector<char>>();
|
auto data = std::make_shared<std::vector<char>>();
|
||||||
bool r = pkFileItem->second->getFile(strFileName, data);
|
if (!pkFileItem->second->getFile(strFileName, data))
|
||||||
|
return false;
|
||||||
|
|
||||||
// Keep the file loaded by always forcing a reference in the smart pointer (temporary hack)
|
// Set dataPtr to the retreived data pointer
|
||||||
keepDataReferencedArray.push_back(data);
|
dataPtr = data;
|
||||||
|
|
||||||
rMappedFile.Link(data->size(), data->data());
|
return true;
|
||||||
*pData = (LPCVOID *) data->data();
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const time_t g_tCachingInterval = 10; // 10초
|
bool CEterPackManager::GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr)
|
||||||
|
|
||||||
bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData)
|
|
||||||
{
|
{
|
||||||
#ifndef _DEBUG
|
// Try to open the file
|
||||||
//const char *pcExt = strchr(c_szFileName, '.');
|
std::ifstream file(fileName, std::ios::binary);
|
||||||
//if (pcExt &&
|
if (!file.is_open())
|
||||||
// _strnicmp(pcExt, ".py", 3) == 0 && // python 스크립트 중
|
return false;
|
||||||
// stricmp(c_szFileName, "logininfo.py") != 0 && // 로그인 정보 파일이 아니고
|
|
||||||
// strnicmp(c_szFileName, "locale", 6) != 0
|
|
||||||
// )
|
|
||||||
//{
|
|
||||||
// return false;
|
|
||||||
//}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//if(m_bTryRelativePath) {
|
// Read the file's contents
|
||||||
// if (strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK1, strlen(PATH_ABSOLUTE_YMIRWORK1)) == 0 || strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK2, strlen(PATH_ABSOLUTE_YMIRWORK2)) == 0) {
|
dataPtr = std::make_shared<std::vector<char>>(
|
||||||
// if(rMappedFile.Create(c_szFileName+strlen(PATH_ABSOLUTE_YMIRWORK1), pData, 0, 0))
|
std::istreambuf_iterator<char>(file),
|
||||||
// {
|
std::istreambuf_iterator<char>()
|
||||||
// return true;
|
);
|
||||||
// }
|
return true;
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
return rMappedFile.Create(c_szFileName, pData, 0, 0) ? true : false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CEterPackManager::isExistInPack(const char * c_szFileName)
|
bool CEterPackManager::isExistInPack(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
std::string strFileName = ConvertFileName(c_szFileName);
|
std::string strFileName = ConvertFileName(c_szFileName);
|
||||||
|
|
||||||
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
|
auto pkFileItem = m_FileMap.find(strFileName);
|
||||||
auto pkFileItem = m_FileDict.find(dwFileNameHash);
|
|
||||||
|
|
||||||
if (pkFileItem == m_FileDict.end())
|
if (pkFileItem == m_FileMap.end())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!pkFileItem->second)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (pkFileItem->second)
|
|
||||||
return pkFileItem->second->fileExists(strFileName.c_str());
|
return pkFileItem->second->fileExists(strFileName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -240,16 +174,9 @@ bool CEterPackManager::isExist(const char * c_szFileName)
|
|||||||
if (isExistInPack(c_szFileName))
|
if (isExistInPack(c_szFileName))
|
||||||
return true;
|
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)
|
if (_access(c_szFileName, 0) == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -276,18 +203,20 @@ bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDire
|
|||||||
|
|
||||||
auto packFiles = pack->listFiles();
|
auto packFiles = pack->listFiles();
|
||||||
|
|
||||||
for (auto const& fileName : packFiles) {
|
for (auto const& fileName : packFiles)
|
||||||
DWORD dwFileNameHash = GetCRC32(fileName.c_str(), fileName.length());
|
m_FileMap.insert({ fileName, pack });
|
||||||
m_FileDict.insert({ dwFileNameHash, 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
|
#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
|
#endif
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,14 +230,16 @@ int CEterPackManager::GetSearchMode()
|
|||||||
return m_iSearchMode;
|
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);
|
InitializeCriticalSection(&m_csFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
CEterPackManager::~CEterPackManager()
|
CEterPackManager::~CEterPackManager()
|
||||||
{
|
{
|
||||||
__ClearCacheMap();
|
|
||||||
|
|
||||||
DeleteCriticalSection(&m_csFinder);
|
DeleteCriticalSection(&m_csFinder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CEterPackManager::TFileMap& CEterPackManager::GetFileMap() {
|
||||||
|
return this->m_FileMap;
|
||||||
|
}
|
||||||
|
@ -6,16 +6,9 @@
|
|||||||
#include "../eterBase/Stl.h"
|
#include "../eterBase/Stl.h"
|
||||||
|
|
||||||
#include "FileProvider.h"
|
#include "FileProvider.h"
|
||||||
#include "EterPack.h"
|
|
||||||
|
|
||||||
class CEterPackManager : public CSingleton<CEterPackManager>
|
class CEterPackManager : public CSingleton<CEterPackManager>
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
struct SCache
|
|
||||||
{
|
|
||||||
BYTE* m_abBufData;
|
|
||||||
DWORD m_dwBufSize;
|
|
||||||
};
|
|
||||||
public:
|
public:
|
||||||
enum ESearchModes
|
enum ESearchModes
|
||||||
{
|
{
|
||||||
@ -25,49 +18,37 @@ class CEterPackManager : public CSingleton<CEterPackManager>
|
|||||||
|
|
||||||
typedef std::list<std::shared_ptr<FileProvider>> TEterPackList;
|
typedef std::list<std::shared_ptr<FileProvider>> TEterPackList;
|
||||||
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>, stringhash> TEterPackMap;
|
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>, stringhash> TEterPackMap;
|
||||||
|
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>, stringhash> TFileMap;
|
||||||
|
typedef std::shared_ptr<std::vector<char>> TPackDataPtr;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CEterPackManager();
|
CEterPackManager();
|
||||||
virtual ~CEterPackManager();
|
virtual ~CEterPackManager();
|
||||||
|
|
||||||
void SetCacheMode();
|
|
||||||
void SetRelativePathMode();
|
|
||||||
|
|
||||||
void LoadStaticCache(const char* c_szFileName);
|
|
||||||
|
|
||||||
void SetSearchMode(bool bPackFirst);
|
void SetSearchMode(bool bPackFirst);
|
||||||
int GetSearchMode();
|
int GetSearchMode();
|
||||||
|
|
||||||
bool Get(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 GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData);
|
|
||||||
|
|
||||||
bool GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData);
|
|
||||||
bool isExist(const char * c_szFileName);
|
bool isExist(const char * c_szFileName);
|
||||||
bool isExistInPack(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);
|
bool RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV = NULL);
|
||||||
std::string ConvertFileName(std::string fileName);
|
std::string ConvertFileName(std::string fileName);
|
||||||
|
|
||||||
|
const TFileMap& GetFileMap();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName);
|
bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName);
|
||||||
|
bool GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr);
|
||||||
std::shared_ptr<FileProvider> FindPack(const char* c_szPathName);
|
bool GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr);
|
||||||
|
|
||||||
SCache* __FindCache(DWORD dwFileNameHash);
|
|
||||||
void __ClearCacheMap();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool m_bTryRelativePath;
|
|
||||||
bool m_isCacheMode;
|
|
||||||
int m_iSearchMode;
|
int m_iSearchMode;
|
||||||
|
|
||||||
std::unordered_map<DWORD, std::shared_ptr<FileProvider>> m_FileDict;
|
TFileMap m_FileMap;
|
||||||
TEterPackMap m_PackMap;
|
TEterPackMap m_PackMap;
|
||||||
|
|
||||||
std::unordered_map<DWORD, SCache> m_kMap_dwNameKey_kCache;
|
|
||||||
|
|
||||||
std::vector<std::shared_ptr<std::vector<char>>> keepDataReferencedArray;
|
|
||||||
|
|
||||||
CRITICAL_SECTION m_csFinder;
|
CRITICAL_SECTION m_csFinder;
|
||||||
};
|
};
|
||||||
|
@ -1 +0,0 @@
|
|||||||
#include "FileProvider.h"
|
|
@ -5,7 +5,6 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
class FileProvider
|
class FileProvider
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -13,4 +12,3 @@ public:
|
|||||||
virtual bool fileExists(const std::string& fileName) = 0;
|
virtual bool fileExists(const std::string& fileName) = 0;
|
||||||
virtual bool getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData) = 0;
|
virtual bool getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,10 +14,8 @@ void Folder::ListFiles(const std::string& directory, const std::string& relative
|
|||||||
|
|
||||||
// Start searching for files and directories
|
// Start searching for files and directories
|
||||||
hFind = FindFirstFile(searchPath.c_str(), &findData);
|
hFind = FindFirstFile(searchPath.c_str(), &findData);
|
||||||
if (hFind == INVALID_HANDLE_VALUE) {
|
if (hFind == INVALID_HANDLE_VALUE)
|
||||||
std::cerr << L"Failed to open directory: " << directory << L"\n";
|
throw std::runtime_error("Failed to open directory: " + directory);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
const std::string fileOrDirName = findData.cFileName;
|
const std::string fileOrDirName = findData.cFileName;
|
||||||
@ -86,26 +84,15 @@ bool Folder::getFile(const std::string& fileName, std::shared_ptr<std::vector<ch
|
|||||||
|
|
||||||
realFileName = this->folderPath + "/" + realFileName;
|
realFileName = this->folderPath + "/" + realFileName;
|
||||||
|
|
||||||
// open the file:
|
// Try to open the file
|
||||||
std::ifstream file(realFileName, std::ios::binary);
|
std::ifstream file(realFileName, std::ios::binary);
|
||||||
|
if (!file.is_open())
|
||||||
|
return false;
|
||||||
|
|
||||||
// Stop eating new lines in binary mode!!!
|
// Read the file's contents
|
||||||
file.unsetf(std::ios::skipws);
|
fileData = std::make_shared<std::vector<char>>(
|
||||||
|
std::istreambuf_iterator<char>(file),
|
||||||
// get its size:
|
std::istreambuf_iterator<char>()
|
||||||
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<BYTE>(file),
|
|
||||||
std::istream_iterator<BYTE>());
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
@ -1,2 +0,0 @@
|
|||||||
#include "stdafx.h"
|
|
||||||
|
|
@ -12,10 +12,12 @@ ZIP::ZIP(const std::string& archivePath)
|
|||||||
|
|
||||||
if ((zipFile = zip_open(archivePath.c_str(), 0, &err)) == NULL) {
|
if ((zipFile = zip_open(archivePath.c_str(), 0, &err)) == NULL) {
|
||||||
zip_error_t error;
|
zip_error_t error;
|
||||||
|
|
||||||
zip_error_init_with_code(&error, err);
|
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);
|
zip_error_fini(&error);
|
||||||
return;
|
|
||||||
|
throw std::runtime_error("Cannot open ZIP archive '" + archivePath + "': " + errorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read the list of files in the archive
|
// Read the list of files in the archive
|
||||||
@ -28,7 +30,7 @@ ZIP::ZIP(const std::string& archivePath)
|
|||||||
std::string fileName(fileData.name);
|
std::string fileName(fileData.name);
|
||||||
|
|
||||||
if (fileData.size == 0) {
|
if (fileData.size == 0) {
|
||||||
// Folder
|
// This is a folder, skip it
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,8 +81,15 @@ bool ZIP::getFile(const std::string& fileName, std::shared_ptr<std::vector<char>
|
|||||||
zip_stat_t fileInfo;
|
zip_stat_t fileInfo;
|
||||||
zip_stat_index(zipFile, it->second, 0, &fileInfo);
|
zip_stat_index(zipFile, it->second, 0, &fileInfo);
|
||||||
|
|
||||||
fileData->resize(fileInfo.size);
|
// Initialize the buffer
|
||||||
|
fileData = std::make_shared<std::vector<char>>(fileInfo.size);
|
||||||
|
|
||||||
|
// Attempt to read the data into the buffer
|
||||||
auto retval = zip_fread(file, fileData->data(), fileData->size());
|
auto retval = zip_fread(file, fileData->data(), fileData->size());
|
||||||
|
|
||||||
|
// Close the file
|
||||||
|
zip_fclose(file);
|
||||||
|
|
||||||
if (retval == -1)
|
if (retval == -1)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
1033
src/EterPack/md5.c
1033
src/EterPack/md5.c
File diff suppressed because it is too large
Load Diff
@ -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
|
|
@ -106,10 +106,8 @@ bool CTerrain::LoadShadowMap(const char * c_pszFileName)
|
|||||||
DWORD dwStart = ELTimer_GetMSec();
|
DWORD dwStart = ELTimer_GetMSec();
|
||||||
Tracef("LoadShadowMap %s ", c_pszFileName);
|
Tracef("LoadShadowMap %s ", c_pszFileName);
|
||||||
|
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID c_pvData;
|
if (!CEterPackManager::Instance().Get(c_pszFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
|
|
||||||
{
|
{
|
||||||
TraceError(" CTerrain::LoadShadowMap - %s OPEN ERROR", c_pszFileName);
|
TraceError(" CTerrain::LoadShadowMap - %s OPEN ERROR", c_pszFileName);
|
||||||
return false;
|
return false;
|
||||||
@ -117,13 +115,13 @@ bool CTerrain::LoadShadowMap(const char * c_pszFileName)
|
|||||||
|
|
||||||
DWORD dwShadowMapSize = sizeof(WORD) * 256 * 256;
|
DWORD dwShadowMapSize = sizeof(WORD) * 256 * 256;
|
||||||
|
|
||||||
if (file.Size() != dwShadowMapSize)
|
if (data->size() != dwShadowMapSize)
|
||||||
{
|
{
|
||||||
TraceError(" CTerrain::LoadShadowMap - %s SIZE ERROR", c_pszFileName);
|
TraceError(" CTerrain::LoadShadowMap - %s SIZE ERROR", c_pszFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(m_awShadowMap, c_pvData, dwShadowMapSize);
|
memcpy_s(m_awShadowMap, dwShadowMapSize, data->data(), data->size());
|
||||||
|
|
||||||
Tracef("%d ms\n", ELTimer_GetMSec() - dwStart);
|
Tracef("%d ms\n", ELTimer_GetMSec() - dwStart);
|
||||||
return true;
|
return true;
|
||||||
|
@ -95,14 +95,12 @@ CItemData * CItemManager::MakeItemData(DWORD dwIndex)
|
|||||||
|
|
||||||
bool CItemManager::LoadItemList(const char * c_szFileName)
|
bool CItemManager::LoadItemList(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
CMappedFile File;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID pData;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
textFileLoader.Bind(data->size(), data->data());
|
||||||
textFileLoader.Bind(File.Size(), pData);
|
|
||||||
|
|
||||||
CTokenVector TokenVector;
|
CTokenVector TokenVector;
|
||||||
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
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)
|
bool CItemManager::LoadItemDesc(const char* c_szFileName)
|
||||||
{
|
{
|
||||||
const VOID* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kFile;
|
CMemoryTextFileLoader kTextFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
{
|
{
|
||||||
Tracenf("CItemManager::LoadItemDesc(c_szFileName=%s) - Load Error", c_szFileName);
|
Tracenf("CItemManager::LoadItemDesc(c_szFileName=%s) - Load Error", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMemoryTextFileLoader kTextFileLoader;
|
kTextFileLoader.Bind(data->size(), data->data());
|
||||||
kTextFileLoader.Bind(kFile.Size(), pvData);
|
|
||||||
|
|
||||||
std::string stTemp;
|
std::string stTemp;
|
||||||
|
|
||||||
@ -254,22 +251,27 @@ DWORD GetHashCode( const char* pString )
|
|||||||
|
|
||||||
bool CItemManager::LoadItemTable(const char* c_szFileName)
|
bool CItemManager::LoadItemTable(const char* c_szFileName)
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
std::stringstream data;
|
||||||
LPCVOID pvData;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DWORD dwFourCC, dwElements, dwDataSize;
|
DWORD dwFourCC, dwElements, dwDataSize;
|
||||||
DWORD dwVersion=0;
|
DWORD dwVersion=0;
|
||||||
DWORD dwStride=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'))
|
if (dwFourCC == MAKEFOURCC('M', 'I', 'P', 'X'))
|
||||||
{
|
{
|
||||||
file.Read(&dwVersion, sizeof(DWORD));
|
data.read((char*)&dwVersion, sizeof(DWORD));
|
||||||
file.Read(&dwStride, sizeof(DWORD));
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.read((char*)&dwStride, sizeof(DWORD));
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (dwVersion != 1)
|
if (dwVersion != 1)
|
||||||
{
|
{
|
||||||
@ -289,19 +291,25 @@ bool CItemManager::LoadItemTable(const char* c_szFileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Read(&dwElements, sizeof(DWORD));
|
data.read((char*)&dwElements, sizeof(DWORD));
|
||||||
file.Read(&dwDataSize, sizeof(DWORD));
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
BYTE * pbData = new BYTE[dwDataSize];
|
data.read((char*)&dwDataSize, sizeof(DWORD));
|
||||||
file.Read(pbData, dwDataSize);
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto pbData = std::make_shared<std::vector<BYTE>>(dwDataSize);
|
||||||
|
data.read((char*)pbData->data(), pbData->size());
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
/////
|
/////
|
||||||
|
|
||||||
CLZObject zObj;
|
CLZObject zObj;
|
||||||
|
|
||||||
if (!CLZO::Instance().Decompress(zObj, pbData, s_adwItemProtoKey))
|
if (!CLZO::Instance().Decompress(zObj, pbData->data(), s_adwItemProtoKey))
|
||||||
{
|
{
|
||||||
delete [] pbData;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -382,7 +390,6 @@ bool CItemManager::LoadItemTable(const char* c_szFileName)
|
|||||||
// pItemData->SetItemTableData(table);
|
// pItemData->SetItemTableData(table);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
delete [] pbData;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -597,14 +597,14 @@ void CMapManager::GetBaseXY(DWORD * pdwBaseX, DWORD * pdwBaseY)
|
|||||||
|
|
||||||
void CMapManager::__LoadMapInfoVector()
|
void CMapManager::__LoadMapInfoVector()
|
||||||
{
|
{
|
||||||
CMappedFile kFile;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID pData;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(kFile, m_stAtlasInfoFileName.c_str(), &pData))
|
|
||||||
if (!CEterPackManager::Instance().Get(kFile, "AtlasInfo.txt", &pData))
|
if (!CEterPackManager::Instance().Get(m_stAtlasInfoFileName, data))
|
||||||
|
if (!CEterPackManager::Instance().Get("AtlasInfo.txt", data))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
textFileLoader.Bind(data->size(), data->data());
|
||||||
textFileLoader.Bind(kFile.Size(), pData);
|
|
||||||
|
|
||||||
char szMapName[256];
|
char szMapName[256];
|
||||||
int x, y;
|
int x, y;
|
||||||
|
@ -452,19 +452,18 @@ bool CMapOutdoor::LoadMonsterAreaInfo()
|
|||||||
char c_szFileName[256];
|
char c_szFileName[256];
|
||||||
sprintf(c_szFileName, "%s\\regen.txt", GetMapDataDirectory().c_str());
|
sprintf(c_szFileName, "%s\\regen.txt", GetMapDataDirectory().c_str());
|
||||||
|
|
||||||
LPCVOID pModelData;
|
CEterPackManager::TPackDataPtr modelData;
|
||||||
CMappedFile File;
|
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);
|
//TraceError(" CMapOutdoorAccessor::LoadMonsterAreaInfo Load File %s ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
|
||||||
CTokenVector stTokenVector;
|
CTokenVector stTokenVector;
|
||||||
|
|
||||||
textFileLoader.Bind(File.Size(), pModelData);
|
textFileLoader.Bind(modelData->size(), modelData->data());
|
||||||
|
|
||||||
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
||||||
{
|
{
|
||||||
|
@ -136,54 +136,6 @@ void GetTimeString(char * str, time_t ct)
|
|||||||
tm.tm_sec);
|
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)
|
bool CProperty::ReadFromMemory(const void * c_pvData, int iLen, const char * c_pszFileName)
|
||||||
{
|
{
|
||||||
const char * pcData = (const char *) c_pvData;
|
const char * pcData = (const char *) c_pvData;
|
||||||
|
@ -19,8 +19,6 @@ class CProperty
|
|||||||
void PutVector(const char * c_pszKey, const CTokenVector & c_rTokenVector);
|
void PutVector(const char * c_pszKey, const CTokenVector & c_rTokenVector);
|
||||||
void PutString(const char * c_pszKey, const char * c_pszString);
|
void PutString(const char * c_pszKey, const char * c_pszString);
|
||||||
|
|
||||||
bool Save(const char * c_pszFileName);
|
|
||||||
|
|
||||||
DWORD GetSize();
|
DWORD GetSize();
|
||||||
DWORD GetCRC();
|
DWORD GetCRC();
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "PropertyManager.h"
|
#include "PropertyManager.h"
|
||||||
#include "Property.h"
|
#include "Property.h"
|
||||||
|
|
||||||
CPropertyManager::CPropertyManager() : m_isFileMode(true)
|
CPropertyManager::CPropertyManager()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,90 +13,34 @@ CPropertyManager::~CPropertyManager()
|
|||||||
Clear();
|
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);
|
LoadReservedCRC(itor.first.c_str());
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_isFileMode = false;
|
|
||||||
|
|
||||||
TDataPositionMap & indexMap = m_pack.GetIndexMap();
|
|
||||||
|
|
||||||
TDataPositionMap::iterator itor = indexMap.begin();
|
|
||||||
|
|
||||||
typedef std::map<DWORD, TEterPackIndex *> TDataPositionMap;
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
while (indexMap.end() != itor)
|
|
||||||
{
|
|
||||||
TEterPackIndex * pIndex = itor->second;
|
|
||||||
++itor;
|
|
||||||
|
|
||||||
if (!stricmp("property/reserve", pIndex->filename))
|
|
||||||
{
|
|
||||||
LoadReservedCRC(pIndex->filename);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Register(pIndex->filename))
|
if (itor.first.rfind("property/", 0) == 0) {
|
||||||
|
if (!Register(itor.first.c_str()))
|
||||||
continue;
|
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)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
char szSourceFileName[256 + 1];
|
|
||||||
_snprintf(szSourceFileName, sizeof(szSourceFileName), "property\\%s", fdata.cFileName);
|
|
||||||
|
|
||||||
m_pack.Put(fdata.cFileName, szSourceFileName,COMPRESSED_TYPE_NONE,"");
|
|
||||||
}
|
|
||||||
while (FindNextFile(hFind, &fdata));
|
|
||||||
|
|
||||||
FindClose(hFind);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPropertyManager::LoadReservedCRC(const char * c_pszFileName)
|
bool CPropertyManager::LoadReservedCRC(const char * c_pszFileName)
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID c_pvData;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
|
if (!CEterPackManager::Instance().Get(c_pszFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
textFileLoader.Bind(data->size(), data->data());
|
||||||
textFileLoader.Bind(file.Size(), c_pvData);
|
|
||||||
|
|
||||||
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
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)
|
bool CPropertyManager::Register(const char * c_pszFileName, CProperty ** ppProperty)
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID c_pvData;
|
if (!CEterPackManager::Instance().Get(c_pszFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CProperty * pProperty = new CProperty(c_pszFileName);
|
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;
|
delete pProperty;
|
||||||
return false;
|
return false;
|
||||||
@ -188,67 +130,6 @@ bool CPropertyManager::Get(DWORD dwCRC, CProperty ** ppProperty)
|
|||||||
return true;
|
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()
|
void CPropertyManager::Clear()
|
||||||
{
|
{
|
||||||
stl_wipe_second(m_PropertyByCRCMap);
|
stl_wipe_second(m_PropertyByCRCMap);
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "../eterPack/EterPack.h"
|
|
||||||
|
|
||||||
class CPropertyManager : public CSingleton<CPropertyManager>
|
class CPropertyManager : public CSingleton<CPropertyManager>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -10,34 +8,20 @@ class CPropertyManager : public CSingleton<CPropertyManager>
|
|||||||
|
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
void SetPack(CEterPack * pPack);
|
|
||||||
bool BuildPack();
|
|
||||||
|
|
||||||
bool LoadReservedCRC(const char * c_pszFileName);
|
bool LoadReservedCRC(const char * c_pszFileName);
|
||||||
void ReserveCRC(DWORD dwCRC);
|
void ReserveCRC(DWORD dwCRC);
|
||||||
DWORD GetUniqueCRC(const char * c_szSeed);
|
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 Register(const char * c_pszFileName, CProperty ** ppProperty = NULL);
|
||||||
|
|
||||||
bool Get(DWORD dwCRC, CProperty ** ppProperty);
|
bool Get(DWORD dwCRC, CProperty ** ppProperty);
|
||||||
bool Get(const char * c_pszFileName, 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:
|
protected:
|
||||||
typedef std::map<DWORD, CProperty *> TPropertyCRCMap;
|
typedef std::map<DWORD, CProperty *> TPropertyCRCMap;
|
||||||
typedef std::set<DWORD> TCRCSet;
|
typedef std::set<DWORD> TCRCSet;
|
||||||
|
|
||||||
bool m_isFileMode;
|
|
||||||
TPropertyCRCMap m_PropertyByCRCMap;
|
TPropertyCRCMap m_PropertyByCRCMap;
|
||||||
TCRCSet m_ReservedCRCSet;
|
TCRCSet m_ReservedCRCSet;
|
||||||
CEterPack m_pack;
|
|
||||||
CEterFileDict m_fileDict;
|
|
||||||
};
|
};
|
||||||
|
@ -237,14 +237,13 @@ bool CRaceManager::__LoadRaceMotionList(CRaceData& rkRaceData, const char* pathN
|
|||||||
s_kMap_stType_dwIndex.insert(std::map<std::string, DWORD>::value_type("SKILL5", CRaceMotionData::NAME_SKILL+125));
|
s_kMap_stType_dwIndex.insert(std::map<std::string, DWORD>::value_type("SKILL5", CRaceMotionData::NAME_SKILL+125));
|
||||||
}
|
}
|
||||||
|
|
||||||
const void* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kMappedFile;
|
CMemoryTextFileLoader kTextFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(kMappedFile, motionListFileName, &pvData))
|
|
||||||
|
if (!CEterPackManager::Instance().Get(motionListFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
kTextFileLoader.Bind(data->size(), data->data());
|
||||||
CMemoryTextFileLoader kTextFileLoader;
|
|
||||||
kTextFileLoader.Bind(kMappedFile.Size(), pvData);
|
|
||||||
|
|
||||||
rkRaceData.RegisterMotionMode(CRaceMotionData::MODE_GENERAL);
|
rkRaceData.RegisterMotionMode(CRaceMotionData::MODE_GENERAL);
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include "../eterBase/Timer.h"
|
#include "../eterBase/Timer.h"
|
||||||
|
|
||||||
bool CSoundData::ms_isSoundFile[SOUND_FILE_MAX_NUM];
|
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()
|
const char * CSoundData::GetFileName()
|
||||||
{
|
{
|
||||||
@ -139,9 +139,7 @@ U32 AILCALLBACK CSoundData::open_callback(char const * filename, U32 *file_handl
|
|||||||
if (-1 == iIndex)
|
if (-1 == iIndex)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
LPCVOID pMap;
|
if (!CEterPackManager::Instance().Get(filename, ms_SoundFile[iIndex]))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(ms_SoundFile[iIndex], filename, &pMap))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ms_isSoundFile[iIndex] = true;
|
ms_isSoundFile[iIndex] = true;
|
||||||
@ -155,7 +153,7 @@ void AILCALLBACK CSoundData::close_callback(U32 file_handle)
|
|||||||
if (!isSlotIndex(file_handle))
|
if (!isSlotIndex(file_handle))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ms_SoundFile[file_handle].Destroy();
|
ms_SoundFile[file_handle].str("");
|
||||||
ms_isSoundFile[file_handle] = false;
|
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))
|
if (!isSlotIndex(file_handle))
|
||||||
return 0;
|
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)
|
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))
|
if (!isSlotIndex(file_handle))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
DWORD dwRealSize = min(ms_SoundFile[file_handle].Size(), bytes);
|
ms_SoundFile[file_handle].read((char*) buffer, bytes);
|
||||||
ms_SoundFile[file_handle].Read(buffer, dwRealSize);
|
return ms_SoundFile[file_handle].gcount();
|
||||||
return dwRealSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSoundData::SetPackMode()
|
void CSoundData::SetPackMode()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#ifndef __MILESLIB_CSOUNDDATA_H__
|
#ifndef __MILESLIB_CSOUNDDATA_H__
|
||||||
#define __MILESLIB_CSOUNDDATA_H__
|
#define __MILESLIB_CSOUNDDATA_H__
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
#include <miles/MSS.H>
|
#include <miles/MSS.H>
|
||||||
#include "../eterBase/MappedFile.h"
|
#include "../eterBase/MappedFile.h"
|
||||||
|
|
||||||
@ -53,7 +54,7 @@ class CSoundData
|
|||||||
static int GetEmptySlotIndex();
|
static int GetEmptySlotIndex();
|
||||||
|
|
||||||
static bool ms_isSoundFile[SOUND_FILE_MAX_NUM];
|
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
|
#endif
|
@ -76,18 +76,23 @@ bool CTerrainImpl::LoadHeightMap(const char*c_szFileName)
|
|||||||
{
|
{
|
||||||
Tracef("LoadRawHeightMapFile %s ", c_szFileName);
|
Tracef("LoadRawHeightMapFile %s ", c_szFileName);
|
||||||
|
|
||||||
CMappedFile kMappedFile;
|
std::stringstream data;
|
||||||
LPCVOID lpcvFileData;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData))
|
|
||||||
{
|
{
|
||||||
Tracen("Error");
|
Tracen("Error");
|
||||||
TraceError("CTerrainImpl::LoadHeightMap - %s OPEN ERROR", c_szFileName);
|
TraceError("CTerrainImpl::LoadHeightMap - %s OPEN ERROR", c_szFileName);
|
||||||
return false;
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,18 +101,13 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName)
|
|||||||
DWORD dwStart = ELTimer_GetMSec();
|
DWORD dwStart = ELTimer_GetMSec();
|
||||||
Tracef("LoadAttrMapFile %s ", c_szFileName);
|
Tracef("LoadAttrMapFile %s ", c_szFileName);
|
||||||
|
|
||||||
CMappedFile kMappedFile;
|
std::stringstream data;
|
||||||
LPCVOID lpcvFileData;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData))
|
|
||||||
{
|
{
|
||||||
TraceError("CTerrainImpl::LoadAttrMap - %s OPEN ERROR", c_szFileName);
|
TraceError("CTerrainImpl::LoadAttrMap - %s OPEN ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD dwFileSize = kMappedFile.Size();
|
|
||||||
BYTE * abFileData = (BYTE *) lpcvFileData;
|
|
||||||
|
|
||||||
// LoadAttrMap
|
// LoadAttrMap
|
||||||
{
|
{
|
||||||
#pragma pack(push)
|
#pragma pack(push)
|
||||||
@ -120,15 +120,14 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName)
|
|||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#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);
|
TraceError(" CTerrainImpl::LoadAttrMap - %s FILE SIZE ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SAttrMapHeader kAttrMapHeader;
|
|
||||||
memcpy(&kAttrMapHeader, abFileData, sizeof(kAttrMapHeader));
|
|
||||||
|
|
||||||
const WORD c_wAttrMapMagic = 2634;
|
const WORD c_wAttrMapMagic = 2634;
|
||||||
if (c_wAttrMapMagic != kAttrMapHeader.m_wMagic)
|
if (c_wAttrMapMagic != kAttrMapHeader.m_wMagic)
|
||||||
{
|
{
|
||||||
@ -148,16 +147,12 @@ bool CTerrainImpl::LoadAttrMap(const char *c_szFileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD dwFileRestSize=dwFileSize-sizeof(kAttrMapHeader);
|
data.read((char*)m_abyAttrMap, sizeof(m_abyAttrMap));
|
||||||
DWORD dwFileNeedSize=sizeof(m_abyAttrMap);
|
if (!data)
|
||||||
if (dwFileRestSize != dwFileNeedSize)
|
|
||||||
{
|
{
|
||||||
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BYTE* abSrcAttrData= abFileData+sizeof(kAttrMapHeader);
|
|
||||||
memcpy(m_abyAttrMap, abSrcAttrData, sizeof(m_abyAttrMap));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Tracef("%d\n", ELTimer_GetMSec() - dwStart);
|
Tracef("%d\n", ELTimer_GetMSec() - dwStart);
|
||||||
@ -168,20 +163,24 @@ bool CTerrainImpl::RAW_LoadTileMap(const char * c_szFileName)
|
|||||||
{
|
{
|
||||||
Tracef("LoadSplatFile %s ", c_szFileName);
|
Tracef("LoadSplatFile %s ", c_szFileName);
|
||||||
|
|
||||||
CMappedFile kMappedFile;
|
std::stringstream data;
|
||||||
LPCVOID lpcvFileData;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData))
|
|
||||||
{
|
{
|
||||||
Tracen("Error");
|
Tracen("Error");
|
||||||
TraceError("CTerrainImpl::RAW_LoadTileMap - %s OPEN ERROR", c_szFileName);
|
TraceError("CTerrainImpl::RAW_LoadTileMap - %s OPEN ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(m_abyTileMap, lpcvFileData, sizeof(BYTE)*(TILEMAP_RAW_XSIZE)*(TILEMAP_RAW_YSIZE));
|
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;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CTerrainImpl::LoadWaterMap(const char * c_szFileName)
|
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)
|
bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
CMappedFile kMappedFile;
|
std::stringstream data;
|
||||||
LPCVOID lpcvFileData;
|
size_t fileSize = 0;
|
||||||
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
if (!CEterPackManager::Instance().Get(kMappedFile, c_szFileName, &lpcvFileData))
|
|
||||||
{
|
{
|
||||||
Tracen("Error");
|
Tracen("Error");
|
||||||
TraceError("CTerrainImpl::LoadWaterMap - %s OPEN ERROR", c_szFileName);
|
TraceError("CTerrainImpl::LoadWaterMap - %s OPEN ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD dwFileSize = kMappedFile.Size();
|
fileSize = data.str().length();
|
||||||
BYTE* abFileData = (BYTE*)lpcvFileData;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
#pragma pack(push)
|
#pragma pack(push)
|
||||||
@ -231,15 +228,14 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName)
|
|||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#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);
|
TraceError("CTerrainImpl::LoadWaterMap - %s FILE SIZE ERROR", c_szFileName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SWaterMapHeader kWaterMapHeader;
|
|
||||||
memcpy(&kWaterMapHeader, abFileData, sizeof(kWaterMapHeader));
|
|
||||||
|
|
||||||
const WORD c_wWaterMapMagic = 5426;
|
const WORD c_wWaterMapMagic = 5426;
|
||||||
|
|
||||||
if (c_wWaterMapMagic != kWaterMapHeader.m_wMagic)
|
if (c_wWaterMapMagic != kWaterMapHeader.m_wMagic)
|
||||||
@ -262,22 +258,23 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName)
|
|||||||
|
|
||||||
m_byNumWater = kWaterMapHeader.m_byLayerCount;
|
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 dwFileNeedSize = sizeof(m_abyWaterMap) + sizeof(long) * m_byNumWater;
|
||||||
DWORD dwFileNeedSize2 = sizeof(m_abyWaterMap) + sizeof(WORD) * m_byNumWater;
|
DWORD dwFileNeedSize2 = sizeof(m_abyWaterMap) + sizeof(WORD) * m_byNumWater;
|
||||||
if (dwFileRestSize == dwFileNeedSize2)
|
if (dwFileRestSize == dwFileNeedSize2)
|
||||||
{
|
{
|
||||||
WORD wWaterHeight[MAX_WATER_NUM + 1];
|
WORD wWaterHeight[MAX_WATER_NUM + 1];
|
||||||
|
|
||||||
BYTE * abSrcWaterData = abFileData + sizeof(kWaterMapHeader);
|
data.read((char*)m_abyWaterMap, sizeof(m_abyWaterMap));
|
||||||
memcpy(m_abyWaterMap, abSrcWaterData, sizeof(m_abyWaterMap));
|
if (!data)
|
||||||
|
return false;
|
||||||
BYTE * abSrcWaterHeight = abSrcWaterData + sizeof(m_abyWaterMap);
|
|
||||||
|
|
||||||
m_byNumWater = MIN(MAX_WATER_NUM, m_byNumWater);
|
m_byNumWater = MIN(MAX_WATER_NUM, m_byNumWater);
|
||||||
if (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)
|
for (int i = 0; i < m_byNumWater; ++i)
|
||||||
m_lWaterHeight[i] = wWaterHeight[i];
|
m_lWaterHeight[i] = wWaterHeight[i];
|
||||||
@ -289,13 +286,15 @@ bool CTerrainImpl::LoadWaterMapFile(const char * c_szFileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BYTE * abSrcWaterData = abFileData + sizeof(kWaterMapHeader);
|
data.read((char*)m_abyWaterMap, sizeof(m_abyWaterMap));
|
||||||
memcpy(m_abyWaterMap, abSrcWaterData, sizeof(m_abyWaterMap));
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
BYTE * abSrcWaterHeight = abSrcWaterData + sizeof(m_abyWaterMap);
|
if (m_byNumWater) {
|
||||||
|
data.read((char*)m_lWaterHeight, sizeof(long)* m_byNumWater);
|
||||||
if (m_byNumWater)
|
if (!data)
|
||||||
memcpy(m_lWaterHeight, abSrcWaterHeight, sizeof(long) * m_byNumWater);
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -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<std::vector<char>> fileData)
|
||||||
{
|
{
|
||||||
NANOBEGIN
|
NANOBEGIN
|
||||||
const CHAR* c_pcFileData=(const CHAR*)c_pvFileData;
|
|
||||||
|
|
||||||
std::string stConvFileData;
|
std::string stConvFileData;
|
||||||
stConvFileData.reserve(uFileSize);
|
stConvFileData.reserve(fileData->size());
|
||||||
stConvFileData+="exec(compile('''";
|
stConvFileData+="exec(compile('''";
|
||||||
|
|
||||||
// ConvertPythonTextFormat
|
// ConvertPythonTextFormat
|
||||||
{
|
{
|
||||||
for (UINT i=0; i<uFileSize; ++i)
|
for (UINT i=0; i<fileData->size(); ++i)
|
||||||
{
|
{
|
||||||
if (c_pcFileData[i]!=13)
|
if ((*fileData)[i] != 13)
|
||||||
stConvFileData+=c_pcFileData[i];
|
stConvFileData+= (*fileData)[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,29 +225,14 @@ bool CPythonLauncher::RunMemoryTextFile(const char* c_szFileName, UINT uFileSize
|
|||||||
|
|
||||||
bool CPythonLauncher::RunFile(const char* c_szFileName)
|
bool CPythonLauncher::RunFile(const char* c_szFileName)
|
||||||
{
|
{
|
||||||
char* acBufData=NULL;
|
CEterPackManager::TPackDataPtr data;
|
||||||
DWORD dwBufSize=0;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
{
|
|
||||||
CMappedFile file;
|
|
||||||
const VOID* pvData;
|
|
||||||
CEterPackManager::Instance().Get(file, c_szFileName, &pvData);
|
|
||||||
|
|
||||||
dwBufSize=file.Size();
|
|
||||||
if (dwBufSize==0)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
acBufData=new char[dwBufSize];
|
if (data->size() == 0)
|
||||||
memcpy(acBufData, pvData, dwBufSize);
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
bool ret=false;
|
return RunMemoryTextFile(c_szFileName, data);
|
||||||
|
|
||||||
ret=RunMemoryTextFile(c_szFileName, dwBufSize, acBufData);
|
|
||||||
|
|
||||||
delete [] acBufData;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CPythonLauncher::RunLine(const char* c_szSrc)
|
bool CPythonLauncher::RunLine(const char* c_szSrc)
|
||||||
|
@ -15,7 +15,7 @@ class CPythonLauncher : public CSingleton<CPythonLauncher>
|
|||||||
void SetTraceFunc(int (*pFunc)(PyObject * obj, PyFrameObject * f, int what, PyObject *arg));
|
void SetTraceFunc(int (*pFunc)(PyObject * obj, PyFrameObject * f, int what, PyObject *arg));
|
||||||
bool RunLine(const char* c_szLine);
|
bool RunLine(const char* c_szLine);
|
||||||
bool RunFile(const char* c_szFileName);
|
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<std::vector<char>> fileData);
|
||||||
bool RunCompiledFile(const char* c_szFileName);
|
bool RunCompiledFile(const char* c_szFileName);
|
||||||
const char* GetError();
|
const char* GetError();
|
||||||
|
|
||||||
|
@ -75,16 +75,15 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree,
|
|||||||
pTree = itor->second;
|
pTree = itor->second;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
LPCVOID c_pvData;
|
|
||||||
|
|
||||||
// NOTE : 파일이 없을때는 return FALSE 아닌가요? - [levites]
|
// NOTE : 파일이 없을때는 return FALSE 아닌가요? - [levites]
|
||||||
if (!CEterPackManager::Instance().Get(file, c_pszFileName, &c_pvData))
|
if (!CEterPackManager::Instance().Get(c_pszFileName, data))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
pTree = new CSpeedTreeWrapper;
|
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;
|
delete pTree;
|
||||||
pTree = nullptr;
|
pTree = nullptr;
|
||||||
@ -92,8 +91,6 @@ BOOL CSpeedTreeForest::GetMainTree(DWORD dwCRC, CSpeedTreeWrapper ** ppMainTree,
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_pMainTreeMap.insert(std::map<DWORD, CSpeedTreeWrapper *>::value_type(dwCRC, pTree));
|
m_pMainTreeMap.insert(std::map<DWORD, CSpeedTreeWrapper *>::value_type(dwCRC, pTree));
|
||||||
|
|
||||||
file.Destroy();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppMainTree = pTree;
|
*ppMainTree = pTree;
|
||||||
|
@ -1042,12 +1042,11 @@ class CTextLineLoader
|
|||||||
public:
|
public:
|
||||||
CTextLineLoader(const char * c_szFileName)
|
CTextLineLoader(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
const VOID* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kFile;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_kTextFileLoader.Bind(kFile.Size(), pvData);
|
m_kTextFileLoader.Bind(data->size(), data->data());
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD GetLineCount()
|
DWORD GetLineCount()
|
||||||
|
@ -241,19 +241,7 @@ void CPythonBackground::Initialize()
|
|||||||
|
|
||||||
void CPythonBackground::__CreateProperty()
|
void CPythonBackground::__CreateProperty()
|
||||||
{
|
{
|
||||||
if (CEterPackManager::SEARCH_FILE_FIRST == CEterPackManager::Instance().GetSearchMode() &&
|
m_PropertyManager.Initialize();
|
||||||
_access("property", 0) == 0)
|
|
||||||
{
|
|
||||||
m_PropertyManager.Initialize(NULL);
|
|
||||||
|
|
||||||
CPropertyLoader PropertyLoader;
|
|
||||||
PropertyLoader.SetPropertyManager(&m_PropertyManager);
|
|
||||||
PropertyLoader.Create("*.*", "Property");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_PropertyManager.Initialize("pack/property");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
@ -106,16 +106,11 @@ void CPythonEventManager::__InitEventSet(TEventSet& rEventSet)
|
|||||||
|
|
||||||
int CPythonEventManager::RegisterEventSet(const char * c_szFileName)
|
int CPythonEventManager::RegisterEventSet(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
CMappedFile File;
|
std::stringstream data;
|
||||||
LPCVOID pMap;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMap))
|
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
std::string strEventString;
|
std::string strEventString = data.str();
|
||||||
strEventString.resize(File.Size()+1);
|
|
||||||
|
|
||||||
File.Read(&strEventString[0], File.Size());
|
|
||||||
|
|
||||||
TEventSet * pEventSet = m_EventSetPool.Alloc();
|
TEventSet * pEventSet = m_EventSetPool.Alloc();
|
||||||
if (!pEventSet)
|
if (!pEventSet)
|
||||||
|
@ -33,13 +33,12 @@ bool CPythonNetworkStream::IsInsultIn(const char* c_szMsg)
|
|||||||
|
|
||||||
bool CPythonNetworkStream::LoadInsultList(const char* c_szInsultListFileName)
|
bool CPythonNetworkStream::LoadInsultList(const char* c_szInsultListFileName)
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
const VOID* pvData;
|
CMemoryTextFileLoader kMemTextFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(file, c_szInsultListFileName, &pvData))
|
if (!CEterPackManager::Instance().Get(c_szInsultListFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader kMemTextFileLoader;
|
kMemTextFileLoader.Bind(data->size(), data->data());
|
||||||
kMemTextFileLoader.Bind(file.Size(), pvData);
|
|
||||||
|
|
||||||
m_kInsultChecker.Clear();
|
m_kInsultChecker.Clear();
|
||||||
for (DWORD dwLineIndex=0; dwLineIndex<kMemTextFileLoader.GetLineCount(); ++dwLineIndex)
|
for (DWORD dwLineIndex=0; dwLineIndex<kMemTextFileLoader.GetLineCount(); ++dwLineIndex)
|
||||||
@ -55,9 +54,8 @@ bool CPythonNetworkStream::LoadConvertTable(DWORD dwEmpireID, const char* c_szFi
|
|||||||
if (dwEmpireID<1 || dwEmpireID>=4)
|
if (dwEmpireID<1 || dwEmpireID>=4)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMappedFile file;
|
std::stringstream data;
|
||||||
const VOID* pvData;
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DWORD dwEngCount=26;
|
DWORD dwEngCount=26;
|
||||||
@ -65,15 +63,16 @@ bool CPythonNetworkStream::LoadConvertTable(DWORD dwEmpireID, const char* c_szFi
|
|||||||
DWORD dwHanSize=dwHanCount*2;
|
DWORD dwHanSize=dwHanCount*2;
|
||||||
DWORD dwFileSize=dwEngCount*2+dwHanSize;
|
DWORD dwFileSize=dwEngCount*2+dwHanSize;
|
||||||
|
|
||||||
if (file.Size()<dwFileSize)
|
if (data.str().length() < dwFileSize)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
char* pcData=(char*)pvData;
|
|
||||||
|
|
||||||
STextConvertTable& rkTextConvTable=m_aTextConvTable[dwEmpireID-1];
|
STextConvertTable& rkTextConvTable=m_aTextConvTable[dwEmpireID-1];
|
||||||
memcpy(rkTextConvTable.acUpper, pcData, dwEngCount);pcData+=dwEngCount;
|
data.read((char*)rkTextConvTable.acUpper, dwEngCount);
|
||||||
memcpy(rkTextConvTable.acLower, pcData, dwEngCount);pcData+=dwEngCount;
|
data.read((char*)rkTextConvTable.acLower, dwEngCount);
|
||||||
memcpy(rkTextConvTable.aacHan, pcData, dwHanSize);
|
data.read((char*)rkTextConvTable.aacHan, dwHanSize);
|
||||||
|
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -14,17 +14,17 @@ bool CPythonNonPlayer::LoadNonPlayerData(const char * c_szFileName)
|
|||||||
6822045
|
6822045
|
||||||
};
|
};
|
||||||
|
|
||||||
CMappedFile file;
|
|
||||||
LPCVOID pvData;
|
|
||||||
|
|
||||||
Tracef("CPythonNonPlayer::LoadNonPlayerData: %s, sizeof(TMobTable)=%u\n", c_szFileName, sizeof(TMobTable));
|
Tracef("CPythonNonPlayer::LoadNonPlayerData: %s, sizeof(TMobTable)=%u\n", c_szFileName, sizeof(TMobTable));
|
||||||
|
|
||||||
if (!CEterPackManager::Instance().Get(file, c_szFileName, &pvData))
|
std::stringstream data;
|
||||||
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
DWORD dwFourCC, dwElements, dwDataSize;
|
DWORD dwFourCC, dwElements, dwDataSize;
|
||||||
|
|
||||||
file.Read(&dwFourCC, sizeof(DWORD));
|
data.read((char*)&dwFourCC, sizeof(DWORD));
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (dwFourCC != MAKEFOURCC('M', 'M', 'P', 'T'))
|
if (dwFourCC != MAKEFOURCC('M', 'M', 'P', 'T'))
|
||||||
{
|
{
|
||||||
@ -32,20 +32,26 @@ bool CPythonNonPlayer::LoadNonPlayerData(const char * c_szFileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
file.Read(&dwElements, sizeof(DWORD));
|
data.read((char*)&dwElements, sizeof(DWORD));
|
||||||
file.Read(&dwDataSize, sizeof(DWORD));
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
data.read((char*)&dwDataSize, sizeof(DWORD));
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto pbData = std::make_shared<std::vector<BYTE>>(dwDataSize);
|
||||||
|
|
||||||
|
data.read((char*)pbData->data(), pbData->size());
|
||||||
|
if (!data)
|
||||||
|
return false;
|
||||||
|
|
||||||
BYTE * pbData = new BYTE[dwDataSize];
|
|
||||||
file.Read(pbData, dwDataSize);
|
|
||||||
/////
|
/////
|
||||||
|
|
||||||
CLZObject zObj;
|
CLZObject zObj;
|
||||||
|
|
||||||
if (!CLZO::Instance().Decompress(zObj, pbData, s_adwMobProtoKey))
|
if (!CLZO::Instance().Decompress(zObj, pbData->data(), s_adwMobProtoKey))
|
||||||
{
|
|
||||||
delete [] pbData;
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
|
|
||||||
if ((zObj.GetSize() % sizeof(TMobTable)) != 0)
|
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));
|
m_NonPlayerDataMap.insert(TNonPlayerDataMap::value_type(pNonPlayerData->dwVnum, pNonPlayerData));
|
||||||
}
|
}
|
||||||
|
|
||||||
delete [] pbData;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,11 +63,9 @@ PyObject * packGet(PyObject * poSelf, PyObject * poArgs)
|
|||||||
(stricmp(pcExt, ".pyc") == 0) ||
|
(stricmp(pcExt, ".pyc") == 0) ||
|
||||||
(stricmp(pcExt, ".txt") == 0))
|
(stricmp(pcExt, ".txt") == 0))
|
||||||
{
|
{
|
||||||
CMappedFile file;
|
CEterPackManager::TPackDataPtr data;
|
||||||
const void * pData = NULL;
|
if (CEterPackManager::Instance().Get(strFileName, data))
|
||||||
|
return Py_BuildValue("s#", data->data(), data->size());
|
||||||
if (CEterPackManager::Instance().Get(file,strFileName,&pData))
|
|
||||||
return Py_BuildValue("s#",pData, file.Size());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
bool CPythonSkill::RegisterSkillTable(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
const VOID* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kFile;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
|
|
||||||
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
textFileLoader.Bind(data->size(), data->data());
|
||||||
textFileLoader.Bind(kFile.Size(), pvData);
|
|
||||||
|
|
||||||
// OVERWRITE_SKILLPROTO_POLY
|
// OVERWRITE_SKILLPROTO_POLY
|
||||||
std::string src_poly_rand;
|
std::string src_poly_rand;
|
||||||
@ -279,13 +279,13 @@ void CPythonSkill::__RegisterNormalIconImage(TSkillData & rData, const char * c_
|
|||||||
extern const DWORD c_iSkillIndex_Riding;
|
extern const DWORD c_iSkillIndex_Riding;
|
||||||
bool CPythonSkill::RegisterSkillDesc(const char * c_szFileName)
|
bool CPythonSkill::RegisterSkillDesc(const char * c_szFileName)
|
||||||
{
|
{
|
||||||
const VOID* pvData;
|
CEterPackManager::TPackDataPtr data;
|
||||||
CMappedFile kFile;
|
CMemoryTextFileLoader textFileLoader;
|
||||||
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
|
|
||||||
|
if (!CEterPackManager::Instance().Get(c_szFileName, data))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
CMemoryTextFileLoader textFileLoader;
|
textFileLoader.Bind(data->size(), data->data());
|
||||||
textFileLoader.Bind(kFile.Size(), pvData);
|
|
||||||
|
|
||||||
CTokenVector TokenVector;
|
CTokenVector TokenVector;
|
||||||
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
|
||||||
|
@ -256,10 +256,6 @@ bool PackInitialize(const char * c_pszFolder)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CTextFileLoader::SetCacheMode();
|
CTextFileLoader::SetCacheMode();
|
||||||
#if defined(USE_RELATIVE_PATH)
|
|
||||||
CEterPackManager::Instance().SetRelativePathMode();
|
|
||||||
#endif
|
|
||||||
CEterPackManager::Instance().SetCacheMode();
|
|
||||||
CEterPackManager::Instance().SetSearchMode(bPackFirst);
|
CEterPackManager::Instance().SetSearchMode(bPackFirst);
|
||||||
|
|
||||||
CSoundData::SetPackMode(); // Miles 파일 콜백을 셋팅
|
CSoundData::SetPackMode(); // Miles 파일 콜백을 셋팅
|
||||||
|
Loading…
Reference in New Issue
Block a user