code_app/sdk/webservice/MsgLoop.cpp

138 lines
2.5 KiB
C++

#include "MsgLoop.h"
MsgLoop::MsgLoop()
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
HGBase_CreateLock(&m_msgLock);
m_bRecvMsg = HGTRUE;
m_manager = new Manager(this);
m_wsServer = new WebServer(this, ServerType_Ws, 1);
m_httpServer = new WebServer(this, ServerType_Http, 2);
m_sockIoServer = new WebServer(this, ServerType_SockIo, 3);
}
MsgLoop::~MsgLoop()
{
delete m_sockIoServer;
m_sockIoServer = NULL;
delete m_httpServer;
m_httpServer = NULL;
delete m_wsServer;
m_wsServer = NULL;
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()
{
m_wsServer->Open(38999);
m_httpServer->Open(18999);
m_sockIoServer->Open(28999);
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.svrId)
{
assert(0 == msg.usrId);
if (WEB_MSGID_QUIT == msg.msgId)
{
assert(NULL == msg.param);
m_wsServer->Close();
m_httpServer->Close();
m_sockIoServer->Close();
}
else if (WEB_MSGID_OPENDEV == msg.msgId)
{
assert(NULL != msg.param);
OpenDevParam* param = (OpenDevParam*)msg.param;
m_manager->OpenDev(param);
delete param;
}
else if (WEB_MSGID_CLOSEDEV == msg.msgId)
{
assert(NULL != msg.param);
CloseDevParam* param = (CloseDevParam*)msg.param;
m_manager->CloseDev(param);
delete param;
}
else if (WEB_MSGID_STOPSCAN == msg.msgId)
{
assert(NULL == msg.param);
m_manager->StopScan();
}
}
else if (1 == msg.svrId)
{
m_wsServer->HandleMsg(&msg);
}
else if (2 == msg.svrId)
{
m_httpServer->HandleMsg(&msg);
}
else if (3 == msg.svrId)
{
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;
}