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