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" />
......
......@@ -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)
{
......@@ -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;
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__ */
......@@ -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;
......
......@@ -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,6 +59,11 @@ 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;
......
......@@ -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);
......
......@@ -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