Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
189 lines
4.1 KiB
C++
189 lines
4.1 KiB
C++
#include "stdafx.h"
|
|
#include "MultiDispatchStorage.h"
|
|
|
|
#include <Log/ServerLog.h>
|
|
#include <Network/Session/Session.h>
|
|
#include <Network/Dispatch/Dispatch.h>
|
|
|
|
bool CMultiDispatch::SetDispatch(unsigned long dispatchKey, CPacketDispatch* lpDispatch)
|
|
{
|
|
if(0 == lpDispatch)
|
|
{
|
|
DETLOG1(g_Log, "this:0x%p/Setting null dispatch", this);
|
|
}
|
|
else
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
|
|
DispatchMap::iterator find = m_DispatchMap.find(dispatchKey);
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
if(find == end)
|
|
{
|
|
lpDispatch->GetSession().AddRef();
|
|
m_DispatchMap.insert(find, DispatchMap::value_type(dispatchKey, lpDispatch));
|
|
DETLOG2(g_Log, "Setting new dispatch(Key:%u/DP:0x%p)", dispatchKey, lpDispatch);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
CPacketDispatch* lpOldDispatch = find->second;
|
|
|
|
if(0 != lpOldDispatch)
|
|
{
|
|
DETLOG1(g_Log, "DP:0x%p/Already dispatch exist. cannot set dispatch", lpOldDispatch);
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void CMultiDispatch::ForceSetDispatch(unsigned long dispatchKey, CPacketDispatch* lpDispatch)
|
|
{
|
|
if(0 == lpDispatch)
|
|
{
|
|
DETLOG1(g_Log, "this:0x%p/Setting null dispatch", this);
|
|
}
|
|
else
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
|
|
DispatchMap::iterator find = m_DispatchMap.find(dispatchKey);
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
CPacketDispatch* lpOldDispatch = 0;
|
|
|
|
if(find == end)
|
|
{
|
|
m_DispatchMap.insert(find, DispatchMap::value_type(dispatchKey, lpDispatch));
|
|
}
|
|
else
|
|
{
|
|
lpOldDispatch = find->second;
|
|
find->second = lpDispatch;
|
|
|
|
if(0 != lpOldDispatch)
|
|
{
|
|
DETLOG1(g_Log, "DP:0x%p/Already dispatch exist. close now", lpOldDispatch);
|
|
lpOldDispatch->GetSession().CloseSession();
|
|
lpOldDispatch->GetSession().Release();
|
|
}
|
|
}
|
|
|
|
DETLOG3(g_Log, "DP:0x%p/Setting new dispatch(Key:%u/DP:0x%p)",
|
|
lpOldDispatch, dispatchKey, lpDispatch);
|
|
|
|
lpDispatch->GetSession().AddRef();
|
|
}
|
|
}
|
|
|
|
void CMultiDispatch::RemoveDispatch(unsigned long dispatchKey)
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
InternalRemoveDispatch(dispatchKey);
|
|
}
|
|
|
|
|
|
size_t CMultiDispatch::GetDispatchNum()
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
return m_DispatchMap.size();
|
|
}
|
|
|
|
bool CMultiDispatch::IsEmpty()
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
return m_DispatchMap.empty();
|
|
}
|
|
|
|
CMultiDispatch::CMultiDispatch()
|
|
{
|
|
|
|
}
|
|
|
|
CMultiDispatch::~CMultiDispatch()
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
|
|
if(!m_DispatchMap.empty())
|
|
{
|
|
DispatchMap::iterator pos = m_DispatchMap.begin();
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
for(;pos != end; ++pos)
|
|
{
|
|
ERRLOG1(g_Log, "this:0x%p/Dispatch is not removed until destroy", pos->second);
|
|
}
|
|
|
|
m_DispatchMap.clear();
|
|
}
|
|
}
|
|
|
|
|
|
void CMultiDispatch::InternalRemoveDispatch(unsigned long dispatchKey)
|
|
{
|
|
DispatchMap::iterator find = m_DispatchMap.find(dispatchKey);
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
if(find == end)
|
|
{
|
|
ERRLOG1(g_Log, "Reset dispatch failed. Invalid dispatch key(%u)", dispatchKey);
|
|
}
|
|
else
|
|
{
|
|
CPacketDispatch* lpDispatch = find->second;
|
|
|
|
DETLOG2(g_Log, "Reset dispatch(Key:%u/DP:0x%p)", dispatchKey, lpDispatch);
|
|
lpDispatch->GetSession().Release();
|
|
m_DispatchMap.erase(find);
|
|
}
|
|
}
|
|
|
|
CPacketDispatch* CMultiDispatch::GetDispatch(unsigned long dispatchKey)
|
|
{
|
|
LockType::Syncronize sync(m_DispatchLock);
|
|
|
|
DispatchMap::iterator find = m_DispatchMap.find(dispatchKey);
|
|
DispatchMap::iterator end = m_DispatchMap.end();
|
|
|
|
if(find != end)
|
|
{
|
|
CPacketDispatch* lpDispatch = find->second;
|
|
lpDispatch->GetSession().AddRef();
|
|
return lpDispatch;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
CMultiDispatch::Storage::Storage(CMultiDispatch& multiDispatch, unsigned long dispatchKey)
|
|
: m_lpDispatch(multiDispatch.GetDispatch(dispatchKey)),
|
|
m_MultiDispatch(multiDispatch)
|
|
{
|
|
|
|
}
|
|
|
|
|
|
CMultiDispatch::Storage::~Storage()
|
|
{
|
|
if(0 != m_lpDispatch)
|
|
{
|
|
m_lpDispatch->GetSession().Release();
|
|
m_lpDispatch = 0;
|
|
}
|
|
}
|
|
|
|
|
|
CPacketDispatch* CMultiDispatch::Storage::ReloadDispatch(unsigned long dispatchKey)
|
|
{
|
|
if(0 != m_lpDispatch)
|
|
{
|
|
m_lpDispatch->GetSession().Release();
|
|
}
|
|
|
|
m_lpDispatch = m_MultiDispatch.GetDispatch(dispatchKey);
|
|
return m_lpDispatch;
|
|
}
|