CustMngrAuthFSM.h 29 KB

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