IDCertFSM.cpp 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536
  1. #include "stdafx.h"
  2. #include "IDCertFSM.h"
  3. #include "GetDevInfoHelper.h"
  4. #include "EventCode.h"
  5. #include "libimageproc.h"
  6. #include "ModuleMix.h"
  7. #include "IDCertificate_UserErrorCode.h"
  8. #include "CommDevEntityErrorCode.h"
  9. #include <iostream>
  10. #include <fstream>
  11. #include <stdio.h>
  12. #include <cv.h>
  13. #include <cxcore.h>
  14. #include <highgui.h>
  15. #include "fileutil.h"
  16. #include <CommEntityUtil.hpp>
  17. using namespace SP::Module::Comm;
  18. #define IDCER_INIT_COUNT 3
  19. #define IDCER_READ_TIMEOUT 60000
  20. #define IDCER_AUTH_INTERVAL 300
  21. //oiltmp need to move together?
  22. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf)
  23. {
  24. int len = strlen(strBuf);
  25. if (len == 0 || len % 2 != 0)
  26. return 0;
  27. BYTE* buf = new BYTE[len / 2];
  28. if (buf == NULL)
  29. return 0;
  30. int j = 0;
  31. for (int i = 0; i < len;)
  32. {
  33. int tmpVal;
  34. sscanf(strBuf + i, "%2X", &tmpVal);
  35. buf[j] = tmpVal;
  36. i += 2;
  37. j++;
  38. }
  39. *hexBuf = buf;
  40. return j;
  41. }
  42. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
  43. {
  44. char* tmpStr = *strBuf;
  45. int count = 0;
  46. for (int i = 0; i < len; ++i)
  47. {
  48. sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
  49. count += 2;
  50. }
  51. return 0;
  52. }
  53. //Normal/Idle
  54. void CIDCertFSM::s0_on_entry()
  55. {
  56. LOG_FUNCTION();
  57. m_devState = DEVICE_STATUS_NORMAL;
  58. GetEntityBase()->GetFunction()->SetUserDefineState(USER_IDCERTIFICATE_IDLE);
  59. if (m_FirstStart) {
  60. m_FirstStart = FALSE;
  61. ToLogWarnInfoAboutTerm(this, m_adapterInfo);
  62. }
  63. }
  64. void CIDCertFSM::s0_on_exit()
  65. {
  66. LOG_FUNCTION();
  67. }
  68. unsigned int CIDCertFSM::s0_on_event(FSMEvent* pEvt)
  69. {
  70. LOG_FUNCTION();
  71. Dbg("s0 evt %d",pEvt->iEvt);
  72. switch (pEvt->iEvt)
  73. {
  74. case USER_EVT_ERROR:
  75. pEvt->SetHandled();
  76. break;
  77. case USER_EVT_QUIT:
  78. pEvt->SetHandled();
  79. Dbg("s0 on event quit");
  80. break;
  81. case USER_EVT_READ:
  82. {
  83. pEvt->SetHandled();
  84. ReadEvent* ide = dynamic_cast<ReadEvent *>(pEvt);
  85. ReadTask* task = new ReadTask(this);
  86. task->ctx = ide->ctx;
  87. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  88. }
  89. break;
  90. case USER_EVT_READ_EX:
  91. {
  92. pEvt->SetHandled();
  93. ReadExEvent* ide = dynamic_cast<ReadExEvent *>(pEvt);
  94. ReadExTask* task = new ReadExTask(this);
  95. task->ctx = ide->ctx;
  96. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  97. }
  98. break;
  99. case USER_EVT_READ_AND_SCAN:
  100. {
  101. pEvt->SetHandled();
  102. ReadAndScanEvent* ide = dynamic_cast<ReadAndScanEvent *>(pEvt);
  103. ReadAndScanTask* task = new ReadAndScanTask(this);
  104. task->ctx = ide->ctx;
  105. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  106. }
  107. break;
  108. default:
  109. break;
  110. }
  111. return 0;
  112. }
  113. //Reading
  114. void CIDCertFSM::s1_on_entry()
  115. {
  116. LOG_FUNCTION();
  117. GetEntityBase()->GetFunction()->SetUserDefineState(USER_IDCERTIFICATE_READING);
  118. }
  119. void CIDCertFSM::s1_on_exit()
  120. {
  121. LOG_FUNCTION();
  122. }
  123. unsigned int CIDCertFSM::s1_on_event(FSMEvent *pEvt)
  124. {
  125. LOG_FUNCTION();
  126. Dbg("s1 evt (%d).", pEvt->iEvt);
  127. int ret = 0;
  128. switch(pEvt->iEvt)
  129. {
  130. case USER_EVT_READ_FINISHED:
  131. pEvt->SetHandled();
  132. ret = pEvt->param1;
  133. break;
  134. case USER_EVT_CANCEL_READ:
  135. pEvt->SetHandled();
  136. Dbg("Set cancel read flag");
  137. m_bCancelRead = true;
  138. break;
  139. case USER_EVT_EXIT:
  140. pEvt->SetHandled();
  141. SetExitFlag();
  142. break;
  143. case USER_EVT_QUIT:
  144. pEvt->SetHandled();
  145. break;
  146. case USER_EVT_READ_EX_FINISHED:
  147. pEvt->SetHandled();
  148. ret = pEvt->param1;
  149. break;
  150. case USER_EVT_READ_AND_SCAN_FINISHED:
  151. pEvt->SetHandled();
  152. ret = pEvt->param1;
  153. break;
  154. default:
  155. break;
  156. }
  157. return ret;
  158. }
  159. //failed
  160. void CIDCertFSM::s2_on_entry()
  161. {
  162. LOG_FUNCTION();
  163. m_devState = DEVICE_STATUS_FAULT;
  164. GetEntityBase()->GetFunction()->SetUserDefineState(USER_IDCERTIFICATE_FAILED);
  165. m_testResult = Error_InvalidState;
  166. }
  167. void CIDCertFSM::s2_on_exit()
  168. {
  169. LOG_FUNCTION();
  170. }
  171. unsigned int CIDCertFSM::s2_on_event(FSMEvent* e)
  172. {
  173. LOG_FUNCTION();
  174. if (e->iEvt == USER_EVT_QUIT)
  175. {
  176. e->SetHandled();
  177. return 0;
  178. }
  179. return 0;
  180. }
  181. //Eject
  182. void CIDCertFSM::s3_on_entry()
  183. {
  184. }
  185. void CIDCertFSM::s3_on_exit()
  186. {
  187. }
  188. unsigned int CIDCertFSM::s3_on_event(FSMEvent* e)
  189. {
  190. return 0;
  191. }
  192. //WaitingFetch
  193. void CIDCertFSM::s4_on_entry()
  194. {
  195. LOG_FUNCTION();
  196. WaitFetchIDCardTask* task = new WaitFetchIDCardTask(this);
  197. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  198. }
  199. void CIDCertFSM::s4_on_exit()
  200. {
  201. }
  202. unsigned int CIDCertFSM::s4_on_event(FSMEvent* pEvt)
  203. {
  204. Dbg("wait fetch id card.event %d,%d",pEvt->iEvt,pEvt->param1);
  205. switch (pEvt->iEvt)
  206. {
  207. case USER_EVT_WAIT_FETCH_IDCARD_FINISHED:
  208. pEvt->SetHandled();
  209. break;
  210. default:
  211. break;
  212. }
  213. return 0;
  214. }
  215. //Init
  216. void CIDCertFSM::s5_on_entry()
  217. {
  218. LOG_FUNCTION();
  219. m_devState = DEVICE_STATUS_NOT_READY;
  220. InitTask* task = new InitTask(this);
  221. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  222. }
  223. void CIDCertFSM::s5_on_exit()
  224. {
  225. LOG_FUNCTION();
  226. }
  227. unsigned int CIDCertFSM::s5_on_event(FSMEvent* pEvt)
  228. {
  229. LOG_FUNCTION();
  230. Dbg("s5 evt %d", pEvt->iEvt);
  231. int ret = 0;
  232. switch (pEvt->iEvt)
  233. {
  234. case USER_EVT_ERROR:
  235. pEvt->SetHandled();
  236. break;
  237. case USER_EVT_QUIT:
  238. pEvt->SetHandled();
  239. Dbg("s5 on event quit");
  240. break;
  241. case USER_EVT_INIT_FINISHED:
  242. {
  243. pEvt->SetHandled();
  244. ret = pEvt->param1;
  245. }
  246. break;
  247. default:
  248. break;
  249. }
  250. return ret;
  251. }
  252. ErrorCodeEnum CIDCertFSM::GetVendorDllPath(CSimpleStringA &strPath)
  253. {
  254. strPath = "termb.dll";
  255. return Error_Succeed;//oiltest
  256. CSimpleStringA strDepPath;
  257. ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("Dep", strDepPath);
  258. if (Error == Error_Succeed) {
  259. strPath = "termb.dll";//CSimpleStringA::Format("%s\\mod_IDCertificate\\termb.dll", (LPCSTR)strDepPath);
  260. }
  261. return Error;
  262. }
  263. bool isnostr(const char *str)
  264. {
  265. int len = strlen(str);
  266. if (len == 0)
  267. return true;
  268. for (int i = 0; i < len; ++i)
  269. {
  270. if (*(str+i) != ' ')
  271. return false;
  272. }
  273. return true;
  274. }
  275. ErrorCodeEnum CIDCertFSM::OnInit()
  276. {
  277. ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
  278. ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN);
  279. ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN);
  280. m_devCatInfo.eState = DEVICE_STATUS_NOT_READY;
  281. m_devCatInfo.version = {0, 0, 0, 0};
  282. return Error_Succeed;
  283. }
  284. ErrorCodeEnum CIDCertFSM::OnExit()
  285. {
  286. if (m_hDevHelper)
  287. {
  288. ErrorCodeEnum err = Error_Succeed;
  289. m_hDevHelper.TearDown();
  290. return err;
  291. }
  292. return Error_Succeed;
  293. }
  294. ErrorCodeEnum CIDCertFSM::CheckDate(const char* date)
  295. {
  296. string strDate = date;
  297. if (strDate.find("长期") != string::npos)
  298. {
  299. return Error_Succeed;
  300. }
  301. else
  302. {
  303. regex pattern("^(([0-9]{4})(\.|-|年)(0[1-9]|1[0-2])(\.|-|月)(0[1-9]|[12][0-9]|3[01])(日)*)$");
  304. smatch sm;
  305. if (regex_match(strDate, sm, pattern))
  306. {
  307. int month = atoi(sm[4].str().c_str());
  308. int day = atoi(sm[6].str().c_str());
  309. if (month > 0 && month <= 12 && day > 0 && day <= 31)
  310. {
  311. return Error_Succeed;
  312. }
  313. }
  314. }
  315. return Error_Unexpect;
  316. }
  317. ErrorCodeEnum CIDCertFSM::CheckDate(const char* startDate, const char* endDate)
  318. {
  319. string strStartDate = startDate, strEndDate = endDate;
  320. regex pattern("^(([0-9]{4})(\.|-))");
  321. smatch smStart, smEnd;
  322. if (regex_search(strStartDate, smStart, pattern) && regex_search(strEndDate, smEnd, pattern))
  323. {
  324. strStartDate = smStart.suffix().str();
  325. strEndDate = smEnd.suffix().str();
  326. if (strStartDate == strEndDate)
  327. return Error_Succeed;
  328. }
  329. return Error_Unexpect;
  330. }
  331. void CIDCertFSM::LogDate(IDCerInfo idInfo)
  332. {
  333. ErrorCodeEnum eErrCode = CheckDate(idInfo.startDate.data);
  334. CSimpleStringA errMsg;
  335. if (Error_Succeed != eErrCode)
  336. {
  337. errMsg = CSimpleStringA::Format("Invalid startDate: %s", idInfo.startDate.data);
  338. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg);
  339. }
  340. eErrCode = CheckDate(idInfo.endDate.data);
  341. if (Error_Succeed != eErrCode)
  342. {
  343. CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate: %s", idInfo.endDate.data);
  344. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg);
  345. }
  346. eErrCode = CheckDate(idInfo.startDate.data, idInfo.endDate.data);
  347. if (Error_Succeed != eErrCode)
  348. {
  349. CSimpleStringA errMsg = CSimpleStringA::Format("起止日期不匹配:start=%s, end=%s", idInfo.startDate.data, idInfo.endDate.data);
  350. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_NotMatch, (const char*)errMsg);
  351. }
  352. eErrCode = CheckDate(idInfo.birthday.data);
  353. if (Error_Succeed != eErrCode)
  354. {
  355. CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate: %s", idInfo.birthday.data);
  356. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg);
  357. }
  358. }
  359. void CIDCertFSM::LogDateEx(IDCerInfoEx idInfo)
  360. {
  361. ErrorCodeEnum eErrCode = CheckDate(idInfo.startDate.data);
  362. CSimpleStringA errMsg;
  363. if (Error_Succeed != eErrCode)
  364. {
  365. errMsg = CSimpleStringA::Format("Invalid startDate: %s", idInfo.startDate.data);
  366. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg);
  367. }
  368. eErrCode = CheckDate(idInfo.endDate.data);
  369. if (Error_Succeed != eErrCode)
  370. {
  371. CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate: %s", idInfo.endDate.data);
  372. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg);
  373. }
  374. eErrCode = CheckDate(idInfo.startDate.data, idInfo.endDate.data);
  375. if (Error_Succeed != eErrCode)
  376. {
  377. CSimpleStringA errMsg = CSimpleStringA::Format("起止日期不匹配:start=%s, end=%s", idInfo.startDate.data, idInfo.endDate.data);
  378. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_NotMatch, (const char*)errMsg);
  379. }
  380. eErrCode = CheckDate(idInfo.birthday.data);
  381. if (Error_Succeed != eErrCode)
  382. {
  383. CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate: %s", idInfo.birthday.data);
  384. LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg);
  385. }
  386. }
  387. int CIDCertFSM::ReadInfo(SpReqAnsContext<IDCert_Read_Req, IDCert_Read_Ans>::Pointer ctx)
  388. {
  389. LOG_FUNCTION();
  390. DWORD elapsed = 0;
  391. DWORD dwStart = RVCGetTickCount();
  392. DWORD dwEnd = RVCGetTickCount();
  393. ErrorCodeEnum hr;
  394. LogEvent(Severity_Middle,LOG_EVT_IDCERTIFICATE_GREEN_ON,"IDCer warning on");
  395. Dbg("Before readingInfo, do clear job.");
  396. DeleteZP(Bmp_ZP);
  397. Dbg("Before readingInfo, finish doing clear job.");
  398. bool bOpenRF = false,bGetIDCert = false;
  399. IDCerInfo idInfo;
  400. memset(&idInfo, 0, sizeof(idInfo));
  401. m_bCancelRead = false;
  402. m_bWaitReadMore = false;
  403. m_bReading = true;
  404. m_bExit = false;
  405. while(elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead)
  406. {
  407. Dbg("338");
  408. if (m_bExit)
  409. {
  410. Dbg("exit");
  411. break;
  412. }
  413. if (m_bWaitReadMore)
  414. {
  415. dwStart = RVCGetTickCount();
  416. m_bWaitReadMore = false;
  417. }
  418. if (!bOpenRF)
  419. {
  420. hr = m_hDevHelper->IDCerRFControl(true);
  421. if (Error_Succeed == hr)
  422. {
  423. Dbg("open rf succeed.");
  424. }
  425. else
  426. {
  427. Dbg("open rf failed. %d",hr);
  428. dwEnd = RVCGetTickCount();
  429. elapsed = dwEnd - dwStart;
  430. //if cannot open rf in 10s ,quit
  431. // Adapt to Desk2S [4/12/2018 15:05 @Gifur]
  432. /*if (elapsed > 10000)
  433. break;
  434. else*/{
  435. Sleep(IDCER_AUTH_INTERVAL);
  436. continue;
  437. }
  438. }
  439. }
  440. bOpenRF = true;
  441. Sleep(IDCER_AUTH_INTERVAL);
  442. hr = m_hDevHelper->IDCerAuthenticate();
  443. if (Error_Succeed != hr)
  444. {
  445. DevErrorInfo devErrInfo;
  446. m_hDevHelper->GetLastErr(devErrInfo);
  447. Dbg("IDCerAuthenticate failed %d,%s.", hr, devErrInfo.szErrMsg);
  448. dwEnd = RVCGetTickCount();
  449. elapsed = dwEnd - dwStart;
  450. continue;
  451. }
  452. else
  453. {
  454. Dbg("auth succeed.");
  455. hr = m_hDevHelper->IDCerGetData(idInfo);
  456. if (hr != Error_Succeed)
  457. {
  458. LOG_IDCER_ERROR_MSG_MACRO(hr, IDCerGetData);
  459. }
  460. else
  461. {
  462. LOG_TRACE("read succeed.");
  463. LogEvent(Severity_Middle,LOG_EVT_IDCERTIFICATE_OP,"IDCertifacate op.");
  464. //oiltest
  465. ctx->Ans.name = idInfo.name.data;
  466. //ctx->Ans.name = "我.们我.们我·们我·们爱邱总";
  467. //ctx->Ans.name = "张云虎";
  468. ctx->Ans.sex = idInfo.sex.data;
  469. ctx->Ans.nation = idInfo.nation.data;
  470. ctx->Ans.birthday = idInfo.birthday.data;
  471. ctx->Ans.address = idInfo.address.data;
  472. //oiltest
  473. ctx->Ans.idcode = idInfo.idno.data;
  474. //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换
  475. if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x')
  476. {
  477. Dbg("x to X");
  478. ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X';
  479. }
  480. //ctx->Ans.idcode = "370285198804025014";
  481. ctx->Ans.department = idInfo.department.data;
  482. ctx->Ans.startdate = idInfo.startDate.data;
  483. ctx->Ans.enddate = idInfo.endDate.data;
  484. //ctx->Ans.startdate = "2015.08.06";
  485. //ctx->Ans.enddate = "2035.08.06";
  486. //oiltest
  487. /*Dbg("Name:%s,Sex:%s,Nation:%s,Birthday:%s,StartDate:%s,EndDate:%s,IDNo:%s****%s,Address:%s,"
  488. ,idInfo.name.data
  489. ,idInfo.sex.data
  490. ,idInfo.nation.data
  491. ,idInfo.birthday.data
  492. ,idInfo.startDate.data
  493. ,idInfo.endDate.data
  494. ,(const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
  495. ,idInfo.address.data);*/
  496. Dbg("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,"
  497. ,idInfo.sex.data
  498. ,idInfo.nation.data
  499. ,idInfo.endDate.data
  500. ,(const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1));
  501. Dbg("to get photo");
  502. hr = GetPngBlob(ctx->Ans.photodata,true);
  503. if (hr != Error_Succeed)
  504. {
  505. bGetIDCert = false;
  506. LOG_TRACE("get photo failed.");
  507. break;
  508. }
  509. bGetIDCert = true;
  510. break;
  511. }
  512. }
  513. dwEnd = RVCGetTickCount();
  514. elapsed = dwEnd - dwStart;
  515. }
  516. m_bExit = false;
  517. m_bReading = false;
  518. LogEvent(Severity_Middle,LOG_EVT_IDCERTIFICATE_GREEN_OFF,"IDCer warning off");
  519. Dbg("after close light");
  520. if (bGetIDCert)
  521. ctx->Answer(Error_Succeed);
  522. else if (m_bCancelRead)
  523. ctx->Answer(Error_Cancel);
  524. else if (elapsed >= IDCER_READ_TIMEOUT)
  525. ctx->Answer(Error_TimeOut);
  526. else
  527. ctx->Answer(Error_Unexpect, AlarmDECToBusiness());
  528. //if (!bGetIDCert)
  529. //LogWarn(Severity_Low,Error_DevCommFailed,LOG_WARN_IDCERTIFICATE_ACTION,"IDCertificate read failed.");
  530. Dbg("after send ack");
  531. //if (!bOpenRF)
  532. //{
  533. // LOG_TRACE("rf failed.");
  534. // return 1;
  535. //}
  536. if(bOpenRF) {
  537. hr = m_hDevHelper->IDCerRFControl(false);
  538. if (hr != Error_Succeed)
  539. {
  540. LOG_IDCER_ERROR_MSG_MACRO(hr, IDCerRFControl);
  541. return 1;
  542. }
  543. }
  544. return 0;
  545. }
  546. int CIDCertFSM::ReadInfoEx(SpReqAnsContext<IDCert_ReadEx_Req, IDCert_ReadEx_Ans>::Pointer ctx)
  547. {
  548. LOG_FUNCTION();
  549. DWORD elapsed = 0;
  550. DWORD dwStart = RVCGetTickCount();
  551. DWORD dwEnd = RVCGetTickCount();
  552. ErrorCodeEnum eErr;
  553. LogEvent(Severity_Middle,LOG_EVT_IDCERTIFICATE_GREEN_ON,"IDCer warning on");
  554. Dbg("Before readingInfo, do clear job.");
  555. DeleteZP(Bmp_ZP);
  556. Dbg("Before readingInfo, finish doing clear job.");
  557. bool bOpenRF = false, bGetIDCert = false;
  558. IDCerInfoEx idInfo;
  559. ZeroMemory(&idInfo, sizeof(IDCerInfoEx));
  560. m_bCancelRead = false;
  561. m_bWaitReadMore = false;
  562. m_bReading = true;
  563. m_bExit = false;
  564. while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead)
  565. {
  566. if (m_bExit)
  567. {
  568. Dbg("exit");
  569. break;
  570. }
  571. if (m_bWaitReadMore)
  572. {
  573. dwStart = RVCGetTickCount();
  574. m_bWaitReadMore = false;
  575. }
  576. if (!bOpenRF)
  577. {
  578. eErr = m_hDevHelper->IDCerRFControl(true);
  579. if (Error_Succeed == eErr)
  580. {
  581. Dbg("open rf succeed.");
  582. }
  583. else
  584. {
  585. Dbg("open rf failed.");
  586. dwEnd = RVCGetTickCount();
  587. elapsed = dwEnd - dwStart;
  588. //if cannot open rf in 10s ,quit
  589. /* if (elapsed > 10000)
  590. break;
  591. else*/{
  592. Sleep(IDCER_AUTH_INTERVAL);
  593. continue;
  594. }
  595. }
  596. }
  597. bOpenRF = true;
  598. Sleep(IDCER_AUTH_INTERVAL);
  599. eErr = m_hDevHelper->IDCerAuthenticate();//卡认证
  600. if (Error_Succeed != eErr)
  601. {
  602. LOG_IDCER_ERROR_MSG_MACRO(eErr, IDCerAuthenticate);
  603. dwEnd = RVCGetTickCount();
  604. elapsed = dwEnd - dwStart;
  605. continue;
  606. }
  607. else
  608. {
  609. Dbg("auth succeed.");
  610. eErr = m_hDevHelper->IDCerGetDataEx(idInfo);
  611. if (eErr != Error_Succeed)
  612. {
  613. LOG_IDCER_ERROR_MSG_MACRO(eErr, IDCerGetDataEx);
  614. }
  615. else
  616. {
  617. LOG_TRACE("read succeed.");
  618. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
  619. ctx->Ans.name = idInfo.name.data;
  620. ctx->Ans.sex = idInfo.sex.data;
  621. ctx->Ans.nation = idInfo.nation.data;
  622. ctx->Ans.birthday = idInfo.birthday.data;
  623. ctx->Ans.address = idInfo.address.data;
  624. ctx->Ans.idcode = idInfo.idno.data;
  625. //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换
  626. if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x')
  627. {
  628. Dbg("x to X");
  629. ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X';
  630. }
  631. ctx->Ans.department = idInfo.department.data;
  632. ctx->Ans.startdate = idInfo.startDate.data;
  633. ctx->Ans.enddate = idInfo.endDate.data;
  634. ctx->Ans.englishname = idInfo.englishName.data;
  635. ctx->Ans.nationality = idInfo.nationality.data;
  636. ctx->Ans.idversion = idInfo.idVersion.data;
  637. ctx->Ans.idtype = idInfo.idType.data;
  638. ctx->Ans.reserved = idInfo.reserved.data;
  639. ctx->Ans.startdate = idInfo.startDate.data;
  640. /*Dbg("Name:%s,Sex:%s,Nation:%s,Birthday:%s,StartDate:%s,EndDate:%s,IDNo:%s****%s,Address:%s,IDType:%s,Department:%s,EnglishName:%s,Nationality:%s"
  641. , (const char*)ctx->Ans.name, (const char*)ctx->Ans.sex, (const char*)ctx->Ans.nation
  642. , (const char*)ctx->Ans.birthday
  643. , (const char*)ctx->Ans.startdate, (const char*)ctx->Ans.enddate
  644. , (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
  645. , (const char*)ctx->Ans.address
  646. , (const char*)ctx->Ans.idtype
  647. , (const char*)ctx->Ans.department
  648. , (const char*)ctx->Ans.englishname , (const char*)ctx->Ans.nationality);*/
  649. Dbg("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s"
  650. ,(const char*)ctx->Ans.sex, (const char*)ctx->Ans.nation
  651. ,(const char*)ctx->Ans.enddate
  652. , (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
  653. , (const char*)ctx->Ans.idtype);
  654. Dbg("to get photo");
  655. eErr = GetPngBlob(ctx->Ans.photodata,true);
  656. if (eErr != Error_Succeed)
  657. {
  658. bGetIDCert = false;
  659. LOG_TRACE("get photo failed.");
  660. break;
  661. }
  662. bGetIDCert = true;
  663. break;
  664. }
  665. }
  666. dwEnd = RVCGetTickCount();
  667. elapsed = dwEnd - dwStart;
  668. }
  669. m_bExit = false;
  670. m_bReading = false;
  671. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off");
  672. Dbg("after close light");
  673. //if (!bGetIDCert)
  674. //LogWarn(Severity_Low, Error_DevCommFailed, LOG_WARN_IDCERTIFICATE_ACTION, "IDCertificate read failed.");
  675. int pos = 99;
  676. ErrorCodeEnum eErr1 = m_hDevHelper->QueryCardPos(pos);
  677. if (eErr1 == Error_NotImpl)
  678. {
  679. Dbg("old version.no need position.");
  680. }
  681. else
  682. {
  683. switch (pos)
  684. {
  685. case 1:
  686. eErr1 = m_hDevHelper->IDCerRFControl(false);
  687. if (eErr1 != Error_Succeed)
  688. m_hDevHelper->ForceIDEject();
  689. break;
  690. case 2:
  691. break;
  692. case 0:
  693. default:
  694. break;
  695. }
  696. //查询卡片位置以决定跳转
  697. eErr1 = m_hDevHelper->QueryCardPos(pos);
  698. if (eErr1 == Error_Succeed)
  699. {
  700. Dbg("pos:%d",pos);
  701. /*if (pos == 2)
  702. return 4;*/
  703. }
  704. }
  705. if (!(eErr1 == Error_Succeed && pos == 2))
  706. {
  707. //oilyang@20180531 add for close enter card
  708. m_hDevHelper->IDCerRFControl(false); //这里基本不耗时,凯欣达大机耗时较长
  709. }
  710. //zjw@20191219 处理完相关操作再返回给前端,防止状态还未跳转又发起流程
  711. if (bGetIDCert)
  712. ctx->Answer(Error_Succeed);
  713. else if (m_bCancelRead)
  714. ctx->Answer(Error_Cancel);
  715. else if (elapsed >= IDCER_READ_TIMEOUT)
  716. ctx->Answer(Error_TimeOut);
  717. else
  718. ctx->Answer(Error_Unexpect);
  719. if (eErr1 == Error_Succeed && pos == 2)
  720. {
  721. return 4;
  722. }
  723. return 0;
  724. }
  725. int CIDCertFSM::ReadAndScan(SpReqAnsContext<IDCert_ReadAndScan_Req, IDCert_ReadAndScan_Ans>::Pointer ctx)
  726. {
  727. LOG_FUNCTION();
  728. DWORD elapsed = 0;
  729. DWORD dwStart = RVCGetTickCount();
  730. DWORD dwEnd = RVCGetTickCount();
  731. ErrorCodeEnum eErr;
  732. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on");
  733. DeleteZP(Bmp_ZP|Bmp_SCAN);
  734. bool bOpenRF = false, bGetIDCert = false;
  735. IDCerInfoEx idInfo;
  736. IDCerInfo idInfoOld;
  737. memset(&idInfo, 0, sizeof(idInfo));
  738. memset(&idInfoOld, 0, sizeof(idInfoOld));
  739. m_bCancelRead = false;
  740. m_bWaitReadMore = false;
  741. m_bReading = true;
  742. m_bExit = false;
  743. ErrorCodeEnum ecForIDCerRFControl(Error_Succeed);
  744. ErrorCodeEnum ecForIDCerAuthenticate(Error_Succeed);
  745. while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead)
  746. {
  747. if (m_bExit)
  748. {
  749. Dbg("exit");
  750. break;
  751. }
  752. if (m_bWaitReadMore)
  753. {
  754. dwStart = RVCGetTickCount();
  755. m_bWaitReadMore = false;
  756. }
  757. if (!bOpenRF)
  758. {
  759. eErr = m_hDevHelper->IDCerRFControl(true);
  760. ecForIDCerRFControl = eErr;
  761. if (Error_Succeed == eErr)
  762. {
  763. Dbg("open rf succeed.");
  764. }
  765. else
  766. {
  767. Dbg("open rf failed.");
  768. dwEnd = RVCGetTickCount();
  769. elapsed = dwEnd - dwStart;
  770. Sleep(IDCER_AUTH_INTERVAL);
  771. continue;
  772. }
  773. }
  774. bOpenRF = true;
  775. Sleep(IDCER_AUTH_INTERVAL);
  776. eErr = m_hDevHelper->IDCerAuthenticate();
  777. ecForIDCerAuthenticate = eErr;
  778. if (Error_Succeed != eErr)
  779. {
  780. Dbg("IDCerAuthenticate failed: %s", SpStrError(ecForIDCerAuthenticate));
  781. dwEnd = RVCGetTickCount();
  782. elapsed = dwEnd - dwStart;
  783. if (eErr == Error_DevMedia)
  784. break;
  785. continue;
  786. }
  787. else
  788. {
  789. Dbg("auth succeed.");
  790. eErr = m_hDevHelper->IDCerGetDataEx(idInfo);
  791. if (eErr == Error_NotImpl)
  792. {
  793. Dbg("to call old interface");
  794. eErr = m_hDevHelper->IDCerGetData(idInfoOld);
  795. if (eErr != Error_Succeed)
  796. {
  797. Dbg("Invoke IDCerGetData failed: %s", SpStrError(eErr));
  798. }
  799. else
  800. {
  801. Dbg("read succeed.");
  802. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
  803. ctx->Ans.name = idInfoOld.name.data;
  804. ctx->Ans.sex = idInfoOld.sex.data;
  805. ctx->Ans.nation = idInfoOld.nation.data;
  806. ctx->Ans.birthday = idInfoOld.birthday.data;
  807. ctx->Ans.address = idInfoOld.address.data;
  808. //oiltest
  809. ctx->Ans.idcode = idInfoOld.idno.data;
  810. //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换
  811. if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x')
  812. {
  813. Dbg("x to X");
  814. ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X';
  815. }
  816. //ctx->Ans.idcode = "370285198804025014";
  817. ctx->Ans.department = idInfoOld.department.data;
  818. ctx->Ans.startdate = idInfoOld.startDate.data;
  819. ctx->Ans.enddate = idInfoOld.endDate.data;
  820. //hyc@2021.3.24
  821. LogDate(idInfoOld);
  822. Dbg("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,"
  823. ,idInfoOld.sex.data
  824. ,idInfoOld.nation.data
  825. ,idInfoOld.endDate.data
  826. ,(const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1));
  827. Dbg("to get photo");
  828. GetPngBlobEx(ctx->Ans.headphoto, "zp", true);
  829. eErr = GetPngBlob(ctx->Ans.photodata, true);
  830. if (eErr != Error_Succeed)
  831. {
  832. bGetIDCert = false;
  833. LOG_TRACE("get photo failed.");
  834. break;
  835. }
  836. bGetIDCert = true;
  837. break;
  838. }
  839. }
  840. else
  841. {
  842. if (eErr != Error_Succeed)
  843. {
  844. Dbg("Invoke IDCerGetDataEx failed: %s", SpStrError(eErr));
  845. }
  846. else
  847. {
  848. Dbg("read succeed.");
  849. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
  850. ctx->Ans.name = idInfo.name.data;
  851. ctx->Ans.sex = idInfo.sex.data;
  852. ctx->Ans.nation = idInfo.nation.data;
  853. ctx->Ans.birthday = idInfo.birthday.data;
  854. ctx->Ans.address = idInfo.address.data;
  855. ctx->Ans.idcode = idInfo.idno.data;
  856. //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换
  857. if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x')
  858. {
  859. Dbg("x to X");
  860. ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X';
  861. }
  862. ctx->Ans.department = idInfo.department.data;
  863. ctx->Ans.startdate = idInfo.startDate.data;
  864. ctx->Ans.enddate = idInfo.endDate.data;
  865. ctx->Ans.englishname = idInfo.englishName.data;
  866. ctx->Ans.nationality = idInfo.nationality.data;
  867. ctx->Ans.idversion = idInfo.idVersion.data;
  868. ctx->Ans.idtype = idInfo.idType.data;
  869. ctx->Ans.reserved = idInfo.reserved.data;
  870. ctx->Ans.startdate = idInfo.startDate.data;
  871. eErr = m_hDevHelper->ScanIDAndSaveImage();
  872. ctx->Ans.hasscan = 0;
  873. if (eErr == Error_Succeed)
  874. {
  875. //idfront.bmp" and "idback.bmp
  876. ErrorCodeEnum eErrFront, eErrBack;
  877. eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront", false);
  878. eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback", false);
  879. if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
  880. ctx->Ans.hasscan = 1;
  881. }
  882. else
  883. {
  884. Dbg("Invoke ScanIDAndSaveImage Failed: %s", SpStrError(eErr));
  885. }
  886. GetPngBlobEx(ctx->Ans.headphoto, "zp", true);
  887. Dbg("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s"
  888. , (const char*)ctx->Ans.sex, (const char*)ctx->Ans.nation
  889. , (const char*)ctx->Ans.enddate
  890. , (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)
  891. , (const char*)ctx->Ans.idtype);
  892. Dbg("to get photo");
  893. eErr = GetPngBlob(ctx->Ans.photodata, true);
  894. if (eErr != Error_Succeed)
  895. {
  896. bGetIDCert = false;
  897. Dbg("get photo failed.");
  898. break;
  899. }
  900. bGetIDCert = true;
  901. break;
  902. }
  903. }
  904. }
  905. dwEnd = RVCGetTickCount();
  906. elapsed = dwEnd - dwStart;
  907. }
  908. m_bExit = false;
  909. m_bReading = false;
  910. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off");
  911. Dbg("after close light");
  912. Dbg("ans size:%d",sizeof(ctx->Ans));
  913. Dbg("%d",FIELD_OFFSET(IDCertificate::IDCertService_ReadAndScan_Ans, reserved));
  914. int pos = 99;
  915. ErrorCodeEnum eErr1 = m_hDevHelper->QueryCardPos(pos);
  916. if (eErr1 == Error_NotImpl)
  917. {
  918. Dbg("old version.no need position.");
  919. }
  920. else
  921. {
  922. Dbg("pos before eject:%d", pos);
  923. switch (pos)
  924. {
  925. case 1:
  926. case 2:
  927. eErr1 = m_hDevHelper->IDCerRFControl(false);
  928. if (eErr1 != Error_Succeed)
  929. {
  930. Dbg("exec IDCerRFControl(false) failed, force eject...");
  931. m_hDevHelper->ForceIDEject();
  932. }
  933. else
  934. Dbg("exec IDCerRFControl(false) succ.");
  935. break;
  936. case 0:
  937. default:
  938. break;
  939. }
  940. //查询卡片位置以决定跳转
  941. eErr1 = m_hDevHelper->QueryCardPos(pos);
  942. if (eErr1 == Error_Succeed)
  943. {
  944. Dbg("pos after eject:%d", pos);
  945. /*if (pos == 2)
  946. return 4;*/
  947. }
  948. }
  949. if ( ! (eErr1 == Error_Succeed && pos == 2) )
  950. {
  951. //oilyang@20180531 add for close enter card
  952. m_hDevHelper->IDCerRFControl(false); //这里基本不耗时,凯欣达新大机耗时较长(先改我们流程解决,后续需要厂商优化这里)
  953. }
  954. //zjw@20191219 处理完相关操作再返回给前端,防止状态还未跳转又发起流程
  955. if (bGetIDCert)
  956. ctx->Answer(Error_Succeed);
  957. else if (m_bCancelRead)
  958. ctx->Answer(Error_Cancel);
  959. else if (elapsed >= IDCER_READ_TIMEOUT) {
  960. ctx->Answer(Error_TimeOut);
  961. if (ecForIDCerRFControl != Error_Succeed) {
  962. SetErrPackage(m_errPkg, "ReadAndScan::IDCerRFControl", m_devSN, ecForIDCerRFControl, MEC_DEVAPI_IDCER_IDCerRFControl);
  963. AlarmDEC(m_errPkg);
  964. }
  965. if (ecForIDCerAuthenticate != Error_Succeed) {
  966. SetErrPackage(m_errPkg, "ReadAndScan::IDCerAuthenticate", m_devSN, ecForIDCerAuthenticate, MEC_DEVAPI_IDCER_IDCerAuthenticate);
  967. AlarmDEC(m_errPkg);
  968. }
  969. }
  970. else if (eErr == Error_DevMedia)
  971. ctx->Answer(Error_DevMedia);
  972. else {
  973. ctx->Answer(Error_Unexpect);
  974. if (ecForIDCerRFControl != Error_Succeed) {
  975. SetErrPackage(m_errPkg, "ReadAndScan::IDCerRFControl", m_devSN, ecForIDCerRFControl, MEC_DEVAPI_IDCER_IDCerRFControl);
  976. AlarmDEC(m_errPkg);
  977. }
  978. if (ecForIDCerAuthenticate != Error_Succeed) {
  979. SetErrPackage(m_errPkg, "ReadAndScan::IDCerAuthenticate", m_devSN, ecForIDCerAuthenticate, MEC_DEVAPI_IDCER_IDCerAuthenticate);
  980. AlarmDEC(m_errPkg);
  981. }
  982. }
  983. if (eErr1 == Error_Succeed && pos == 2)
  984. {
  985. return 4;
  986. }
  987. return 0;
  988. }
  989. ErrorCodeEnum CIDCertFSM::GetPngBlob(CBlob &data, bool bClear)
  990. {
  991. CSimpleStringA strPath,strBkPath,strBmpPath,strPngPath,strTxtPath,strWltPath;
  992. ErrorCodeEnum err;
  993. err = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  994. if (err != Error_Succeed)
  995. {
  996. Dbg("Get path failed.");
  997. return Error_Param;
  998. }
  999. strBkPath = strPath + SPLIT_SLASH_STR + "bk.bmp";
  1000. strBmpPath = strPath + SPLIT_SLASH_STR + "zp.bmp";
  1001. strPngPath = strPath + SPLIT_SLASH_STR + "zp.JPEG";
  1002. strTxtPath = strPath + SPLIT_SLASH_STR + "wz.txt";
  1003. strWltPath = strPath + SPLIT_SLASH_STR + "xp.wlt";
  1004. Dbg("photo change: %s,%s,%s",(LPCSTR)strBkPath,(LPCSTR)strBmpPath,(LPCSTR)strPngPath);
  1005. bool bResult = imageprocess((char*)strBkPath.GetData(), (char*)strBmpPath.GetData(), (char*)strPngPath.GetData());
  1006. Dbg("photo changed");
  1007. if (!bResult)
  1008. {
  1009. Dbg("photo changed failed.");
  1010. return Error_Unexpect;
  1011. }
  1012. //if (Error == Error_Succeed) {
  1013. FILE *fp = fopen(strPngPath, "rb");
  1014. if (fp) {
  1015. fseek(fp, 0, SEEK_END);
  1016. long flen = ftell(fp);
  1017. fseek(fp, 0, SEEK_SET);
  1018. data.Alloc(flen);
  1019. fread(data.m_pData, 1, flen, fp);
  1020. fclose(fp);
  1021. //DeleteFileA(strTxtPath);
  1022. //DeleteFileA(strWltPath);
  1023. } else {
  1024. LOG_TRACE("fopen %s failed!", (LPCSTR)strPngPath);
  1025. err = Error_IO;
  1026. }
  1027. //}
  1028. Dbg("After ReadInfo, do clear job.");
  1029. if (bClear)
  1030. DeleteZP(Bmp_ZP);
  1031. Dbg("After ReadInfo, finish doing clear job.");
  1032. return err;
  1033. }
  1034. ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefix, bool bClear)
  1035. {
  1036. CSimpleStringA strPath;
  1037. ErrorCodeEnum eErr;
  1038. eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1039. if (eErr != Error_Succeed)
  1040. {
  1041. Dbg("Get path failed.");
  1042. if (bClear)
  1043. DeleteZP(Bmp_SCAN);
  1044. return Error_Param;
  1045. }
  1046. strPath = strPath + SPLIT_SLASH_STR + fileNamePrefix;
  1047. Dbg("to load [%s.bmp",(const char*)strPath);
  1048. IplImage *src = cvLoadImage(strPath + ".bmp");
  1049. if (!src)
  1050. {
  1051. Dbg("read file %s.bmp failed.err:%d", (const char*)strPath, GetLastError());
  1052. if (bClear)
  1053. DeleteZP(Bmp_SCAN);
  1054. return Error_Unexpect;
  1055. }
  1056. cvSaveImage(strPath + ".jpg", src);
  1057. FILE *fp = fopen(strPath + ".jpg", "rb");
  1058. if (fp) {
  1059. fseek(fp, 0, SEEK_END);
  1060. long flen = ftell(fp);
  1061. fseek(fp, 0, SEEK_SET);
  1062. data.Alloc(flen);
  1063. Dbg("alloc data:%d",flen);
  1064. fread(data.m_pData, 1, flen, fp);
  1065. fclose(fp);
  1066. if (bClear)
  1067. DeleteZP(Bmp_SCAN);
  1068. return Error_Succeed;
  1069. }
  1070. else {
  1071. Dbg("fopen %s failed!", (const char*)strPath);
  1072. if (bClear)
  1073. DeleteZP(Bmp_SCAN);
  1074. return Error_IO;
  1075. }
  1076. }
  1077. void CIDCertFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1078. {
  1079. //for simple
  1080. pTransactionContext->SendAnswer(m_testResult);
  1081. }
  1082. ErrorCodeEnum CIDCertFSM::DeleteFileIfExisted(LPCTSTR fileName)
  1083. {
  1084. if(strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  1085. {
  1086. Dbg("Invalid or empty fileName(%s)", fileName);
  1087. return Error_Param;
  1088. }
  1089. CSimpleStringA strPath, strAimPath;
  1090. ErrorCodeEnum erroCode = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1091. strAimPath = strPath + SPLIT_SLASH_STR + fileName;
  1092. if(ExistsFileA((LPCTSTR)strAimPath))
  1093. {
  1094. if(RemoveFileA((LPCTSTR)strAimPath))
  1095. {
  1096. Dbg("RemoveFileA(%s) suc.", (LPCTSTR)strAimPath);
  1097. return Error_Succeed;
  1098. }
  1099. else
  1100. {
  1101. Dbg("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1102. return Error_Unexpect;
  1103. }
  1104. }
  1105. if(GetLastError() == ERROR_FILE_NOT_FOUND)
  1106. {
  1107. return Error_Succeed;
  1108. }
  1109. Dbg("DeleteFile(%s) Unexpect GetLastError(%d).", (LPCTSTR)strAimPath, GetLastError());
  1110. return Error_Unexpect;
  1111. }
  1112. ErrorCodeEnum CIDCertFSM::GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType)
  1113. {
  1114. LOG_FUNCTION();
  1115. if (m_bRVCIL)
  1116. {
  1117. memset(m_devCatInfo.szModel, 0, MAX_DEV_MODEL_LEN);
  1118. memset(m_devCatInfo.szType, 0, MAX_DEV_TYPE_LEN);
  1119. memset(m_devCatInfo.szVendor, 0, MAX_DEV_VENDOR_LEN);
  1120. return Error_Succeed;
  1121. }
  1122. Dbg("DevCategoryInfo len:%d,%d,%d", strlen(m_devCatInfo.szModel), strlen(m_devCatInfo.szType), strlen(m_devCatInfo.szVendor));
  1123. strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN >strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel)+1 : MAX_DEV_MODEL_LEN);
  1124. strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN >strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) + 1 : MAX_DEV_TYPE_LEN);
  1125. strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN >strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) + 1 : MAX_DEV_VENDOR_LEN);
  1126. devType = m_devVer;//适配器版本号
  1127. devInfo.eState = DEVICE_STATUS_NORMAL;
  1128. memcpy(&devInfo.version, &m_devCatInfo.version, sizeof(DevSoftVersion));
  1129. return Error_Succeed;
  1130. }
  1131. int CIDCertFSM::WaitFetchIDCard()
  1132. {
  1133. LOG_FUNCTION();
  1134. ErrorCodeEnum eErr = Error_Unexpect;
  1135. int pos = 99;
  1136. //DWORD64 dwStart = RVCGetTickCount64();
  1137. DWORD64 dwStart = RVCGetTickCount();
  1138. DWORD64 dwEnd = 0;
  1139. while ((dwEnd - dwStart)< 120 * 1000)//wait for 120 seconds
  1140. {
  1141. eErr = m_hDevHelper->QueryCardPos(pos);
  1142. if (eErr == Error_Succeed && pos == 0)
  1143. {
  1144. Dbg("身份证被取回");
  1145. return 0;
  1146. }
  1147. Sleep(1000);
  1148. }
  1149. // BugFix [4/16/2020 14:27 @Gifur]
  1150. return -1;
  1151. }
  1152. void CIDCertFSM::DeleteZP(int type)
  1153. {
  1154. if ((type&Bmp_ZP) == Bmp_ZP)
  1155. {
  1156. Dbg("to delete zp...");
  1157. DeleteFileIfExisted("zp.JPEG");
  1158. DeleteFileIfExisted("zp.jpg");
  1159. DeleteFileIfExisted("zp.bmp"); //All
  1160. DeleteFileIfExisted("wz.txt"); //Sankyo
  1161. DeleteFileIfExisted("xp.wlt");
  1162. DeleteFileIfExisted("ImgTemp.bmp"); //Nantian
  1163. DeleteFileIfExisted("BP8913_ID.bmp"); //Nantian
  1164. }
  1165. if ((type&Bmp_SCAN) == Bmp_SCAN)
  1166. {
  1167. Dbg("to delete id...");
  1168. DeleteFileIfExisted("idfront.bmp");
  1169. DeleteFileIfExisted("idback.bmp");
  1170. DeleteFileIfExisted("idfront.jpg");
  1171. DeleteFileIfExisted("idback.jpg");
  1172. }
  1173. }
  1174. int CIDCertFSM::ReadHZCard(SpReqAnsContext<IDCert_ReadEx_Req, IDCert_ReadEx_Ans>::Pointer ctx)
  1175. {
  1176. //oiltest@20180613 for songrui hz
  1177. //ErrorCodeEnum eErr = m_hDevHelper->DevClose();
  1178. //Dbg("before read card,DevClose result:%d", eErr);
  1179. //eErr = ReleaseDevComponent((DeviceBaseClass *&)m_hDevHelper);
  1180. //Dbg("before read card,ReleaseDevComponent result:%d", eErr);
  1181. //HANDLE itc = device_open("USB", 0, 9600);
  1182. //if (itc > 0)
  1183. //{
  1184. // BYTE type;
  1185. // PBYTE pID = new BYTE[10];
  1186. // ZeroMemory(pID, 10);
  1187. // int ret = rf_card(itc, 0xfffe, &type, pID);
  1188. // if (ret == 0)
  1189. // {
  1190. // memcpy(ctx->Ans.photodata.m_pData, pID, 4);
  1191. // ctx->Answer(Error_Succeed);
  1192. // Dbg("read card ok.");
  1193. // }
  1194. // else
  1195. // {
  1196. // Dbg("read card failed %d",ret);
  1197. // ctx->Answer(Error_Unexpect);
  1198. // }
  1199. // device_close(itc);
  1200. //}
  1201. //else
  1202. // Dbg("device_open failed result:%x", itc);
  1203. //eErr = CreateDevComponent((DeviceBaseClass *&)m_hDevHelper);
  1204. //Dbg("after read card,CreateDevComponent result:%d", eErr);
  1205. //eErr = m_hDevHelper->DevOpen(0);
  1206. //Dbg("after read card,devopen result:%d",eErr);
  1207. return 0;
  1208. }
  1209. void CIDCertFSM::CrossTermCall(SpReqAnsContext<IDCert_CrossTermCall_Req, IDCert_CrossTermCall_Ans>::Pointer cctx)
  1210. {
  1211. ErrorCodeEnum eErr = Error_Unexpect;
  1212. Dbg("CrossTermCall,type:%x", cctx->Req.type);
  1213. switch (cctx->Req.type)
  1214. {
  1215. case IDCertService_Method_Read:
  1216. {
  1217. DEFINE_PUPPET_CONTEXT_WITH_TYPE(IDCert_Read_Req, IDCert_Read_Ans);
  1218. if ((eErr = SpBlob2Object(cctx->Req.paramX, ctx->Req)) == Error_Succeed) {
  1219. if (this->ReadInfo(ctx) != 0) {
  1220. eErr = Error_Unexpect;
  1221. }
  1222. else {
  1223. eErr = SpObject2Blob(ctx->Ans, cctx->Ans.retParamX);
  1224. Dbg("after ReadInfo,eErr:%d,paramX.len:%d",eErr, cctx->Ans.retParamX.m_iLength);
  1225. }
  1226. }
  1227. cctx->Answer(eErr);
  1228. }
  1229. break;
  1230. case IDCertService_Method_ReadAndScan:
  1231. {
  1232. DEFINE_PUPPET_CONTEXT_WITH_TYPE(IDCert_ReadAndScan_Req, IDCert_ReadAndScan_Ans);
  1233. if ((eErr = SpBlob2Object(cctx->Req.paramX, ctx->Req)) == Error_Succeed) {
  1234. if (this->ReadAndScan(ctx) != 0) {
  1235. eErr = Error_Unexpect;
  1236. }
  1237. else {
  1238. eErr = SpObject2Blob(ctx->Ans, cctx->Ans.retParamX);
  1239. Dbg("after ReadAndScan,eErr:%d,paramX.len:%d", eErr, cctx->Ans.retParamX.m_iLength);
  1240. }
  1241. }
  1242. cctx->Answer(eErr);
  1243. }
  1244. break;
  1245. case IDCertService_Method_CancelRead:
  1246. m_bCancelRead = true;
  1247. break;
  1248. case IDCertService_Method_ReadWaitMore:
  1249. if (GetReadFlag())
  1250. SetReadMore();
  1251. break;
  1252. case IDCertService_Method_Exit:
  1253. SetExitFlag();
  1254. break;
  1255. default:
  1256. break;
  1257. }
  1258. }
  1259. void CIDCertFSM::CrossTermInvokeInfo(SpOnewayCallContext<IDCert_CrossTermInvokeInfo_Info>::Pointer ctx)
  1260. {
  1261. LOG_FUNCTION();
  1262. Dbg("entity sn:%x,type:%d,errcode:%x", ctx->Info.nEntityID, ctx->Info.type,ctx->Info.result);
  1263. //Dbg("mxx 001[%d]", m_readAndScanCtx->Req.type);
  1264. if (ctx->Info.paramX.m_iLength <= 1)
  1265. {
  1266. }
  1267. ErrorCodeEnum eErr = Error_Unexpect;
  1268. CSmartPointer<ITransactionContext> pTransactionContext;
  1269. switch (ctx->Info.type)
  1270. {
  1271. case IDCertService_Method_Read:
  1272. {
  1273. auto pt = static_cast<SpReqAnsContext<IDCert_Read_Req,
  1274. IDCert_Read_Ans>*>(GetCtx(ctx->Info.type));
  1275. SpReqAnsContext<IDCert_Read_Req,
  1276. IDCert_Read_Ans>::Pointer xctx;
  1277. xctx.Attach(pt);
  1278. eErr = SpBlob2Object(ctx->Info.paramX, xctx->Ans);
  1279. Dbg("eErr:%d,Y len:%d", eErr, ctx->Info.paramX.m_iLength);
  1280. xctx->Answer((ErrorCodeEnum)ctx->Info.result);
  1281. }
  1282. break;
  1283. case IDCertService_Method_ReadAndScan:
  1284. {
  1285. auto pt = static_cast<SpReqAnsContext<IDCert_ReadAndScan_Req,IDCert_ReadAndScan_Ans>*>(m_mapCtx[ctx->Info.type].pCtx);
  1286. SpReqAnsContext<IDCert_ReadAndScan_Req, IDCert_ReadAndScan_Ans>::Pointer tmpctx;
  1287. tmpctx.Attach(pt);
  1288. eErr = SpBlob2Object(ctx->Info.paramX, tmpctx->Ans);
  1289. Dbg("eErr:%d,Y len:%d", eErr, ctx->Info.paramX.m_iLength);
  1290. Dbg("name:%s",(const char*)tmpctx->Ans.name);
  1291. tmpctx->Answer(eErr);
  1292. tmpctx.SubRef();
  1293. m_mapCtx.erase(ctx->Info.type);
  1294. }
  1295. break;
  1296. default:
  1297. break;
  1298. }
  1299. }
  1300. int CIDCertFSM::LocalCallHeartBeat(int method, CBlob &bbSend, bool bTwoWay)
  1301. {
  1302. ErrorCodeEnum eErr = Error_Unexpect;
  1303. if (m_pHBClient == NULL)
  1304. {
  1305. m_pHBClient = new HeartBeatService_ClientBase(GetEntityBase());
  1306. if (m_pHBClient == NULL)
  1307. {
  1308. Dbg("create HeartBeat client failed.GetLastError:%d", GetLastError());
  1309. return -1;
  1310. }
  1311. eErr = m_pHBClient->Connect();
  1312. if (eErr != Error_Succeed)
  1313. {
  1314. Dbg("client connect to HeartBeat failed:%x", eErr);
  1315. m_pHBClient->SafeDelete();
  1316. m_pHBClient = NULL;
  1317. return -1;
  1318. }
  1319. }
  1320. HeartBeatService_CrossTermCall_Req req;
  1321. HeartBeatService_CrossTermCall_Ans ans;
  1322. req.nEntityID = 0x201;
  1323. req.isTwoWay = bTwoWay;
  1324. req.fromTerminalNo = m_terminalNo;
  1325. GetAttachedTerminal(req.toTerminalNo);
  1326. //req.toTerminalNo = "7717715004";
  1327. req.param1 = "";
  1328. req.param2 = "";
  1329. req.paramX = bbSend;
  1330. req.type = method;
  1331. Dbg("call to heartbeat,from %s to %s,entity id:%x,type:%d",(const char*)req.fromTerminalNo,(const char*)req.toTerminalNo,req.nEntityID,req.type);
  1332. eErr = m_pHBClient->CrossTermCall(req, ans, 20000);
  1333. Dbg("CrossTermCall to HeartBeat result:%x", eErr);
  1334. m_pHBClient->GetFunction()->CloseSession();
  1335. m_pHBClient = NULL;//resource cost?
  1336. return 0;
  1337. }
  1338. bool CIDCertFSM::GetAttachedTerminal(CSimpleStringA &csTerm)
  1339. {
  1340. return (Error_Succeed == GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm));
  1341. }
  1342. int CIDCertFSM::Initial()
  1343. {
  1344. LOG_FUNCTION();
  1345. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  1346. if (_strnicmp((const char*)m_csMachineType, "RVC.IL", strlen("RVC.IL")) == 0)
  1347. {
  1348. m_bRVCIL = true;
  1349. return 0;
  1350. }
  1351. m_devState = DEVICE_STATUS_NOT_READY;
  1352. CSimpleStringA csLibFullName;
  1353. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  1354. Dbg("To extra vendor lib file path...");
  1355. ErrorCodeEnum err = pEntity->ExtractVendorLibFullPath(csLibFullName);
  1356. if (err != Error_Succeed)
  1357. {
  1358. LogWarn(Severity_Middle, err, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "get dllname failed");
  1359. return Error_DevLoadFileFailed;
  1360. }
  1361. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_RootInfo, csLibFullName.GetData());
  1362. m_adapterInfo.adapterFileName = csLibFullName;
  1363. Dbg("To load up vendor lib...");
  1364. err = m_hDevHelper.LoadUp(csLibFullName);
  1365. if (err != Error_Succeed)
  1366. {
  1367. LogErrMsg("LoadUp", err, DEC_DEV_OBJECT_CREATE_FAILED, TRUE);
  1368. return 2;
  1369. }
  1370. CSimpleStringA dllName, tmpVendor(""), tmpDevSN(""), tmpDLLVersion, csDepPath("");
  1371. GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor);
  1372. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN);
  1373. GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion);
  1374. if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1
  1375. tmpDLLVersion = "8.1";
  1376. if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2)
  1377. {
  1378. Dbg("This is fwb device.");
  1379. m_devSN = tmpDevSN;
  1380. GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath);
  1381. dllName = csDepPath + SPLIT_SLASH_STR + "IDCertificate." + tmpVendor + "." + tmpDLLVersion + ".dll";//oiltmp
  1382. Dbg("%s", (const char*)dllName);
  1383. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, tmpVendor);
  1384. }
  1385. else
  1386. {
  1387. dllName = pEntity->GetVendorLibName();
  1388. CSmartPointer<IConfigInfo> pConfig;
  1389. ErrorCodeEnum rc = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, pConfig);
  1390. CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityBase()->GetEntityName();
  1391. CSimpleStringA str;
  1392. pConfig->ReadConfigValue(strSection, "Vendor", str);
  1393. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, str);
  1394. }
  1395. bool bOpenFlag = false;
  1396. do {
  1397. int tmpPort = 0;
  1398. CSmartPointer<IConfigInfo> spConfig;
  1399. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1400. err = spEntityFunction->OpenConfig(Config_Root, spConfig);
  1401. if (err != Error_Succeed) {
  1402. Dbg("open cfg file failed!");
  1403. LogWarn(Severity_Middle, err, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "open root cfg failed.");
  1404. return 2;
  1405. }
  1406. spConfig->ReadConfigValueInt("Device.IDCertificate", "Port", tmpPort);
  1407. Dbg("IDCer open with port %d", tmpPort);
  1408. err = m_hDevHelper->DevOpen(tmpPort);
  1409. if (err != Error_Succeed)
  1410. {
  1411. SetErrPackage(m_errPkg, "Initial::DevOpen", m_devSN, err, MEC_DEVAPI_IDCER_DevOpen);
  1412. AlarmDEC(m_errPkg);
  1413. return 2;
  1414. }
  1415. } while (!m_hDevHelper && bOpenFlag == false);
  1416. if (m_hDevHelper)
  1417. {
  1418. err = m_hDevHelper->IDCerRFControl(false);
  1419. if (err != Error_Succeed) {
  1420. SetErrPackage(m_errPkg, "Initial::IDCerRFControl", m_devSN, err, MEC_DEVAPI_IDCER_IDCerRFControl);
  1421. AlarmDEC(m_errPkg);
  1422. }
  1423. else {
  1424. Dbg("close rf ok.");
  1425. }
  1426. }
  1427. memset(m_devCatInfo.szModel, 0, MAX_DEV_MODEL_LEN);
  1428. memset(m_devCatInfo.szType, 0, MAX_DEV_TYPE_LEN);
  1429. memset(m_devCatInfo.szVendor, 0, MAX_DEV_VENDOR_LEN);
  1430. err = m_hDevHelper->GetDevCategory(m_devCatInfo);
  1431. if (err == Error_Succeed)
  1432. {
  1433. Dbg("szModel:%s, szType:%s, szVendor:%s", m_devCatInfo.szModel, m_devCatInfo.szType, m_devCatInfo.szVendor);
  1434. m_adapterInfo.devCatInfo = m_devCatInfo;
  1435. }
  1436. else {
  1437. SetErrPackage(m_errPkg, "Initial::GetDevCategory", m_devSN, err, MEC_DEVAPI_IDCER_GetDevCategory);
  1438. AlarmDEC(m_errPkg);
  1439. }
  1440. if (m_hDevHelper)
  1441. {
  1442. m_devInit = true;
  1443. return 0;
  1444. }
  1445. else {
  1446. return 2;
  1447. }
  1448. }