173 lines
No EOL
9.8 KiB
C++
173 lines
No EOL
9.8 KiB
C++
#include "StdAfx.h"
|
||
#include "LogBuilder.h"
|
||
#include "ServiceManagerEx.h"
|
||
|
||
const wstring TYPE_HEAD = L"<";
|
||
const wstring TYPE_TAIL = L">";
|
||
|
||
CLogBuilder::MAP_LOG_STRING CLogBuilder::s_LogStrings;
|
||
CLogBuilder::MAP_LOG_ENUMERATION CLogBuilder::s_LogEnumerations;
|
||
|
||
log_error CLogBuilder::Load(const wstring& filename)
|
||
{
|
||
m_pFile = _wfopen(filename.c_str(), L"r");
|
||
if (!m_pFile)
|
||
return error_file_not_found;
|
||
|
||
fseek(m_pFile, 0, SEEK_END);
|
||
long size = ftell(m_pFile);
|
||
fseek(m_pFile, 0, SEEK_SET);
|
||
|
||
const ConfigEx& config = ((CServiceManagerExApp*)::AfxGetApp())->GetConfigEx();
|
||
if (size > (long)(1024 * config.exceptLogSize))
|
||
return error_size_overflow;
|
||
|
||
/////////
|
||
Unload();
|
||
/////////
|
||
|
||
wchar_t line[1024];
|
||
|
||
while (1)
|
||
{
|
||
if (fgetws(line, _countof(line), m_pFile) == NULL)
|
||
break;
|
||
|
||
LogInfo* pLog = Parse(line);
|
||
if (!pLog)
|
||
continue;
|
||
|
||
m_logs.push_back(pLog);
|
||
}
|
||
|
||
fclose(m_pFile);
|
||
m_pFile = NULL;
|
||
|
||
return error_none;
|
||
}
|
||
|
||
void CLogBuilder::Unload()
|
||
{
|
||
for each (const LogInfo* v in m_logs)
|
||
{
|
||
delete v;
|
||
}
|
||
m_logs.clear();
|
||
}
|
||
|
||
LogInfo* CLogBuilder::Parse(const wchar_t* line)
|
||
{
|
||
wstring buf = line;
|
||
|
||
try
|
||
{
|
||
// date
|
||
size_t pos1 = buf.find(L'\'');
|
||
size_t pos2 = buf.find(L'\'', pos1 + 1);
|
||
if (pos1 == wstring::npos || pos2 == wstring::npos)
|
||
return NULL;
|
||
|
||
wstring date = buf.substr(pos1, pos2);
|
||
date = date.substr(1);
|
||
date = date.substr(0, date.length() - 1);
|
||
|
||
// type
|
||
wstring type;
|
||
wstring log = buf.substr(pos2 + 2);
|
||
|
||
size_t header_size = TYPE_HEAD.size();
|
||
wstring header = log.substr(0, header_size);
|
||
if (header.compare(TYPE_HEAD) == 0)
|
||
{
|
||
size_t pos = log.find(TYPE_TAIL, header_size);
|
||
type = log.substr(header_size, pos - header_size);
|
||
log = log.substr(pos + 2);
|
||
}
|
||
else
|
||
{
|
||
type = L"_FILELOG";
|
||
}
|
||
|
||
// erase \r\n
|
||
size_t pos = log.rfind('\n');
|
||
if (pos != wstring::npos)
|
||
log = log.substr(0, pos);
|
||
|
||
pos = log.rfind('\r');
|
||
if (pos != wstring::npos)
|
||
log = log.substr(0, pos);
|
||
|
||
return new LogInfo(date, type, log);
|
||
}
|
||
catch (...)
|
||
{
|
||
return NULL;
|
||
}
|
||
}
|
||
|
||
wstring CLogBuilder::TypeToString(LogType::eLogType type)
|
||
{
|
||
MAP_LOG_STRING::iterator it = s_LogStrings.find(type);
|
||
if (it == s_LogStrings.end())
|
||
return wstring(L"_NORMAL");
|
||
|
||
return it->second;
|
||
}
|
||
|
||
LogType::eLogType CLogBuilder::StringToType(const wstring& type)
|
||
{
|
||
MAP_LOG_ENUMERATION::iterator it = s_LogEnumerations.find(type);
|
||
if (it == s_LogEnumerations.end())
|
||
return LogType::_NORMAL;
|
||
|
||
return it->second;
|
||
}
|
||
|
||
void CLogBuilder::Initialize()
|
||
{
|
||
s_LogStrings.clear();
|
||
s_LogEnumerations.clear();
|
||
|
||
AddType(LogType::_NORMAL, wstring(L"_NORMAL"));
|
||
AddType(LogType::_ERROR, wstring(L"_ERROR"));
|
||
AddType(LogType::_DANGERPOINT, wstring(L"_DANGERPOINT"));
|
||
AddType(LogType::_FILELOG, wstring(L"_FILELOG"));
|
||
AddType(LogType::_HACK, wstring(L"_HACK"));
|
||
AddType(LogType::_HACKSHIELD, wstring(L"_HACKSHIELD"));
|
||
AddType(LogType::_ITEMDUPLICATE, wstring(L"_ITEMDUPLICATE"));
|
||
AddType(LogType::_WEAPONTYPE, wstring(L"_WEAPONTYPE"));
|
||
AddType(LogType::_SESSIONCRASH, wstring(L"_SESSIONCRASH"));
|
||
AddType(LogType::_ROOMCRASH, wstring(L"_ROOMCRASH"));
|
||
AddType(LogType::_UNREACHABLE, wstring(L"_UNREACHABLE"));
|
||
AddType(LogType::_LOADINGDISCONNECT, wstring(L"_LOADINGDISCONNECT"));
|
||
AddType(LogType::_ROOMFINALIZECRASH, wstring(L"_ROOMFINALIZECRASH"));
|
||
AddType(LogType::_GAMECONNECTLOG, wstring(L"_GAMECONNECTLOG"));
|
||
AddType(LogType::_GAMESERVERDELAY, wstring(L"_GAMESERVERDELAY"));
|
||
AddType(LogType::_ENTERGAMECHECK, wstring(L"_ENTERGAMECHECK"));
|
||
AddType(LogType::_DROPITEMPENALTY, wstring(L"_DROPITEMPENALTY"));
|
||
AddType(LogType::_TREASUREPENALTY, wstring(L"_TREASUREPENALTY"));
|
||
AddType(LogType::_CLEARGRADEPENALTY, wstring(L"_CLEARGRADEPENALTY"));
|
||
AddType(LogType::_PRELOADED_DYNAMICLOAD, wstring(L"_PRELOADED_DYNAMICLOAD"));
|
||
AddType(LogType::_DELOBJECT_NAMEKEYFINDERR, wstring(L"_DELOBJECT_NAMEKEYFINDERR"));
|
||
AddType(LogType::_OCTREELOG, wstring(L"_OCTREELOG"));
|
||
AddType(LogType::_INVALIDACTOR, wstring(L"_INVALIDACTOR"));
|
||
AddType(LogType::_GPKERROR, wstring(L"_GPKERROR"));
|
||
AddType(LogType::_ACCEPTORERROR, wstring(L"_ACCEPTORERROR"));
|
||
AddType(LogType::_QUESTHACK, wstring(L"_QUESTHACK"));
|
||
AddType(LogType::_ZOMBIEUSER, wstring(L"_ZOMBIEUSER"));
|
||
AddType(LogType::_EVENTLIST, wstring(L"_EVENTLIST"));
|
||
AddType(LogType::_FARM, wstring(L"_FARM"));
|
||
AddType(LogType::_GUILDWAR, wstring(L"_GUILDWAR"));
|
||
AddType(LogType::_MOVEPACKET_SEQ, wstring(L"_MOVEPACKET_SEQ"));
|
||
AddType(LogType::_SKILL_ACTION, wstring(L"_SKILL_ACTION"));
|
||
AddType(LogType::_FILEDBLOG, wstring(L"_FILEDBLOG"));
|
||
AddType(LogType::_LADDER, wstring(L"_LADDER"));
|
||
AddType(LogType::_PVPROOM, wstring(L"_PVPROOM"));
|
||
AddType(LogType::_PING, wstring(L"_PING"));
|
||
}
|
||
|
||
void CLogBuilder::AddType(LogType::eLogType type, const wstring& typeStr)
|
||
{
|
||
s_LogStrings.insert(make_pair(type, typeStr));
|
||
s_LogEnumerations.insert(make_pair(typeStr, type));
|
||
} |