HGGitLab

Commit 8e4ed50b authored by luoliangyi's avatar luoliangyi

将消息队列独立成单独的类,三个服务共享同一个消息循环

parent 89dad333
#include "HttpUser.h"
#include "WebServer.h"
#include "MsgLoop.h"
#include "Manager.h"
#include "../../base/HGInfo.h"
#include "cJSON.h"
extern Manager* g_manager;
static std::string ToJsonPair(const std::string& key, int value, bool sep)
{
char ret[256];
......@@ -138,7 +137,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
}
std::string devId;
g_manager->GetCurDevId(devId);
GetManager()->GetCurDevId(devId);
char* result = new char[devId.size() + 256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, devId.c_str());
......@@ -149,7 +148,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
else if (requestMethod == "GET" && requestURIPath == "/WebScan/getDevices")
{
std::vector<std::string> devNameList;
g_manager->GetDevNames(devNameList);
GetManager()->GetDevNames(devNameList);
std::string devNames = "[";
for (int i = 0; i < (int)devNameList.size(); ++i)
......@@ -173,7 +172,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
std::string devId = HttpHead::GetValue(requestURIQueryInfos, "pid");
std::vector<std::string> imgNameList;
std::vector<std::string> imgBase64List;
g_manager->GetImageByDevId(devId, imgNameList, imgBase64List);
GetManager()->GetImageByDevId(devId, imgNameList, imgBase64List);
std::string imgInfos = "[";
for (int i = 0; i < (int)imgNameList.size(); ++i)
......@@ -199,7 +198,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
std::string devId = HttpHead::GetValue(requestURIQueryInfos, "pid");
DevParam devParam;
g_manager->GetDevParam(devId, devParam);
GetManager()->GetDevParam(devId, devParam);
std::string devParamStr = "{";
devParamStr += ToJsonPair("device", devParam.device, true);
......@@ -294,7 +293,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
cJSON_Delete(json);
}
g_manager->SetDevParam(devId, devParam);
GetManager()->SetDevParam(devId, devParam);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"\"}", 200);
......@@ -306,7 +305,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
HGByte* data = NULL;
HGUInt size = 0;
g_manager->ExportOfdFile(&data, &size);
GetManager()->ExportOfdFile(&data, &size);
SendResponse(requestHttpVersion.c_str(), 200, "OK", data, size, "application/zip");
delete[] data;
}
......@@ -314,7 +313,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
HGByte* data = NULL;
HGUInt size = 0;
g_manager->ExportPdfFile(&data, &size);
GetManager()->ExportPdfFile(&data, &size);
SendResponse(requestHttpVersion.c_str(), 200, "OK", data, size, "application/pdf");
delete[] data;
}
......@@ -322,7 +321,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
HGByte* data = NULL;
HGUInt size = 0;
g_manager->ExportTiffFile(&data, &size);
GetManager()->ExportTiffFile(&data, &size);
SendResponse(requestHttpVersion.c_str(), 200, "OK", data, size, "application/x-tif");
delete[] data;
}
......@@ -330,7 +329,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
HGByte* data = NULL;
HGUInt size = 0;
g_manager->ExportZipFile(&data, &size);
GetManager()->ExportZipFile(&data, &size);
SendResponse(requestHttpVersion.c_str(), 200, "OK", data, size, "application/zip");
delete[] data;
}
......@@ -365,7 +364,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
cJSON_Delete(json);
}
g_manager->UploadImage(uploadParam);
GetManager()->UploadImage(uploadParam);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -384,7 +383,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
std::string devId = HttpHead::GetValue(uriQueryInfos, "pid");
std::string imgName = HttpHead::GetValue(uriQueryInfos, "imageName");
std::string imgBase64 = HttpHead::GetValue(uriQueryInfos, "image");
g_manager->SaveImage(devId, imgName, imgBase64);
GetManager()->SaveImage(devId, imgName, imgBase64);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -402,7 +401,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
std::string devId = HttpHead::GetValue(uriQueryInfos, "pid");
std::string imgName = HttpHead::GetValue(uriQueryInfos, "imageName");
g_manager->DeleteImage(devId, imgName);
GetManager()->DeleteImage(devId, imgName);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -419,7 +418,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
HttpHead::AnalysisURIQuery(query.c_str(), uriQueryInfos);
std::string devId = HttpHead::GetValue(uriQueryInfos, "pid");
g_manager->DeleteAllImage(devId);
GetManager()->DeleteAllImage(devId);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -447,7 +446,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
}
}
std::string imgName, imgBase64;
g_manager->MergeImage(devId, isHorizontal, imgIndexs, imgName, imgBase64);
GetManager()->MergeImage(devId, isHorizontal, imgIndexs, imgName, imgBase64);
char *result = new char[256 + imgName.size() + imgBase64.size()];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":{\"imageName\":\"%s\", \"src\":\"%s\"}}",
......@@ -467,7 +466,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
std::string devId = HttpHead::GetValue(uriQueryInfos, "pid");
std::vector<std::string> imgNameList, imgBase64List;
g_manager->BookSort(devId, imgNameList, imgBase64List);
GetManager()->BookSort(devId, imgNameList, imgBase64List);
std::string imgInfos = "[";
for (int i = 0; i < (int)imgNameList.size(); ++i)
......@@ -510,7 +509,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
index2 = atoi(uriQueryInfos[i].second.c_str());
}
}
g_manager->ExchangeImage(devId, index1, index2);
GetManager()->ExchangeImage(devId, index1, index2);
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -521,7 +520,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
else if (requestMethod == "GET" && requestURIPath == "/WebScan/getLastBatch")
{
std::string devId;
g_manager->GetLastBetch(devId);
GetManager()->GetLastBetch(devId);
char* result = new char[devId.size() + 256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, devId.c_str());
......@@ -533,7 +532,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
{
std::string devId = HttpHead::GetValue(requestURIQueryInfos, "pid");
std::string devSerialNo;
g_manager->GetDevSerialNo(devId, devSerialNo);
GetManager()->GetDevSerialNo(devId, devSerialNo);
char* result = new char[devSerialNo.size() + 256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, devSerialNo.c_str());
......@@ -546,7 +545,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
std::string devId = HttpHead::GetValue(requestURIQueryInfos, "pid");
std::string imgName = HttpHead::GetValue(requestURIQueryInfos, "imageName");
std::string imgBase64;
g_manager->GetImageBase64(devId, imgName, imgBase64);
GetManager()->GetImageBase64(devId, imgName, imgBase64);
char* result = new char[imgBase64.size() + 256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, imgBase64.c_str());
......@@ -563,7 +562,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
HttpHead::AnalysisURIQuery(query.c_str(), uriQueryInfos);
}
g_manager->ResetPatchIndex();
GetManager()->ResetPatchIndex();
char result[256];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":\"%s\"}", 200, "success");
......@@ -586,7 +585,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
int y1 = atoi(HttpHead::GetValue(uriQueryInfos, "y1").c_str());
int y2 = atoi(HttpHead::GetValue(uriQueryInfos, "y2").c_str());
std::string imgName1, imgBase64_1, imgName2, imgBase64_2;
g_manager->SplitImage(devId, imgName, isHorizontal, x1, y1, x2, y2,
GetManager()->SplitImage(devId, imgName, isHorizontal, x1, y1, x2, y2,
imgName1, imgBase64_1, imgName2, imgBase64_2);
char *result = new char[256 + imgName1.size() + imgBase64_1.size() + imgName2.size() + imgBase64_2.size()];
......@@ -625,9 +624,10 @@ void HttpUser::ThreadFunc()
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
else
......@@ -666,9 +666,10 @@ void HttpUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -690,9 +691,10 @@ void HttpUser::ThreadFunc()
WebMsg msg;
msg.msgId = WEB_MSGID_HTTPCMD;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
bool b = GetLoop()->Send(&msg);
if (!b)
{
delete param;
......@@ -716,9 +718,10 @@ void HttpUser::ThreadFunc()
WebMsg msg;
msg.msgId = WEB_MSGID_HTTPCMD;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
bool b = GetLoop()->Send(&msg);
if (!b)
{
delete[] param->data;
......
#include "Manager.h"
#include "MsgLoop.h"
#include "../../base/HGBuffer.h"
#include "../../base/HGBase64.h"
#include "../../base/HGUtility.h"
......@@ -61,110 +62,123 @@ static std::string StdStringToUtf8(const char* str)
#endif
}
Manager::Manager()
Manager::Manager(class MsgLoop* loop)
{
HGBase_CreateLock(&m_lock);
m_loop = loop;
m_devName.clear();
SANE_Int version_code = 0;
SANE_Status status = sane_init_ex(&version_code, sane_ex_callback, this);
assert(SANE_STATUS_GOOD == status);
m_devHandle = NULL;
m_scanInsertImgName.clear();
m_scanIsInsert = false;
m_scanEvent = NULL;
m_scanParam = NULL;
m_scanning = false;
SANE_Int version_code = 0;
SANE_Status status = sane_init_ex(&version_code, sane_ex_callback, this);
assert(SANE_STATUS_GOOD == status);
}
Manager::~Manager()
{
StopScan();
if (NULL != m_devHandle)
{
StopScan();
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
}
sane_exit();
}
void Manager::OpenDev(const OpenDevParam* param)
{
if (!m_devName.empty() || NULL != m_devHandle)
{
return;
}
bool ret = false;
SANE_Status status = sane_open(param->devName.c_str(), &m_devHandle);
if (SANE_STATUS_GOOD == status)
{
assert(NULL != m_devHandle);
m_devName = param->devName;
}
}
void Manager::CloseDev(const CloseDevParam* param)
{
if (m_devName.empty() || NULL == m_devHandle || m_devName != param->devName)
{
return;
}
assert(NULL != m_devHandle);
StopScan();
sane_close(m_devHandle);
m_devHandle = NULL;
m_devName.clear();
HGBase_DestroyLock(m_lock);
m_lock = NULL;
}
bool Manager::Scan(const std::string& insertImgName, bool isInsert, ScanEvent event, void* param)
{
assert(NULL != event && NULL != param);
bool ret = false;
HGBase_EnterLock(m_lock);
if (NULL != m_devHandle)
if (m_scanning)
{
sane_cancel(m_devHandle);
sane_close(m_devHandle);
m_devHandle = NULL;
m_scanInsertImgName.clear();
m_scanIsInsert = false;
m_scanEvent = NULL;
m_scanParam = NULL;
return false;
}
m_scanInsertImgName = insertImgName;
m_scanIsInsert = isInsert;
m_scanEvent = event;
m_scanParam = param;
SANE_Status status = sane_open(m_devName.c_str(), &m_devHandle);
if (SANE_STATUS_GOOD == status)
bool ret = false;
if (NULL != m_devHandle)
{
m_scanInsertImgName = insertImgName;
m_scanIsInsert = isInsert;
m_scanEvent = event;
m_scanParam = param;
if (SANE_STATUS_GOOD == sane_start(m_devHandle))
{
m_scanning = true;
ret = true;
}
else
{
sane_close(m_devHandle);
m_devHandle = NULL;
m_scanInsertImgName.clear();
m_scanIsInsert = false;
m_scanEvent = NULL;
m_scanParam = NULL;
}
}
else
{
m_scanInsertImgName.clear();
m_scanIsInsert = false;
m_scanEvent = NULL;
m_scanParam = NULL;
}
HGBase_LeaveLock(m_lock);
return ret;
}
bool Manager::StopScan()
{
HGBase_EnterLock(m_lock);
if (NULL != m_devHandle)
if (m_scanning)
{
assert(NULL != m_devHandle);
sane_cancel(m_devHandle);
sane_close(m_devHandle);
m_devHandle = NULL;
m_scanning = false;
m_scanInsertImgName.clear();
m_scanIsInsert = false;
m_scanEvent = NULL;
m_scanParam = NULL;
}
HGBase_LeaveLock(m_lock);
return true;
}
bool Manager::GetCurDevId(std::string& devId)
{
HGBase_EnterLock(m_lock);
devId = m_devName;
HGBase_LeaveLock(m_lock);
return true;
}
......@@ -217,17 +231,6 @@ bool Manager::GetImageByDevId(const std::string& devId, std::vector<std::string>
bool Manager::GetDevParam(const std::string& devId, DevParam& devParam)
{
HGBase_EnterLock(m_lock);
SANE_Status status = sane_open(m_devName.c_str(), &m_devHandle);
if (SANE_STATUS_GOOD == status)
{
void *data = NULL;
SANE_Int info;
sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, NULL, &info);
}
HGBase_LeaveLock(m_lock);
return true;
}
......@@ -641,9 +644,7 @@ bool Manager::ExchangeImage(const std::string& devId, int index1, int index2)
bool Manager::GetLastBetch(std::string& devId)
{
HGBase_EnterLock(m_lock);
devId = m_devName;
HGBase_LeaveLock(m_lock);
return true;
}
......@@ -990,51 +991,59 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
case SANE_EVENT_DEVICE_ARRIVED:
{
SANE_Device* sane_dev = (SANE_Device*)data;
HGBase_EnterLock(p->m_lock);
if (p->m_devName.empty())
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "device arrive, name=%s", Utf8ToStdString(sane_dev->name).c_str());
OpenDevParam* openDevParam = new OpenDevParam;
openDevParam->devName = sane_dev->name;
WebMsg msg;
msg.msgId = WEB_MSGID_OPENDEV;
msg.svrId = 0;
msg.usrId = 0;
msg.param = openDevParam;
bool b = p->m_loop->Send(&msg);
if (!b)
{
p->m_devName = sane_dev->name;
delete openDevParam;
}
HGBase_LeaveLock(p->m_lock);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "device arrive, name=%s", Utf8ToStdString(sane_dev->name).c_str());
}
break;
case SANE_EVENT_DEVICE_LEFT:
{
SANE_Device* sane_dev = (SANE_Device*)data;
HGBase_EnterLock(p->m_lock);
if (p->m_devName == sane_dev->name)
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "device remove, name=%s", Utf8ToStdString(sane_dev->name).c_str());
CloseDevParam* closeDevParam = new CloseDevParam;
closeDevParam->devName = sane_dev->name;
WebMsg msg;
msg.msgId = WEB_MSGID_CLOSEDEV;
msg.svrId = 0;
msg.usrId = 0;
msg.param = closeDevParam;
bool b = p->m_loop->Send(&msg);
if (!b)
{
p->m_devName.clear();
delete closeDevParam;
}
HGBase_LeaveLock(p->m_lock);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "device remove, name=%s", Utf8ToStdString(sane_dev->name).c_str());
}
break;
case SANE_EVENT_STATUS:
{
HGBase_EnterLock(p->m_lock);
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_STATUS, (void*)data, (void*)0, p->m_scanParam);
HGBase_LeaveLock(p->m_lock);
}
break;
case SANE_EVENT_ERROR:
{
HGBase_EnterLock(p->m_lock);
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_ERROR, (void *)data, (void*)0, p->m_scanParam);
HGBase_LeaveLock(p->m_lock);
}
break;
case SANE_EVENT_WORKING:
{
HGBase_EnterLock(p->m_lock);
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_WORKING, (void*)data, (void*)0, p->m_scanParam);
HGBase_LeaveLock(p->m_lock);
}
break;
case SANE_EVENT_IMAGE_OK:
......@@ -1055,8 +1064,6 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
HGBase_CreateImageFromData(data, &imgInfo, nullptr, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &img);
if (NULL != img)
{
HGBase_EnterLock(p->m_lock);
std::string filePath = GetFilePath(p->m_devName);
std::vector<std::string> fileNameList = GetFileNameList(p->m_devName);
......@@ -1110,17 +1117,21 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_IMAGE, (void*)imgName.c_str(), (void *)imgBase64.c_str(), p->m_scanParam);
HGBase_LeaveLock(p->m_lock);
HGBase_DestroyImage(img);
}
}
break;
case SANE_EVENT_SCAN_FINISHED:
{
HGBase_EnterLock(p->m_lock);
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_FINISH, (void*)data, (void*)0, p->m_scanParam);
HGBase_LeaveLock(p->m_lock);
WebMsg msg;
msg.msgId = WEB_MSGID_STOPSCAN;
msg.svrId = 0;
msg.usrId = 0;
msg.param = NULL;
p->m_loop->Send(&msg);
}
break;
}
......
......@@ -6,6 +6,7 @@
#include "../../base/HGLock.h"
#include "../../base/HGImage.h"
#include "sane_ex/sane_ex.h"
#include "WebMsg.h"
#include <vector>
#include <string>
......@@ -95,9 +96,13 @@ typedef void (*ScanEvent)(HGUInt event, void *value1, void *value2, void *param)
class Manager
{
public:
Manager();
Manager(class MsgLoop* loop);
~Manager();
// 打开设备
void OpenDev(const OpenDevParam *param);
// 关闭设备
void CloseDev(const CloseDevParam* param);
// 扫描
bool Scan(const std::string& insertImgName, bool isInsert, ScanEvent event, void *param);
// 停止扫描
......@@ -160,13 +165,15 @@ private:
static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
private:
HGLock m_lock;
class MsgLoop* m_loop;
std::string m_devName;
SANE_Handle m_devHandle;
std::string m_scanInsertImgName;
bool m_scanIsInsert;
ScanEvent m_scanEvent;
void* m_scanParam;
bool m_scanning;
};
#endif /* __MANAGER_H__ */
#include "MsgLoop.h"
MsgLoop::MsgLoop()
: m_manager(this)
, m_wsServer(this, ServerType_Ws, 1)
, m_httpServer(this, ServerType_Http, 2)
, m_sockIoServer(this, ServerType_SockIo, 3)
{
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
HGBase_CreateLock(&m_msgLock);
......@@ -40,6 +44,10 @@ bool MsgLoop::Send(const WebMsg* msg)
void MsgLoop::Loop()
{
m_wsServer.Open(38999);
m_httpServer.Open(18999);
m_sockIoServer.Open(28999);
while (1)
{
HGBase_WaitEvent(m_msgEvent);
......@@ -53,8 +61,51 @@ void MsgLoop::Loop()
}
HGBase_LeaveLock(m_msgLock);
//
HandleMsg(&msg);
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())
......@@ -70,7 +121,7 @@ void MsgLoop::Loop()
}
}
void MsgLoop::HandleMsg(const WebMsg* msg)
Manager* MsgLoop::GetManager()
{
return &m_manager;
}
\ No newline at end of file
......@@ -6,6 +6,8 @@
#include "../../base/HGEvent.h"
#include "../../base/HGLock.h"
#include "WebMsg.h"
#include "Manager.h"
#include "WebServer.h"
#include <list>
class MsgLoop
......@@ -16,15 +18,18 @@ public:
bool Send(const WebMsg* msg);
void Loop();
private:
void HandleMsg(const WebMsg* msg);
Manager* GetManager();
private:
HGEvent m_msgEvent;
HGLock m_msgLock;
HGBool m_bRecvMsg;
std::list<WebMsg> m_listMsg;
Manager m_manager;
WebServer m_wsServer;
WebServer m_httpServer;
WebServer m_sockIoServer;
};
#endif /* __MSGLOOP_H__ */
\ No newline at end of file
#include "SockIoUser.h"
#include "WebServer.h"
#include "MsgLoop.h"
#include "Manager.h"
#include "../../base/HGInfo.h"
#include "../../base/HGUtility.h"
......@@ -7,8 +8,6 @@
#include "base64.h"
#include "cJSON.h"
extern Manager* g_manager;
#if defined(HG_CMP_MSC)
SockIoUser::SockIoUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn)
#else
......@@ -54,7 +53,7 @@ void SockIoUser::HandleCmd(const SockIoCmdParam* param)
cJSON_Delete(json);
}
bool ret = g_manager->Scan(imgName, insert, ScanCallback, this);
bool ret = GetManager()->Scan(imgName, insert, ScanCallback, this);
if (!ret)
{
std::string resp = "42[\"error\", \"scan error\"]";
......@@ -63,12 +62,11 @@ void SockIoUser::HandleCmd(const SockIoCmdParam* param)
}
else if ("stop" == user)
{
bool ret = g_manager->StopScan();
if (!ret)
{
std::string resp = "42[\"error\", \"stop error\"]";
SendResponse((const HGByte*)resp.c_str(), (HGUInt)resp.size(), HGTRUE);
}
bool ret = GetManager()->StopScan();
assert(ret);
std::string resp = "42[\"success\", \"stop scan success!\"]";
SendResponse((const HGByte*)resp.c_str(), (HGUInt)resp.size(), HGTRUE);
}
}
......@@ -109,9 +107,10 @@ void SockIoUser::ThreadFunc()
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
else
......@@ -153,9 +152,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -180,9 +180,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
else if ((0x80 | 0x09) == headData[0]) // PING帧
......@@ -211,9 +212,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -223,9 +225,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -235,9 +238,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -247,9 +251,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -264,9 +269,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -298,9 +304,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -336,9 +343,10 @@ void SockIoUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -401,9 +409,10 @@ void SockIoUser::ThreadFunc()
WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIOCMD;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
bool b = GetLoop()->Send(&msg);
if (!b)
{
delete[] param->data;
......@@ -467,9 +476,10 @@ void SockIoUser::ScanCallback(HGUInt event, void* value1, void* value2, void* pa
WebMsg msg;
msg.msgId = WEB_MSGID_SOCKIORET;
msg.userId = p->m_id;
msg.svrId = p->m_server->GetId();
msg.usrId = p->m_id;
msg.param = param;
bool b = p->m_server->SendMsg(&msg);
bool b = p->GetLoop()->Send(&msg);
if (!b)
{
delete[] param->data;
......
......@@ -15,11 +15,15 @@
#define WEB_MSGID_WSRET 7
#define WEB_MSGID_HTTPRET 8
#define WEB_MSGID_SOCKIORET 9
#define WEB_MSGID_OPENDEV 10
#define WEB_MSGID_CLOSEDEV 11
#define WEB_MSGID_STOPSCAN 12
struct WebMsg
{
HGUInt msgId; /* WEB_MSGID_** */
HGUInt userId; /* userId */
HGUInt svrId; /* serverId */
HGUInt usrId; /* userId */
HGPointer param; /* param */
};
......@@ -59,4 +63,14 @@ struct SockIoRetParam
HGUInt size;
};
struct OpenDevParam
{
std::string devName;
};
struct CloseDevParam
{
std::string devName;
};
#endif /* __WEBMSG_H__ */
\ No newline at end of file
#include "WebServer.h"
#include "MsgLoop.h"
#include "WsUser.h"
#include "HttpUser.h"
#include "SockIoUser.h"
#include "../../base/HGInfo.h"
WebServer::WebServer(ServerType type)
: m_svrType(type)
WebServer::WebServer(class MsgLoop* loop, HGUInt type, HGUInt id)
{
m_currId = 1;
HGBase_CreateEvent(HGTRUE, HGFALSE, &m_msgEvent);
HGBase_CreateLock(&m_msgLock);
m_bRecvMsg = HGFALSE;
m_loop = loop;
m_type = type;
m_id = id;
m_currUserId = 1;
#if defined(HG_CMP_MSC)
m_sockServer = INVALID_SOCKET;
#else
......@@ -21,33 +22,22 @@ WebServer::WebServer(ServerType type)
WebServer::~WebServer()
{
HGBase_DestroyLock(m_msgLock);
m_msgLock = NULL;
HGBase_DestroyEvent(m_msgEvent);
m_msgEvent = NULL;
}
bool WebServer::SendMsg(const WebMsg* msg)
class MsgLoop* WebServer::GetLoop()
{
if (NULL == msg)
{
return false;
}
bool ret = false;
HGBase_EnterLock(m_msgLock);
if (m_bRecvMsg)
{
m_listMsg.push_back(*msg);
HGBase_SetEvent(m_msgEvent);
return m_loop;
}
if (WEB_MSGID_QUIT == msg->msgId)
m_bRecvMsg = HGFALSE;
ret = true;
}
HGBase_LeaveLock(m_msgLock);
HGUInt WebServer::GetType()
{
return m_type;
}
return ret;
HGUInt WebServer::GetId()
{
return m_id;
}
bool WebServer::Open(HGUShort port)
......@@ -109,24 +99,22 @@ bool WebServer::Open(HGUShort port)
return false;
}
HGBase_EnterLock(m_msgLock);
m_bRecvMsg = HGTRUE;
HGBase_LeaveLock(m_msgLock);
m_sockServer = sockServer;
HGBase_OpenThread(ThreadFunc, this, &m_listenThread);
assert(NULL != m_listenThread);
if (ServerType_Ws == m_svrType)
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open websocket-server success, post=%u", port);
else if (ServerType_Http == m_svrType)
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open http-server success, post=%u", port);
else
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open socket.io-server success, post=%u", port);
return true;
}
bool WebServer::Close()
{
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin());
delete pUser;
pUser = NULL;
}
#if defined(HG_CMP_MSC)
if (INVALID_SOCKET == m_sockServer)
#else
......@@ -148,76 +136,32 @@ bool WebServer::Close()
return true;
}
void WebServer::MsgLoop()
{
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);
// 处理
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;
}
}
}
void WebServer::HandleMsg(const WebMsg* msg)
{
assert(NULL != msg);
assert(msg->svrId == m_id);
if (WEB_MSGID_QUIT == msg->msgId)
{
assert(0 == msg->userId);
assert(NULL == msg->param);
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin());
delete pUser;
pUser = NULL;
}
}
else if (WEB_MSGID_CONNET == msg->msgId)
if (WEB_MSGID_CONNET == msg->msgId)
{
assert(0 == msg->userId);
assert(0 == msg->usrId);
ConnectParam* param = (ConnectParam*)msg->param;
assert(NULL != param);
WebUser* user = NULL;
if (ServerType_Ws == m_svrType)
user = new WsUser(this, m_currId, param->ip, param->port, param->socket);
else if (ServerType_Http == m_svrType)
user = new HttpUser(this, m_currId, param->ip, param->port, param->socket);
if (ServerType_Ws == m_type)
user = new WsUser(this, m_currUserId, param->ip, param->port, param->socket);
else if (ServerType_Http == m_type)
user = new HttpUser(this, m_currUserId, param->ip, param->port, param->socket);
else
user = new SockIoUser(this, m_currId, param->ip, param->port, param->socket);
user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket);
++m_currId;
++m_currUserId;
m_vectorUser.push_back(user);
delete param;
}
else if (WEB_MSGID_DISCONNET == msg->msgId)
{
HGUInt id = (HGUInt)msg->userId;
HGUInt id = (HGUInt)msg->usrId;
assert(NULL == msg->param);
int nIndex = GetUserIndex(id);
......@@ -231,7 +175,7 @@ void WebServer::HandleMsg(const WebMsg* msg)
}
else if (WEB_MSGID_WSCMD == msg->msgId)
{
HGUInt id = (HGUInt)msg->userId;
HGUInt id = (HGUInt)msg->usrId;
WsCmdParam* param = (WsCmdParam*)msg->param;
assert(NULL != param);
......@@ -248,7 +192,7 @@ void WebServer::HandleMsg(const WebMsg* msg)
}
else if (WEB_MSGID_HTTPCMD == msg->msgId)
{
HGUInt id = (HGUInt)msg->userId;
HGUInt id = (HGUInt)msg->usrId;
HttpCmdParam* param = (HttpCmdParam*)msg->param;
assert(NULL != param);
......@@ -265,7 +209,7 @@ void WebServer::HandleMsg(const WebMsg* msg)
}
else if (WEB_MSGID_SOCKIOCMD == msg->msgId)
{
HGUInt id = (HGUInt)msg->userId;
HGUInt id = (HGUInt)msg->usrId;
SockIoCmdParam* param = (SockIoCmdParam*)msg->param;
assert(NULL != param);
......@@ -282,7 +226,7 @@ void WebServer::HandleMsg(const WebMsg* msg)
}
else if (WEB_MSGID_SOCKIORET == msg->msgId)
{
HGUInt id = (HGUInt)msg->userId;
HGUInt id = (HGUInt)msg->usrId;
SockIoRetParam* param = (SockIoRetParam*)msg->param;
assert(NULL != param);
......@@ -343,9 +287,10 @@ void WebServer::ThreadFunc(HGThread thread, HGPointer param)
WebMsg msg;
msg.msgId = WEB_MSGID_CONNET;
msg.userId = 0;
msg.svrId = p->m_id;
msg.usrId = 0;
msg.param = param;
bool b = p->SendMsg(&msg);
bool b = p->m_loop->Send(&msg);
if (!b)
{
delete msg.param;
......
......@@ -3,44 +3,38 @@
#include "../../base/HGDef.h"
#include "../../base/HGInc.h"
#include "../../base/HGEvent.h"
#include "../../base/HGLock.h"
#include "../../base/HGThread.h"
#include "WebMsg.h"
#include <string>
#include <vector>
#include <list>
enum ServerType
{
ServerType_Ws,
ServerType_Http,
ServerType_SockIo
};
#define ServerType_Ws 1L
#define ServerType_Http 2L
#define ServerType_SockIo 3L
class WebServer
{
public:
WebServer(ServerType type);
WebServer(class MsgLoop *loop, HGUInt type, HGUInt id);
~WebServer();
bool SendMsg(const WebMsg* msg);
class MsgLoop* GetLoop();
HGUInt GetType();
HGUInt GetId();
bool Open(HGUShort port);
bool Close();
void MsgLoop();
void HandleMsg(const WebMsg* msg);
private:
void HandleMsg(const WebMsg* msg);
int GetUserIndex(HGUInt id);
static void ThreadFunc(HGThread thread, HGPointer param);
private:
ServerType m_svrType;
HGUInt m_currId;
HGEvent m_msgEvent;
HGLock m_msgLock;
HGBool m_bRecvMsg;
std::list<WebMsg> m_listMsg;
class MsgLoop* m_loop;
HGUInt m_type;
HGUInt m_id;
HGUInt m_currUserId;
#if defined(HG_CMP_MSC)
SOCKET m_sockServer;
#else
......
#include "WebUser.h"
#include "WebServer.h"
#include "MsgLoop.h"
#if defined(HG_CMP_MSC)
WebUser::WebUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn)
......@@ -42,6 +43,16 @@ HGUInt WebUser::GetId()
return m_id;
}
class MsgLoop* WebUser::GetLoop()
{
return m_server->GetLoop();
}
class Manager* WebUser::GetManager()
{
return m_server->GetLoop()->GetManager();
}
void WebUser::ThreadFunc(HGThread thread, HGPointer param)
{
WebUser* p = (WebUser*)param;
......
......@@ -17,6 +17,8 @@ public:
virtual ~WebUser();
HGUInt GetId();
class MsgLoop* GetLoop();
class Manager* GetManager();
protected:
virtual void ThreadFunc() = 0;
......
#include "WsUser.h"
#include "WebServer.h"
#include "MsgLoop.h"
#include "Manager.h"
#include "../../base/HGInfo.h"
#include "sha1.h"
#include "base64.h"
extern Manager* g_manager;
#if defined(HG_CMP_MSC)
WsUser::WsUser(class WebServer *server, HGUInt id, const char *ip, uint16_t port, SOCKET sockConn)
#else
......@@ -61,9 +60,10 @@ void WsUser::ThreadFunc()
// 这里跳出,可能是服务器关闭了socketConn,或者客户端关闭了socket,或者网络断开
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
else
......@@ -105,9 +105,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -132,9 +133,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
else if ((0x80 | 0x09) == headData[0]) // PING帧
......@@ -163,9 +165,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -175,9 +178,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -187,9 +191,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -199,9 +204,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
}
......@@ -216,9 +222,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -250,9 +257,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -288,9 +296,10 @@ void WsUser::ThreadFunc()
{
WebMsg msg;
msg.msgId = WEB_MSGID_DISCONNET;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = NULL;
m_server->SendMsg(&msg);
GetLoop()->Send(&msg);
break;
}
......@@ -345,9 +354,10 @@ void WsUser::ThreadFunc()
WebMsg msg;
msg.msgId = WEB_MSGID_WSCMD;
msg.userId = m_id;
msg.svrId = m_server->GetId();
msg.usrId = m_id;
msg.param = param;
bool b = m_server->SendMsg(&msg);
bool b = GetLoop()->Send(&msg);
if (!b)
{
delete[] param->data;
......
#include "../../base/HGDef.h"
#include "../../base/HGInc.h"
#include "../../base/HGThread.h"
#include "Manager.h"
#include "WebServer.h"
#include "MsgLoop.h"
Manager* g_manager = NULL;
static void WsThreadFunc(HGThread thread, HGPointer param)
{
WebServer* server = (WebServer*)param;
if (server->Open(38999))
{
server->MsgLoop();
server->Close();
}
}
static void HttpThreadFunc(HGThread thread, HGPointer param)
static void ThreadFunc(HGThread thread, HGPointer param)
{
WebServer* server = (WebServer*)param;
if (server->Open(18999))
{
server->MsgLoop();
server->Close();
}
}
(void)thread;
(void)param;
static void SockIoThreadFunc(HGThread thread, HGPointer param)
{
WebServer* server = (WebServer*)param;
if (server->Open(28999))
{
server->MsgLoop();
server->Close();
}
MsgLoop* loop = (MsgLoop*)param;
loop->Loop();
}
#if defined(HG_CMP_MSC)
......@@ -48,29 +24,11 @@ int main()
assert(0 == ret);
#endif
g_manager = new Manager();
WebServer wsServer(ServerType_Ws);
HGThread wsThread = NULL;
HGBase_OpenThread(WsThreadFunc, &wsServer, &wsThread);
WebServer httpServer(ServerType_Http);
HGThread httpThread = NULL;
HGBase_OpenThread(HttpThreadFunc, &httpServer, &httpThread);
WebServer sockIoServer(ServerType_SockIo);
HGThread sockIoThread = NULL;
HGBase_OpenThread(SockIoThreadFunc, &sockIoServer, &sockIoThread);
HGBase_CloseThread(sockIoThread);
sockIoThread = NULL;
HGBase_CloseThread(httpThread);
httpThread = NULL;
HGBase_CloseThread(wsThread);
wsThread = NULL;
delete g_manager;
g_manager = NULL;
MsgLoop loop;
HGThread thread = NULL;
HGBase_OpenThread(ThreadFunc, &loop, &thread);
HGBase_CloseThread(thread);
thread = NULL;
#if defined(HG_CMP_MSC)
WSACleanup();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment