CustMngrAuthFSM.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891
  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_QUERYAUTHORINFO,
  80. USER_EVT_QUERYAUTHORINFO_FINISHED,
  81. USER_EVT_QUERYAUTHORINFO_CANCEL,
  82. USER_EVT_COLLECTFINGERPRINT_START,
  83. USER_EVT_COLLECTFINGERPRINTEX_START,
  84. USER_EVT_COLLECTFINGERPRINTINFO,
  85. USER_EVT_GENERATE_TEMPLATE,
  86. USER_EVT_GENERATE_TEMPLATE_FINISHED,
  87. USER_EVT_COLLECTFINGERPRINT_FINISHED,
  88. USER_EVT_COLLECTFINGERPRINTEX_FINISHED,
  89. USER_EVT_COLLECTFINGERPRINTINFO_FINISHED,
  90. USER_EVT_COLLECTFINGERPRINT_CANCEL,
  91. USER_EVT_COLLECTFINGERPRINTEX_CANCEL,
  92. USER_EVT_SAVEFINGERPRINT_START,
  93. USER_EVT_SAVEFINGERPRINT_FINISHED,
  94. USER_EVT_CHECKUKEY,
  95. USER_EVT_CHECKUKEY_FINISHED,
  96. USER_EVT_HOLDON,
  97. USER_EVT_EXIT,
  98. };
  99. enum AuthByWhich//授权结果
  100. {
  101. AuthByNone = 0,
  102. AuthByFngPrnt = 1,
  103. AuthByUkey = 2,
  104. };
  105. enum BmpType
  106. {
  107. BmpImage = 1,
  108. TestImage
  109. };
  110. struct AuthContext
  111. {
  112. AuthByWhich eAuthByWhich;
  113. CSimpleStringA UkeyID;
  114. CSimpleStringA CustomerID;
  115. CSimpleStringA Feature;
  116. CBlob FingerImg;
  117. };
  118. class CCustMngrAuthEntity;
  119. class CCustMngrAuthFSM;
  120. class AuthorizeStartEvent : public FSMEvent
  121. {
  122. public:
  123. AuthorizeStartEvent() : FSMEvent(USER_EVT_AUTHORIZE_START){}
  124. ~AuthorizeStartEvent(){}
  125. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  126. virtual void OnUnhandled()
  127. {
  128. if (ctx != NULL)
  129. {
  130. Dbg("authorize_start unhandled");
  131. ctx->Answer(Error_InvalidState);
  132. }
  133. }
  134. protected:
  135. private:
  136. };
  137. class AuthorizeCancelExEvent : public FSMEvent
  138. {
  139. public:
  140. AuthorizeCancelExEvent() : FSMEvent(USER_EVT_QUERYAUTHORINFO_CANCEL) {}
  141. ~AuthorizeCancelExEvent() {}
  142. SpReqAnsContext<CustMngrAuthService_StopAuthorizeEx_Req, CustMngrAuthService_StopAuthorizeEx_Ans>::Pointer ctx;
  143. virtual void OnUnhandled()
  144. {
  145. if (ctx != NULL)
  146. {
  147. Dbg("cancel QueryAuthorInfo unhandled");
  148. }
  149. }
  150. protected:
  151. private:
  152. };
  153. class AuthorizeFinishedEvent : public FSMEvent
  154. {
  155. public:
  156. AuthorizeFinishedEvent() : FSMEvent(USER_EVT_AUTHORIZE_FINISHED){}
  157. ~AuthorizeFinishedEvent(){}
  158. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  159. virtual void OnUnhandled()
  160. {
  161. if (ctx != NULL)
  162. {
  163. Dbg("authorize_finished unhandled");
  164. }
  165. }
  166. protected:
  167. private:
  168. };
  169. class AuthorizeCancelEvent : public FSMEvent
  170. {
  171. public:
  172. AuthorizeCancelEvent() : FSMEvent(USER_EVT_AUTHORIZE_CANCEL){}
  173. ~AuthorizeCancelEvent(){}
  174. SpReqAnsContext<CustMngrAuthService_StopAuthorize_Req, CustMngrAuthService_StopAuthorize_Ans>::Pointer ctx;
  175. virtual void OnUnhandled()
  176. {
  177. if (ctx != NULL)
  178. {
  179. Dbg("authorize_cancel unhandled");
  180. ctx->Answer(Error_InvalidState);
  181. }
  182. }
  183. protected:
  184. private:
  185. };
  186. class QueryAuthorInfoEvent : public FSMEvent
  187. {
  188. public:
  189. QueryAuthorInfoEvent() : FSMEvent(USER_EVT_QUERYAUTHORINFO) {}
  190. ~QueryAuthorInfoEvent() {}
  191. SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer ctx;
  192. virtual void OnUnhandled()
  193. {
  194. if (ctx != NULL)
  195. {
  196. Dbg("QueryAuthorInfo unhandled");
  197. ctx->Answer(Error_InvalidState);
  198. }
  199. }
  200. protected:
  201. private:
  202. };
  203. class QueryAuthorInfoFinishedEvent : public FSMEvent
  204. {
  205. public:
  206. QueryAuthorInfoFinishedEvent() : FSMEvent(USER_EVT_QUERYAUTHORINFO_FINISHED) {}
  207. ~QueryAuthorInfoFinishedEvent() {}
  208. SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer ctx;
  209. virtual void OnUnhandled()
  210. {
  211. if (ctx != NULL)
  212. {
  213. Dbg("QueryAuthorInfo_finished unhandled");
  214. }
  215. }
  216. protected:
  217. private:
  218. };
  219. class CollectFingerPrintStartEvent : public FSMEvent
  220. {
  221. public:
  222. CollectFingerPrintStartEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_START){}
  223. ~CollectFingerPrintStartEvent(){}
  224. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  225. virtual void OnUnhandled()
  226. {
  227. if (ctx!=NULL)
  228. {
  229. Dbg("collect_finger_print unhandled");
  230. ctx->Answer(Error_InvalidState);
  231. }
  232. }
  233. };
  234. class CollectFingerPrintExStartEvent : public FSMEvent
  235. {
  236. public:
  237. CollectFingerPrintExStartEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINTEX_START) {}
  238. ~CollectFingerPrintExStartEvent() {}
  239. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintEx_Req, CustMngrAuthService_CollectFingerPrintEx_Ans>::Pointer ctx;
  240. virtual void OnUnhandled()
  241. {
  242. if (ctx != NULL)
  243. {
  244. Dbg("collect_fingerEx_print unhandled");
  245. ctx->Answer(Error_InvalidState);
  246. }
  247. }
  248. protected:
  249. private:
  250. };
  251. class CollectFingerPrintInfoEvent : public FSMEvent
  252. {
  253. public:
  254. CollectFingerPrintInfoEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINTINFO) {}
  255. ~CollectFingerPrintInfoEvent() {}
  256. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintInfo_Req, CustMngrAuthService_CollectFingerPrintInfo_Ans>::Pointer ctx;
  257. virtual void OnUnhandled()
  258. {
  259. if (ctx != NULL)
  260. {
  261. Dbg("Collect FingerPrint info unhandled");
  262. ctx->Answer(Error_InvalidState);
  263. }
  264. }
  265. protected:
  266. private:
  267. };
  268. class GenerateTemplateEvent : public FSMEvent
  269. {
  270. public:
  271. GenerateTemplateEvent() : FSMEvent(USER_EVT_GENERATE_TEMPLATE) {}
  272. ~GenerateTemplateEvent() {}
  273. SpReqAnsContext<CustMngrAuthService_GenerateTemplate_Req, CustMngrAuthService_GenerateTemplate_Ans>::Pointer ctx;
  274. virtual void OnUnhandled()
  275. {
  276. if (ctx != NULL)
  277. {
  278. Dbg("Generate Template unhandled");
  279. ctx->Answer(Error_InvalidState);
  280. }
  281. }
  282. protected:
  283. private:
  284. };
  285. class CollectFingerPrintFinishedEvent : public FSMEvent
  286. {
  287. public:
  288. CollectFingerPrintFinishedEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_FINISHED){}
  289. ~CollectFingerPrintFinishedEvent(){}
  290. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  291. virtual void OnUnhandled()
  292. {
  293. if (ctx!=NULL)
  294. {
  295. Dbg("collect_finger_print_finished unhandled");
  296. }
  297. }
  298. protected:
  299. private:
  300. };
  301. class CollectFingerPrintExFinishedEvent : public FSMEvent
  302. {
  303. public:
  304. CollectFingerPrintExFinishedEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINTEX_FINISHED) {}
  305. ~CollectFingerPrintExFinishedEvent() {}
  306. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintEx_Req, CustMngrAuthService_CollectFingerPrintEx_Ans>::Pointer ctx;
  307. virtual void OnUnhandled()
  308. {
  309. if (ctx != NULL)
  310. {
  311. Dbg("collect_finger_printEx_finished unhandled");
  312. }
  313. }
  314. protected:
  315. private:
  316. };
  317. class CollectFingerPrintInfoFinishedEvent : public FSMEvent
  318. {
  319. public:
  320. CollectFingerPrintInfoFinishedEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINTINFO_FINISHED) {}
  321. ~CollectFingerPrintInfoFinishedEvent() {}
  322. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintInfo_Req, CustMngrAuthService_CollectFingerPrintInfo_Ans>::Pointer ctx;
  323. virtual void OnUnhandled()
  324. {
  325. if (ctx != NULL)
  326. {
  327. Dbg("Collect FingerPrint Info finished unhandled");
  328. }
  329. }
  330. protected:
  331. private:
  332. };
  333. class GenerateTemplateFinishedEvent : public FSMEvent
  334. {
  335. public:
  336. GenerateTemplateFinishedEvent() : FSMEvent(USER_EVT_GENERATE_TEMPLATE_FINISHED) {}
  337. ~GenerateTemplateFinishedEvent() {}
  338. SpReqAnsContext<CustMngrAuthService_GenerateTemplate_Req, CustMngrAuthService_GenerateTemplate_Ans>::Pointer ctx;
  339. virtual void OnUnhandled()
  340. {
  341. if (ctx != NULL)
  342. {
  343. Dbg("Generate Template finished unhandled");
  344. }
  345. }
  346. protected:
  347. private:
  348. };
  349. class CancelCollectFingerPrintEvent : public FSMEvent
  350. {
  351. public:
  352. CancelCollectFingerPrintEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINT_CANCEL){}
  353. ~CancelCollectFingerPrintEvent(){}
  354. virtual void OnUnhandled()
  355. {
  356. Dbg("cancel collect fingerprint unhandled");
  357. }
  358. };
  359. class CancelCollectFingerPrintExEvent : public FSMEvent
  360. {
  361. public:
  362. CancelCollectFingerPrintExEvent() : FSMEvent(USER_EVT_COLLECTFINGERPRINTEX_CANCEL) {}
  363. ~CancelCollectFingerPrintExEvent() {}
  364. virtual void OnUnhandled()
  365. {
  366. Dbg("cancel collect fingerprintEx unhandled");
  367. }
  368. };
  369. class SaveFingerPrintStartEvent : public FSMEvent
  370. {
  371. public:
  372. SaveFingerPrintStartEvent() : FSMEvent(USER_EVT_SAVEFINGERPRINT_START){}
  373. ~SaveFingerPrintStartEvent(){}
  374. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  375. virtual void OnUnhandled(){
  376. if (ctx!=NULL)
  377. {
  378. Dbg("save_finger_print_start unhandled");
  379. ctx->Answer(Error_InvalidState);
  380. }
  381. }
  382. };
  383. class SaveFingerPrintFinishedEvent : public FSMEvent
  384. {
  385. public:
  386. SaveFingerPrintFinishedEvent() : FSMEvent(USER_EVT_SAVEFINGERPRINT_FINISHED){}
  387. ~SaveFingerPrintFinishedEvent(){}
  388. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  389. virtual void OnUnhandled(){
  390. if (ctx!=NULL)
  391. {
  392. Dbg("save_finger_print_finished unhandled");
  393. }
  394. }
  395. };
  396. class CheckUkeyEvent : public FSMEvent
  397. {
  398. public:
  399. CheckUkeyEvent() : FSMEvent(USER_EVT_CHECKUKEY){}
  400. ~CheckUkeyEvent(){}
  401. virtual void OnUnhandled()
  402. {
  403. Dbg("check_ukey unhandled");
  404. }
  405. };
  406. class CheckUkeyFinishedEvent : public FSMEvent
  407. {
  408. public:
  409. CheckUkeyFinishedEvent() : FSMEvent(USER_EVT_CHECKUKEY_FINISHED){}
  410. ~CheckUkeyFinishedEvent(){}
  411. virtual void OnUnhandled()
  412. {
  413. Dbg("check_ukey_finished unhandled");
  414. }
  415. };
  416. class HoldOnEvent : public FSMEvent
  417. {
  418. public:
  419. HoldOnEvent() : FSMEvent(USER_EVT_HOLDON){}
  420. ~HoldOnEvent(){}
  421. SpReqAnsContext<CustMngrAuthService_HoldOn_Req, CustMngrAuthService_HoldOn_Ans>::Pointer ctx;
  422. virtual void OnUnhandled(){
  423. if (ctx!=NULL)
  424. {
  425. Dbg("holdon unhandled");
  426. ctx->Answer(Error_InvalidState);
  427. }
  428. }
  429. };
  430. class FeatureUpdateConn;
  431. class CCustMngrAuthFSM : public FSMImpl<CCustMngrAuthFSM>
  432. {
  433. public:
  434. enum { s0, s1, s2, s3, s4, s5};
  435. BEGIN_FSM_STATE(CCustMngrAuthFSM)
  436. FSM_STATE_ENTRY(s0, "Init", s0_on_entry, s0_on_exit, s0_on_event)
  437. FSM_STATE_ENTRY(s1, "Initializing", s1_on_entry, s1_on_exit, s1_on_event)
  438. FSM_STATE_ENTRY(s2, "Idle", s2_on_entry, s2_on_exit, s2_on_event)
  439. FSM_STATE_ENTRY(s3, "Authorizing", s3_on_entry, s3_on_exit, s3_on_event)
  440. FSM_STATE_ENTRY(s4, "Registering", s4_on_entry, s4_on_exit, s4_on_event)
  441. FSM_STATE_ENTRY(s5, "Failed", s5_on_entry, s5_on_exit, s5_on_event)
  442. END_FSM_STATE()
  443. BEGIN_FSM_RULE(CCustMngrAuthFSM, s0)
  444. FSM_RULE_ENTRY(s0, s2, USER_EVT_TEST, 0)
  445. FSM_RULE_ENTRY(s0, s1, USER_EVT_INIT, 0)
  446. FSM_RULE_ENTRY(s0, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  447. FSM_RULE_ENTRY(s1, s2, USER_EVT_INIT_FINISHED, 0)
  448. FSM_RULE_ENTRY(s1, s5, USER_EVT_INIT_FINISHED, 1)
  449. FSM_RULE_ENTRY(s1, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  450. FSM_RULE_ENTRY(s2, s3, USER_EVT_AUTHORIZE_START, 0)
  451. FSM_RULE_ENTRY(s2, s3, USER_EVT_QUERYAUTHORINFO, 0)
  452. FSM_RULE_ENTRY(s2, s4, USER_EVT_COLLECTFINGERPRINT_START, 0)
  453. FSM_RULE_ENTRY(s2, s4, USER_EVT_COLLECTFINGERPRINTEX_START, 0)
  454. FSM_RULE_ENTRY(s2, s4, USER_EVT_COLLECTFINGERPRINTINFO, 0)
  455. FSM_RULE_ENTRY(s2, s4, USER_EVT_GENERATE_TEMPLATE, 0)
  456. FSM_RULE_ENTRY(s2, s4, USER_EVT_CHECKUKEY, 0)
  457. FSM_RULE_ENTRY(s2, s4, USER_EVT_SAVEFINGERPRINT_START, 0)
  458. FSM_RULE_ENTRY(s2, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  459. FSM_RULE_ENTRY(s3, s2, USER_EVT_EXIT, 0)
  460. FSM_RULE_ENTRY(s3, s2, USER_EVT_AUTHORIZE_FINISHED, 0)
  461. FSM_RULE_ENTRY(s3, s2, USER_EVT_QUERYAUTHORINFO_FINISHED, 0)
  462. FSM_RULE_ENTRY(s3, s2, EVT_TIMER, 0)
  463. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINT_START, 0)
  464. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINTEX_START, 0)
  465. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINT_FINISHED, 0)
  466. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINTEX_FINISHED, 0)
  467. FSM_RULE_ENTRY(s4, s2, USER_EVT_COLLECTFINGERPRINTINFO_FINISHED, 0)
  468. FSM_RULE_ENTRY(s4, s2, USER_EVT_GENERATE_TEMPLATE_FINISHED, 0)
  469. FSM_RULE_ENTRY(s4, s2, USER_EVT_SAVEFINGERPRINT_FINISHED, 0)
  470. FSM_RULE_ENTRY(s4, s2, USER_EVT_CHECKUKEY_FINISHED, 0)
  471. FSM_RULE_ENTRY(s3, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  472. FSM_RULE_ENTRY(s5, FSM_STATE_EXIT, USER_EVT_QUIT, 0)
  473. END_FSM_RULE()
  474. CCustMngrAuthFSM(): m_pMaintainWatcher(NULL), m_pFingerPrint(NULL), m_pDeviceControl(NULL), m_bCancelCollectFP(false)
  475. , m_bCancelAuthorize(false), m_bAuthorizeTimeout(false) {
  476. hStopUpdate = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  477. m_TimeLimit = 55;//默认授权超时秒数
  478. m_ctx = NULL;
  479. InitializeCriticalSection(&m_cs);
  480. }
  481. ~CCustMngrAuthFSM(){
  482. DeleteCriticalSection(&m_cs);
  483. }
  484. virtual ErrorCodeEnum OnInit();
  485. virtual ErrorCodeEnum OnExit();
  486. void s0_on_entry();
  487. void s0_on_exit();
  488. unsigned int s0_on_event(FSMEvent* event);
  489. void s1_on_entry();
  490. void s1_on_exit();
  491. unsigned int s1_on_event(FSMEvent* event);
  492. void s2_on_entry();
  493. void s2_on_exit();
  494. unsigned int s2_on_event(FSMEvent* event);
  495. void s3_on_entry();
  496. void s3_on_exit();
  497. unsigned int s3_on_event(FSMEvent* event);
  498. void s4_on_entry();
  499. void s4_on_exit();
  500. unsigned int s4_on_event(FSMEvent* event);
  501. void s5_on_entry();
  502. void s5_on_exit();
  503. unsigned int s5_on_event(FSMEvent* event);
  504. HANDLE hStopUpdate;
  505. AuthContext m_authCtx;
  506. CSimpleStringA m_TerminalID;
  507. CSimpleStringA m_csMachineType;
  508. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer m_ctx;
  509. SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer qaInfoCtx;
  510. int Initial();
  511. ErrorCodeEnum OpenRunInfoFile();
  512. ErrorCodeEnum MatchFingerPrint(SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx, bool& bStopAuthorize);
  513. ErrorCodeEnum MatchFingerPrintEx(SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer ctx, bool& bStopAuthorize, DWORD& dwUserErrCode);
  514. ErrorCodeEnum WaitForUkey(ErrorCodeEnum eErr);
  515. void CancelAuthorize();
  516. void CancelCollect();
  517. void FeatureUpdate();
  518. ErrorCodeEnum CollectFingerPrint(SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx, DWORD& dwUserErrCode);
  519. ErrorCodeEnum CollectFingerPrintEx(SpReqAnsContext<CustMngrAuthService_CollectFingerPrintEx_Req, CustMngrAuthService_CollectFingerPrintEx_Ans>::Pointer ctx, DWORD& dwUserErrCode);
  520. ErrorCodeEnum CollectFingerPrintInfo(SpReqAnsContext<CustMngrAuthService_CollectFingerPrintInfo_Req, CustMngrAuthService_CollectFingerPrintInfo_Ans>::Pointer ctx, DWORD& dwUserErrCode);
  521. ErrorCodeEnum GenerateTemplate(SpReqAnsContext<CustMngrAuthService_GenerateTemplate_Req, CustMngrAuthService_GenerateTemplate_Ans>::Pointer ctx, DWORD& dwUserErrCode);
  522. ErrorCodeEnum GetImgBlob(CBlob &data, CSimpleStringA imgPath);
  523. void BroadcastPressFinger(int times, bool bPressFinger);
  524. ErrorCodeEnum SwitchUSB(bool bOpen);
  525. ErrorCodeEnum SaveFingerPrint(SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx);
  526. int CompareTime(CSimpleStringA time1, CSimpleStringA time2);
  527. int CompareUpdateTime(const char* time1, const char* time2);
  528. bool ReadDataIntoMemory(bool& bHasData);
  529. void UpdateDataIntoMemory(map<CSimpleStringA, FeatureData*> tempFeature, bool bIsFirstTimeQueryData);
  530. string ClearStringSpaceHeadTail(string& line);
  531. CSimpleStringA GetCurrentDate();
  532. void DeleteBmp(int type);
  533. ErrorCodeEnum DeleteFileIfExisted(const char* fileName);
  534. ErrorCodeEnum ReceiveDataFromServer(CAutoArray<CSimpleStringA>& dataArray, RunInfoParams runInfoParam);
  535. bool BackupFile(CSimpleStringA srcFile, CSimpleStringA dstFile);
  536. CSimpleStringA GetMaxTime(CSimpleStringA maxTime, CSimpleStringA tempTime);
  537. CSimpleString GenerateAlarmJson(CSimpleString entityName, int cost);
  538. void BroadcastGetFinger(int status);
  539. void InitBeforeUpdateData();
  540. ErrorCodeEnum ConnectFingerPrintEntity();
  541. ErrorCodeEnum PrepareDataBeforeMatch(MatchParams *matchParam);
  542. ErrorCodeEnum MatchProcess(MatchParams* matchParam, bool& bStopAuthorize);
  543. ErrorCodeEnum AnalyzeMatchResult(MatchParams* matchParam, bool& bStopAuthorize);
  544. ErrorCodeEnum CollectProcess(SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer &ctx, DWORD& dwUserErrCode);
  545. ErrorCodeEnum CollectProcessEx(SpReqAnsContext<CustMngrAuthService_CollectFingerPrintEx_Req, CustMngrAuthService_CollectFingerPrintEx_Ans>::Pointer& ctx, DWORD& dwUserErrCode);
  546. ErrorCodeEnum LoadRunConfig(CSmartPointer<IConfigInfo>& spConfig);
  547. void InitTimeParams(RunInfoParams & runInfoParam, CSmartPointer<IConfigInfo> &spConfig);
  548. ErrorCodeEnum InitBeforeQueryData(RunInfoParams& runInfoParam, CSmartPointer<IConfigInfo>& spConfig);
  549. ErrorCodeEnum BackupBeforeWriteData(RunInfoParams& runInfoParam, CSmartPointer<IConfigInfo>& spConfig);
  550. ErrorCodeEnum WriteData(RunInfoParams& runInfoParam, CAutoArray<CSimpleStringA> dataArray, CSmartPointer<IConfigInfo>& spConfig);
  551. ErrorCodeEnum ProcessFeatureData(JsonParams &jsonParam, TempFeatureData &tmpFeatureData, RunInfoParams runinfoParam, CSmartPointer<IConfigInfo>& spConfig);
  552. private:
  553. DeviceControlService_ClientBase *m_pDeviceControl;
  554. FingerPrintService_ClientBase *m_pFingerPrint;
  555. MaintainCertificate_ClientBase *m_pMaintainWatcher;
  556. FeatureUpdateConn *m_pConnection;
  557. CSimpleStringA m_FingerSection;
  558. CSimpleStringA m_RunInfoPath;
  559. bool m_bCancelCollectFP, m_bCancelAuthorize, m_bAuthorizeTimeout;
  560. int m_TimeLimit;
  561. map<CSimpleStringA, FeatureData*> m_featureData;
  562. CRITICAL_SECTION m_cs;
  563. };
  564. class FeatureUpdateConn : public SpSecureClient
  565. {
  566. public:
  567. FeatureUpdateConn(CEntityBase *pEntity, CCustMngrAuthFSM *pFSM) : SpSecureClient(pEntity)
  568. {
  569. m_pFSM = pFSM;
  570. m_jsonLen = 0;
  571. m_GetErrMsg = false;
  572. m_reply = NULL;
  573. m_hPkgAnswer = ::CreateEventA(NULL, TRUE, FALSE, NULL);
  574. }
  575. virtual ~FeatureUpdateConn() {}
  576. virtual void OnDisconnect()
  577. {
  578. Dbg("FeatureUpdateConnection disconnected");
  579. }
  580. void SendFeatReq(const char* currAgent, const char* branchID, const char* lastTime = NULL)
  581. {
  582. LOG_FUNCTION();
  583. m_reply = NULL;
  584. m_jsonLen = 0;
  585. FeatReq req = { 0 };
  586. memcpy(req.BranchID, branchID, 16);
  587. memcpy(req.CurrentAgent, currAgent, 16);//transfer flag
  588. if (lastTime != NULL)
  589. {
  590. memcpy(req.UpdateTime, lastTime, 20);
  591. Dbg("req.UpdateTime:%s", req.UpdateTime);
  592. }
  593. #ifdef RVC_OS_WIN
  594. Dbg("req.TerminalID = %s, m_pFSM->m_TerminalID = %s", req.TerminalID, m_pFSM->m_TerminalID.GetData());
  595. strncpy_s(req.TerminalID, sizeof(req.TerminalID), m_pFSM->m_TerminalID, m_pFSM->m_TerminalID.GetLength());
  596. #else
  597. strncpy(req.TerminalID, m_pFSM->m_TerminalID, m_pFSM->m_TerminalID.GetLength());
  598. #endif // RVC_OS_WIN
  599. CSmartPointer<IPackage> pkt = CreateNewPackage("FETQYREQ");
  600. pkt->AddStruct("FETQYREQ", false, false, (LPBYTE)&req, sizeof(FeatReq));
  601. SendPackage(pkt);
  602. }
  603. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  604. {
  605. DWORD dwSysCode, dwUserCode;
  606. string errMsg;
  607. if (pRecvPkg->GetErrMsg(dwSysCode, dwUserCode, errMsg))
  608. {
  609. string serviceCode = pRecvPkg->GetServiceCode();
  610. Dbg("receive %s ans packet is error, errormsg is %s", serviceCode.c_str(), errMsg.c_str());
  611. m_GetErrMsg = true;
  612. SetEvent(m_hPkgAnswer);
  613. }else{
  614. Dbg("success, no error message.");
  615. string serviceCode = pRecvPkg->GetServiceCode();
  616. if (serviceCode == "FETQYREQ")
  617. {
  618. int dataLen = pRecvPkg->GetStructLen("FETQYANS");
  619. if (dataLen > 0 )
  620. {
  621. Dbg("GetStructData structlen: %d", dataLen);
  622. BYTE *pBuffer = new BYTE[dataLen];
  623. memset(pBuffer, 0, dataLen);
  624. int arrayNum = 0;
  625. if (pRecvPkg->GetStructData("FETQYANS", pBuffer, &dataLen, &arrayNum))
  626. {
  627. LPBYTE pData = new BYTE[dataLen +1];
  628. memcpy(pData, pBuffer, dataLen);
  629. m_reply = (FeatReply*)pData;
  630. if (m_reply != NULL)
  631. {
  632. pData[dataLen] = 0;
  633. m_jsonLen = dataLen - sizeof(FeatReply);
  634. }else
  635. Dbg("ERROR: m_reply is null!");
  636. }else
  637. Dbg("ERROR: getstructdata(FETQYANS) failed!");
  638. delete pBuffer;
  639. }else
  640. Dbg("ERROR: getstructlen(FETQYANS) = 0!");
  641. SetEvent(m_hPkgAnswer);
  642. }else
  643. Dbg("ERROR: wrong service code!");
  644. }
  645. }
  646. private:
  647. CCustMngrAuthFSM *m_pFSM;
  648. public:
  649. HANDLE m_hPkgAnswer;
  650. bool m_GetErrMsg;
  651. FeatReply* m_reply;
  652. int m_jsonLen;
  653. };
  654. struct InitTask : public ITaskSp
  655. {
  656. CCustMngrAuthFSM *fsm;
  657. InitTask(CCustMngrAuthFSM *f) : fsm(f) {}
  658. void Process()
  659. {
  660. LOG_FUNCTION();
  661. FSMEvent *e = new FSMEvent(USER_EVT_INIT_FINISHED);
  662. e->param1 = fsm->Initial();
  663. fsm->PostEventFIFO(e);
  664. }
  665. };
  666. struct FeatureUpdateTask : public ITaskSp
  667. {
  668. CCustMngrAuthFSM *fsm;
  669. FeatureUpdateTask(CCustMngrAuthFSM *f) : fsm(f) {}
  670. void Process()
  671. {
  672. LOG_FUNCTION();
  673. fsm->FeatureUpdate();
  674. }
  675. };
  676. struct MatchFingerPrintTask : public ITaskSp
  677. {
  678. CCustMngrAuthFSM *fsm;
  679. MatchFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f) {}
  680. SpReqAnsContext<CustMngrAuthService_StartAuthorize_Req, CustMngrAuthService_StartAuthorize_Ans>::Pointer ctx;
  681. void Process()
  682. {
  683. bool bStopAuthorize = false;
  684. ErrorCodeEnum eErr = fsm->MatchFingerPrint(ctx, bStopAuthorize);
  685. //if (bStopAuthorize)
  686. //{
  687. AuthorizeFinishedEvent *e = new AuthorizeFinishedEvent();
  688. e->ctx = ctx;
  689. e->param1 = eErr;
  690. fsm->PostEventFIFO(e);
  691. //}
  692. //else
  693. //{
  694. // AuthorizeFinishedEvent *e = new AuthorizeFinishedEvent();
  695. // e->ctx = ctx;
  696. // e->param1 = fsm->WaitForUkey(eErr);
  697. // fsm->PostEventFIFO(e);//指纹匹配异常停止,继续等到超时或ukey插入结束授权,如果是ukey插入,这个event就不会被处理
  698. //}
  699. }
  700. };
  701. struct MatchFingerPrintTaskEx : public ITaskSp
  702. {
  703. CCustMngrAuthFSM* fsm;
  704. MatchFingerPrintTaskEx(CCustMngrAuthFSM* f) : fsm(f) {}
  705. SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer ctx;
  706. void Process()
  707. {
  708. bool bStopAuthorize = false;
  709. DWORD dwUserErrorCode = 0;
  710. ErrorCodeEnum eErr = fsm->MatchFingerPrintEx(ctx, bStopAuthorize, dwUserErrorCode);
  711. //if (bStopAuthorize)
  712. //{
  713. QueryAuthorInfoFinishedEvent* e = new QueryAuthorInfoFinishedEvent();
  714. e->ctx = ctx;
  715. e->param1 = eErr;
  716. e->param2 = dwUserErrorCode;
  717. fsm->PostEventFIFO(e);//指纹匹配结束,结束授权
  718. //}
  719. //else
  720. //{
  721. // QueryAuthorInfoFinishedEvent* e = new QueryAuthorInfoFinishedEvent();
  722. // e->ctx = ctx;
  723. // e->param1 = fsm->WaitForUkey(eErr);
  724. // fsm->PostEventFIFO(e);//指纹匹配异常停止,继续等到超时或ukey插入结束授权,如果是ukey插入,这个event就不会被处理
  725. //}
  726. }
  727. };
  728. struct CollectFingerPrintTask : public ITaskSp
  729. {
  730. CCustMngrAuthFSM *fsm;
  731. SpReqAnsContext<CustMngrAuthService_CollectFingerPrint_Req, CustMngrAuthService_CollectFingerPrint_Ans>::Pointer ctx;
  732. CollectFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f){}
  733. void Process()
  734. {
  735. LOG_FUNCTION();
  736. CollectFingerPrintFinishedEvent *e = new CollectFingerPrintFinishedEvent();
  737. e->ctx = ctx;
  738. DWORD dwUserErrorCode = 0;
  739. ErrorCodeEnum eErr = fsm->CollectFingerPrint(ctx, dwUserErrorCode);
  740. if(eErr == Error_Unexpect && dwUserErrorCode > 0)
  741. ctx->Answer(eErr, dwUserErrorCode);
  742. else
  743. ctx->Answer(eErr);
  744. fsm->PostEventFIFO(e);
  745. }
  746. };
  747. //采集指纹Ex
  748. struct CollectFingerPrintExTask : public ITaskSp
  749. {
  750. CCustMngrAuthFSM* fsm;
  751. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintEx_Req, CustMngrAuthService_CollectFingerPrintEx_Ans>::Pointer ctx;
  752. CollectFingerPrintExTask(CCustMngrAuthFSM* f) : fsm(f) {}
  753. void Process()
  754. {
  755. LOG_FUNCTION();
  756. CollectFingerPrintExFinishedEvent* e = new CollectFingerPrintExFinishedEvent();
  757. e->ctx = ctx;
  758. DWORD dwUserErrorCode = 0;
  759. ErrorCodeEnum eErr = fsm->CollectFingerPrintEx(ctx, dwUserErrorCode);
  760. if (eErr == Error_Unexpect && dwUserErrorCode > 0)
  761. ctx->Answer(eErr, dwUserErrorCode);
  762. else
  763. ctx->Answer(eErr);
  764. fsm->PostEventFIFO(e);
  765. }
  766. };
  767. struct CollectFingerPrintInfoTask : public ITaskSp
  768. {
  769. CCustMngrAuthFSM* fsm;
  770. SpReqAnsContext<CustMngrAuthService_CollectFingerPrintInfo_Req, CustMngrAuthService_CollectFingerPrintInfo_Ans>::Pointer ctx;
  771. CollectFingerPrintInfoTask(CCustMngrAuthFSM* f) : fsm(f) {}
  772. void Process()
  773. {
  774. LOG_FUNCTION();
  775. CollectFingerPrintInfoFinishedEvent* e = new CollectFingerPrintInfoFinishedEvent();
  776. e->ctx = ctx;
  777. DWORD dwUserErrorCode = 0;
  778. ErrorCodeEnum eErr = fsm->CollectFingerPrintInfo(ctx, dwUserErrorCode);
  779. if (eErr == Error_Unexpect && dwUserErrorCode > 0)
  780. ctx->Answer(eErr, dwUserErrorCode);
  781. else
  782. ctx->Answer(eErr);
  783. fsm->PostEventFIFO(e);
  784. }
  785. };
  786. struct GenerateTemplateTask : public ITaskSp
  787. {
  788. CCustMngrAuthFSM* fsm;
  789. SpReqAnsContext<CustMngrAuthService_GenerateTemplate_Req, CustMngrAuthService_GenerateTemplate_Ans>::Pointer ctx;
  790. GenerateTemplateTask(CCustMngrAuthFSM* f) : fsm(f) {}
  791. void Process()
  792. {
  793. LOG_FUNCTION();
  794. GenerateTemplateFinishedEvent* e = new GenerateTemplateFinishedEvent();
  795. e->ctx = ctx;
  796. DWORD dwUserErrorCode = 0;
  797. ErrorCodeEnum eErr = fsm->GenerateTemplate(ctx, dwUserErrorCode);
  798. if (eErr == Error_Unexpect && dwUserErrorCode > 0)
  799. ctx->Answer(eErr, dwUserErrorCode);
  800. else
  801. ctx->Answer(eErr);
  802. fsm->PostEventFIFO(e);
  803. }
  804. };
  805. struct SaveFingerPrintTask : public ITaskSp
  806. {
  807. CCustMngrAuthFSM *fsm;
  808. SpReqAnsContext<CustMngrAuthService_SaveFingerPrint_Req, CustMngrAuthService_SaveFingerPrint_Ans>::Pointer ctx;
  809. SaveFingerPrintTask(CCustMngrAuthFSM *f) : fsm(f) {}
  810. void Process()
  811. {
  812. LOG_FUNCTION();
  813. SaveFingerPrintFinishedEvent *e = new SaveFingerPrintFinishedEvent();
  814. e->ctx = ctx;
  815. ErrorCodeEnum eErr = fsm->SaveFingerPrint(ctx);
  816. ctx->Answer(eErr);
  817. fsm->PostEventFIFO(e);
  818. }
  819. };
  820. #endif //__CUSTMNGRAUTH_FSM_H