HGGitLab

Commit 1ba26f39 authored by luoliangyi's avatar luoliangyi

解决websdk在linux上的崩溃问题

parent f9fd7fa7
...@@ -52,6 +52,8 @@ ...@@ -52,6 +52,8 @@
<Unit filename="../../../../sdk/webservice/HttpUser.h" /> <Unit filename="../../../../sdk/webservice/HttpUser.h" />
<Unit filename="../../../../sdk/webservice/Manager.cpp" /> <Unit filename="../../../../sdk/webservice/Manager.cpp" />
<Unit filename="../../../../sdk/webservice/Manager.h" /> <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.cpp" />
<Unit filename="../../../../sdk/webservice/SockIoUser.h" /> <Unit filename="../../../../sdk/webservice/SockIoUser.h" />
<Unit filename="../../../../sdk/webservice/WebMsg.h" /> <Unit filename="../../../../sdk/webservice/WebMsg.h" />
......
...@@ -602,6 +602,8 @@ void HttpUser::HandleCmd(const HttpCmdParam* param) ...@@ -602,6 +602,8 @@ void HttpUser::HandleCmd(const HttpCmdParam* param)
void HttpUser::ThreadFunc() void HttpUser::ThreadFunc()
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "HttpUser::ThreadFunc");
char chBuffer[2048]; char chBuffer[2048];
const char* pBuffer = chBuffer; const char* pBuffer = chBuffer;
int nBufferSize = 0; int nBufferSize = 0;
......
...@@ -341,6 +341,7 @@ bool Manager::GetImageByDevId(const std::string& devId, std::vector<std::string> ...@@ -341,6 +341,7 @@ bool Manager::GetImageByDevId(const std::string& devId, std::vector<std::string>
std::string filePath = GetFilePath(devId); std::string filePath = GetFilePath(devId);
std::vector<std::string> fileNameList = GetFileNameList(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) for (int i = 0; i < (int)fileNameList.size(); ++i)
{ {
...@@ -777,9 +778,7 @@ bool Manager::ExportZipFile(HGByte** data, HGUInt* size) ...@@ -777,9 +778,7 @@ bool Manager::ExportZipFile(HGByte** data, HGUInt* size)
bool ret = false; bool ret = false;
for (int i = 0; i < (int)fileNameList.size(); ++i) for (int i = 0; i < (int)fileNameList.size(); ++i)
{ {
HGImage img = NULL;
std::string fileName = filePath + fileNameList[i]; std::string fileName = filePath + fileNameList[i];
zip_source_t* s = zip_source_file(z, StdStringToUtf8(fileName.c_str()).c_str(), 0, 0); zip_source_t* s = zip_source_file(z, StdStringToUtf8(fileName.c_str()).c_str(), 0, 0);
if (NULL != s) if (NULL != s)
{ {
...@@ -1154,7 +1153,7 @@ std::string Manager::GetFilePath(const std::string& devId) ...@@ -1154,7 +1153,7 @@ std::string Manager::GetFilePath(const std::string& devId)
HGChar docsPath[512]; HGChar docsPath[512];
HGBase_GetDocumentsPath(docsPath, 512); HGBase_GetDocumentsPath(docsPath, 512);
HGChar imgPath[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]; HGChar stdImgPath[512];
HGBase_StandardiseFileName(imgPath, 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 ...@@ -1397,12 +1396,16 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
break; break;
case SANE_EVENT_WORKING: case SANE_EVENT_WORKING:
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_WORKING");
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);
} }
break; break;
case SANE_EVENT_IMAGE_OK: case SANE_EVENT_IMAGE_OK:
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_IMAGE_OK");
SANE_Image* sane_img = (SANE_Image*)data; SANE_Image* sane_img = (SANE_Image*)data;
HGUInt imgType = 0; HGUInt imgType = 0;
...@@ -1478,6 +1481,8 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i ...@@ -1478,6 +1481,8 @@ int Manager::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned i
break; break;
case SANE_EVENT_SCAN_FINISHED: case SANE_EVENT_SCAN_FINISHED:
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SANE_EVENT_SCAN_FINISHED");
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);
......
#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);
m_bRecvMsg = HGTRUE; 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() 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); HGBase_DestroyLock(m_msgLock);
m_msgLock = NULL; m_msgLock = NULL;
HGBase_DestroyEvent(m_msgEvent); HGBase_DestroyEvent(m_msgEvent);
...@@ -44,9 +54,9 @@ bool MsgLoop::Send(const WebMsg* msg) ...@@ -44,9 +54,9 @@ bool MsgLoop::Send(const WebMsg* msg)
void MsgLoop::Loop() void MsgLoop::Loop()
{ {
m_wsServer.Open(38999); m_wsServer->Open(38999);
m_httpServer.Open(18999); m_httpServer->Open(18999);
m_sockIoServer.Open(28999); m_sockIoServer->Open(28999);
while (1) while (1)
{ {
...@@ -69,41 +79,41 @@ void MsgLoop::Loop() ...@@ -69,41 +79,41 @@ void MsgLoop::Loop()
if (WEB_MSGID_QUIT == msg.msgId) if (WEB_MSGID_QUIT == msg.msgId)
{ {
assert(NULL == msg.param); assert(NULL == msg.param);
m_wsServer.Close(); m_wsServer->Close();
m_httpServer.Close(); m_httpServer->Close();
m_sockIoServer.Close(); m_sockIoServer->Close();
} }
else if (WEB_MSGID_OPENDEV == msg.msgId) else if (WEB_MSGID_OPENDEV == msg.msgId)
{ {
assert(NULL != msg.param); assert(NULL != msg.param);
OpenDevParam* param = (OpenDevParam*)msg.param; OpenDevParam* param = (OpenDevParam*)msg.param;
m_manager.OpenDev(param); m_manager->OpenDev(param);
delete param; delete param;
} }
else if (WEB_MSGID_CLOSEDEV == msg.msgId) else if (WEB_MSGID_CLOSEDEV == msg.msgId)
{ {
assert(NULL != msg.param); assert(NULL != msg.param);
CloseDevParam* param = (CloseDevParam*)msg.param; CloseDevParam* param = (CloseDevParam*)msg.param;
m_manager.CloseDev(param); m_manager->CloseDev(param);
delete param; delete param;
} }
else if (WEB_MSGID_STOPSCAN == msg.msgId) else if (WEB_MSGID_STOPSCAN == msg.msgId)
{ {
assert(NULL == msg.param); assert(NULL == msg.param);
m_manager.StopScan(); m_manager->StopScan();
} }
} }
else if (1 == msg.svrId) else if (1 == msg.svrId)
{ {
m_wsServer.HandleMsg(&msg); m_wsServer->HandleMsg(&msg);
} }
else if (2 == msg.svrId) else if (2 == msg.svrId)
{ {
m_httpServer.HandleMsg(&msg); m_httpServer->HandleMsg(&msg);
} }
else if (3 == msg.svrId) else if (3 == msg.svrId)
{ {
m_sockIoServer.HandleMsg(&msg); m_sockIoServer->HandleMsg(&msg);
} }
} }
...@@ -123,5 +133,5 @@ void MsgLoop::Loop() ...@@ -123,5 +133,5 @@ void MsgLoop::Loop()
Manager* MsgLoop::GetManager() Manager* MsgLoop::GetManager()
{ {
return &m_manager; return m_manager;
} }
...@@ -26,10 +26,10 @@ private: ...@@ -26,10 +26,10 @@ private:
HGBool m_bRecvMsg; HGBool m_bRecvMsg;
std::list<WebMsg> m_listMsg; std::list<WebMsg> m_listMsg;
Manager m_manager; Manager *m_manager;
WebServer m_wsServer; WebServer *m_wsServer;
WebServer m_httpServer; WebServer *m_httpServer;
WebServer m_sockIoServer; WebServer *m_sockIoServer;
}; };
#endif /* __MSGLOOP_H__ */ #endif /* __MSGLOOP_H__ */
...@@ -77,6 +77,8 @@ void SockIoUser::HandleRet(const SockIoRetParam* param) ...@@ -77,6 +77,8 @@ void SockIoUser::HandleRet(const SockIoRetParam* param)
void SockIoUser::ThreadFunc() void SockIoUser::ThreadFunc()
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "SockIoUser::ThreadFunc");
char chBuffer[2048]; char chBuffer[2048];
const char* pBuffer = chBuffer; const char* pBuffer = chBuffer;
int nBufferSize = 0; int nBufferSize = 0;
......
...@@ -59,7 +59,7 @@ bool WebServer::Open(HGUShort port) ...@@ -59,7 +59,7 @@ bool WebServer::Open(HGUShort port)
if (-1 == sockServer) if (-1 == sockServer)
#endif #endif
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 1"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 1, port=%u", port);
return false; return false;
} }
...@@ -83,7 +83,7 @@ bool WebServer::Open(HGUShort port) ...@@ -83,7 +83,7 @@ bool WebServer::Open(HGUShort port)
#else #else
close(sockServer); close(sockServer);
#endif #endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 2"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 2, port=%u", port);
return false; return false;
} }
...@@ -95,26 +95,19 @@ bool WebServer::Open(HGUShort port) ...@@ -95,26 +95,19 @@ bool WebServer::Open(HGUShort port)
#else #else
close(sockServer); close(sockServer);
#endif #endif
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3"); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver failed 3, port=%u", port);
return false; return false;
} }
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);
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "open webserver success, port=%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
...@@ -124,6 +117,14 @@ bool WebServer::Close() ...@@ -124,6 +117,14 @@ bool WebServer::Close()
return false; 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) #if defined(HG_CMP_MSC)
closesocket(m_sockServer); closesocket(m_sockServer);
m_sockServer = INVALID_SOCKET; m_sockServer = INVALID_SOCKET;
...@@ -155,6 +156,9 @@ void WebServer::HandleMsg(const WebMsg* msg) ...@@ -155,6 +156,9 @@ void WebServer::HandleMsg(const WebMsg* msg)
else else
user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket); user = new SockIoUser(this, m_currUserId, param->ip, param->port, param->socket);
// 打开接收线程
user->Open();
++m_currUserId; ++m_currUserId;
m_vectorUser.push_back(user); m_vectorUser.push_back(user);
delete param; delete param;
......
#include "WebUser.h" #include "WebUser.h"
#include "WebServer.h" #include "WebServer.h"
#include "MsgLoop.h" #include "MsgLoop.h"
#include "../../base/HGInfo.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)
...@@ -15,8 +16,7 @@ WebUser::WebUser(class WebServer* server, HGUInt id, const char* ip, uint16_t po ...@@ -15,8 +16,7 @@ WebUser::WebUser(class WebServer* server, HGUInt id, const char* ip, uint16_t po
m_port = port; m_port = port;
m_sockConn = sockConn; m_sockConn = sockConn;
HGBase_OpenThread(ThreadFunc, this, &m_thread); m_thread = NULL;
assert(NULL != m_thread);
} }
WebUser::~WebUser() WebUser::~WebUser()
...@@ -38,6 +38,12 @@ WebUser::~WebUser() ...@@ -38,6 +38,12 @@ WebUser::~WebUser()
m_server = NULL; m_server = NULL;
} }
void WebUser::Open()
{
HGBase_OpenThread(ThreadFunc, this, &m_thread);
assert(NULL != m_thread);
}
HGUInt WebUser::GetId() HGUInt WebUser::GetId()
{ {
return m_id; return m_id;
...@@ -53,6 +59,11 @@ class Manager* WebUser::GetManager() ...@@ -53,6 +59,11 @@ class Manager* WebUser::GetManager()
return m_server->GetLoop()->GetManager(); return m_server->GetLoop()->GetManager();
} }
void WebUser::ThreadFunc()
{
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "WebUser::ThreadFunc");
}
void WebUser::ThreadFunc(HGThread thread, HGPointer param) void WebUser::ThreadFunc(HGThread thread, HGPointer param)
{ {
WebUser* p = (WebUser*)param; WebUser* p = (WebUser*)param;
......
...@@ -16,12 +16,13 @@ public: ...@@ -16,12 +16,13 @@ public:
#endif #endif
virtual ~WebUser(); virtual ~WebUser();
void Open();
HGUInt GetId(); HGUInt GetId();
class MsgLoop* GetLoop(); class MsgLoop* GetLoop();
class Manager* GetManager(); class Manager* GetManager();
protected: protected:
virtual void ThreadFunc() = 0; virtual void ThreadFunc();
private: private:
static void ThreadFunc(HGThread thread, HGPointer param); static void ThreadFunc(HGThread thread, HGPointer param);
......
...@@ -30,6 +30,8 @@ void WsUser::HandleCmd(const WsCmdParam* param) ...@@ -30,6 +30,8 @@ void WsUser::HandleCmd(const WsCmdParam* param)
void WsUser::ThreadFunc() void WsUser::ThreadFunc()
{ {
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "WsUser::ThreadFunc");
char chBuffer[2048]; char chBuffer[2048];
const char* pBuffer = chBuffer; const char* pBuffer = chBuffer;
int nBufferSize = 0; 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