code_app/sdk/webservice/MsgLoop.cpp

173 lines
3.2 KiB
C++

#include "MsgLoop.h"
MsgLoop::MsgLoop()
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
HGBase_CreateLock(&m_msgLock);
m_bRecvMsg = HGTRUE;
if (1) // 使用旧协议
{
m_manager = new Manager(this);
m_httpServer = new WebServer(this, ServerType_Http);
m_sockIoServer = new WebServer(this, ServerType_SockIo);
m_wsServer = NULL;
}
else // 使用新协议
{
m_manager = NULL;
m_httpServer = NULL;
m_sockIoServer = NULL;
m_wsServer = new WebServer(this, ServerType_Ws);
}
}
MsgLoop::~MsgLoop()
{
if (NULL != m_wsServer)
{
delete m_wsServer;
m_wsServer = NULL;
}
if (NULL != m_sockIoServer)
{
delete m_sockIoServer;
m_sockIoServer = NULL;
}
if (NULL != m_httpServer)
{
delete m_httpServer;
m_httpServer = NULL;
}
if (NULL != m_manager)
{
delete m_manager;
m_manager = NULL;
}
HGBase_DestroyLock(m_msgLock);
m_msgLock = NULL;
HGBase_DestroyEvent(m_msgEvent);
m_msgEvent = NULL;
}
bool MsgLoop::Send(const WebMsg* msg)
{
if (NULL == msg)
{
return false;
}
bool ret = false;
HGBase_EnterLock(m_msgLock);
if (m_bRecvMsg)
{
m_listMsg.push_back(*msg);
HGBase_SetEvent(m_msgEvent);
if (WEB_MSGID_QUIT == msg->msgId)
m_bRecvMsg = HGFALSE;
ret = true;
}
HGBase_LeaveLock(m_msgLock);
return ret;
}
void MsgLoop::Loop()
{
if (NULL != m_httpServer)
m_httpServer->Open(18999);
if (NULL != m_sockIoServer)
m_sockIoServer->Open(28999);
if (NULL != m_wsServer)
m_wsServer->Open(38999);
while (1)
{
HGBase_WaitEvent(m_msgEvent);
WebMsg msg = { 0 };
HGBase_EnterLock(m_msgLock);
if (!m_listMsg.empty())
{
msg = m_listMsg.front();
m_listMsg.pop_front();
}
HGBase_LeaveLock(m_msgLock);
if (0 != msg.msgId)
{
if (0 == msg.svrType)
{
assert(0 == msg.usrId);
if (WEB_MSGID_QUIT == msg.msgId)
{
assert(NULL == msg.param);
if (NULL != m_wsServer)
m_wsServer->Close();
if (NULL != m_sockIoServer)
m_sockIoServer->Close();
if (NULL != m_httpServer)
m_httpServer->Close();
}
else if (WEB_MSGID_OPENDEV == msg.msgId)
{
assert(NULL != msg.param);
OpenDevParam* param = (OpenDevParam*)msg.param;
if (NULL != m_manager)
m_manager->OpenDev(param);
delete param;
}
else if (WEB_MSGID_CLOSEDEV == msg.msgId)
{
assert(NULL != msg.param);
CloseDevParam* param = (CloseDevParam*)msg.param;
if (NULL != m_manager)
m_manager->CloseDev(param);
delete param;
}
else if (WEB_MSGID_SCANFINISH == msg.msgId)
{
assert(NULL == msg.param);
if (NULL != m_manager)
m_manager->ScanFinish();
}
}
else if (ServerType_Ws == msg.svrType)
{
assert(NULL != m_wsServer);
m_wsServer->HandleMsg(&msg);
}
else if (ServerType_Http == msg.svrType)
{
assert(NULL != m_httpServer);
m_httpServer->HandleMsg(&msg);
}
else if (ServerType_SockIo == msg.svrType)
{
assert(NULL != m_sockIoServer);
m_sockIoServer->HandleMsg(&msg);
}
}
HGBase_EnterLock(m_msgLock);
if (m_listMsg.empty())
{
HGBase_ResetEvent(m_msgEvent);
}
HGBase_LeaveLock(m_msgLock);
if (WEB_MSGID_QUIT == msg.msgId)
{
break;
}
}
}
Manager* MsgLoop::GetManager()
{
return m_manager;
}