CustMngrAuthFSM.h 29 KB

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