HGGitLab

Commit 8e4ed50b authored by luoliangyi's avatar luoliangyi

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

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