CustMngrAuthFSM.h 17 KB

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