HGGitLab

Commit 1ba26f39 authored by luoliangyi's avatar luoliangyi

解决websdk在linux上的崩溃问题

parent f9fd7fa7
......@@ -52,6 +52,8 @@
<Unit filename="../../../../sdk/webservice/HttpUser.h" />
<Unit filename="../../../../sdk/webservice/Manager.cpp" />
<Unit filename="../../../../sdk/webservice/Manager.h" />
<Unit filename="../../../../sdk/webservice/MsgLoop.cpp" />
<Unit filename="../../../../sdk/webservice/MsgLoop.h" />
<Unit filename="../../../../sdk/webservice/SockIoUser.cpp" />
<Unit filename="../../../../sdk/webservice/SockIoUser.h" />
<Unit filename="../../../../sdk/webservice/WebMsg.h" />
......
......@@ -84,7 +84,7 @@ static bool GetJsonBoolValue(cJSON* json, const std::string& key)
static std::string GetJsonStringValue(cJSON* json, const std::string& key)
{
std::string ret;
cJSON* p = json->child;
while (NULL != p)
{
......@@ -123,7 +123,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
HttpPairs requestURIQueryInfos = param->head.GetRequestURIQueryInfos();
std::string requestHttpVersion = param->head.GetRequestHttpVersion();
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "HttpUser: method=%s, path=%s, httpVersion=%s",
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "HttpUser: method=%s, path=%s, httpVersion=%s",
requestMethod.c_str(), requestURIPath.c_str(), requestHttpVersion.c_str());
if (requestMethod == "POST" && requestURIPath == "/WebScan/getVersionInfo")
......@@ -451,7 +451,7 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
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\"}}",
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":{\"imageName\":\"%s\", \"src\":\"%s\"}}",
200, imgName.c_str(), imgBase64.c_str());
SendResponse(requestHttpVersion.c_str(), 200, "OK",
(const HGByte*)result, (HGUInt)strlen(result), "application/json");
......@@ -587,11 +587,11 @@ 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;
GetManager()->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()];
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":{\"oneSrc\":\"%s\", \"oneName\":\"%s\", \"twoSrc\":\"%s\", \"twoName\":\"%s\"}}",
sprintf(result, "{\"code\":%d, \"msg\":null, \"data\":{\"oneSrc\":\"%s\", \"oneName\":\"%s\", \"twoSrc\":\"%s\", \"twoName\":\"%s\"}}",
200, imgBase64_1.c_str(), imgName1.c_str(), imgBase64_2.c_str(), imgName2.c_str());
SendResponse(requestHttpVersion.c_str(), 200, "OK",
(const HGByte*)result, (HGUInt)strlen(result), "application/json");
......@@ -602,6 +602,8 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
void HttpUser::ThreadFunc()
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "HttpUser::ThreadFunc");
char chBuffer[2048];
const char* pBuffer = chBuffer;
int nBufferSize = 0;
......
......@@ -341,6 +341,7 @@ bool Manager::GetImageByDevId(const std::string& devId, std::vector<std::string>
std::string filePath = GetFilePath(devId);
std::vector<std::string> fileNameList = GetFileNameList(devId);
HGBase_WriteInfo(HGBASE_INFOTYPE_DEBUG, "filePath=%s", filePath.c_str());
for (int i = 0; i < (int)fileNameList.size(); ++i)
{
......@@ -530,7 +531,7 @@ bool Manager::SetDevParam(const std::string& devId, const DevParam& devParam)
}
else if (SANE_TYPE_FIXED == desp->type)
{
}
else if (SANE_TYPE_STRING == desp->type)
{
......@@ -579,11 +580,11 @@ bool Manager::SetDevParam(const std::string& devId, const DevParam& devParam)
}
else if (SANE_TYPE_BUTTON == desp->type)
{
}
else if (SANE_TYPE_GROUP == desp->type)
{
}
}
......@@ -777,9 +778,7 @@ bool Manager::ExportZipFile(HGByte** data, HGUInt* size)
bool ret = false;
for (int i = 0; i < (int)fileNameList.size(); ++i)
{
HGImage img = NULL;
std::string fileName = filePath + fileNameList[i];
zip_source_t* s = zip_source_file(z, StdStringToUtf8(fileName.c_str()).c_str(), 0, 0);
if (NULL != s)
{
......@@ -1154,7 +1153,7 @@ std::string Manager::GetFilePath(const std::string& devId)
HGChar docsPath[512];
HGBase_GetDocumentsPath(docsPath, 512);
HGChar imgPath[512];
sprintf(imgPath, "%sHuaGo/WebService/%s/", docsPath, Utf8ToStdString(devId.c_str()).c_str());
sprintf(imgPath, "%sHuago/WebService/%s/", docsPath, Utf8ToStdString(devId.c_str()).c_str());
HGChar stdImgPath[512];
HGBase_StandardiseFileName(imgPath, stdImgPath, 512);
......@@ -1397,12 +1396,16 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
break;
case SANE_EVENT_WORKING:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_WORKING");
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_WORKING, (void*)data, (void*)0, p->m_scanParam);
}
break;
case SANE_EVENT_IMAGE_OK:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_IMAGE_OK");
SANE_Image* sane_img = (SANE_Image*)data;
HGUInt imgType = 0;
......@@ -1478,6 +1481,8 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
break;
case SANE_EVENT_SCAN_FINISHED:
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_SCAN_FINISHED");
if (NULL != p->m_scanEvent)
p->m_scanEvent(SCANEVENT_FINISH, (void*)data, (void*)0, p->m_scanParam);
......
#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);
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);
......@@ -44,9 +54,9 @@ bool MsgLoop::Send(const WebMsg* msg)
void MsgLoop::Loop()
{
m_wsServer.Open(38999);
m_httpServer.Open(18999);
m_sockIoServer.Open(28999);
m_wsServer->Open(38999);
m_httpServer->Open(18999);
m_sockIoServer->Open(28999);
while (1)
{
......@@ -69,41 +79,41 @@ void MsgLoop::Loop()
if (WEB_MSGID_QUIT == msg.msgId)
{
assert(NULL == msg.param);
m_wsServer.Close();
m_httpServer.Close();
m_sockIoServer.Close();
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);
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);
m_manager->CloseDev(param);
delete param;
}
else if (WEB_MSGID_STOPSCAN == msg.msgId)
{
assert(NULL == msg.param);
m_manager.StopScan();
m_manager->StopScan();
}
}
else if (1 == msg.svrId)
{
m_wsServer.HandleMsg(&msg);
}
m_wsServer->HandleMsg(&msg);
}
else if (2 == msg.svrId)
{
m_httpServer.HandleMsg(&msg);
}
m_httpServer->HandleMsg(&msg);
}
else if (3 == msg.svrId)
{
m_sockIoServer.HandleMsg(&msg);
m_sockIoServer->HandleMsg(&msg);
}
}
......@@ -123,5 +133,5 @@ void MsgLoop::Loop()
Manager* MsgLoop::GetManager()
{
return &m_manager;
}
\ No newline at end of file
return m_manager;
}
......@@ -26,10 +26,10 @@ private:
HGBool m_bRecvMsg;
std::list<WebMsg> m_listMsg;
Manager m_manager;
WebServer m_wsServer;
WebServer m_httpServer;
WebServer m_sockIoServer;
Manager *m_manager;
WebServer *m_wsServer;
WebServer *m_httpServer;
WebServer *m_sockIoServer;
};
#endif /* __MSGLOOP_H__ */
\ No newline at end of file
#endif /* __MSGLOOP_H__ */
......@@ -32,7 +32,7 @@ void SockIoUser::HandleCmd(const SockIoCmdParam* param)
{
return;
}
if ("scan" == user)
{
std::string imgName;
......@@ -41,7 +41,7 @@ void SockIoUser::HandleCmd(const SockIoCmdParam* param)
cJSON* json = cJSON_Parse(data.c_str());
if (NULL != json)
{
if (NULL != json->child && 0 == strcmp("imageName", json->child->string)
if (NULL != json->child && 0 == strcmp("imageName", json->child->string)
&& cJSON_String == json->child->type)
{
imgName = json->child->valuestring;
......@@ -77,6 +77,8 @@ void SockIoUser::HandleRet(const SockIoRetParam* param)
void SockIoUser::ThreadFunc()
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SockIoUser::ThreadFunc");
char chBuffer[2048];
const char* pBuffer = chBuffer;
int nBufferSize = 0;
......@@ -568,7 +570,7 @@ bool SockIoUser::ShakeHand(const std::string& head)
char uuid[256] = {0};
HGBase_GetUuid(uuid, 256);
std::string resp = "0{";
resp += "\"sid\":\"";
resp += uuid;
......@@ -635,4 +637,4 @@ bool SockIoUser::SendResponse(const HGByte* data, HGUInt size, HGBool text)
send(m_sockConn, (const char*)data, size, 0);
HGBase_LeaveLock(m_cs);
return true;
}
\ No newline at end of file
}
......@@ -59,7 +59,7 @@ bool WebServer::Open(HGUShort port)
if (-1 == sockServer)
#endif
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 1");
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 1, port=%u", port);
return false;
}
......@@ -83,7 +83,7 @@ bool WebServer::Open(HGUShort port)
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 2");
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 2, port=%u", port);
return false;
}
......@@ -95,26 +95,19 @@ bool WebServer::Open(HGUShort port)
#else
close(sockServer);
#endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3");
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3, port=%u", port);
return false;
}
m_sockServer = sockServer;
HGBase_OpenThread(ThreadFunc, this, &m_listenThread);
assert(NULL != m_listenThread);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver success, port=%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
......@@ -124,6 +117,14 @@ bool WebServer::Close()
return false;
}
while (!m_vectorUser.empty())
{
WebUser* pUser = m_vectorUser[0];
m_vectorUser.erase(m_vectorUser.begin());
delete pUser;
pUser = NULL;
}
#if defined(HG_CMP_MSC)
closesocket(m_sockServer);
m_sockServer = INVALID_SOCKET;
......@@ -155,6 +156,9 @@ void WebServer::HandleMsg(const WebMsg* msg)
else
user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket);
// 打开接收线程
user->Open();
++m_currUserId;
m_vectorUser.push_back(user);
delete param;
......
#include "WebUser.h"
#include "WebServer.h"
#include "MsgLoop.h"
#include "../../base/HGInfo.h"
#if defined(HG_CMP_MSC)
WebUser::WebUser(class WebServer* server, HGUInt id, const char* ip, uint16_t port, SOCKET sockConn)
......@@ -15,8 +16,7 @@ WebUser::WebUser(class WebServer* server, HGUInt id, const char* ip, uint16_t po
m_port = port;
m_sockConn = sockConn;
HGBase_OpenThread(ThreadFunc, this, &m_thread);
assert(NULL != m_thread);
m_thread = NULL;
}
WebUser::~WebUser()
......@@ -38,6 +38,12 @@ WebUser::~WebUser()
m_server = NULL;
}
void WebUser::Open()
{
HGBase_OpenThread(ThreadFunc, this, &m_thread);
assert(NULL != m_thread);
}
HGUInt WebUser::GetId()
{
return m_id;
......@@ -53,8 +59,13 @@ class Manager* WebUser::GetManager()
return m_server->GetLoop()->GetManager();
}
void WebUser::ThreadFunc()
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "WebUser::ThreadFunc");
}
void WebUser::ThreadFunc(HGThread thread, HGPointer param)
{
WebUser* p = (WebUser*)param;
p->ThreadFunc();
}
\ No newline at end of file
}
......@@ -16,12 +16,13 @@ public:
#endif
virtual ~WebUser();
void Open();
HGUInt GetId();
class MsgLoop* GetLoop();
class Manager* GetManager();
protected:
virtual void ThreadFunc() = 0;
virtual void ThreadFunc();
private:
static void ThreadFunc(HGThread thread, HGPointer param);
......@@ -41,4 +42,4 @@ protected:
HGThread m_thread;
};
#endif /* __WEBUSER_H__ */
\ No newline at end of file
#endif /* __WEBUSER_H__ */
......@@ -30,6 +30,8 @@ void WsUser::HandleCmd(const WsCmdParam* param)
void WsUser::ThreadFunc()
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "WsUser::ThreadFunc");
char chBuffer[2048];
const char* pBuffer = chBuffer;
int nBufferSize = 0;
......
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