CustMngrAuthFSM.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579
  1. #ifndef __CUSTMNGRAUTH_FSM_H
  2. #define __CUSTMNGRAUTH_FSM_H
  3. #pragma once
  4. #include "SpFSM.h"
  5. #include "SpSecureClient.h"
  6. #include "json/json.h"
  7. #include "CustMngrAuth_server_g.h"
  8. #include "CustMngrAuth_msg_g.h"
  9. #include "FingerPrint_client_g.h"
  10. #include "MaintainWatcher_client_g.h"
  11. #include "MaintainWatcher_msg_g.h"
  12. #include "DeviceControl_client_g.h"
  13. using namespace CustMngrAuth;
  14. using namespace MaintainWatcher;
  15. using namespace DeviceControl;
  16. using namespace FingerPrint;
  17. //下载特征库所调用的分行服务接口
  18. #pragma pack(1)
  19. struct FeatReq
  20. {
  21. char TerminalID[16];
  22. char BranchID[16];
  23. char CurrentAgent[16];
  24. char UpdateTime[20];
  25. };
  26. struct FeatReply
  27. {
  28. int ResultCode;
  29. char BranchID[16];
  30. char CurrentAgent[16];
  31. char Data[0];//no more than 45k
  32. };
  33. struct FeatureData{
  34. CAutoArray<CSimpleStringA> FingerIDArray;
  35. CAutoArray<int> FingerIDLenArray;
  36. };
  37. struct TemplateInfo{
  38. CSimpleStringA CustomerID;
  39. int TemplateNum;
  40. };
  41. struct MatchParams
  42. {
  43. FingerPrintService_Match_Req sMatchReq;
  44. FingerPrintService_Match_Ans sMatchAns;
  45. vector<TemplateInfo> sFingerCount;
  46. int sTotalNumOfTemplate; //Total Num of template which is not empty
  47. };
  48. #pragma pack()
  49. enum EvtType{
  50. USER_EVT_TEST = EVT_USER + 1,
  51. USER_EVT_QUIT,
  52. USER_EVT_INIT,
  53. USER_EVT_INIT_FINISHED,
  54. USER_EVT_AUTHORIZE_START,
  55. USER_EVT_AUTHORIZE_FINISHED,
  56. USER_EVT_AUTHORIZE_CANCEL,
  57. USER_EVT_COLLECTFINGERPRINT_START,
  58. USER_EVT_COLLECTFINGERPRINT_FINISHED,
  59. USER_EVT_COLLECTFINGERPRINT_CANCEL,
  60. USER_EVT_SAVEFINGERPRINT_START,
  61. USER_EVT_SAVEFINGERPRINT_FINISHED,
  62. USER_EVT_CHECKUKEY,
  63. USER_EVT_CHECKUKEY_FINISHED,
  64. USER_EVT_HOLDON,
  65. USER_EVT_EXIT,
  66. };
  67. enum AuthByWhich//授权结果
  68. {
  69. AuthByNone = 0,
  70. AuthByFngPrnt = 1,
  71. AuthByUkey = 2,
  72. };
  73. struct AuthContext
  74. {
  75. AuthByWhich eAuthByWhich;
  76. CSimpleStringA UkeyID;
  77. CSimpleStringA CustomerID;
  78. };
  79. class CCustMngrAuthEntity;
  80. class CCustMngrAuthFSM;
  81. class AuthorizeStartEvent : public FSMEvent
  82. {
  83. public:
  84. AuthorizeStartEvent() : FSMEvent(USER_EVT_AUTHORIZE_START){}
  85. ~AuthorizeStartEvent(){}
  86. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  87. virtual void OnUnhandled()
  88. {
  89. Dbg("authorize_start unhandled");
  90. }
  91. protected:
  92. private:
  93. };
  94. class AuthorizeFinishedEvent : public FSMEvent
  95. {
  96. public:
  97. AuthorizeFinishedEvent() : FSMEvent(USER_EVT_AUTHORIZE_FINISHED){}
  98. ~AuthorizeFinishedEvent(){}
  99. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  100. virtual void OnUnhandled()
  101. {
  102. Dbg("authorize_finished unhandled");
  103. }
  104. protected:
  105. private:
  106. };
  107. class AuthorizeCancelEvent : public FSMEvent
  108. {
  109. public:
  110. AuthorizeCancelEvent() : FSMEvent(USER_EVT_AUTHORIZE_CANCEL){}
  111. ~AuthorizeCancelEvent(){}
  112. SpReqAnsContext<CustMngrAuthService_StopAuthorize_Req, CustMngrAuthService_StopAuthorize_Ans>::Pointer ctx;
  113. virtual void OnUnhandled()
  114. {
  115. if (ctx!=NULL)
  116. {
  117. Dbg("authorize_cancel unhandled");
  118. ctx->Answer(Error_InvalidState);
  119. }
  120. Dbg("authorize_cancel unhandled");
  121. }
  122. protected:
  123. private:
  124. };
  125. class CollectFingerPrintStartEvent : public FSMEvent
  126. {
  127. public:
  128. CollectFingerPrintStartEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_START){}
  129. ~CollectFingerPrintStartEvent(){}
  130. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  131. virtual void OnUnhandled()
  132. {
  133. if (ctx!=NULL)
  134. {
  135. Dbg("collect_finger_print unhandled");
  136. ctx->Answer(Error_InvalidState);
  137. }
  138. }
  139. protected:
  140. private:
  141. };
  142. class CollectFingerPrintFinishedEvent : public FSMEvent
  143. {
  144. public:
  145. CollectFingerPrintFinishedEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_FINISHED){}
  146. ~CollectFingerPrintFinishedEvent(){}
  147. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  148. virtual void OnUnhandled()
  149. {
  150. if (ctx!=NULL)
  151. {
  152. Dbg("collect_finger_print_finished unhandled");
  153. ctx->Answer(Error_InvalidState);
  154. }
  155. }
  156. protected:
  157. private:
  158. };
  159. class CancelCollectFingerPrintEvent : public FSMEvent
  160. {
  161. public:
  162. CancelCollectFingerPrintEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_CANCEL){}
  163. ~CancelCollectFingerPrintEvent(){}
  164. virtual void OnUnhandled()
  165. {
  166. Dbg("cancel collect fingerprint unhandled");
  167. }
  168. };
  169. class SaveFingerPrintStartEvent : public FSMEvent
  170. {
  171. public:
  172. SaveFingerPrintStartEvent() : FSMEvent(USER_EVT_SAVEFINGERPRINT_START){}
  173. ~SaveFingerPrintStartEvent(){}
  174. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  175. virtual void OnUnhandled(){
  176. if (ctx!=NULL)
  177. {
  178. Dbg("save_finger_print_start unhandled");
  179. ctx->Answer(Error_InvalidState);
  180. }
  181. }
  182. };
  183. class SaveFingerPrintFinishedEvent : public FSMEvent
  184. {
  185. public:
  186. SaveFingerPrintFinishedEvent() : FSMEvent(USER_EVT_SAVEFINGERPRINT_FINISHED){}
  187. ~SaveFingerPrintFinishedEvent(){}
  188. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  189. virtual void OnUnhandled(){
  190. if (ctx!=NULL)
  191. {
  192. Dbg("save_finger_print_finished unhandled");
  193. ctx->Answer(Error_InvalidState);
  194. }
  195. }
  196. };
  197. class CheckUkeyEvent : public FSMEvent
  198. {
  199. public:
  200. CheckUkeyEvent() : FSMEvent(USER_EVT_CHECKUKEY){}
  201. ~CheckUkeyEvent(){}
  202. virtual void OnUnhandled()
  203. {
  204. Dbg("check_ukey unhandled");
  205. }
  206. };
  207. class CheckUkeyFinishedEvent : public FSMEvent
  208. {
  209. public:
  210. CheckUkeyFinishedEvent() : FSMEvent(USER_EVT_CHECKUKEY_FINISHED){}
  211. ~CheckUkeyFinishedEvent(){}
  212. virtual void OnUnhandled()
  213. {
  214. Dbg("check_ukey_finished unhandled");
  215. }
  216. };
  217. class HoldOnEvent : public FSMEvent
  218. {
  219. public:
  220. HoldOnEvent() : FSMEvent(USER_EVT_HOLDON){}
  221. ~HoldOnEvent(){}
  222. SpReqAnsContext<CustMngrAuthService_HoldOn_Req, CustMngrAuthService_HoldOn_Ans>::Pointer ctx;
  223. virtual void OnUnhandled(){
  224. if (ctx!=NULL)
  225. {
  226. Dbg("holdon unhandled");
  227. ctx->Answer(Error_InvalidState);
  228. }
  229. }
  230. };
  231. class FeatureUpdateConn;
  232. class CCustMngrAuthFSM : public FSMImpl<CCustMngrAuthFSM>
  233. {
  234. public:
  235. enum { s0, s1, s2, s3, s4, s5};
  236. BEGIN_FSM_STATE(CCustMngrAuthFSM)
  237. FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
  238. FSM_STATE_ENTRY(s1, "Initializing", s1_on_entry, s1_on_exit, s1_on_event)
  239. FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event)
  240. FSM_STATE_ENTRY(s3, "Authorizing", s3_on_entry, s3_on_exit, s3_on_event)
  241. FSM_STATE_ENTRY(s4, "Registering", s4_on_entry, s4_on_exit, s4_on_event)
  242. FSM_STATE_ENTRY(s5, "Failed", s5_on_entry, s5_on_exit, s5_on_event)
  243. END_FSM_STATE()
  244. BEGIN_FSM_RULE(CCustMngrAuthFSM, s0)
  245. FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0)//oiltest?
  246. FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT, 0)
  247. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  248. FSM_RULE_ENTRY(s1, s2, USER_EVT_INIT_FINISHED, 0)
  249. FSM_RULE_ENTRY(s1, s5, USER_EVT_INIT_FINISHED, 1)
  250. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  251. FSM_RULE_ENTRY(s2, s3, USER_EVT_AUTHORIZE_START, 0)
  252. FSM_RULE_ENTRY(s2, s4, USER_EVT_COLLECTFINGERPRINT_START, 0)
  253. FSM_RULE_ENTRY(s2, s4, USER_EVT_CHECKUKEY, 0)
  254. FSM_RULE_ENTRY(s2, s4, USER_EVT_SAVEFINGERPRINT_START, 0)
  255. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  256. FSM_RULE_ENTRY(s3, s2, USER_EVT_EXIT, 0)
  257. FSM_RULE_ENTRY(s3, s2, USER_EVT_AUTHORIZE_FINISHED, 0)
  258. //FSM_RULE_ENTRY(s3, s2, USER_EVT_AUTHORIZE_CANCEL, 0)
  259. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINT_START, 0)
  260. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINT_FINISHED, 0)
  261. //FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINT_CANCEL, 0)
  262. FSM_RULE_ENTRY(s4, s2, USER_EVT_SAVEFINGERPRINT_FINISHED, 0)
  263. FSM_RULE_ENTRY(s4, s2, USER_EVT_CHECKUKEY_FINISHED, 0)
  264. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  265. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  266. END_FSM_RULE()
  267. CCustMngrAuthFSM(): m_pMaintainWatcher(NULL), m_pFingerPrint(NULL), m_pDeviceControl(NULL), m_bCancelCollectFP(false)
  268. , m_bCancelAuthorize(false), m_bAuthorizeTimeout(false) {
  269. hStopUpdate = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  270. m_TimeLimit = 55;//默认授权超时秒数
  271. m_ctx = NULL;
  272. InitializeCriticalSection(&m_cs);
  273. }
  274. ~CCustMngrAuthFSM(){
  275. DeleteCriticalSection(&m_cs);
  276. }
  277. virtual ErrorCodeEnum OnInit();
  278. virtual ErrorCodeEnum OnExit();
  279. void s0_on_entry();
  280. void s0_on_exit();
  281. unsigned int s0_on_event(FSMEvent* event);
  282. void s1_on_entry();
  283. void s1_on_exit();
  284. unsigned int s1_on_event(FSMEvent* event);
  285. void s2_on_entry();
  286. void s2_on_exit();
  287. unsigned int s2_on_event(FSMEvent* event);
  288. void s3_on_entry();
  289. void s3_on_exit();
  290. unsigned int s3_on_event(FSMEvent* event);
  291. void s4_on_entry();
  292. void s4_on_exit();
  293. unsigned int s4_on_event(FSMEvent* event);
  294. void s5_on_entry();
  295. void s5_on_exit();
  296. unsigned int s5_on_event(FSMEvent* event);
  297. HANDLE hStopUpdate;
  298. int Initial();
  299. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer m_ctx;
  300. AuthContext m_authCtx;
  301. CSimpleStringA m_TerminalID;
  302. CSimpleStringA m_csMachineType;
  303. ErrorCodeEnum MatchFingerPrint(SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx, bool& bStopAuthorize);
  304. ErrorCodeEnum WaitForUkey(ErrorCodeEnum eErr);
  305. void CancelAuthorize();
  306. void FeatureUpdate();
  307. ErrorCodeEnum CollectFingerPrint(SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx, DWORD& dwUserErrCode);
  308. ErrorCodeEnum GetImgBlob(CBlob &data, CSimpleStringA imgPath);
  309. void BroadcastPressFinger(int times, bool bPressFinger);
  310. ErrorCodeEnum SwitchUSB(bool bOpen);
  311. ErrorCodeEnum SaveFingerPrint(SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx);
  312. int CompareTime(CSimpleStringA time1, CSimpleStringA time2);
  313. int CompareUpdateTime(const char* time1, const char* time2);
  314. int RecoverFile(CSimpleStringA nowFileName, CSimpleStringA backupFileName);
  315. bool ReadDataIntoMemory(bool& bHasData);
  316. void UpdateDataIntoMemory(map<CSimpleStringA, FeatureData*> tempFeature, bool bIsFirstTimeQueryData);
  317. string ClearStringSpaceHeadTail(string& line);
  318. CSimpleStringA GetCurrentDate();
  319. void TransDataFromServer(CAutoArray<CSimpleStringA> &dataArray, CSimpleStringA latestTime, bool& bResumeTrans, bool bIsFirstTimeQueryData);
  320. bool BackupFile(CSimpleStringA srcFile, CSimpleStringA dstFile);
  321. CSimpleStringA GetMaxTime(CSimpleStringA maxTime, CSimpleStringA tempTime);
  322. CSimpleString GenerateAlarmJson(CSimpleString entityName, int cost);
  323. void BroadcastGetFinger(int status);
  324. void InitBeforeUpdateData();
  325. ErrorCodeEnum InitBeforeMatch();
  326. ErrorCodeEnum PrepareDataBeforeMatch(MatchParams *matchParam);
  327. ErrorCodeEnum MatchProcess(MatchParams* matchParam, bool& bStopAuthorize);
  328. ErrorCodeEnum AnalyzeMatchResult(MatchParams* matchParam, bool& bStopAuthorize);
  329. private:
  330. DeviceControlService_ClientBase *m_pDeviceControl;
  331. FingerPrintService_ClientBase *m_pFingerPrint;
  332. MaintainCertificate_ClientBase *m_pMaintainWatcher;
  333. FeatureUpdateConn *m_pConnection;//中台连接
  334. CSimpleStringA m_FingerSection;
  335. CSimpleStringA m_RunInfoPath;
  336. bool m_bCancelCollectFP, m_bCancelAuthorize, m_bAuthorizeTimeout;
  337. int m_TimeLimit;
  338. map<CSimpleStringA, FeatureData*> m_featureData;
  339. CRITICAL_SECTION m_cs;//临界区变量
  340. };
  341. class FeatureUpdateConn : public SpSecureClient
  342. {
  343. public:
  344. FeatureUpdateConn(CEntityBase *pEntity, CCustMngrAuthFSM *pFSM) : SpSecureClient(pEntity)
  345. {
  346. m_pFSM = pFSM;
  347. m_jsonLen = 0;
  348. m_GetErrMsg = false;
  349. m_reply = NULL;
  350. m_hPkgAnswer = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  351. }
  352. virtual ~FeatureUpdateConn() {}
  353. virtual void OnDisconnect()
  354. {
  355. Dbg("FeatureUpdateConnection disconnected");
  356. }
  357. void SendFeatReq(const char* currAgent, const char* branchID, const char* lastTime = NULL)
  358. {
  359. m_reply = NULL;
  360. m_jsonLen = 0;
  361. FeatReq req = { 0 };
  362. memcpy(req.BranchID, branchID, 16);
  363. memcpy(req.CurrentAgent, currAgent, 16);//续传标志(代表已查到的最后一个客户经理
  364. if (lastTime != NULL)
  365. {
  366. memcpy(req.UpdateTime, lastTime, 20);//本地指纹数据最新时间
  367. Dbg("req.UpdateTime:%s", req.UpdateTime);
  368. }
  369. #ifdef RVC_OS_WIN
  370. strncpy_s(req.TerminalID, sizeof(req.TerminalID), m_pFSM->m_TerminalID, _TRUNCATE);
  371. #else
  372. strncpy(req.TerminalID, m_pFSM->m_TerminalID, _TRUNCATE);
  373. #endif // RVC_OS_WIN
  374. CSmartPointer<IPackage> pkt = CreateNewPackage("FETQYREQ");
  375. pkt->AddStruct("FETQYREQ", false, false, (LPBYTE)&req, sizeof(FeatReq));
  376. SendPackage(pkt);
  377. }
  378. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  379. {
  380. DWORD dwSysCode, dwUserCode;
  381. string errMsg;
  382. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, errMsg))
  383. {
  384. string serviceCode = pRecvPkg->GetServiceCode();
  385. Dbg("receive %s ans packet is error, errormsg is %s", serviceCode.c_str(), errMsg.c_str());
  386. m_GetErrMsg = true;
  387. SetEvent(m_hPkgAnswer);
  388. }else{
  389. //判断result接受buff,resultcode判断,
  390. Dbg("pRecvPkg get no errormessage.");
  391. string serviceCode = pRecvPkg->GetServiceCode();
  392. if (serviceCode == "FETQYREQ")
  393. {
  394. int dataLen = pRecvPkg->GetStructLen("FETQYANS");
  395. if (dataLen > 0 )
  396. {
  397. Dbg("GetStructData structlen: %d", dataLen);
  398. BYTE *pBuf = new BYTE[dataLen];
  399. memset(pBuf, 0, dataLen);
  400. int arrayNum = 0;
  401. if (pRecvPkg->GetStructData("FETQYANS", pBuf, &dataLen, &arrayNum))
  402. {
  403. LPBYTE pData = new BYTE[dataLen +1];
  404. memcpy(pData, pBuf, dataLen);
  405. m_reply = (FeatReply*)pData;
  406. if (m_reply != NULL)
  407. {
  408. pData[dataLen] = 0;
  409. m_jsonLen = dataLen - sizeof(FeatReply);
  410. }else
  411. Dbg("ERROR: m_reply is null!");
  412. }else
  413. Dbg("ERROR: getstructdata(FETQYANS) failed!");
  414. delete pBuf;
  415. }else
  416. Dbg("ERROR: getstructlen(FETQYANS) = 0!");
  417. //设m_pEvt为已通知,使下载线程从挂起中恢复,再设为未通知
  418. //isTimeOut = false;
  419. SetEvent(m_hPkgAnswer);
  420. }else
  421. Dbg("ERROR: wrong service code!");
  422. }
  423. }
  424. private:
  425. CCustMngrAuthFSM *m_pFSM;
  426. public:
  427. HANDLE m_hPkgAnswer;
  428. bool m_GetErrMsg;
  429. FeatReply* m_reply;
  430. int m_jsonLen;
  431. };
  432. //初始化:检查、配置路径、起特征更新任务
  433. struct InitTask : public ITaskSp
  434. {
  435. CCustMngrAuthFSM *fsm;
  436. InitTask(CCustMngrAuthFSM *f) : fsm(f) {}
  437. void Process()
  438. {
  439. LOG_FUNCTION();
  440. FSMEvent *e = new FSMEvent(USER_EVT_INIT_FINISHED);
  441. e->param1 = fsm->Initial();
  442. fsm->PostEventFIFO(e);
  443. }
  444. };
  445. //特征定期更新
  446. struct FeatureUpdateTask : public ITaskSp
  447. {
  448. CCustMngrAuthFSM *fsm;
  449. FeatureUpdateTask(CCustMngrAuthFSM *f) : fsm(f) {}
  450. void Process()
  451. {
  452. LOG_FUNCTION();
  453. fsm->FeatureUpdate();
  454. }
  455. };
  456. //调用指纹匹配服务,阻塞等待返回
  457. struct MatchFingerPrintTask : public ITaskSp
  458. {
  459. CCustMngrAuthFSM *fsm;
  460. MatchFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f) {}
  461. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  462. void Process()
  463. {
  464. bool bStopAuthorize = false;
  465. ErrorCodeEnum eErr = fsm->MatchFingerPrint(ctx, bStopAuthorize);
  466. if (bStopAuthorize)
  467. {
  468. AuthorizeFinishedEvent *e = new AuthorizeFinishedEvent();
  469. e->ctx = ctx;
  470. e->param1 = eErr;
  471. fsm->PostEventFIFO(e);//指纹匹配结束,结束授权
  472. }
  473. else
  474. {
  475. AuthorizeFinishedEvent *e = new AuthorizeFinishedEvent();
  476. e->ctx = ctx;
  477. e->param1 = fsm->WaitForUkey(eErr);
  478. fsm->PostEventFIFO(e);//指纹匹配异常停止,继续等到超时或ukey插入结束授权,如果是ukey插入,这个event就不会被处理
  479. }
  480. }
  481. };
  482. //采集指纹
  483. struct CollectFingerPrintTask : public ITaskSp
  484. {
  485. CCustMngrAuthFSM *fsm;
  486. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  487. CollectFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f){}
  488. void Process()
  489. {
  490. LOG_FUNCTION();
  491. CollectFingerPrintFinishedEvent *e = new CollectFingerPrintFinishedEvent();
  492. e->ctx = ctx;
  493. DWORD dwUserErrorCode = 0;
  494. ErrorCodeEnum eErr = fsm->CollectFingerPrint(ctx, dwUserErrorCode);
  495. if(eErr == Error_Unexpect && dwUserErrorCode > 0)
  496. ctx->Answer(eErr, dwUserErrorCode);
  497. else
  498. ctx->Answer(eErr);
  499. fsm->PostEventFIFO(e);
  500. }
  501. };
  502. struct SaveFingerPrintTask : public ITaskSp
  503. {
  504. CCustMngrAuthFSM *fsm;
  505. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  506. SaveFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f) {}
  507. void Process()
  508. {
  509. LOG_FUNCTION();
  510. SaveFingerPrintFinishedEvent *e = new SaveFingerPrintFinishedEvent();
  511. e->ctx = ctx;
  512. ErrorCodeEnum eErr = fsm->SaveFingerPrint(ctx);
  513. ctx->Answer(eErr);
  514. fsm->PostEventFIFO(e);
  515. }
  516. };
  517. #endif //__CUSTMNGRAUTH_FSM_H