CustMngrAuthFSM.cpp 28 KB

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