CustMngrAuthFSM.cpp 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "SpHelper.h"
  4. #include "CustMngrAuth_UserErrorCode.h"
  5. #include "CustMngrAuthFSM.h"
  6. #include "CommEntityUtil.hpp"
  7. #include <fstream>
  8. #include <map>
  9. #ifdef RVC_OS_WIN
  10. #include <iostream>
  11. #include <iomanip>
  12. #include <random>
  13. #include <stdint.h>
  14. #include <sstream>
  15. using namespace std;
  16. #else
  17. #include "fileutil.h"
  18. #include <memory>
  19. #include <thread>
  20. #include <chrono>
  21. #include <string>
  22. #include <ctime>
  23. #include <cstring>
  24. using std::string;
  25. #endif
  26. #define IMAGE_NUM 3
  27. class CCustMngrAuthEntity;
  28. //Init
  29. void CCustMngrAuthFSM::s0_on_entry()
  30. {
  31. LOG_FUNCTION();
  32. FSMEvent* pEvt = new FSMEvent(USER_EVT_INIT);
  33. PostEventFIFO(pEvt);
  34. }
  35. void CCustMngrAuthFSM::s0_on_exit()
  36. {
  37. LOG_FUNCTION();
  38. }
  39. unsigned int CCustMngrAuthFSM::s0_on_event(FSMEvent* pEvt)
  40. {
  41. LOG_FUNCTION();
  42. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s0 evt %d", pEvt->iEvt);
  43. switch (pEvt->iEvt)
  44. {
  45. case USER_EVT_INIT:
  46. {
  47. InitTask* task = new InitTask(this);
  48. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  49. pEvt->SetHandled();
  50. return 0;
  51. }
  52. break;
  53. default:
  54. break;
  55. }
  56. return 0;
  57. }
  58. //Initializing
  59. void CCustMngrAuthFSM::s1_on_entry()
  60. {
  61. LOG_FUNCTION();
  62. }
  63. void CCustMngrAuthFSM::s1_on_exit()
  64. {
  65. LOG_FUNCTION();
  66. }
  67. unsigned int CCustMngrAuthFSM::s1_on_event(FSMEvent* pEvt)
  68. {
  69. LOG_FUNCTION();
  70. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 evt %d", pEvt->iEvt);
  71. switch (pEvt->iEvt)
  72. {
  73. case USER_EVT_INIT_FINISHED:
  74. pEvt->SetHandled();
  75. return pEvt->param1;
  76. default:
  77. break;
  78. }
  79. return 0;
  80. }
  81. //Idle
  82. void CCustMngrAuthFSM::s2_on_entry()
  83. {
  84. LOG_FUNCTION();
  85. }
  86. void CCustMngrAuthFSM::s2_on_exit()
  87. {
  88. LOG_FUNCTION();
  89. }
  90. unsigned int CCustMngrAuthFSM::s2_on_event(FSMEvent* pEvt)
  91. {
  92. LOG_FUNCTION();
  93. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 evt(%d, %d)", pEvt->iEvt, pEvt->param1);
  94. switch (pEvt->iEvt)
  95. {
  96. case USER_EVT_AUTHORIZE_START:
  97. {
  98. pEvt->SetHandled();
  99. AuthorizeStartEvent* authorEvt = dynamic_cast<AuthorizeStartEvent*>(pEvt);
  100. if (authorEvt->ctx->Req.TimeLimit <= 0)
  101. {
  102. AuthorizeFinishedEvent* e = new AuthorizeFinishedEvent();
  103. e->ctx = authorEvt->ctx;
  104. e->param1 = Error_Param;
  105. this->PostEventFIFO(e);
  106. break;
  107. }
  108. //状态机流程会耗一些时间,这里要比前端传过来的时间小一些,及时返回给前端
  109. m_TimeLimit = (authorEvt->ctx->Req.TimeLimit - 3) * 1000;
  110. m_bCancelAuthorize = false;
  111. //起指纹匹配线程
  112. MatchFingerPrintTask* matchTask = new MatchFingerPrintTask(this);
  113. matchTask->ctx = authorEvt->ctx;
  114. GetEntityBase()->GetFunction()->PostThreadPoolTask(matchTask);
  115. }
  116. break;
  117. case USER_EVT_QUERYAUTHORINFO:
  118. {
  119. pEvt->SetHandled();
  120. QueryAuthorInfoEvent* queryEvt = dynamic_cast<QueryAuthorInfoEvent*>(pEvt);
  121. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("QUERYAUTHORINFO, time:%d, wayOfKey:%d, wayOfFinger:%d",
  122. queryEvt->ctx->Req.TimeLimit, queryEvt->ctx->Req.WayofKey, queryEvt->ctx->Req.WayofFinger);
  123. if (queryEvt->ctx->Req.TimeLimit <= 0)
  124. {
  125. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ERROR: receive timelimit lessequal than zero(%d).", queryEvt->ctx->Req.TimeLimit);
  126. QueryAuthorInfoFinishedEvent* e = new QueryAuthorInfoFinishedEvent();
  127. e->ctx = queryEvt->ctx;
  128. e->param1 = Error_Param;
  129. this->PostEventFIFO(e);
  130. break;
  131. }
  132. m_TimeLimit = (queryEvt->ctx->Req.TimeLimit - 3) * 1000;
  133. ErrorCodeEnum eErr;
  134. m_bCancelAuthorize = false;
  135. if (queryEvt->ctx->Req.WayofFinger == 1)
  136. {
  137. //起指纹匹配线程
  138. MatchFingerPrintTaskEx* mTask = new MatchFingerPrintTaskEx(this);
  139. mTask->ctx = queryEvt->ctx;
  140. GetEntityBase()->GetFunction()->PostThreadPoolTask(mTask);
  141. }
  142. if (queryEvt->ctx->Req.WayofKey == 1)
  143. {
  144. //打开USB
  145. }
  146. }
  147. break;
  148. case USER_EVT_COLLECTFINGERPRINT_START:
  149. {
  150. pEvt->SetHandled();
  151. CollectFingerPrintStartEvent* collectEvt = dynamic_cast<CollectFingerPrintStartEvent*>(pEvt);
  152. CollectFingerPrintTask* collectTask = new CollectFingerPrintTask(this);
  153. collectTask->ctx = collectEvt->ctx;
  154. GetEntityBase()->GetFunction()->PostThreadPoolTask(collectTask);
  155. }
  156. break;
  157. case USER_EVT_COLLECTFINGERPRINTEX_START:
  158. {
  159. pEvt->SetHandled();
  160. CollectFingerPrintExStartEvent* collectEvt = dynamic_cast<CollectFingerPrintExStartEvent*>(pEvt);
  161. CollectFingerPrintExTask* collectExTask = new CollectFingerPrintExTask(this);
  162. collectExTask->ctx = collectEvt->ctx;
  163. GetEntityBase()->GetFunction()->PostThreadPoolTask(collectExTask);
  164. }
  165. break;
  166. case USER_EVT_COLLECTFINGERPRINTINFO:
  167. {
  168. pEvt->SetHandled();
  169. CollectFingerPrintInfoEvent* collectEvt = dynamic_cast<CollectFingerPrintInfoEvent*>(pEvt);
  170. CollectFingerPrintInfoTask* collectExTask = new CollectFingerPrintInfoTask(this);
  171. collectExTask->ctx = collectEvt->ctx;
  172. GetEntityBase()->GetFunction()->PostThreadPoolTask(collectExTask);
  173. }
  174. break;
  175. case USER_EVT_GENERATE_TEMPLATE:
  176. {
  177. pEvt->SetHandled();
  178. GenerateTemplateEvent* gtEvt = dynamic_cast<GenerateTemplateEvent*>(pEvt);
  179. GenerateTemplateTask* gtTask = new GenerateTemplateTask(this);
  180. gtTask->ctx = gtEvt->ctx;
  181. GetEntityBase()->GetFunction()->PostThreadPoolTask(gtTask);
  182. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Generate Template task posted");
  183. }
  184. break;
  185. case USER_EVT_SAVEFINGERPRINT_START:
  186. {
  187. pEvt->SetHandled();
  188. SaveFingerPrintStartEvent* saveEvtfpe = dynamic_cast<SaveFingerPrintStartEvent*>(pEvt);
  189. SaveFingerPrintTask* saveTask = new SaveFingerPrintTask(this);
  190. saveTask->ctx = saveEvtfpe->ctx;
  191. GetEntityBase()->GetFunction()->PostThreadPoolTask(saveTask);
  192. }
  193. break;
  194. case USER_EVT_CHECKUKEY:
  195. {
  196. pEvt->SetHandled();
  197. //SwitchUSB(true);
  198. }
  199. break;
  200. default:
  201. break;
  202. }
  203. return 0;
  204. }
  205. void CCustMngrAuthFSM::s3_on_entry()
  206. {
  207. LOG_FUNCTION();
  208. ScheduleTimer(1, m_TimeLimit);
  209. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set timer when match, %dms", m_TimeLimit);
  210. }
  211. void CCustMngrAuthFSM::s3_on_exit()
  212. {
  213. LOG_FUNCTION();
  214. CancelTimer(1);
  215. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit match event, timer canceled");
  216. }
  217. unsigned int CCustMngrAuthFSM::s3_on_event(FSMEvent* pEvt)
  218. {
  219. LOG_FUNCTION();
  220. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 evt %d, %d", pEvt->iEvt, pEvt->param1);
  221. switch (pEvt->iEvt)
  222. {
  223. case USER_EVT_HOLDON:
  224. {
  225. CancelTimer(1);
  226. HoldOnEvent* holdEvt = dynamic_cast<HoldOnEvent*>(pEvt);
  227. if (holdEvt->ctx == NULL)
  228. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HoldOnEvent->ctx is NULL");
  229. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("HoldOn with MoreTime: %d second", holdEvt->ctx->Req.MoreTime);
  230. int moreTime = holdEvt->ctx->Req.MoreTime * 1000;
  231. ScheduleTimer(1, (moreTime > 0) ? moreTime : m_TimeLimit);
  232. pEvt->SetHandled();
  233. }
  234. break;
  235. case EVT_TIMER:
  236. {
  237. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Hit Timer");
  238. pEvt->SetHandled();
  239. m_bAuthorizeTimeout = true;
  240. m_bCancelAuthorize = true;
  241. CancelAuthorize();
  242. }
  243. break;
  244. case USER_EVT_AUTHORIZE_FINISHED:
  245. {
  246. pEvt->SetHandled();
  247. AuthorizeFinishedEvent* authorEvt = dynamic_cast<AuthorizeFinishedEvent*>(pEvt);
  248. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Checking m_authCtx and answer ctx");
  249. if (authorEvt->param1 == 0)
  250. {
  251. if (m_authCtx.eAuthByWhich == AuthByUkey)
  252. {
  253. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_authCtx.eAuthByWhich == AuthByUkey");
  254. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  255. {
  256. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke cancel match.");
  257. (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->CancelMatch();
  258. }
  259. authorEvt->ctx->Ans.WayofAuth = AuthByUkey;
  260. authorEvt->ctx->Ans.UkeyID = m_authCtx.UkeyID;
  261. authorEvt->ctx->Answer(Error_Succeed);
  262. }
  263. else if (m_authCtx.eAuthByWhich == AuthByFngPrnt)
  264. {
  265. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_authCtx.eAuthByWhich == AuthByFngPrnt");
  266. authorEvt->ctx->Ans.WayofAuth = AuthByFngPrnt;
  267. authorEvt->ctx->Ans.CustomerID = m_authCtx.CustomerID;
  268. authorEvt->ctx->Answer(Error_Succeed);
  269. }
  270. }
  271. else
  272. {
  273. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("authorize finished with param1 as %d", authorEvt->param1);
  274. authorEvt->ctx->Answer((ErrorCodeEnum)authorEvt->param1);
  275. }
  276. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  277. {
  278. m_bCancelAuthorize = true;
  279. m_pFingerPrint->GetFunction()->CloseSession();
  280. m_pFingerPrint = NULL;
  281. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
  282. }
  283. m_authCtx.eAuthByWhich = AuthByNone;
  284. m_authCtx.CustomerID = "";
  285. m_authCtx.UkeyID = "";
  286. m_ctx = NULL;
  287. }
  288. break;
  289. case USER_EVT_QUERYAUTHORINFO_FINISHED:
  290. {
  291. pEvt->SetHandled();
  292. QueryAuthorInfoFinishedEvent* qafEvt = dynamic_cast<QueryAuthorInfoFinishedEvent*>(pEvt);
  293. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Checking m_authCtx and answer qaInfoCtx");
  294. if (qafEvt->param1 == 0)
  295. {
  296. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("authorize finished with param1 as 0"); //Error_Succeed
  297. if (m_authCtx.eAuthByWhich == AuthByUkey)
  298. {
  299. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_authCtx.eAuthByWhich == AuthByUkey");
  300. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  301. {
  302. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke cancel collect.");
  303. (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->CancelRegister();
  304. }
  305. qafEvt->ctx->Ans.WayofAuth = AuthByUkey;
  306. qafEvt->ctx->Ans.UkeyID = m_authCtx.UkeyID;
  307. qafEvt->ctx->Answer(Error_Succeed);
  308. }
  309. else if (m_authCtx.eAuthByWhich == AuthByFngPrnt)
  310. {
  311. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_authCtx.eAuthByWhich == AuthByFngPrnt");
  312. qafEvt->ctx->Ans.WayofAuth = AuthByFngPrnt;
  313. qafEvt->ctx->Ans.Feature = m_authCtx.Feature;
  314. qafEvt->ctx->Ans.FingerImg = m_authCtx.FingerImg;
  315. qafEvt->ctx->Answer(Error_Succeed);
  316. }
  317. }
  318. else
  319. {
  320. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("authorize finished with param1 as %d", qafEvt->param1);
  321. qafEvt->ctx->Answer((ErrorCodeEnum)qafEvt->param1, qafEvt->param2);
  322. }
  323. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  324. {
  325. m_bCancelAuthorize = true;
  326. m_pFingerPrint->GetFunction()->CloseSession();
  327. m_pFingerPrint = NULL;
  328. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
  329. }
  330. m_authCtx.eAuthByWhich = AuthByNone;
  331. m_authCtx.CustomerID = "";
  332. m_authCtx.UkeyID = "";
  333. m_authCtx.Feature = "";
  334. memset(&m_authCtx.FingerImg, 0, sizeof(m_authCtx.FingerImg));
  335. qaInfoCtx = NULL;
  336. }
  337. break;
  338. case USER_EVT_AUTHORIZE_CANCEL:
  339. {
  340. pEvt->SetHandled();
  341. m_bCancelAuthorize = true;
  342. CancelAuthorize();
  343. }
  344. break;
  345. case USER_EVT_QUERYAUTHORINFO_CANCEL:
  346. {
  347. pEvt->SetHandled();
  348. m_bCancelAuthorize = true;
  349. CancelCollect();
  350. }
  351. break;
  352. default:
  353. break;
  354. }
  355. return 0;
  356. }
  357. void CCustMngrAuthFSM::s4_on_entry()
  358. {
  359. LOG_FUNCTION();
  360. }
  361. void CCustMngrAuthFSM::s4_on_exit()
  362. {
  363. LOG_FUNCTION();
  364. }
  365. unsigned int CCustMngrAuthFSM::s4_on_event(FSMEvent* pEvt)
  366. {
  367. LOG_FUNCTION();
  368. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s4 evt %d, %d", pEvt->iEvt, pEvt->param1);
  369. switch (pEvt->iEvt)
  370. {
  371. case USER_EVT_COLLECTFINGERPRINT_FINISHED:
  372. pEvt->SetHandled();
  373. break;
  374. case USER_EVT_COLLECTFINGERPRINTEX_FINISHED:
  375. pEvt->SetHandled();
  376. break;
  377. case USER_EVT_COLLECTFINGERPRINTINFO_FINISHED:
  378. {
  379. pEvt->SetHandled();
  380. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  381. {
  382. m_pFingerPrint->GetFunction()->CloseSession();
  383. m_pFingerPrint = NULL;
  384. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
  385. }
  386. }
  387. break;
  388. case USER_EVT_GENERATE_TEMPLATE_FINISHED:
  389. {
  390. pEvt->SetHandled();
  391. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  392. {
  393. m_pFingerPrint->GetFunction()->CloseSession();
  394. m_pFingerPrint = NULL;
  395. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("M_pFingerPrint disconnected.");
  396. }
  397. }
  398. break;
  399. case USER_EVT_COLLECTFINGERPRINT_CANCEL:
  400. {
  401. pEvt->SetHandled();
  402. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  403. (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->CancelRegister();
  404. }
  405. break;
  406. case USER_EVT_SAVEFINGERPRINT_FINISHED:
  407. pEvt->SetHandled();
  408. break;
  409. case USER_EVT_CHECKUKEY_FINISHED:
  410. {
  411. pEvt->SetHandled();
  412. }
  413. break;
  414. default:
  415. break;
  416. }
  417. return 0;
  418. }
  419. void CCustMngrAuthFSM::s5_on_entry()
  420. {
  421. LOG_FUNCTION();
  422. }
  423. void CCustMngrAuthFSM::s5_on_exit()
  424. {
  425. LOG_FUNCTION();
  426. }
  427. unsigned int CCustMngrAuthFSM::s5_on_event(FSMEvent* pEvt)
  428. {
  429. LOG_FUNCTION();
  430. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s5 evt %d, %d", pEvt->iEvt, pEvt->param1);
  431. return 0;
  432. }
  433. #pragma region entity init
  434. ErrorCodeEnum CCustMngrAuthFSM::OnInit()
  435. {
  436. LOG_FUNCTION();
  437. m_authCtx.eAuthByWhich = AuthByNone;
  438. CSystemStaticInfo staticInfo;
  439. m_pEntity->GetFunction()->GetSystemStaticInfo(staticInfo);
  440. m_TerminalID = staticInfo.strTerminalID;
  441. m_csMachineType = staticInfo.strMachineType;
  442. m_FingerSection = "FingerInfo";
  443. CSimpleStringA machineVersion = CSimpleStringA::Format("%d.%d", staticInfo.MachineVersion.GetMajor(), staticInfo.MachineVersion.GetMinor());
  444. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CustMngrAuth m_csMachineType:%s, machineVersion:%s, TerminalNo:%s",
  445. m_csMachineType.GetData(), machineVersion.GetData(), m_TerminalID.GetData());
  446. return Error_Succeed;
  447. }
  448. ErrorCodeEnum CCustMngrAuthFSM::OnExit()
  449. {
  450. LOG_FUNCTION();
  451. FSMImpl<CCustMngrAuthFSM>::OnExit();
  452. return Error_Succeed;
  453. }
  454. int CCustMngrAuthFSM::Initial()
  455. {
  456. ErrorCodeEnum errCode = OpenRunInfoFile();
  457. if (errCode != Error_Succeed) {
  458. return 1;
  459. }
  460. return 0;
  461. }
  462. ErrorCodeEnum CCustMngrAuthFSM::OpenRunInfoFile()
  463. {
  464. ErrorCodeEnum errCode;
  465. errCode = GetEntityBase()->GetFunction()->GetPath("RunInfo", m_RunInfoPath);
  466. if (errCode != Error_Succeed)
  467. {
  468. LogWarn(Severity_High, Error_DevLoadFileFailed, LOG_ERR_CUSTMNGRAUTH_GET_RUNINFO_PATH_FAILED_Init, "get runinfo path failed while init");
  469. errCode = Error_Unexpect;
  470. }
  471. return errCode;
  472. }
  473. #pragma endregion
  474. #pragma region Registe process
  475. ErrorCodeEnum CCustMngrAuthFSM::CollectFingerPrintInfo(SpReqAnsContext<CustMngrAuthService_CollectFingerPrintInfo_Req, CustMngrAuthService_CollectFingerPrintInfo_Ans>::Pointer ctx, DWORD& dwUserErrCode)
  476. {
  477. LOG_FUNCTION();
  478. if (ctx == NULL || !(ctx->Req.FingerId > 0 && ctx->Req.FingerId < 10))
  479. {
  480. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("CollectFingerPrintInfo, Invalid inParam, FingerId:%d", ctx->Req.FingerId);
  481. return Error_Param;
  482. }
  483. CSimpleStringA tmpParam = CSimpleStringA::Format("web invoke CollectFingerPrintInfo with inParam FingerId:%d", ctx->Req.FingerId);
  484. LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_CUSTMNGRAUTH_INVOKE_CollectFingerPrintInfo, "web invoke CollectFingerPrintInfo");
  485. ErrorCodeEnum errCode;
  486. m_pFingerPrint = new FingerPrintService_ClientBase(m_pEntity);
  487. errCode = m_pFingerPrint->Connect();
  488. if (errCode != Error_Succeed)
  489. {
  490. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("CollectFingerPrintInfo, connect to FingerPrint entity failed. %s", SpStrError(errCode));
  491. m_pFingerPrint->SafeDelete();
  492. m_pFingerPrint = NULL;
  493. return Error_Hardware; //TODO::give one other errCode
  494. }
  495. CSimpleStringA depPath(true);
  496. m_pEntity->GetFunction()->GetPath("Dep", depPath);
  497. FingerPrintService_GetFingerPrint_Req GetFingerReq;
  498. FingerPrintService_GetFingerPrint_Ans GetFingerAns;
  499. GetFingerReq.times = ctx->Req.FingerId;
  500. if (m_pFingerPrint == NULL || m_pFingerPrint->QuerySessionClosed())
  501. {
  502. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("m_pFingerPrint is NULL or connection closed.");
  503. return Error_Hardware;
  504. }
  505. ULLINT l_beginTime, l_endTime;
  506. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  507. errCode = m_pFingerPrint->GetFingerPrint(GetFingerReq, GetFingerAns, 30000, dwUserErrCode);
  508. l_endTime = SP::Module::Comm::RVCGetTickCount();
  509. //DbgInfo("GetFingerPrint", l_beginTime, l_endTime, errCode, CSimpleStringA::Format("reserved1[0]:%d", GetFingerAns.reserved1[0]));
  510. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetFingerPrint").setBeginTime(l_beginTime).setEndTime(l_endTime)("CollectFingerPrintInfo invoke GetFingerPrint return %s", SpStrError(errCode));
  511. if (errCode == Error_NotInit)
  512. {
  513. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("FingerPrintEntity not ready or failed.");
  514. return Error_DevNotAvailable;
  515. }
  516. if (errCode == Error_Succeed)
  517. {
  518. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("reserved1[0]:%d", GetFingerAns.reserved1[0]);
  519. switch (GetFingerAns.reserved1[0])
  520. {
  521. case 1:
  522. errCode = Error_Succeed;
  523. break;
  524. case 2:
  525. errCode = Error_TimeOut;
  526. break;
  527. case 3:
  528. errCode = Error_Cancel;
  529. break;
  530. default:
  531. errCode = Error_Unexpect;
  532. break;
  533. }
  534. if (errCode == Error_Succeed)
  535. {
  536. ctx->Ans.feature = GetFingerAns.feature;
  537. CBlob data;
  538. CSimpleStringA imgFullPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", depPath.GetData(), GetFingerAns.imageName.GetData());
  539. ErrorCodeEnum imgErrCode = GetImgBlob(data, imgFullPath);
  540. if (imgErrCode != Error_Succeed)
  541. {
  542. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Failed to load image(%s)", imgFullPath.GetData());
  543. return Error_Unexpect;
  544. }
  545. ctx->Ans.fingerImg = data;
  546. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CollectFingerPrintInfo return success.");
  547. }
  548. }
  549. else
  550. errCode = Error_Unexpect;
  551. return errCode;
  552. }
  553. ErrorCodeEnum CCustMngrAuthFSM::GenerateTemplate(SpReqAnsContext<CustMngrAuthService_GenerateTemplate_Req, CustMngrAuthService_GenerateTemplate_Ans>::Pointer ctx, DWORD& dwUserErrCode)
  554. {
  555. LOG_FUNCTION();
  556. LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_CUSTMNGRAUTH_INVOKE_GenerateTemplate, "web invoke GenerateTemplate");
  557. int fingerNum = ctx->Req.FingerIDList.GetCount();
  558. if (fingerNum != IMAGE_NUM)
  559. {
  560. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GenerateTemplate, Invalid inParam, fingerNum:%d", fingerNum);
  561. return Error_Param;
  562. }
  563. ErrorCodeEnum errCode;
  564. m_pFingerPrint = new FingerPrintService_ClientBase(m_pEntity);
  565. errCode = m_pFingerPrint->Connect();
  566. if (errCode != Error_Succeed)
  567. {
  568. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("GenerateTemplate, connect to fingerprint entity failed while GenerateTemplate: %s", SpStrError(errCode));
  569. m_pFingerPrint->SafeDelete();
  570. m_pFingerPrint = NULL;
  571. return Error_DevNotAvailable; //TODO::give one other errCode
  572. }
  573. CSimpleStringA depPath(true);
  574. m_pEntity->GetFunction()->GetPath("Dep", depPath);
  575. FingerPrintService_GenerateTemplate_Req generateReq;
  576. FingerPrintService_GenerateTemplate_Ans generateAns;
  577. generateReq.FingerIDList.Init(IMAGE_NUM);
  578. for (int i = 0; i < generateReq.FingerIDList.GetCount(); ++i)
  579. {
  580. generateReq.FingerIDList[i] = ctx->Req.FingerIDList[i];
  581. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("fingerIDList = %d", generateReq.FingerIDList[i]);
  582. }
  583. if (m_pFingerPrint == NULL || m_pFingerPrint->QuerySessionClosed())
  584. {
  585. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("m_pFingerPrint is NULL or connection closed.");
  586. return Error_DevNotAvailable;
  587. }
  588. ULLINT l_beginTime, l_endTime;
  589. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  590. errCode = (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->GenerateTemplate(generateReq, generateAns, 20000, dwUserErrCode);
  591. l_endTime = SP::Module::Comm::RVCGetTickCount();
  592. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GenerateTemplate").setBeginTime(l_beginTime).setEndTime(l_endTime)("GenerateTemplate invoke GenerateTemplate return %s", SpStrError(errCode));
  593. if (errCode == Error_NotInit)
  594. {
  595. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("FingerPrint Entity not ready or failed.");
  596. return Error_DevNotAvailable;
  597. }
  598. if (errCode == Error_Succeed)
  599. {
  600. ctx->Ans.templateFeature = generateAns.templateFeature;
  601. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GenerateTemplate return success.");
  602. }
  603. else {
  604. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invoke GenerateTemplate returned %d", errCode);
  605. errCode = Error_Unexpect;
  606. }
  607. return errCode;
  608. }
  609. void CCustMngrAuthFSM::BroadcastPressFinger(int times, bool bPressFinger)
  610. {
  611. if (bPressFinger) {
  612. PressFinger pfEvt;//
  613. pfEvt.FingerNo = 1;//maybe no use,control by @zhuyi
  614. pfEvt.Times = times;
  615. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(PressFinger), SP_MSG_SIG_OF(PressFinger), pfEvt);
  616. }
  617. else {
  618. LiftFinger lfEvt;
  619. lfEvt.FingerNo = 1;
  620. lfEvt.Times = times;
  621. SpSendBroadcast(m_pEntity->GetFunction(), SP_MSG_OF(LiftFinger), SP_MSG_SIG_OF(LiftFinger), lfEvt);
  622. }
  623. }
  624. ErrorCodeEnum CCustMngrAuthFSM::GetImgBlob(CBlob& data, CSimpleStringA imgPath)
  625. {
  626. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("image full path: %s", imgPath.GetData());
  627. ErrorCodeEnum eErr;
  628. FILE* fp = fopen(imgPath, "rb");
  629. if (fp) {
  630. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetImgBlob succeed.");
  631. fseek(fp, 0, SEEK_END);
  632. long flen = ftell(fp);
  633. fseek(fp, 0, SEEK_SET);
  634. data.Alloc(flen);
  635. fread(data.m_pData, 1, flen, fp);
  636. fclose(fp);
  637. eErr = Error_Succeed;
  638. }
  639. else {
  640. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetImgBlob %s failed!", imgPath.GetData());
  641. eErr = Error_IO;
  642. }
  643. return eErr;
  644. }
  645. #pragma endregion
  646. #pragma region authorize process
  647. ErrorCodeEnum CCustMngrAuthFSM::MatchFingerPrintEx(SpReqAnsContext<CustMngrAuthService_QueryAuthorInfo_Req, CustMngrAuthService_QueryAuthorInfo_Ans>::Pointer ctx, bool& bStopAuthorize, DWORD& dwUserErrCode)
  648. {
  649. LOG_FUNCTION();
  650. LogWarn(Severity_Low, Error_Unexpect, LOG_ERR_CUSTMNGRAUTH_INVOKE_MATCHEx, "web invoke MatchFingerPrintEx");
  651. ErrorCodeEnum errCode;
  652. m_pFingerPrint = new FingerPrintService_ClientBase(m_pEntity);
  653. errCode = m_pFingerPrint->Connect();
  654. if (errCode != Error_Succeed)
  655. {
  656. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("ERROR: connect to fingerprint entity failed while match %s", SpStrError(errCode));
  657. m_pFingerPrint->SafeDelete();
  658. m_pFingerPrint = NULL;
  659. return Error_Hardware; //TODO::give one other errCode
  660. }
  661. CSimpleStringA depPath(true);
  662. m_pEntity->GetFunction()->GetPath("Dep", depPath);
  663. FingerPrintService_GetFingerPrint_Req GetFingerReq;
  664. FingerPrintService_GetFingerPrint_Ans GetFingerAns;
  665. GetFingerReq.times = 10;
  666. if (m_pFingerPrint == NULL || m_pFingerPrint->QuerySessionClosed())
  667. {
  668. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("m_pFingerPrint is NULL or connection closed.");
  669. return Error_DevNotAvailable;
  670. }
  671. ULLINT l_beginTime, l_endTime;
  672. l_beginTime = SP::Module::Comm::RVCGetTickCount();
  673. errCode = (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->GetFingerPrint(GetFingerReq, GetFingerAns, 30000, dwUserErrCode);
  674. l_endTime = SP::Module::Comm::RVCGetTickCount();
  675. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetFingerPrint").setBeginTime(l_beginTime).setEndTime(l_endTime)("MatchFingerPrintEx invoke GetFingerPrint return %s", SpStrError(errCode));
  676. if (errCode == Error_DevNotAvailable) {
  677. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("FingerPrintEntity DevOpen failed");
  678. return errCode;
  679. }
  680. if (errCode == Error_NotInit)
  681. {
  682. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("FingerPrintEntity not ready or failed.");
  683. return Error_DevNotAvailable;
  684. }
  685. if (errCode == Error_Cancel)
  686. {
  687. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("FingerPrintEntity is canceled while match before");
  688. return Error_Cancel;
  689. }
  690. if (errCode == Error_TimeOut)
  691. {
  692. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("FingerPrintEntity invoke GetFingerPrint time out 30s");
  693. return Error_TimeOut;
  694. }
  695. bStopAuthorize = true;
  696. if (m_bCancelAuthorize || (errCode == Error_Succeed && GetFingerAns.reserved1[0] == 3)){
  697. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetFingerPrint is canceled while match, m_bAuthorizeTimeout:%d", m_bAuthorizeTimeout);
  698. m_bCancelAuthorize = false;
  699. if (m_bAuthorizeTimeout) {
  700. m_bAuthorizeTimeout = false;
  701. return Error_TimeOut;
  702. }
  703. return Error_Cancel;
  704. }
  705. if (errCode == Error_Succeed)
  706. {
  707. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("reserved1[0]:%d", GetFingerAns.reserved1[0]);
  708. switch (GetFingerAns.reserved1[0])
  709. {
  710. case 1:
  711. errCode = Error_Succeed;
  712. break;
  713. case 2:
  714. errCode = Error_TimeOut;
  715. break;
  716. case 3:
  717. errCode = Error_Cancel;
  718. break;
  719. default:
  720. errCode = Error_Unexpect;
  721. break;
  722. }
  723. if (errCode == Error_Succeed)
  724. {
  725. m_authCtx.eAuthByWhich = AuthByFngPrnt;
  726. ctx->Ans.Feature = GetFingerAns.feature;
  727. CBlob data;
  728. CSimpleStringA imgFullPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", depPath.GetData(), GetFingerAns.imageName.GetData());
  729. ErrorCodeEnum imgErrCode = GetImgBlob(data, imgFullPath);
  730. if (imgErrCode != Error_Succeed)
  731. {
  732. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Failed to load image(%s)", imgFullPath.GetData());
  733. return Error_Unexpect;
  734. }
  735. ctx->Ans.FingerImg = data;
  736. m_authCtx.Feature = ctx->Ans.Feature;
  737. m_authCtx.FingerImg = ctx->Ans.FingerImg;
  738. }
  739. }
  740. else
  741. errCode = Error_Unexpect;
  742. DeleteBmp(BmpImage);
  743. return errCode;
  744. }
  745. void CCustMngrAuthFSM::DeleteBmp(int type)
  746. {
  747. if ((type & BmpImage) == BmpImage)
  748. {
  749. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to delete fingerprint images...");
  750. CSimpleStringA imageName;
  751. DeleteFileIfExisted("finger.bmp");
  752. for (int i = 1; i <= 10; ++i) {
  753. imageName = CSimpleString::Format("finger%d.bmp", i);
  754. DeleteFileIfExisted(imageName.GetData());
  755. }
  756. }
  757. if ((type & TestImage) == TestImage)
  758. {
  759. DeleteFileIfExisted("testFinger.bmp");
  760. }
  761. }
  762. ErrorCodeEnum CCustMngrAuthFSM::DeleteFileIfExisted(const char* fileName)
  763. {
  764. #ifdef RVC_OS_WIN
  765. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  766. {
  767. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invalid or empty filename(%s)", fileName);
  768. return Error_Param;
  769. }
  770. CSimpleStringA strPath, strObjPath;
  771. ErrorCodeEnum errCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  772. strObjPath = strPath + "\\" + fileName;
  773. WIN32_FIND_DATA findData;
  774. if (FindFirstFileA((LPCTSTR)strObjPath, &findData) != INVALID_HANDLE_VALUE)
  775. {
  776. if (DeleteFileA((LPCTSTR)strObjPath) != 0)
  777. {
  778. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) success.", strObjPath.GetData());
  779. return Error_Succeed;
  780. }
  781. else {
  782. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DeleteFile(%s) failed LastError(%s).", strObjPath.GetData(), GetLastError());
  783. return Error_Unexpect;
  784. }
  785. }
  786. if (GetLastError() == ERROR_FILE_NOT_FOUND)
  787. {
  788. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("file %s not exist.", fileName);
  789. return Error_Succeed;
  790. }
  791. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DeleteFle(%s) Unexpect GetLastError(%s).", strObjPath.GetData(), GetLastError());
  792. return Error_Unexpect;
  793. #else
  794. if (strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  795. {
  796. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invalid or empty filename(%s)", fileName);
  797. return Error_Param;
  798. }
  799. CSimpleStringA strPath, strObjPath;
  800. ErrorCodeEnum errCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  801. strObjPath = CSimpleStringA::Format("%s" SPLIT_SLASH_STR "%s", strPath.GetData(), fileName);
  802. if (ExistsFileA(strObjPath))
  803. {
  804. if (RemoveFileA(strObjPath))
  805. {
  806. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeleteFile(%s) success.", strObjPath.GetData());
  807. return Error_Succeed;
  808. }
  809. else {
  810. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DeleteFile(%s) failed LastError(%s).", strObjPath.GetData(), GetLastError());
  811. return Error_Unexpect;
  812. }
  813. }
  814. else {
  815. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("file %s not exist.", fileName);
  816. return Error_Succeed;
  817. }
  818. #endif
  819. }
  820. void CCustMngrAuthFSM::BroadcastGetFinger(int status)
  821. {
  822. GetFinger evt;
  823. evt.Status = status;
  824. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(GetFinger), SP_MSG_SIG_OF(GetFinger), evt);
  825. }
  826. #pragma endregion
  827. #pragma region invoked function
  828. //ErrorCodeEnum CCustMngrAuthFSM::WaitForUkey(ErrorCodeEnum eErr)
  829. //{
  830. // //与朱毅约定,4表示本地无指纹数据,3表示指纹仪实体异常(包括旧接口的其他错误码和新接口的Error_HardWare)
  831. // //4: no data in local, 3:enitty exception
  832. //// DbgInfo(CSimpleStringA::Format("WaitForUkey, eErr:%d(0x%x)", eErr, eErr));
  833. // DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("WaitForUkey, eErr:%d(0x%x)", eErr, eErr);
  834. // int status = (eErr == Error_NoTarget) ? 4 : 3;
  835. // BroadcastGetFinger(status);
  836. // while (1) {
  837. //#ifdef RVC_OS_WIN
  838. // Sleep(300);
  839. //#else
  840. // SLEEP(300);
  841. //#endif
  842. // if (m_bCancelAuthorize) {
  843. // m_bCancelAuthorize = false;
  844. // if (m_bAuthorizeTimeout){
  845. // m_bAuthorizeTimeout = false;
  846. // return Error_TimeOut;
  847. // }
  848. // else
  849. // return Error_Cancel;
  850. // }
  851. // }
  852. //}
  853. void CCustMngrAuthFSM::CancelAuthorize()
  854. {
  855. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke m_pFingerPrint->CancelMatch()");
  856. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  857. (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->CancelMatch();
  858. }
  859. void CCustMngrAuthFSM::CancelCollect()
  860. {
  861. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke m_pFingerPrint->CancelRegister()");
  862. if (m_pFingerPrint != NULL && !m_pFingerPrint->QuerySessionClosed())
  863. (*m_pFingerPrint)(EntityResource::getLink().upgradeLink())->CancelRegister();
  864. }
  865. #pragma endregion