IDCertFSM.cpp 38 KB

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