HGGitLab
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
app
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
CI / CD Analytics
Repository Analytics
Value Stream Analytics
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
luoliangyi
app
Commits
8e4ed50b
Commit
8e4ed50b
authored
Apr 20, 2022
by
luoliangyi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
将消息队列独立成单独的类,三个服务共享同一个消息循环
parent
89dad333
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
373 additions
and
352 deletions
+373
-352
sdk/webservice/HttpUser.cpp
sdk/webservice/HttpUser.cpp
+34
-31
sdk/webservice/Manager.cpp
sdk/webservice/Manager.cpp
+94
-83
sdk/webservice/Manager.h
sdk/webservice/Manager.h
+9
-2
sdk/webservice/MsgLoop.cpp
sdk/webservice/MsgLoop.cpp
+55
-4
sdk/webservice/MsgLoop.h
sdk/webservice/MsgLoop.h
+8
-3
sdk/webservice/SockIoUser.cpp
sdk/webservice/SockIoUser.cpp
+43
-33
sdk/webservice/WebMsg.h
sdk/webservice/WebMsg.h
+15
-1
sdk/webservice/WebServer.cpp
sdk/webservice/WebServer.cpp
+43
-98
sdk/webservice/WebServer.h
sdk/webservice/WebServer.h
+14
-20
sdk/webservice/WebUser.cpp
sdk/webservice/WebUser.cpp
+11
-0
sdk/webservice/WebUser.h
sdk/webservice/WebUser.h
+2
-0
sdk/webservice/WsUser.cpp
sdk/webservice/WsUser.cpp
+34
-24
sdk/webservice/main.cpp
sdk/webservice/main.cpp
+11
-53
No files found.
sdk/webservice/HttpUser.cpp
View file @
8e4ed50b
#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
;
...
...
sdk/webservice/Manager.cpp
View file @
8e4ed50b
#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
;
}
...
...
sdk/webservice/Manager.h
View file @
8e4ed50b
...
...
@@ -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__ */
sdk/webservice/MsgLoop.cpp
View file @
8e4ed50b
#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
sdk/webservice/MsgLoop.h
View file @
8e4ed50b
...
...
@@ -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
sdk/webservice/SockIoUser.cpp
View file @
8e4ed50b
#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
;
...
...
sdk/webservice/WebMsg.h
View file @
8e4ed50b
...
...
@@ -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
sdk/webservice/WebServer.cpp
View file @
8e4ed50b
#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
->
us
e
rId
);
assert
(
0
==
msg
->
usrId
);
ConnectParam
*
param
=
(
ConnectParam
*
)
msg
->
param
;
assert
(
NULL
!=
param
);
WebUser
*
user
=
NULL
;
if
(
ServerType_Ws
==
m_
svrT
ype
)
user
=
new
WsUser
(
this
,
m_currId
,
param
->
ip
,
param
->
port
,
param
->
socket
);
else
if
(
ServerType_Http
==
m_
svrT
ype
)
user
=
new
HttpUser
(
this
,
m_currId
,
param
->
ip
,
param
->
port
,
param
->
socket
);
if
(
ServerType_Ws
==
m_
t
ype
)
user
=
new
WsUser
(
this
,
m_curr
User
Id
,
param
->
ip
,
param
->
port
,
param
->
socket
);
else
if
(
ServerType_Http
==
m_
t
ype
)
user
=
new
HttpUser
(
this
,
m_curr
User
Id
,
param
->
ip
,
param
->
port
,
param
->
socket
);
else
user
=
new
SockIoUser
(
this
,
m_currId
,
param
->
ip
,
param
->
port
,
param
->
socket
);
user
=
new
SockIoUser
(
this
,
m_curr
User
Id
,
param
->
ip
,
param
->
port
,
param
->
socket
);
++
m_currId
;
++
m_curr
User
Id
;
m_vectorUser
.
push_back
(
user
);
delete
param
;
}
else
if
(
WEB_MSGID_DISCONNET
==
msg
->
msgId
)
{
HGUInt
id
=
(
HGUInt
)
msg
->
us
e
rId
;
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
->
us
e
rId
;
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
->
us
e
rId
;
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
->
us
e
rId
;
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
->
us
e
rId
;
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
;
...
...
sdk/webservice/WebServer.h
View file @
8e4ed50b
...
...
@@ -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
...
...
sdk/webservice/WebUser.cpp
View file @
8e4ed50b
#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
;
...
...
sdk/webservice/WebUser.h
View file @
8e4ed50b
...
...
@@ -17,6 +17,8 @@ public:
virtual
~
WebUser
();
HGUInt
GetId
();
class
MsgLoop
*
GetLoop
();
class
Manager
*
GetManager
();
protected:
virtual
void
ThreadFunc
()
=
0
;
...
...
sdk/webservice/WsUser.cpp
View file @
8e4ed50b
#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
;
...
...
sdk/webservice/main.cpp
View file @
8e4ed50b
#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
();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment