Files
2022-10-26 12:25:11 +08:00

464 lines
12 KiB
C++

/*------------------------------------------------------------------------------
* FileReader.cpp
*------------------------------------------------------------------------------
*
*------------------------------------------------------------------------------
* All rights reserved by
**----------------------------------------------------------------------------*/
#include "stdafx.h"
#include "FileReader.h"
#include "LogCollectorLog.h"
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
CFileReader::CFileReader(void)
: m_hFileStream(NULL),
m_dwErrCode(0),
m_dwSystemErrCode(0)
{
ZeroMemory(m_szFileName, sizeof(m_szFileName));
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
CFileReader::~CFileReader(void)
{
Close();
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
BOOL CFileReader::Open(TCHAR* pszFileName)
{
memcpy(m_szFileName, pszFileName, MAX_PATH);
m_hFileStream = ::CreateFile(pszFileName,
GENERIC_READ,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (INVALID_HANDLE_VALUE == m_hFileStream)
{
m_hFileStream = NULL;
m_dwSystemErrCode = ::GetLastError();
SetConvertSystemErr();
//m_dwErrCode = LOGSTATE_OPEN_FAIL;
/*
LogCollectorLog cLog("FAIL_FILE_READ_LOG", "FAIL_FILE_READ_LOG");
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
cLog.AddLog("CreateFile MSG : %s", lpMsgBuf);
LocalFree( lpMsgBuf );
*/
return FALSE;
}
return TRUE;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
BOOL CFileReader::SetLogFileOffset(fpos_t ulOffset)
{
if (ulOffset < 0)
{
ulOffset = 0;
}
LARGE_INTEGER li;
li.QuadPart = ulOffset;
BOOL bSuccess = ::SetFilePointerEx(m_hFileStream, li, NULL, FILE_CURRENT);
if (bSuccess == INVALID_SET_FILE_POINTER
&& GetLastError() != NO_ERROR)
{
/*
LogCollectorLog cLog("FAIL_FILE_READ_LOG", "FAIL_FILE_READ_LOG");
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
cLog.AddLog("SetFilePointerEx MSG : %s", lpMsgBuf);
LocalFree( lpMsgBuf );
*/
return FALSE;
}
return TRUE;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
fpos_t CFileReader::GetLogFileOffset()
{
LARGE_INTEGER liInput;
LARGE_INTEGER liOutput;
liInput.QuadPart = 0;
liOutput.QuadPart = 0;
BOOL bSuccess = ::SetFilePointerEx(m_hFileStream, liInput, &liOutput, FILE_CURRENT);
if (bSuccess == INVALID_SET_FILE_POINTER
&& GetLastError() != NO_ERROR)
{
liOutput.QuadPart = 0;
}
return liOutput.QuadPart;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
LP_BINLOG_BASE_INFO CFileReader::Read()
{
DWORD dwReadLen = 0;
BINLOG_BASE_INFO BaseInfo;
LP_BINLOG_BASE_INFO pReadLog = NULL;
memset(&BaseInfo, 0, sizeof(BINLOG_BASE_INFO));
BOOL bSuccess = ::ReadFile(m_hFileStream,
(LPVOID)&BaseInfo,
sizeof(BINLOG_BASE_INFO),
&dwReadLen,
NULL);
if (bSuccess)
{
if (dwReadLen < sizeof(BINLOG_BASE_INFO) && dwReadLen != 0)
{
m_dwErrCode = LOGSTATE_INVALIED_OFFSET;
}
else if(dwReadLen == 0)
{
m_dwErrCode = LOGSTATE_END;
}
else
{
pReadLog = SelectRealObject(&BaseInfo, dwReadLen);
SetConvertSystemErr();
}
}
else
{
/*
LogCollectorLog cLog("FAIL_FILE_READ_LOG", "FAIL_FILE_READ_LOG");
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
::GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
cLog.AddLog("ReadFile MSG : %s", lpMsgBuf);
LocalFree( lpMsgBuf );
*/
SetConvertSystemErr();
}
return pReadLog;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
LP_BINLOG_BASE_INFO CFileReader::SelectRealObject(LP_BINLOG_BASE_INFO pBaseInfo, DWORD dwReadLen)
{
LP_BINLOG_BASE_INFO pReadLog = NULL;
DWORD dwRealReadLen = 0;
BOOL bSuccess = FALSE;
switch(pBaseInfo->category.category)
{
/*
case CATEGORY_LOGIN :
{
int nSize = sizeof(BINLOG__LOGIN) - dwReadLen;
pReadLog = new BINLOG__LOGIN;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
*/
case CATEGORY_CHARACTER_LOGIN :
{
int nSize = sizeof(BINLOG__CHARACTER_LOGIN) - dwReadLen;
//LP_BINLOG__CHARACTER_LOGIN pReadLog = NULL;
pReadLog = new BINLOG__CHARACTER_LOGIN;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_CHARACTER_CREATE :
{
int nSize = sizeof(BINLOG__CHARACTER_CREATE) - dwReadLen;
//LP_BINLOG__CHARACTER_CREATE pReadLog = NULL;
pReadLog = new BINLOG__CHARACTER_CREATE;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_CHAT :
{
break;
}
case CATEGORY_SKILL :
{
break;
}
case CATEGORY_QUEST :
{
int nSize = sizeof(BINLOG__QUEST) - dwReadLen;
//LP_BINLOG__QUEST pReadLog = NULL;
pReadLog = new BINLOG__QUEST;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_COMBAT :
{
int nSize = sizeof(BINLOG__COMBAT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__COMBAT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_ITEM :
{
int nSize = sizeof(BINLOG__ITEM) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__ITEM;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_PARTY :
{
//pReadLog = new ;
break;
}
case CATEGORY_SQUAD :
{
//pReadLog = new ;
break;
}
case CATEGORY_CHARACTER_STATE :
{
int nSize = sizeof(BINLOG__CHARACTER_STATE) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__CHARACTER_STATE;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_CHARACTER_SNAPSHOT :
{
int nSize = sizeof(BINLOG__CHARACTER_SNAPSHOT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__CHARACTER_SNAPSHOT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_WAREHOUSE_SNAPSHOT :
{
int nSize = sizeof(BINLOG__WAREHOUSE_SNAPSHOT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__WAREHOUSE_SNAPSHOT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_SKILL_SNAPSHOT :
{
int nSize = sizeof(BINLOG__SKILL_SNAPSHOT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__SKILL_SNAPSHOT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
/*
case CATEGORY_LADDER_SNAPSHOT:
{
int nSize = sizeof(BINLOG__LADDER_SNAPSHOT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__LADDER_SNAPSHOT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
*/
case CATEGORY_MISSION_SNAPSHOT:
{
int nSize = sizeof(BINLOG__MISSION_SNAPSHOT) - dwReadLen;
//LP_BINLOG__COMBAT pReadLog = NULL;
pReadLog = new BINLOG__MISSION_SNAPSHOT;
memcpy(pReadLog, pBaseInfo, sizeof(BINLOG_BASE_INFO));
BYTE* pTmpReadLog = (BYTE*)pReadLog + sizeof(BINLOG_BASE_INFO);
bSuccess = ::ReadFile(m_hFileStream, (LPVOID)pTmpReadLog, nSize, &dwRealReadLen, NULL);
break;
}
case CATEGORY_GM_LOG :
{
//pReadLog = new ;
break;
}
case CATEGORY_MAIL :
{
//pReadLog = new ;
break;
}
case CATEGORY_GUILD :
{
//pReadLog = new ;
break;
}
default :
LogCollectorLog cLog(_T("UNKNOWN_OBJ"), _T("UNKNOWN_OBJ"));
cLog.AddLog(_T("==================================================\n"));
cLog.AddLog(_T("Not Define Log\n"));
cLog.AddLog(_T("Name : %s, OFFSET : %I64d\n"), m_szFileName, GetLogFileOffset());
cLog.AddLog(_T("==================================================\n"));
m_dwErrCode = LOGSTATE_INVALIED_OFFSET;
break;
}
return pReadLog;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
void CFileReader::Close()
{
::CloseHandle(m_hFileStream);
m_hFileStream = NULL;
}
/** ----------------------------------------------------------------------------
\brief
\param
\return
------------------------------------------------------------------------------*/
VOID CFileReader::SetConvertSystemErr()
{
switch(m_dwSystemErrCode)
{
case 0:
m_dwErrCode = LOGSTATE_LOADING;
break;
case ERROR_FILE_NOT_FOUND :
m_dwErrCode = LOGSTSTE_NOT_FOUND_FILE;
break;
case ERROR_NETWORK_BUSY :
// 네트워크 상태가 좋지 않음.
m_dwErrCode = LOGSTATE_NETWORK_BUSY;
break;
case ERROR_HANDLE_EOF :
// 파일의 끝에 도달.
m_dwErrCode = LOGSTATE_REALTIME_SAME_OFFSET;
break;
case ERROR_BAD_NETPATH :
case ERROR_NETWORK_ACCESS_DENIED :
// 네트워크 경로가 잘못되어 있음.
m_dwErrCode = LOGSTATE_ACCESS_DENY;
break;
case ERROR_PATH_NOT_FOUND :
m_dwErrCode = LOGSTATE_FOLDER_NOT_FOUND;
break;
default :
m_dwErrCode = LOGSTATE_UNKNOWN_FAIL;
break;
}
}