DragonNest/Server/ServiceManagerEx/LogBuilder.cpp

173 lines
4.7 KiB
C++
Raw Permalink Normal View History

#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));
}