IDCertFSM.cpp 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165
  1. #include "stdafx.h"
  2. #include "IDCertFSM.h"
  3. #include "EventCode.h"
  4. #include "ModuleMix.h"
  5. #include "IDCertificate_UserErrorCode.h"
  6. #include <highgui.h>
  7. #include <cv.h>
  8. #include <cxcore.h>
  9. #include <fstream>
  10. #include <iomanip>
  11. #ifdef RVC_OS_LINUX
  12. #include "CommDevEntityErrorCode.h"
  13. #include <iostream>
  14. #include <stdio.h>
  15. #include "fileutil.h"
  16. #include <CommEntityUtil.hpp>
  17. #include <wchar.h>
  18. using namespace SP::Module::Comm;
  19. #else
  20. #include "RVCComm.h"
  21. #include "publicFunExport.h"
  22. #include "json/json.h"
  23. #include <Windows.h>
  24. #include <unordered_map>
  25. #pragma comment(lib,"user32.lib")
  26. #endif // RVC_OS_LINUX
  27. #define IDCER_INIT_COUNT 3
  28. #define IDCER_READ_TIMEOUT 60000
  29. #define IDCER_AUTH_INTERVAL 300
  30. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  31. #define IMAGE_DETECT_URL "https://carddetect.paasst.cmbchina.cn/api/card/image-detect"
  32. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  33. #define IMAGE_DETECT_URL "https://carddetect.paasuat.cmbchina.cn/api/card/image-detect"
  34. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  35. #define IMAGE_DETECT_URL "https://carddetect.paas.cmbchina.cn/api/card/image-detect"
  36. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev&生产环境*/
  37. #define IMAGE_DETECT_URL "https://carddetect.paas.cmbchina.cn/api/card/image-detect"
  38. #else/*本地编译等非DevOps环境编译的版本*/
  39. #define IMAGE_DETECT_URL "https://carddetect.paasst.cmbchina.cn/api/card/image-detect"
  40. #endif
  41. #ifdef RVC_OS_WIN
  42. static const std::string base64_chars =
  43. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  44. "abcdefghijklmnopqrstuvwxyz"
  45. "0123456789+/";
  46. std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
  47. std::string ret;
  48. int i = 0;
  49. int j = 0;
  50. unsigned char char_array_3[3];
  51. unsigned char char_array_4[4];
  52. while (in_len--) {
  53. char_array_3[i++] = *(bytes_to_encode++);
  54. if (i == 3) {
  55. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  56. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  57. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  58. char_array_4[3] = char_array_3[2] & 0x3f;
  59. for (i = 0; (i < 4); i++)
  60. ret += base64_chars[char_array_4[i]];
  61. i = 0;
  62. }
  63. }
  64. if (i)
  65. {
  66. for (j = i; j < 3; j++)
  67. char_array_3[j] = '\0';
  68. char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
  69. char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
  70. char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
  71. char_array_4[3] = char_array_3[2] & 0x3f;
  72. for (j = 0; (j < i + 1); j++)
  73. ret += base64_chars[char_array_4[j]];
  74. while ((i++ < 3))
  75. ret += '=';
  76. }
  77. return ret;
  78. }
  79. struct ImgChekTask : ITaskSp
  80. {
  81. CIDCertFSM* m_fsm;
  82. ImgChekTask(CIDCertFSM* fsm) :m_fsm(fsm) {}
  83. CSimpleStringA idNum;
  84. CSimpleStringA inName;
  85. CBlob imgInput;
  86. CSimpleStringA inNationality;
  87. CSimpleStringA inIdType;
  88. CSimpleStringA imgType;
  89. void Process()
  90. {
  91. CSystemStaticInfo si;
  92. m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si);
  93. IHttpFunc* client;
  94. client = create_http(m_fsm->HttpsLogCallBack);
  95. ImgCheckReq imgCheckReq;
  96. ImgCheckRet imgCheckRet;
  97. imgCheckReq.terminalNo = si.strTerminalID.GetData();
  98. imgCheckReq.name = inName.GetData();
  99. imgCheckReq.idNo = idNum.GetData();
  100. imgCheckReq.nationality = inNationality.GetData();
  101. imgCheckReq.idType = inIdType.GetData();
  102. imgCheckReq.topN = 1;
  103. imgCheckReq.returnImgBase64 = 1;
  104. string imgIn = imgInput.m_pData; //图片原始数据
  105. long srclen = imgInput.m_iLength;
  106. string encodeIn = base64_encode((unsigned char*)imgInput.m_pData, srclen);
  107. //string encodeIn;
  108. //Encode(imgIn, encodeIn); //传给服务端应base64编码
  109. imgCheckReq.imageBase64 = encodeIn;
  110. imgCheckReq.m_url = m_fsm->checkImgURL;
  111. long beg = GetTickCount();
  112. PROCESS_LINK_CONTEXT("LR0402201ImgCheck")
  113. bool ret = client->Post(imgCheckReq, imgCheckRet, &nextLink);
  114. long end = GetTickCount();
  115. CSimpleStringA errMsg;
  116. if (ret) {
  117. if (imgCheckRet.m_success != true)
  118. {
  119. errMsg = CSimpleStringA::Format("图片检测不通过,result_data:%s,图片类型 = %s。", imgCheckRet.m_resultData.c_str(), imgType.GetData());
  120. LogWarn(Severity_Middle, Error_Resource, IDCertificate_UserErrorCode_ScanImg_Failed, errMsg.GetData());
  121. if (client) client->Destory();
  122. return;
  123. }
  124. }
  125. else {
  126. errMsg = CSimpleStringA::Format("图片质量检测请求失败,请检查本地网络连接。图片类型 = %s。", imgType.GetData());
  127. LogWarn(Severity_Middle, Error_Resource, IDCertificate_UserErrorCode_ScanImg_Failed, errMsg.GetData());
  128. }
  129. client->Destory();
  130. }
  131. };
  132. #endif //RVC_OS_WIN
  133. //Normal/Idle
  134. void CIDCertFSM::s0_on_entry()
  135. {
  136. LOG_FUNCTION();
  137. SetDevState(DEVICE_STATUS_NORMAL);
  138. }
  139. void CIDCertFSM::s0_on_exit()
  140. {
  141. LOG_FUNCTION();
  142. }
  143. unsigned int CIDCertFSM::s0_on_event(FSMEvent* pEvt)
  144. {
  145. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s0 evt %d",pEvt->iEvt);
  146. switch (pEvt->iEvt)
  147. {
  148. case USER_EVT_ERROR:
  149. pEvt->SetHandled();
  150. break;
  151. case USER_EVT_QUIT:
  152. pEvt->SetHandled();
  153. break;
  154. case USER_EVT_READ_AND_SCAN_UTF8: //ex1
  155. {
  156. pEvt->SetHandled();
  157. ReadAndScanUTF8Event* ide = dynamic_cast<ReadAndScanUTF8Event*>(pEvt);
  158. ReadAndScanUTF8Task* task = new ReadAndScanUTF8Task(this);
  159. task->ctx = ide->ctx;
  160. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  161. }
  162. break;
  163. case USER_EVT_READ_AND_SCAN_UTF8JS: //ex1
  164. {
  165. pEvt->SetHandled();
  166. ReadAndScanUTF8JSEvent* ide = dynamic_cast<ReadAndScanUTF8JSEvent*>(pEvt);
  167. ReadAndScanUTF8JSTask* task = new ReadAndScanUTF8JSTask(this);
  168. task->ctx = ide->ctx;
  169. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  170. }
  171. break;
  172. case USER_EVT_TODO_INIT:
  173. {
  174. pEvt->SetHandled();
  175. }
  176. break;
  177. case USER_EVT_TODO_INIT_FINISHED:
  178. {
  179. pEvt->SetHandled();
  180. return pEvt->param1;
  181. }
  182. default:
  183. break;
  184. }
  185. return 0;
  186. }
  187. //Reading
  188. void CIDCertFSM::s1_on_entry()
  189. {
  190. LOG_FUNCTION();
  191. }
  192. void CIDCertFSM::s1_on_exit()
  193. {
  194. LOG_FUNCTION();
  195. }
  196. unsigned int CIDCertFSM::s1_on_event(FSMEvent *pEvt)
  197. {
  198. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s1 evt %d", pEvt->iEvt);
  199. int ret = 0;
  200. switch(pEvt->iEvt)
  201. {
  202. case USER_EVT_CANCEL_READ:
  203. pEvt->SetHandled();
  204. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set cancel read flag");
  205. m_bCancelRead = true;
  206. break;
  207. case USER_EVT_EXIT:
  208. pEvt->SetHandled();
  209. SetExitFlag();
  210. break;
  211. case USER_EVT_QUIT:
  212. pEvt->SetHandled();
  213. break;
  214. case USER_EVT_READ_AND_SCAN_UTF8_FINISHED:
  215. if (pEvt->param1 == -1)
  216. {
  217. invalidBreak = true;
  218. return 5;
  219. }
  220. pEvt->SetHandled();
  221. ret = pEvt->param1;
  222. break;
  223. case USER_EVT_READ_AND_SCAN_UTF8JS_FINISHED:
  224. if (pEvt->param1 == -1)
  225. {
  226. invalidBreak = true;
  227. return 5;
  228. }
  229. pEvt->SetHandled();
  230. ret = pEvt->param1;
  231. break;
  232. case USER_EVT_TODO_INIT:
  233. {
  234. pEvt->SetHandled();
  235. }
  236. break;
  237. case USER_EVT_TODO_INIT_FINISHED:
  238. {
  239. pEvt->SetHandled();
  240. return pEvt->param1;
  241. }
  242. default:
  243. break;
  244. }
  245. return ret;
  246. }
  247. //failed
  248. void CIDCertFSM::s2_on_entry()
  249. {
  250. LOG_FUNCTION();
  251. SetDevState(DEVICE_STATUS_FAULT);
  252. m_testResult = Error_InvalidState;
  253. }
  254. void CIDCertFSM::s2_on_exit()
  255. {
  256. LOG_FUNCTION();
  257. }
  258. unsigned int CIDCertFSM::s2_on_event(FSMEvent* e)
  259. {
  260. LOG_FUNCTION();
  261. if (e->iEvt == USER_EVT_QUIT)
  262. {
  263. e->SetHandled();
  264. return 0;
  265. }
  266. return 0;
  267. }
  268. //Eject
  269. void CIDCertFSM::s3_on_entry()
  270. {
  271. }
  272. void CIDCertFSM::s3_on_exit()
  273. {
  274. }
  275. unsigned int CIDCertFSM::s3_on_event(FSMEvent* e)
  276. {
  277. return 0;
  278. }
  279. //WaitingFetch
  280. void CIDCertFSM::s4_on_entry()
  281. {
  282. LOG_FUNCTION();
  283. WaitFetchIDCardTask* task = new WaitFetchIDCardTask(this);
  284. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  285. }
  286. void CIDCertFSM::s4_on_exit()
  287. {
  288. }
  289. unsigned int CIDCertFSM::s4_on_event(FSMEvent* pEvt)
  290. {
  291. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
  292. ("wait fetch id card.event %d,%d", pEvt->iEvt, pEvt->param1);
  293. switch (pEvt->iEvt)
  294. {
  295. case USER_EVT_WAIT_FETCH_IDCARD_FINISHED:
  296. pEvt->SetHandled();
  297. break;
  298. default:
  299. break;
  300. }
  301. return 0;
  302. }
  303. //Init
  304. void CIDCertFSM::s5_on_entry()
  305. {
  306. LOG_FUNCTION();
  307. SetDevState(DEVICE_STATUS_NOT_READY);
  308. InitTask* task = new InitTask(this);
  309. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  310. }
  311. void CIDCertFSM::s5_on_exit()
  312. {
  313. LOG_FUNCTION();
  314. }
  315. unsigned int CIDCertFSM::s5_on_event(FSMEvent* pEvt)
  316. {
  317. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s5 evt %d", pEvt->iEvt);
  318. int ret = 0;
  319. switch (pEvt->iEvt)
  320. {
  321. case USER_EVT_ERROR:
  322. pEvt->SetHandled();
  323. break;
  324. case USER_EVT_QUIT:
  325. pEvt->SetHandled();
  326. break;
  327. case USER_EVT_INIT_FINISHED:
  328. {
  329. pEvt->SetHandled();
  330. ret = pEvt->param1;
  331. }
  332. break;
  333. case USER_EVT_TODO_INIT:
  334. {
  335. pEvt->SetHandled();
  336. }
  337. break;
  338. case USER_EVT_TODO_INIT_FINISHED:
  339. {
  340. pEvt->SetHandled();
  341. return pEvt->param1;
  342. }
  343. default:
  344. break;
  345. }
  346. return ret;
  347. }
  348. ErrorCodeEnum CIDCertFSM::GetVendorDllPath(CSimpleStringA &strPath)
  349. {
  350. strPath = "termb.dll";
  351. return Error_Succeed;//oiltest
  352. }
  353. ErrorCodeEnum CIDCertFSM::OnInit()
  354. {
  355. ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN);
  356. ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN);
  357. ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN);
  358. #ifdef RVC_OS_WIN //windows使用宽字符
  359. nationalCode[1] = L"汉";
  360. nationalCode[2] = L"蒙古";
  361. nationalCode[3] = L"回";
  362. nationalCode[4] = L"藏";
  363. nationalCode[5] = L"维吾尔";
  364. nationalCode[6] = L"苗";
  365. nationalCode[7] = L"彝";
  366. nationalCode[8] = L"壮";
  367. nationalCode[9] = L"布依";
  368. nationalCode[10] = L"朝鲜";
  369. nationalCode[11] = L"满";
  370. nationalCode[12] = L"侗";
  371. nationalCode[13] = L"瑶";
  372. nationalCode[14] = L"白";
  373. nationalCode[15] = L"土家";
  374. nationalCode[16] = L"哈尼";
  375. nationalCode[17] = L"哈萨克";
  376. nationalCode[18] = L"傣";
  377. nationalCode[19] = L"黎";
  378. nationalCode[20] = L"傈僳";
  379. nationalCode[21] = L"佤";
  380. nationalCode[22] = L"畲";
  381. nationalCode[23] = L"高山";
  382. nationalCode[24] = L"拉祜";
  383. nationalCode[25] = L"水";
  384. nationalCode[26] = L"东乡";
  385. nationalCode[27] = L"纳西";
  386. nationalCode[28] = L"景颇";
  387. nationalCode[29] = L"阿尔克孜";
  388. nationalCode[30] = L"土";
  389. nationalCode[31] = L"达斡尔";
  390. nationalCode[32] = L"仫佬";
  391. nationalCode[33] = L"羌";
  392. nationalCode[34] = L"布朗";
  393. nationalCode[35] = L"撒拉";
  394. nationalCode[36] = L"毛南";
  395. nationalCode[37] = L"仡佬";
  396. nationalCode[38] = L"锡伯";
  397. nationalCode[39] = L"阿昌";
  398. nationalCode[40] = L"普米";
  399. nationalCode[41] = L"塔吉克";
  400. nationalCode[42] = L"怒";
  401. nationalCode[43] = L"乌孜别克";
  402. nationalCode[44] = L"俄罗斯";
  403. nationalCode[45] = L"鄂温克";
  404. nationalCode[46] = L"德昂";
  405. nationalCode[47] = L"保安";
  406. nationalCode[48] = L"裕固";
  407. nationalCode[49] = L"京";
  408. nationalCode[50] = L"塔塔尔";
  409. nationalCode[51] = L"独龙";
  410. nationalCode[52] = L"鄂伦春";
  411. nationalCode[53] = L"赫哲";
  412. nationalCode[54] = L"门巴";
  413. nationalCode[55] = L"珞巴";
  414. nationalCode[56] = L"基诺";
  415. #else
  416. nationalCode[1] = "汉";
  417. nationalCode[2] = "蒙古";
  418. nationalCode[3] = "回";
  419. nationalCode[4] = "藏";
  420. nationalCode[5] = "维吾尔";
  421. nationalCode[6] = "苗";
  422. nationalCode[7] = "彝";
  423. nationalCode[8] = "壮";
  424. nationalCode[9] = "布依";
  425. nationalCode[10] = "朝鲜";
  426. nationalCode[11] = "满";
  427. nationalCode[12] = "侗";
  428. nationalCode[13] = "瑶";
  429. nationalCode[14] = "白";
  430. nationalCode[15] = "土家";
  431. nationalCode[16] = "哈尼";
  432. nationalCode[17] = "哈萨克";
  433. nationalCode[18] = "傣";
  434. nationalCode[19] = "黎";
  435. nationalCode[20] = "傈僳";
  436. nationalCode[21] = "佤";
  437. nationalCode[22] = "畲";
  438. nationalCode[23] = "高山";
  439. nationalCode[24] = "拉祜";
  440. nationalCode[25] = "水";
  441. nationalCode[26] = "东乡";
  442. nationalCode[27] = "纳西";
  443. nationalCode[28] = "景颇";
  444. nationalCode[29] = "阿尔克孜";
  445. nationalCode[30] = "土";
  446. nationalCode[31] = "达斡尔";
  447. nationalCode[32] = "仫佬";
  448. nationalCode[33] = "羌";
  449. nationalCode[34] = "布朗";
  450. nationalCode[35] = "撒拉";
  451. nationalCode[36] = "毛南";
  452. nationalCode[37] = "仡佬";
  453. nationalCode[38] = "锡伯";
  454. nationalCode[39] = "阿昌";
  455. nationalCode[40] = "普米";
  456. nationalCode[41] = "塔吉克";
  457. nationalCode[42] = "怒";
  458. nationalCode[43] = "乌孜别克";
  459. nationalCode[44] = "俄罗斯";
  460. nationalCode[45] = "鄂温克";
  461. nationalCode[46] = "德昂";
  462. nationalCode[47] = "保安";
  463. nationalCode[48] = "裕固";
  464. nationalCode[49] = "京";
  465. nationalCode[50] = "塔塔尔";
  466. nationalCode[51] = "独龙";
  467. nationalCode[52] = "鄂伦春";
  468. nationalCode[53] = "赫哲";
  469. nationalCode[54] = "门巴";
  470. nationalCode[55] = "珞巴";
  471. nationalCode[56] = "基诺";
  472. #endif
  473. supportUCS2 = FALSE;
  474. igestionVer = FALSE;
  475. closeImgCheck = FALSE;
  476. CSmartPointer<IConfigInfo> spCtSettingConfig;
  477. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig);
  478. int tflag;
  479. spCtSettingConfig->ReadConfigValueInt("IDCertificate", "CloseImagCheckFlag", tflag);
  480. if (tflag != 0)
  481. {
  482. closeImgCheck = TRUE;
  483. }
  484. checkImgURL = IMAGE_DETECT_URL;
  485. CSimpleStringA tUrl;
  486. spCtSettingConfig->ReadConfigValue("IDCertificate", "CardDetectUrl", tUrl);
  487. if (!tUrl.IsNullOrEmpty()) { checkImgURL = tUrl.GetData(); }
  488. return Error_Succeed;
  489. }
  490. ErrorCodeEnum CIDCertFSM::OnExit()
  491. {
  492. if (m_hDevHelper)
  493. {
  494. ErrorCodeEnum err = Error_Succeed;
  495. m_hDevHelper.TearDown();
  496. return err;
  497. }
  498. return Error_Succeed;
  499. }
  500. int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext<IDCert_ReadAndScanUTF8_Req, IDCert_ReadAndScanUTF8_Ans>::Pointer ctx)
  501. {
  502. LOG_FUNCTION();
  503. DWORD elapsed = 0;
  504. DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
  505. DWORD dwEnd = SP::Module::Comm::RVCGetTickCount();
  506. ErrorCodeEnum eErr = Error_Unexpect;
  507. ErrorCodeEnum errRfOpen = Error_Unexpect;
  508. ErrorCodeEnum errAuth = Error_Unexpect;
  509. ErrorCodeEnum errRead = Error_Unexpect;
  510. ErrorCodeEnum errReadEx = Error_Unexpect;
  511. ErrorCodeEnum errReadEx2 = Error_Unexpect;
  512. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on");
  513. DeleteZP(Bmp_ZP | Bmp_SCAN, 1);
  514. bool bOpenRF = false, bGetIDCert = false;
  515. IDCerInfoEx2 idInfoEx2;
  516. IDCerInfoEx idInfo;
  517. IDCerInfo idInfoOld;
  518. memset(&idInfoEx2, 0, sizeof(idInfoEx2));
  519. memset(&idInfo, 0, sizeof(idInfo));
  520. memset(&idInfoOld, 0, sizeof(idInfoOld));
  521. m_bCancelRead = false;
  522. m_bWaitReadMore = false;
  523. m_bReading = true;
  524. m_bExit = false;
  525. bool bReadSuccess = false;
  526. bool bInvokeReadEx = false;
  527. bool bInvokeReadEx2 = false;
  528. bool bExitWhenReading = false;
  529. bool bIDCerAuthenticate = false;
  530. int curDeleteType = Bmp_ZP;
  531. while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead)
  532. {
  533. if (m_bExit)
  534. {
  535. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("exit");
  536. break;
  537. }
  538. bReadSuccess = false;
  539. bInvokeReadEx = false;
  540. bInvokeReadEx2 = false;
  541. if (m_bWaitReadMore)
  542. {
  543. dwStart = SP::Module::Comm::RVCGetTickCount();
  544. m_bWaitReadMore = false;
  545. }
  546. if (!bOpenRF)
  547. {
  548. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  549. errRfOpen = m_hDevHelper->IDCerRFControl(true);
  550. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  551. if (Error_Succeed == errRfOpen)
  552. {
  553. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  554. .setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
  555. }
  556. else
  557. {
  558. dwEnd = SP::Module::Comm::RVCGetTickCount();
  559. elapsed = dwEnd - dwStart;
  560. Sleep(IDCER_AUTH_INTERVAL);
  561. continue;
  562. }
  563. }
  564. bOpenRF = true;
  565. Sleep(IDCER_AUTH_INTERVAL);
  566. bIDCerAuthenticate = false;
  567. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  568. errAuth = m_hDevHelper->IDCerAuthenticate();
  569. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  570. if (Error_Succeed != errAuth)
  571. {
  572. dwEnd = SP::Module::Comm::RVCGetTickCount();
  573. elapsed = dwEnd - dwStart;
  574. continue;
  575. }
  576. else
  577. {
  578. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  579. .setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)();
  580. bIDCerAuthenticate = true;
  581. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  582. errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2);
  583. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  584. if (errReadEx2 == Error_NotImpl)
  585. {
  586. ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息
  587. }
  588. else
  589. {
  590. ctx->Ans.msgtype = 1; //新字段传递,UTF8、二进制传递文字信息
  591. //ex2数据读取功能代码、UCS2转UTF8代码
  592. bInvokeReadEx2 = true;
  593. if (errReadEx2 != Error_Succeed)
  594. {
  595. bReadSuccess = false;
  596. }
  597. else
  598. {
  599. unsigned char name[1024]; memset(name, 0, 1024);
  600. unsigned char sex[1024]; memset(sex, 0, 1024);
  601. unsigned char nation[1024]; memset(nation, 0, 1024);
  602. unsigned char birthday[1024]; memset(birthday, 0, 1024);
  603. unsigned char address[1024]; memset(address, 0, 1024);
  604. unsigned char idno[1024]; memset(idno, 0, 1024);
  605. unsigned char department[1024]; memset(department, 0, 1024);
  606. unsigned char startDate[1024]; memset(startDate, 0, 1024);
  607. unsigned char endDate[1024]; memset(endDate, 0, 1024);
  608. unsigned char englishName[1024]; memset(englishName, 0, 1024);
  609. unsigned char nationality[1024]; memset(nationality, 0, 1024);
  610. unsigned char idVersion[1024]; memset(idVersion, 0, 1024);
  611. unsigned char idType[1024]; memset(idType, 0, 1024);
  612. unsigned char reserved[1024]; memset(reserved, 0, 1024);//外国人永居证旧证件关联字段
  613. unsigned char englishNameEx[1024]; memset(englishNameEx, 0, 1024); //英文名备用字段
  614. unsigned char IssuedSN[1024]; memset(IssuedSN, 0, 1024); //换证次数
  615. DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
  616. .setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
  617. .setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
  618. bReadSuccess = true;
  619. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
  620. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("各字段长度-姓名:%d; 性别:%d; 民族:%d; 身份证:%d;",
  621. GetUCS2ByteLength((UINT16*)idInfoEx2.name.data), GetUCS2ByteLength((UINT16*)idInfoEx2.sex.data),
  622. GetUCS2ByteLength((UINT16*)idInfoEx2.nation.data), GetUCS2ByteLength((UINT16*)idInfoEx2.idno.data));
  623. //去除首尾空格
  624. RemoveUCS2Blank((UINT16*)idInfoEx2.name.data);
  625. CheckHanZi((UINT16*)idInfoEx2.name.data); //检测汉字编码
  626. RemoveUCS2Blank((UINT16*)idInfoEx2.sex.data);
  627. RemoveUCS2Blank((UINT16*)idInfoEx2.nation.data);
  628. RemoveUCS2Blank((UINT16*)idInfoEx2.birthday.data);
  629. RemoveUCS2Blank((UINT16*)idInfoEx2.address.data);
  630. RemoveUCS2Blank((UINT16*)idInfoEx2.idno.data);
  631. RemoveUCS2Blank((UINT16*)idInfoEx2.department.data);
  632. RemoveUCS2Blank((UINT16*)idInfoEx2.startDate.data);
  633. RemoveUCS2Blank((UINT16*)idInfoEx2.endDate.data);
  634. RemoveUCS2Blank((UINT16*)idInfoEx2.englishName.data);
  635. RemoveUCS2Blank((UINT16*)idInfoEx2.nationality.data);
  636. RemoveUCS2Blank((UINT16*)idInfoEx2.idVersion.data);
  637. RemoveUCS2Blank((UINT16*)idInfoEx2.idType.data);
  638. RemoveUCS2Blank((UINT16*)idInfoEx2.reserved.data); //外国人永居证旧证件关联字段
  639. RemoveUCS2Blank((UINT16*)idInfoEx2.reserved2.data); //英文名备用字段
  640. RemoveUCS2Blank((UINT16*)idInfoEx2.issuedSN.data); //换证次数
  641. #ifdef RVC_OS_WIN
  642. //转换成GBK用于debug上传
  643. char* tSex = new char[32];
  644. char* tNation = new char[32];
  645. char* tBirthday = new char[32];
  646. char* tStartDate = new char[32];
  647. char* tEndDate = new char[32];
  648. char* tIDcode = new char[1024];
  649. char* tIDtype = new char[8];
  650. char* tName = new char[128];
  651. char* tNationality = new char[8];
  652. char* tChecKNum = new char[8];
  653. memcpy(tSex, idInfoEx2.sex.data, 32);
  654. memcpy(tNation, idInfoEx2.nation.data, 32);
  655. memcpy(tBirthday, idInfoEx2.birthday.data, 32);
  656. memcpy(tStartDate, idInfoEx2.startDate.data, 32);
  657. memcpy(tEndDate, idInfoEx2.endDate.data, 32);
  658. memcpy(tIDcode, idInfoEx2.idno.data, 1024);
  659. memcpy(tIDtype, idInfoEx2.idType.data, 8);
  660. memcpy(tName, idInfoEx2.name.data, 128);
  661. memcpy(tNationality, idInfoEx2.nationality.data, 8);
  662. memcpy(tChecKNum, idInfoEx2.issuedSN.data, 8);
  663. char *gbkSex, *gbkNation, *gbkBirthday, *gbkStartDate, *gbkEndDate, *gbkIDcode, *gbkIDtype, *gbkName, *gbkNationality, *gbktCheckNum;
  664. int iSize;
  665. //sex
  666. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, NULL, 0, NULL, NULL);
  667. gbkSex = (char*)malloc((iSize + 1));
  668. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, gbkSex, iSize, NULL, NULL);
  669. //nation
  670. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, NULL, 0, NULL, NULL);
  671. gbkNation = (char*)malloc((iSize + 1));
  672. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, gbkNation, iSize, NULL, NULL);
  673. //birthday
  674. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, NULL, 0, NULL, NULL);
  675. gbkBirthday = (char*)malloc((iSize + 1));
  676. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, gbkBirthday, iSize, NULL, NULL);
  677. //startdate
  678. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, NULL, 0, NULL, NULL);
  679. gbkStartDate = (char*)malloc((iSize + 1));
  680. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, gbkStartDate, iSize, NULL, NULL);
  681. //endate
  682. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, NULL, 0, NULL, NULL);
  683. gbkEndDate = (char*)malloc((iSize + 1));
  684. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, gbkEndDate, iSize, NULL, NULL);
  685. //idcode
  686. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, NULL, 0, NULL, NULL);
  687. gbkIDcode = (char*)malloc((iSize + 1));
  688. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, gbkIDcode, iSize, NULL, NULL);
  689. //idtype
  690. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, NULL, 0, NULL, NULL);
  691. gbkIDtype = (char*)malloc((iSize + 1));
  692. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, gbkIDtype, iSize, NULL, NULL);
  693. //name
  694. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, NULL, 0, NULL, NULL);
  695. gbkName = (char*)malloc((iSize + 1));
  696. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, gbkName, iSize, NULL, NULL);
  697. //natinality
  698. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, NULL, 0, NULL, NULL);
  699. gbkNationality = (char*)malloc((iSize + 1));
  700. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, gbkNationality, iSize, NULL, NULL);
  701. //issuedSN
  702. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, NULL, 0, NULL, NULL);
  703. gbktCheckNum = (char*)malloc((iSize + 1));
  704. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, gbktCheckNum, iSize, NULL, NULL);
  705. //gbk转换结束
  706. #endif
  707. UCS2_to_UTF8((UINT16*)idInfoEx2.name.data, name);
  708. //UCS2_to_UTF8((UINT16*)idInfoEx2.sex.data, sex);
  709. GetSexUTF8String((UINT16*)idInfoEx2.sex.data, sex);
  710. //UCS2_to_UTF8((UINT16*)idInfoEx2.nation.data, nation);
  711. GetNationalUTF8String((UINT16*)idInfoEx2.nation.data, nation);
  712. //UCS2_to_UTF8((UINT16*)idInfoEx2.birthday.data, birthday);
  713. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.birthday.data, birthday);
  714. UCS2_to_UTF8((UINT16*)idInfoEx2.address.data, address);
  715. UCS2_to_UTF8((UINT16*)idInfoEx2.idno.data, idno);
  716. UCS2_to_UTF8((UINT16*)idInfoEx2.department.data, department);
  717. //UCS2_to_UTF8((UINT16*)idInfoEx2.startDate.data, startDate);
  718. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.startDate.data, startDate);
  719. //UCS2_to_UTF8((UINT16*)idInfoEx2.endDate.data, endDate);
  720. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.endDate.data, endDate);
  721. UCS2_to_UTF8((UINT16*)idInfoEx2.englishName.data, englishName);
  722. UCS2_to_UTF8((UINT16*)idInfoEx2.nationality.data, nationality);
  723. UCS2_to_UTF8((UINT16*)idInfoEx2.idVersion.data, idVersion);
  724. UCS2_to_UTF8((UINT16*)idInfoEx2.idType.data, idType);
  725. UCS2_to_UTF8((UINT16*)idInfoEx2.reserved.data, reserved);
  726. UCS2_to_UTF8((UINT16*)idInfoEx2.reserved2.data, englishNameEx);
  727. UCS2_to_UTF8((UINT16*)idInfoEx2.issuedSN.data, IssuedSN);
  728. ctx->Ans.name_utf8.Alloc(strlen((char*)name));
  729. ctx->Ans.sex_utf8.Alloc(strlen((char*)sex));
  730. ctx->Ans.nation_utf8.Alloc(strlen((char*)nation));
  731. ctx->Ans.birthday_utf8.Alloc(strlen((char*)birthday));
  732. ctx->Ans.address_utf8.Alloc(strlen((char*)address));
  733. ctx->Ans.idcode_utf8.Alloc(strlen((char*)idno));
  734. ctx->Ans.department_utf8.Alloc(strlen((char*)department));
  735. ctx->Ans.startdate_utf8.Alloc(strlen((char*)startDate));
  736. ctx->Ans.enddate_utf8.Alloc(strlen((char*)endDate));
  737. ctx->Ans.englishname_utf8.Alloc(strlen((char*)englishName));
  738. ctx->Ans.nationality_utf8.Alloc(strlen((char*)nationality));
  739. ctx->Ans.idversion_utf8.Alloc(strlen((char*)idVersion));
  740. ctx->Ans.idtype_utf8.Alloc(strlen((char*)idType));
  741. ctx->Ans.reserved_utf8.Alloc(strlen((char*)reserved)); //新外国人永居证关联字段
  742. ctx->Ans.othercode_utf8.Alloc(strlen((char*)englishNameEx)); //英文名备用字段
  743. memcpy(ctx->Ans.name_utf8.m_pData, name, strlen((char*)name));
  744. memcpy(ctx->Ans.sex_utf8.m_pData, sex, strlen((char*)sex));
  745. memcpy(ctx->Ans.nation_utf8.m_pData, nation, strlen((char*)nation));
  746. memcpy(ctx->Ans.birthday_utf8.m_pData, birthday, strlen((char*)birthday));
  747. memcpy(ctx->Ans.address_utf8.m_pData, address, strlen((char*)address));
  748. memcpy(ctx->Ans.idcode_utf8.m_pData, idno, strlen((char*)idno));
  749. memcpy(ctx->Ans.department_utf8.m_pData, department, strlen((char*)department));
  750. memcpy(ctx->Ans.startdate_utf8.m_pData, startDate, strlen((char*)startDate));
  751. memcpy(ctx->Ans.enddate_utf8.m_pData, endDate, strlen((char*)endDate));
  752. memcpy(ctx->Ans.englishname_utf8.m_pData, englishName, strlen((char*)englishName));
  753. memcpy(ctx->Ans.nationality_utf8.m_pData, nationality, strlen((char*)nationality));
  754. memcpy(ctx->Ans.idversion_utf8.m_pData, idVersion, strlen((char*)idVersion));
  755. memcpy(ctx->Ans.idtype_utf8.m_pData, idType, strlen((char*)idType));
  756. memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段
  757. memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段
  758. GetPngBlobEx(ctx->Ans.headphoto, "zp"); //转换头像图片
  759. ctx->Ans.hasscan = 0;
  760. if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
  761. {
  762. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  763. eErr = m_hDevHelper->ScanIDAndSaveImage();
  764. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  765. if (eErr == Error_Succeed)
  766. {
  767. curDeleteType = Bmp_ZP | Bmp_SCAN;
  768. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
  769. transImgMsg.Clear();
  770. //idfront.bmp" and "idback.bmp
  771. ErrorCodeEnum eErrFront, eErrBack;
  772. eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
  773. eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback");
  774. if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
  775. {
  776. ctx->Ans.hasscan = 1;
  777. #ifdef RVC_OS_WIN
  778. if (!closeImgCheck)
  779. {
  780. ImgChekTask* frontImgCheck = new ImgChekTask(this);
  781. frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
  782. frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
  783. frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
  784. frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
  785. frontImgCheck->imgInput = ctx->Ans.frontphoto;
  786. frontImgCheck->imgType = "正面";
  787. GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
  788. ImgChekTask* backImgCheck = new ImgChekTask(this);
  789. backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
  790. backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
  791. backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
  792. backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
  793. backImgCheck->imgInput = ctx->Ans.backphoto;
  794. frontImgCheck->imgType = "背面";
  795. GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
  796. }
  797. #endif
  798. }
  799. else
  800. {
  801. CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed.";
  802. if (transImgMsg.GetLength() != 0)
  803. {
  804. warnMsg = warnMsg + transImgMsg;
  805. }
  806. LogWarn(Severity_Middle, Error_Succeed,
  807. IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData());
  808. }
  809. }
  810. else
  811. {
  812. if (eErr != Error_NotImpl)
  813. SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
  814. false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
  815. }
  816. }
  817. #ifdef RVC_OS_WIN
  818. CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
  819. , (const char*)CSimpleStringA(gbkIDcode).SubString(0, 4)
  820. , (const char*)CSimpleStringA(gbkIDcode).SubString(CSimpleStringA(gbkIDcode).GetLength() - 1, 1));
  821. #else
  822. CSimpleStringA tIdcode = (char*)idno;
  823. CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
  824. , (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1));
  825. #endif
  826. LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData());
  827. ctx->Ans.photodata = ctx->Ans.headphoto;
  828. DeleteZP(curDeleteType, 2);
  829. bGetIDCert = true;
  830. break;
  831. }
  832. }
  833. }
  834. dwEnd = SP::Module::Comm::RVCGetTickCount();
  835. elapsed = dwEnd - dwStart;
  836. }
  837. DeleteZP(curDeleteType);
  838. if (m_bExit)
  839. bExitWhenReading = true;
  840. m_bExit = false;
  841. m_bReading = false;
  842. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off");
  843. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  844. ErrorCodeEnum eErr1 = m_hDevHelper->IDCerRFControl(false);
  845. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  846. if (eErr1 != Error_Succeed)
  847. {
  848. SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
  849. false, m_ullEndTime - m_ullBeginTime, "", SetRFControlContext(false).GetData());
  850. }
  851. else
  852. {
  853. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl")
  854. .setCostTime(m_ullEndTime - m_ullBeginTime)();
  855. }
  856. if (bGetIDCert)
  857. {
  858. ctx->Answer(Error_Succeed);
  859. }
  860. else if (m_bCancelRead)
  861. {
  862. ctx->Answer(Error_Cancel);
  863. }
  864. else if (elapsed >= IDCER_READ_TIMEOUT)
  865. {
  866. if (bIDCerAuthenticate) {
  867. if (bInvokeReadEx2 && !bReadSuccess) {
  868. SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
  869. true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8);
  870. ctx->Answer(Error_TimeOut, GetAlarmDEC()); //RTA2109
  871. }
  872. }
  873. else if (!bOpenRF)
  874. {
  875. SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
  876. true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8, SetRFControlContext(true).GetData());
  877. ctx->Answer(Error_TimeOut, GetAlarmDEC());
  878. }
  879. else
  880. {
  881. if (errAuth == Error_DevMedia)
  882. {
  883. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_OtherCard, "读证超时,插入的卡片非身份.");
  884. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
  885. ctx->Answer(Error_TimeOut);
  886. }
  887. else if(errAuth == Error_Dev_IDCardNotFound)
  888. {
  889. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_NoCard, "读证超时,未检测到有卡片插入.");
  890. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8)();
  891. ctx->Answer(Error_TimeOut);
  892. }
  893. else
  894. {
  895. SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
  896. false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2107
  897. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  898. }
  899. }
  900. }
  901. else
  902. {
  903. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8 some thing wrong.");
  904. ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed);
  905. LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong.");
  906. }
  907. if (m_bCancelRead)
  908. {
  909. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 2");
  910. return 2;
  911. }
  912. if (bExitWhenReading)
  913. {
  914. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 3");
  915. return 3;
  916. }
  917. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 0");
  918. return 0;
  919. }
  920. int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext<IDCert_ReadAndScanUTF8JS_Req, IDCert_ReadAndScanUTF8JS_Ans>::Pointer ctx)
  921. {
  922. LOG_FUNCTION();
  923. DWORD elapsed = 0;
  924. DWORD dwStart = SP::Module::Comm::RVCGetTickCount();
  925. DWORD dwEnd = SP::Module::Comm::RVCGetTickCount();
  926. ErrorCodeEnum eErr = Error_Unexpect;
  927. ErrorCodeEnum errRfOpen = Error_Unexpect;
  928. ErrorCodeEnum errAuth = Error_Unexpect;
  929. ErrorCodeEnum errRead = Error_Unexpect;
  930. ErrorCodeEnum errReadEx = Error_Unexpect;
  931. ErrorCodeEnum errReadEx2 = Error_Unexpect;
  932. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on");
  933. DeleteZP(Bmp_ZP | Bmp_SCAN, 1);
  934. bool bOpenRF = false, bGetIDCert = false;
  935. IDCerInfoEx2 idInfoEx2;
  936. IDCerInfoEx idInfo;
  937. IDCerInfo idInfoOld;
  938. memset(&idInfoEx2, 0, sizeof(idInfoEx2));
  939. memset(&idInfo, 0, sizeof(idInfo));
  940. memset(&idInfoOld, 0, sizeof(idInfoOld));
  941. m_bCancelRead = false;
  942. m_bWaitReadMore = false;
  943. m_bReading = true;
  944. m_bExit = false;
  945. bool bReadSuccess = false;
  946. bool bInvokeReadEx = false;
  947. bool bInvokeReadEx2 = false;
  948. bool bExitWhenReading = false;
  949. bool bIDCerAuthenticate = false;
  950. int curDeleteType = Bmp_ZP;
  951. while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead)
  952. {
  953. if (m_bExit)
  954. {
  955. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("exit");
  956. break;
  957. }
  958. bReadSuccess = false;
  959. bInvokeReadEx = false;
  960. bInvokeReadEx2 = false;
  961. if (m_bWaitReadMore)
  962. {
  963. dwStart = SP::Module::Comm::RVCGetTickCount();
  964. m_bWaitReadMore = false;
  965. }
  966. if (!bOpenRF)
  967. {
  968. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  969. errRfOpen = m_hDevHelper->IDCerRFControl(true);
  970. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  971. if (Error_Succeed == errRfOpen)
  972. {
  973. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  974. .setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)();
  975. }
  976. else
  977. {
  978. dwEnd = SP::Module::Comm::RVCGetTickCount();
  979. elapsed = dwEnd - dwStart;
  980. Sleep(IDCER_AUTH_INTERVAL);
  981. continue;
  982. }
  983. }
  984. bOpenRF = true;
  985. Sleep(IDCER_AUTH_INTERVAL);
  986. bIDCerAuthenticate = false;
  987. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  988. errAuth = m_hDevHelper->IDCerAuthenticate();
  989. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  990. if (Error_Succeed != errAuth)
  991. {
  992. dwEnd = SP::Module::Comm::RVCGetTickCount();
  993. elapsed = dwEnd - dwStart;
  994. continue;
  995. }
  996. else
  997. {
  998. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  999. .setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1000. bIDCerAuthenticate = true;
  1001. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1002. errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2);
  1003. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1004. if (errReadEx2 == Error_NotImpl)
  1005. {
  1006. ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息
  1007. }
  1008. else
  1009. {
  1010. ctx->Ans.msgtype = 1; //新字段传递,UTF8、二进制传递文字信息
  1011. //ex2数据读取功能代码、UCS2转UTF8代码
  1012. bInvokeReadEx2 = true;
  1013. if (errReadEx2 != Error_Succeed)
  1014. {
  1015. bReadSuccess = false;
  1016. }
  1017. else
  1018. {
  1019. unsigned char name[1024]; memset(name, 0, 1024);
  1020. unsigned char sex[1024]; memset(sex, 0, 1024);
  1021. unsigned char nation[1024]; memset(nation, 0, 1024);
  1022. unsigned char birthday[1024]; memset(birthday, 0, 1024);
  1023. unsigned char address[1024]; memset(address, 0, 1024);
  1024. unsigned char idno[1024]; memset(idno, 0, 1024);
  1025. unsigned char department[1024]; memset(department, 0, 1024);
  1026. unsigned char startDate[1024]; memset(startDate, 0, 1024);
  1027. unsigned char endDate[1024]; memset(endDate, 0, 1024);
  1028. unsigned char englishName[1024]; memset(englishName, 0, 1024);
  1029. unsigned char nationality[1024]; memset(nationality, 0, 1024);
  1030. unsigned char idVersion[1024]; memset(idVersion, 0, 1024);
  1031. unsigned char idType[1024]; memset(idType, 0, 1024);
  1032. unsigned char reserved[1024]; memset(reserved, 0, 1024);//外国人永居证旧证件关联字段
  1033. unsigned char englishNameEx[1024]; memset(englishNameEx, 0, 1024); //英文名备用字段
  1034. unsigned char IssuedSN[1024]; memset(IssuedSN, 0, 1024); //换证次数
  1035. DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER)
  1036. .setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime)
  1037. .setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)();
  1038. bReadSuccess = true;
  1039. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op.");
  1040. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("各字段长度-姓名:%d; 性别:%d; 民族:%d; 身份证:%d;",
  1041. GetUCS2ByteLength((UINT16*)idInfoEx2.name.data), GetUCS2ByteLength((UINT16*)idInfoEx2.sex.data),
  1042. GetUCS2ByteLength((UINT16*)idInfoEx2.nation.data), GetUCS2ByteLength((UINT16*)idInfoEx2.idno.data));
  1043. //去除首尾空格
  1044. RemoveUCS2Blank((UINT16*)idInfoEx2.name.data);
  1045. CheckHanZi((UINT16*)idInfoEx2.name.data); //检测汉字编码
  1046. RemoveUCS2Blank((UINT16*)idInfoEx2.sex.data);
  1047. RemoveUCS2Blank((UINT16*)idInfoEx2.nation.data);
  1048. RemoveUCS2Blank((UINT16*)idInfoEx2.birthday.data);
  1049. RemoveUCS2Blank((UINT16*)idInfoEx2.address.data);
  1050. RemoveUCS2Blank((UINT16*)idInfoEx2.idno.data);
  1051. RemoveUCS2Blank((UINT16*)idInfoEx2.department.data);
  1052. RemoveUCS2Blank((UINT16*)idInfoEx2.startDate.data);
  1053. RemoveUCS2Blank((UINT16*)idInfoEx2.endDate.data);
  1054. RemoveUCS2Blank((UINT16*)idInfoEx2.englishName.data);
  1055. RemoveUCS2Blank((UINT16*)idInfoEx2.nationality.data);
  1056. RemoveUCS2Blank((UINT16*)idInfoEx2.idVersion.data);
  1057. RemoveUCS2Blank((UINT16*)idInfoEx2.idType.data);
  1058. RemoveUCS2Blank((UINT16*)idInfoEx2.reserved.data); //外国人永居证旧证件关联字段
  1059. RemoveUCS2Blank((UINT16*)idInfoEx2.reserved2.data); //英文名备用字段
  1060. RemoveUCS2Blank((UINT16*)idInfoEx2.issuedSN.data); //换证次数
  1061. #ifdef RVC_OS_WIN
  1062. //转换成GBK用于debug上传
  1063. char* tSex = new char[32];
  1064. char* tNation = new char[32];
  1065. char* tBirthday = new char[32];
  1066. char* tStartDate = new char[32];
  1067. char* tEndDate = new char[32];
  1068. char* tIDcode = new char[1024];
  1069. char* tIDtype = new char[8];
  1070. char* tName = new char[128];
  1071. char* tNationality = new char[8];
  1072. char* tChecKNum = new char[8];
  1073. memcpy(tSex, idInfoEx2.sex.data, 32);
  1074. memcpy(tNation, idInfoEx2.nation.data, 32);
  1075. memcpy(tBirthday, idInfoEx2.birthday.data, 32);
  1076. memcpy(tStartDate, idInfoEx2.startDate.data, 32);
  1077. memcpy(tEndDate, idInfoEx2.endDate.data, 32);
  1078. memcpy(tIDcode, idInfoEx2.idno.data, 1024);
  1079. memcpy(tIDtype, idInfoEx2.idType.data, 8);
  1080. memcpy(tName, idInfoEx2.name.data, 128);
  1081. memcpy(tNationality, idInfoEx2.nationality.data, 8);
  1082. memcpy(tChecKNum, idInfoEx2.issuedSN.data, 8);
  1083. char* gbkSex, * gbkNation, * gbkBirthday, * gbkStartDate, * gbkEndDate, * gbkIDcode, * gbkIDtype, * gbkName, * gbkNationality, * gbktCheckNum;
  1084. int iSize;
  1085. //sex
  1086. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, NULL, 0, NULL, NULL);
  1087. gbkSex = (char*)malloc((iSize + 1));
  1088. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, gbkSex, iSize, NULL, NULL);
  1089. //nation
  1090. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, NULL, 0, NULL, NULL);
  1091. gbkNation = (char*)malloc((iSize + 1));
  1092. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, gbkNation, iSize, NULL, NULL);
  1093. //birthday
  1094. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, NULL, 0, NULL, NULL);
  1095. gbkBirthday = (char*)malloc((iSize + 1));
  1096. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, gbkBirthday, iSize, NULL, NULL);
  1097. //startdate
  1098. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, NULL, 0, NULL, NULL);
  1099. gbkStartDate = (char*)malloc((iSize + 1));
  1100. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, gbkStartDate, iSize, NULL, NULL);
  1101. //endate
  1102. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, NULL, 0, NULL, NULL);
  1103. gbkEndDate = (char*)malloc((iSize + 1));
  1104. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, gbkEndDate, iSize, NULL, NULL);
  1105. //idcode
  1106. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, NULL, 0, NULL, NULL);
  1107. gbkIDcode = (char*)malloc((iSize + 1));
  1108. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, gbkIDcode, iSize, NULL, NULL);
  1109. //idtype
  1110. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, NULL, 0, NULL, NULL);
  1111. gbkIDtype = (char*)malloc((iSize + 1));
  1112. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, gbkIDtype, iSize, NULL, NULL);
  1113. //name
  1114. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, NULL, 0, NULL, NULL);
  1115. gbkName = (char*)malloc((iSize + 1));
  1116. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, gbkName, iSize, NULL, NULL);
  1117. //natinality
  1118. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, NULL, 0, NULL, NULL);
  1119. gbkNationality = (char*)malloc((iSize + 1));
  1120. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, gbkNationality, iSize, NULL, NULL);
  1121. //issuedSN
  1122. iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, NULL, 0, NULL, NULL);
  1123. gbktCheckNum = (char*)malloc((iSize + 1));
  1124. WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, gbktCheckNum, iSize, NULL, NULL);
  1125. //gbk转换结束
  1126. #endif
  1127. UCS2_to_UTF8((UINT16*)idInfoEx2.name.data, name);
  1128. //UCS2_to_UTF8((UINT16*)idInfoEx2.sex.data, sex);
  1129. GetSexUTF8String((UINT16*)idInfoEx2.sex.data, sex);
  1130. //UCS2_to_UTF8((UINT16*)idInfoEx2.nation.data, nation);
  1131. GetNationalUTF8String((UINT16*)idInfoEx2.nation.data, nation);
  1132. //UCS2_to_UTF8((UINT16*)idInfoEx2.birthday.data, birthday);
  1133. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.birthday.data, birthday);
  1134. UCS2_to_UTF8((UINT16*)idInfoEx2.address.data, address);
  1135. UCS2_to_UTF8((UINT16*)idInfoEx2.idno.data, idno);
  1136. UCS2_to_UTF8((UINT16*)idInfoEx2.department.data, department);
  1137. //UCS2_to_UTF8((UINT16*)idInfoEx2.startDate.data, startDate);
  1138. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.startDate.data, startDate);
  1139. //UCS2_to_UTF8((UINT16*)idInfoEx2.endDate.data, endDate);
  1140. GetDateStandardFormatUTF8((UINT16*)idInfoEx2.endDate.data, endDate);
  1141. UCS2_to_UTF8((UINT16*)idInfoEx2.englishName.data, englishName);
  1142. UCS2_to_UTF8((UINT16*)idInfoEx2.nationality.data, nationality);
  1143. UCS2_to_UTF8((UINT16*)idInfoEx2.idVersion.data, idVersion);
  1144. UCS2_to_UTF8((UINT16*)idInfoEx2.idType.data, idType);
  1145. UCS2_to_UTF8((UINT16*)idInfoEx2.reserved.data, reserved);
  1146. UCS2_to_UTF8((UINT16*)idInfoEx2.reserved2.data, englishNameEx);
  1147. UCS2_to_UTF8((UINT16*)idInfoEx2.issuedSN.data, IssuedSN);
  1148. ctx->Ans.name_utf8.Alloc(strlen((char*)name));
  1149. ctx->Ans.sex_utf8.Alloc(strlen((char*)sex));
  1150. ctx->Ans.nation_utf8.Alloc(strlen((char*)nation));
  1151. ctx->Ans.birthday_utf8.Alloc(strlen((char*)birthday));
  1152. ctx->Ans.address_utf8.Alloc(strlen((char*)address));
  1153. ctx->Ans.idcode_utf8.Alloc(strlen((char*)idno));
  1154. ctx->Ans.department_utf8.Alloc(strlen((char*)department));
  1155. ctx->Ans.startdate_utf8.Alloc(strlen((char*)startDate));
  1156. ctx->Ans.enddate_utf8.Alloc(strlen((char*)endDate));
  1157. ctx->Ans.englishname_utf8.Alloc(strlen((char*)englishName));
  1158. ctx->Ans.nationality_utf8.Alloc(strlen((char*)nationality));
  1159. ctx->Ans.idversion_utf8.Alloc(strlen((char*)idVersion));
  1160. ctx->Ans.idtype_utf8.Alloc(strlen((char*)idType));
  1161. ctx->Ans.reserved_utf8.Alloc(strlen((char*)reserved)); //新外国人永居证关联字段
  1162. ctx->Ans.othercode_utf8.Alloc(strlen((char*)englishNameEx)); //英文名备用字段
  1163. memcpy(ctx->Ans.name_utf8.m_pData, name, strlen((char*)name));
  1164. memcpy(ctx->Ans.sex_utf8.m_pData, sex, strlen((char*)sex));
  1165. memcpy(ctx->Ans.nation_utf8.m_pData, nation, strlen((char*)nation));
  1166. memcpy(ctx->Ans.birthday_utf8.m_pData, birthday, strlen((char*)birthday));
  1167. memcpy(ctx->Ans.address_utf8.m_pData, address, strlen((char*)address));
  1168. memcpy(ctx->Ans.idcode_utf8.m_pData, idno, strlen((char*)idno));
  1169. memcpy(ctx->Ans.department_utf8.m_pData, department, strlen((char*)department));
  1170. memcpy(ctx->Ans.startdate_utf8.m_pData, startDate, strlen((char*)startDate));
  1171. memcpy(ctx->Ans.enddate_utf8.m_pData, endDate, strlen((char*)endDate));
  1172. memcpy(ctx->Ans.englishname_utf8.m_pData, englishName, strlen((char*)englishName));
  1173. memcpy(ctx->Ans.nationality_utf8.m_pData, nationality, strlen((char*)nationality));
  1174. memcpy(ctx->Ans.idversion_utf8.m_pData, idVersion, strlen((char*)idVersion));
  1175. memcpy(ctx->Ans.idtype_utf8.m_pData, idType, strlen((char*)idType));
  1176. memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段
  1177. memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段
  1178. ctx->Ans.hasscan = 0;
  1179. GetPngBlobEx(ctx->Ans.headphoto, "zp"); //转换头像图片
  1180. if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能
  1181. {
  1182. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1183. eErr = m_hDevHelper->ScanIDAndSaveImage();
  1184. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1185. if (eErr == Error_Succeed)
  1186. {
  1187. curDeleteType = Bmp_ZP | Bmp_SCAN;
  1188. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)();
  1189. transImgMsg.Clear();
  1190. //idfront.bmp" and "idback.bmp
  1191. ErrorCodeEnum eErrFront, eErrBack;
  1192. eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront");
  1193. eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback");
  1194. if (eErrFront == Error_Succeed && eErrBack == Error_Succeed)
  1195. {
  1196. ctx->Ans.hasscan = 1;
  1197. #ifdef RVC_OS_WIN
  1198. if (!closeImgCheck)
  1199. {
  1200. ImgChekTask* frontImgCheck = new ImgChekTask(this);
  1201. frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
  1202. frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
  1203. frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
  1204. frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
  1205. frontImgCheck->imgInput = ctx->Ans.frontphoto;
  1206. frontImgCheck->imgType = "正面";
  1207. GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck);
  1208. ImgChekTask* backImgCheck = new ImgChekTask(this);
  1209. backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode;
  1210. backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName;
  1211. backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality;
  1212. backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype;
  1213. backImgCheck->imgInput = ctx->Ans.backphoto;
  1214. frontImgCheck->imgType = "背面";
  1215. GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck);
  1216. }
  1217. #endif
  1218. }
  1219. else
  1220. {
  1221. CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed.";
  1222. if (transImgMsg.GetLength() != 0)
  1223. {
  1224. warnMsg = warnMsg + transImgMsg;
  1225. }
  1226. LogWarn(Severity_Middle, Error_Succeed,
  1227. IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData());
  1228. }
  1229. }
  1230. else
  1231. {
  1232. if(eErr != Error_NotImpl)
  1233. SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__,
  1234. false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
  1235. }
  1236. }
  1237. #ifdef RVC_OS_WIN
  1238. CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
  1239. , (const char*)CSimpleStringA(gbkIDcode).SubString(0, 4)
  1240. , (const char*)CSimpleStringA(gbkIDcode).SubString(CSimpleStringA(gbkIDcode).GetLength() - 1, 1));
  1241. #else
  1242. CSimpleStringA tIdcode = (char*)idno;
  1243. CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s"
  1244. , (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1));
  1245. #endif
  1246. LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData());
  1247. ctx->Ans.photodata = ctx->Ans.headphoto;
  1248. DeleteZP(curDeleteType, 2);
  1249. bGetIDCert = true;
  1250. break;
  1251. }
  1252. }
  1253. }
  1254. dwEnd = SP::Module::Comm::RVCGetTickCount();
  1255. elapsed = dwEnd - dwStart;
  1256. }
  1257. DeleteZP(curDeleteType);
  1258. if (m_bExit)
  1259. bExitWhenReading = true;
  1260. m_bExit = false;
  1261. m_bReading = false;
  1262. LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off");
  1263. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1264. ErrorCodeEnum eErr1 = m_hDevHelper->IDCerRFControl(false);
  1265. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1266. if (eErr1 != Error_Succeed)
  1267. {
  1268. SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
  1269. false, m_ullEndTime - m_ullBeginTime, "", SetRFControlContext(false).GetData());
  1270. }
  1271. else
  1272. {
  1273. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl")
  1274. .setCostTime(m_ullEndTime - m_ullBeginTime)();
  1275. }
  1276. if (bGetIDCert)
  1277. {
  1278. ctx->Answer(Error_Succeed);
  1279. }
  1280. else if (m_bCancelRead)
  1281. {
  1282. ctx->Answer(Error_Cancel);
  1283. }
  1284. else if (elapsed >= IDCER_READ_TIMEOUT)
  1285. {
  1286. if (bIDCerAuthenticate) {
  1287. if (bInvokeReadEx2 && !bReadSuccess) {
  1288. SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__,
  1289. true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS);
  1290. //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2));
  1291. ctx->Answer(Error_TimeOut, GetAlarmDEC()); //RTA2109
  1292. }
  1293. }
  1294. else if (!bOpenRF)
  1295. {
  1296. SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__,
  1297. true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS, SetRFControlContext(true).GetData());
  1298. //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen));
  1299. ctx->Answer(Error_TimeOut, GetAlarmDEC());
  1300. }
  1301. else
  1302. {
  1303. if (errAuth == Error_DevMedia)
  1304. {
  1305. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_OtherCard, "读证超时,插入的卡片非身份.");
  1306. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)();
  1307. ctx->Answer(Error_TimeOut);
  1308. }
  1309. else if (errAuth == Error_Dev_IDCardNotFound)
  1310. {
  1311. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Timeout_NoCard, "读证超时,未检测到有卡片插入.");
  1312. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)();
  1313. ctx->Answer(Error_TimeOut);
  1314. }
  1315. else
  1316. {
  1317. SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__,
  1318. false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); //RTA2107
  1319. ctx->Answer(Error_Unexpect, GetAlarmDEC());
  1320. }
  1321. }
  1322. }
  1323. else
  1324. {
  1325. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS).setResultCode("RTA2104")("ReadAndScanUTF8JS some thing wrong.");
  1326. ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed);
  1327. LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong.");
  1328. }
  1329. if (m_bCancelRead)
  1330. {
  1331. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 2");
  1332. return 2;
  1333. }
  1334. if (bExitWhenReading)
  1335. {
  1336. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 3");
  1337. return 3;
  1338. }
  1339. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 0");
  1340. return 0;
  1341. }
  1342. ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefix)
  1343. {
  1344. CSimpleStringA strPath, errMsg, strOldPath;
  1345. ErrorCodeEnum eErr;
  1346. eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath);
  1347. if (eErr != Error_Succeed)
  1348. {
  1349. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get [Dep] path failed! errcode:%s.", SpStrError(eErr));
  1350. return Error_Param;
  1351. }
  1352. strPath = strPath + SPLIT_SLASH_STR + fileNamePrefix;
  1353. //涉及到后缀名变更,单独实现
  1354. if (!ExistsFileA((const char*)(strPath + ".bmp")))
  1355. {
  1356. eErr = m_pEntity->GetFunction()->GetPath("DepBak", strOldPath);
  1357. if (eErr != Error_Succeed)
  1358. {
  1359. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get [DepBak] Path failed! errcode:%s.", SpStrError(eErr));
  1360. return Error_Param;
  1361. }
  1362. strOldPath = strOldPath + SPLIT_SLASH_STR + fileNamePrefix;
  1363. if (ExistsFileA(strOldPath + ".bmp"))//在旧Dep路径下找到文件时告警
  1364. {
  1365. strPath = strOldPath;
  1366. CSimpleStringA warnMsg = CSimpleStringA::Format("Find %s.bmp in OLD dep path!", strOldPath.GetData());
  1367. LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_FindFile_in_DepBak, warnMsg.GetData());
  1368. }
  1369. }
  1370. IplImage *src = cvLoadImage(strPath + ".bmp");
  1371. if (!src)
  1372. {
  1373. errMsg = CSimpleStringA::Format("read file %s.bmp failed.err:%d", (const char*)strPath, GetLastError());
  1374. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg.GetData());
  1375. if (transImgMsg.GetLength() != 0)
  1376. {
  1377. transImgMsg = transImgMsg + "," + errMsg;
  1378. }
  1379. else
  1380. {
  1381. transImgMsg = errMsg;
  1382. }
  1383. cvReleaseImage(&src);
  1384. return Error_Unexpect;
  1385. }
  1386. cvSaveImage(strPath + ".jpg", src);
  1387. FILE *fp = fopen(strPath + ".jpg", "rb");
  1388. if (fp) {
  1389. fseek(fp, 0, SEEK_END);
  1390. long flen = ftell(fp);
  1391. fseek(fp, 0, SEEK_SET);
  1392. data.Alloc(flen);
  1393. fread(data.m_pData, 1, flen, fp);
  1394. fclose(fp);
  1395. cvReleaseImage(&src);
  1396. return Error_Succeed;
  1397. }
  1398. else {
  1399. errMsg = CSimpleStringA::Format("fopen %s failed!", (const char*)strPath);
  1400. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg.GetData());
  1401. if (transImgMsg.GetLength() != 0)
  1402. {
  1403. transImgMsg = transImgMsg + "," + errMsg;
  1404. }
  1405. else
  1406. {
  1407. transImgMsg = errMsg;
  1408. }
  1409. cvReleaseImage(&src);
  1410. return Error_IO;
  1411. }
  1412. }
  1413. void CIDCertFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  1414. {
  1415. //for simple
  1416. pTransactionContext->SendAnswer(m_testResult);
  1417. }
  1418. ErrorCodeEnum CIDCertFSM::DeleteFileIfExisted(LPCTSTR fileName, int deleteTiming)
  1419. {
  1420. if(strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL)
  1421. {
  1422. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
  1423. ("Invalid or empty fileName(%s)", fileName);
  1424. return Error_Param;
  1425. }
  1426. CSimpleStringA strAimPath, strAimOldPath;
  1427. ErrorCodeEnum erroCode = m_pEntity->GetFunction()->GetPath("Dep", strAimPath);
  1428. strAimPath = strAimPath + SPLIT_SLASH_STR + fileName;
  1429. UpdateAndWarnFileFindInDepBak(strAimPath, fileName, IDCertificate_UserErrorCode_FindFile_in_DepBak);
  1430. map<string, string> errInfo;
  1431. CSimpleStringA errMsg;
  1432. if (ExistsFileA((LPCTSTR)strAimPath))
  1433. {
  1434. if (deleteTiming == 1) //检测到上次读证残留图片
  1435. {
  1436. errInfo["path"] = strAimPath.GetData();
  1437. errInfo["hash"] = GetFileHashStr(strAimPath).GetData();
  1438. errInfo["modifytime"] = GetFileLastModifyTime(strAimPath).GetData();
  1439. errMsg = generateJsonStr(errInfo).second.c_str();
  1440. //CSimpleStringA errMsg = CSimpleStringA::Format("检测到上次读证残留图片:[%s]", strAimPath.GetData());
  1441. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2112").setAPI("DeleteFileIfExisted")(errMsg.GetData());
  1442. }
  1443. if (RemoveFileA((LPCTSTR)strAimPath))
  1444. {
  1445. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("RemoveFileA(%s) suc.", (LPCTSTR)strAimPath);
  1446. return Error_Succeed;
  1447. }
  1448. else
  1449. {
  1450. CSimpleStringA rtaCode = "";
  1451. if (deleteTiming == 1) //删除上次读证残留图片失败
  1452. {
  1453. rtaCode = "RTA2113";
  1454. }
  1455. else if (deleteTiming == 2) //删除本次读证生成图片失败
  1456. {
  1457. rtaCode = "RTA2115";
  1458. }
  1459. errInfo.clear();
  1460. errInfo["path"] = strAimPath.GetData();
  1461. errInfo["lasterror"] = to_string(GetLastError());
  1462. errMsg = generateJsonStr(errInfo).second.c_str();
  1463. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(rtaCode.GetData()).setAPI("DeleteFileIfExisted")
  1464. (errMsg.GetData());
  1465. return Error_Unexpect;
  1466. }
  1467. }
  1468. else
  1469. {
  1470. if (deleteTiming == 2) //未发现本次读证生成的图片
  1471. {
  1472. errInfo.clear();
  1473. errInfo["path"] = strAimPath.GetData();
  1474. errMsg = generateJsonStr(errInfo).second.c_str();
  1475. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2114").setAPI("DeleteFileIfExisted")(errMsg.GetData());
  1476. }
  1477. return Error_Succeed;
  1478. }
  1479. }
  1480. ErrorCodeEnum CIDCertFSM::GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType)
  1481. {
  1482. if (m_getDevCategory != Error_Succeed)
  1483. return m_getDevCategory;
  1484. strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) + 1 : MAX_DEV_MODEL_LEN);
  1485. strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) + 1 : MAX_DEV_TYPE_LEN);
  1486. strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) + 1 : MAX_DEV_VENDOR_LEN);
  1487. devType = m_adapterInfo.strVersion;//适配器版本号
  1488. return Error_Succeed;
  1489. }
  1490. int CIDCertFSM::WaitFetchIDCard()
  1491. {
  1492. LOG_FUNCTION();
  1493. ErrorCodeEnum eErr = Error_Unexpect;
  1494. int pos = 99;
  1495. DWORD64 dwStart = SP::Module::Comm::RVCGetTickCount();
  1496. DWORD64 dwEnd = 0;
  1497. while ((dwEnd - dwStart) < 120 * 1000)//wait for 120 seconds
  1498. {
  1499. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1500. eErr = m_hDevHelper->QueryCardPos(pos);
  1501. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1502. if (eErr == Error_Succeed)
  1503. {
  1504. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
  1505. .setCostTime(m_ullEndTime - m_ullBeginTime)
  1506. ("QueryCardPos succeed");
  1507. }
  1508. else
  1509. {
  1510. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")
  1511. .setCostTime(m_ullEndTime - m_ullBeginTime)
  1512. .setResultCode("RTA210A")
  1513. ("QueryCardPos failed.");
  1514. }
  1515. if (eErr == Error_Succeed && pos == 0)
  1516. {
  1517. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WaitFetchIDCard")("身份证被取回");
  1518. return 0;
  1519. }
  1520. Sleep(1000);
  1521. }
  1522. // BugFix [4/16/2020 14:27 @Gifur]
  1523. return -1;
  1524. }
  1525. void CIDCertFSM::DeleteZP(int type, int deleteTiming)
  1526. {
  1527. if ((type&Bmp_ZP) == Bmp_ZP)
  1528. {
  1529. DeleteFileIfExisted("zp.jpg", deleteTiming);
  1530. DeleteFileIfExisted("zp.bmp", deleteTiming); //All
  1531. }
  1532. if ((type&Bmp_SCAN) == Bmp_SCAN)
  1533. {
  1534. DeleteFileIfExisted("idfront.bmp", deleteTiming);
  1535. DeleteFileIfExisted("idback.bmp", deleteTiming);
  1536. DeleteFileIfExisted("idfront.jpg", deleteTiming);
  1537. DeleteFileIfExisted("idback.jpg", deleteTiming);
  1538. }
  1539. }
  1540. int CIDCertFSM::Initial()
  1541. {
  1542. LOG_FUNCTION();
  1543. CSystemStaticInfo sysInfo;
  1544. GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  1545. m_csMachineType = sysInfo.strMachineType;
  1546. m_terminalNo = sysInfo.strTerminalID;
  1547. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("machineType:%s,terminalNo:%s", (const char*)m_csMachineType, (const char*)m_terminalNo);
  1548. SetDevState(DEVICE_STATUS_NOT_READY);
  1549. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  1550. //to do device init
  1551. ErrorCodeEnum eErrDev;
  1552. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1553. CSmartPointer<IConfigInfo> spConfig;
  1554. eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig);
  1555. if (eErrDev != Error_Succeed) {
  1556. LogWarn(Severity_Middle, eErrDev, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "open cfg file failed!");
  1557. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cfg file failed!");
  1558. m_bOpening = false;
  1559. return 2;
  1560. }
  1561. eErrDev = pEntity->LoadVendorLibName();
  1562. if (eErrDev != Error_Succeed) {
  1563. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get vendor dll(%s)name failed.", pEntity->GetVendorLibName().GetData());
  1564. m_bOpening = false;
  1565. return 2;
  1566. }
  1567. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  1568. pEntity->InitializeVendorLogSwitch();
  1569. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)
  1570. ("Vendor=%s#Version=%s#Batch=%s", (const char*)m_adapterInfo.strVendor, (const char*)m_adapterInfo.strVersion, (const char*)m_adapterInfo.strBatch);
  1571. eErrDev = LoadUpAdapterLibrary();
  1572. if (!IS_SUCCEED(eErrDev)) {
  1573. LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_DllLoadFailed,
  1574. CSimpleStringA::Format("身份证加载厂商适配器失败!GLE=%d.", GetLastError()));
  1575. m_bOpening = false;
  1576. return 2;
  1577. }
  1578. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("IDCer open with port %d", m_adapterInfo.GetPortInt());
  1579. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1580. ErrorCodeEnum err = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt());
  1581. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1582. m_bOpening = false;
  1583. if (err == Error_Succeed)
  1584. {
  1585. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(m_ullEndTime - m_ullBeginTime)
  1586. ("Initial DevOpen succeed");
  1587. }
  1588. else
  1589. {
  1590. SetErrorAndLog(err, MEC_DEVAPI_IDCER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__,
  1591. false, m_ullEndTime - m_ullBeginTime);
  1592. m_hDevHelper.TearDown();
  1593. return 2;
  1594. }
  1595. memset(m_devCatInfo.szModel, 0, MAX_DEV_MODEL_LEN);
  1596. memset(m_devCatInfo.szType, 0, MAX_DEV_TYPE_LEN);
  1597. memset(m_devCatInfo.szVendor, 0, MAX_DEV_VENDOR_LEN);
  1598. m_ullBeginTime = SP::Module::Comm::RVCGetTickCount();
  1599. eErrDev = m_hDevHelper->GetDevCategory(m_devCatInfo);
  1600. m_ullEndTime = SP::Module::Comm::RVCGetTickCount();
  1601. m_getDevCategory = err; //获取设备信息的api执行结果
  1602. if (eErrDev == Error_Succeed)
  1603. {
  1604. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime)
  1605. ("Initial GetDevCategory succeed");
  1606. if (strlen(m_devCatInfo.szModel) < 256)
  1607. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", m_devCatInfo.szModel);
  1608. CSimpleStringA szMod(m_devCatInfo.szModel);
  1609. if (strstr(m_devCatInfo.szModel, "CODE=UCS2") != NULL)
  1610. {
  1611. supportUCS2 = TRUE;
  1612. }
  1613. if (strstr(m_devCatInfo.szModel, "STYLE=IG") != NULL)
  1614. {
  1615. igestionVer = TRUE;
  1616. }
  1617. if (strstr(m_devCatInfo.szModel, "FUNCTION=ITFY") != NULL)
  1618. {
  1619. supportNewForeigner = TRUE;
  1620. }
  1621. m_adapterInfo.FulfillCategoryInfo(m_devCatInfo);
  1622. }
  1623. else
  1624. {
  1625. SetErrorAndLog(eErrDev, MEC_DEVAPI_IDCER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__,
  1626. false, m_ullEndTime - m_ullBeginTime);
  1627. }
  1628. if (m_hDevHelper != nullptr)
  1629. {
  1630. SetDevInitFlag();
  1631. LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_DevOpen_Success, "身份证打开成功");
  1632. return 0;
  1633. }
  1634. else
  1635. return 2;
  1636. return 0;
  1637. }
  1638. BOOL CIDCertFSM::UCS2_to_UTF8(UINT16* ucs2_code, UINT8* utf8_code)
  1639. {
  1640. UINT8* out = utf8_code;
  1641. if (!utf8_code)
  1642. {
  1643. return FALSE;
  1644. }
  1645. while (*ucs2_code != 0)
  1646. {
  1647. if (0x0080 > *ucs2_code)
  1648. {
  1649. /* 1 byte UTF-8 Character.*/
  1650. *out = (UINT8)*ucs2_code;
  1651. ++out;
  1652. }
  1653. else if (0x0800 > *ucs2_code)
  1654. {
  1655. /*2 bytes UTF-8 Character.*/
  1656. *out = ((UINT8)(*ucs2_code >> 6)) | 0xc0;
  1657. *(out + 1) = ((UINT8)(*ucs2_code & 0x003F)) | 0x80;
  1658. out += 2;
  1659. }
  1660. else
  1661. {
  1662. /* 3 bytes UTF-8 Character .*/
  1663. *out = ((UINT8)(*ucs2_code >> 12)) | 0xE0;
  1664. *(out + 1) = ((UINT8)((*ucs2_code & 0x0FC0) >> 6)) | 0x80;
  1665. *(out + 2) = ((UINT8)(*ucs2_code & 0x003F)) | 0x80;
  1666. out += 3;
  1667. }
  1668. //挪动两个字节
  1669. ++ucs2_code;
  1670. }
  1671. return TRUE;
  1672. }
  1673. BOOL CIDCertFSM::GetSexUTF8String(UINT16* in, UINT8* out)
  1674. {
  1675. if (!out)
  1676. {
  1677. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("性别转换out字段为空!");
  1678. return false;
  1679. }
  1680. #ifdef RVC_OS_WIN
  1681. wstring man = L"男";
  1682. wstring woman = L"女";
  1683. wstring unknow = L"未说明";
  1684. unsigned char tmp[1024];
  1685. memset(tmp, 0, 1024);
  1686. UCS2_to_UTF8(in, tmp);
  1687. int sexCode = _wtoi((wchar_t*)in);
  1688. switch (sexCode)
  1689. {
  1690. case 1:
  1691. UCS2_to_UTF8((UINT16*)man.c_str(), out);
  1692. break;
  1693. case 2:
  1694. UCS2_to_UTF8((UINT16*)woman.c_str(), out);
  1695. break;
  1696. case 9:
  1697. UCS2_to_UTF8((UINT16*)unknow.c_str(), out);
  1698. break;
  1699. default:
  1700. UCS2_to_UTF8(in, out);
  1701. break;
  1702. }
  1703. #else
  1704. //linux默认编码就是utf8,直接拷贝
  1705. char* man = "男";
  1706. char* woman = "女";
  1707. char* unknow = "未说明";
  1708. unsigned char sexIn[1024];
  1709. memset(sexIn, 0, 1024);
  1710. UCS2_to_UTF8(in, sexIn); //linux默认编码就是utf8,转成utf8格式后直接就是linux下的char类型
  1711. long sexCode = atoi((char*)sexIn); //直接转成数字
  1712. switch (sexCode)
  1713. {
  1714. case 1:
  1715. memcpy(out, man, strlen(man));
  1716. break;
  1717. case 2:
  1718. memcpy(out, woman, strlen(woman));
  1719. break;
  1720. case 9:
  1721. memcpy(out, unknow, strlen(unknow));
  1722. break;
  1723. default:
  1724. UCS2_to_UTF8(in, out);
  1725. break;
  1726. }
  1727. #endif
  1728. return true;
  1729. }
  1730. BOOL CIDCertFSM::GetNationalUTF8String(UINT16* in, UINT8* out)
  1731. {
  1732. if (!out)
  1733. {
  1734. return false;
  1735. }
  1736. #ifdef RVC_OS_WIN
  1737. int sexCode = _wtoi((wchar_t*)in);
  1738. if (sexCode >= 1 && sexCode <= 56)
  1739. {
  1740. UCS2_to_UTF8((UINT16*)nationalCode[sexCode].c_str(), out);
  1741. }
  1742. else
  1743. {
  1744. UCS2_to_UTF8(in, out);
  1745. }
  1746. #else
  1747. unsigned char nationIn[1024];
  1748. memset(nationIn, 0, 1024);
  1749. UCS2_to_UTF8(in, nationIn); //linux默认编码就是utf8,转成utf8格式后直接就是linux下的char类型
  1750. int nCode = atoi((char*)nationIn); //直接转成数字
  1751. if (nCode >= 1 && nCode <= 56)
  1752. {
  1753. //linux默认编码就是utf8,直接拷贝
  1754. memcpy(out, nationalCode[nCode].c_str(), strlen(nationalCode[nCode].c_str()));
  1755. }
  1756. else
  1757. {
  1758. UCS2_to_UTF8(in, out);
  1759. }
  1760. #endif
  1761. return true;
  1762. }
  1763. BOOL CIDCertFSM::GetDateStandardFormatUTF8(UINT16* in, UINT8* out)
  1764. {
  1765. if (!out)
  1766. {
  1767. return false;
  1768. }
  1769. #ifdef RVC_OS_WIN
  1770. wstring longtime = L"长期";
  1771. unsigned char ltimeCheck[1024];
  1772. memset(ltimeCheck, 0, 1024);
  1773. UCS2_to_UTF8((UINT16*)longtime.c_str(), ltimeCheck);
  1774. #else
  1775. char* ltimeCheck = "长期"; //linux默认编码就是utf8
  1776. #endif
  1777. unsigned char ltimeIn[1024];
  1778. memset(ltimeIn, 0, 1024);
  1779. UCS2_to_UTF8(in, ltimeIn);
  1780. int cmp = strcmp((char*)ltimeCheck, (char*)ltimeIn); //判断长期证件
  1781. if (cmp == 0)
  1782. {
  1783. #ifdef RVC_OS_WIN
  1784. wstring time = L"9999/12/31";
  1785. UCS2_to_UTF8((UINT16*)time.c_str(), out);
  1786. #else
  1787. char tEndtime[1024] = "9999/12/31"; //linux默认编码就是utf8,不转换,直接传出去就好
  1788. memcpy(out, tEndtime, strlen(tEndtime));
  1789. #endif
  1790. return true;
  1791. }
  1792. UINT16 trans[1024];
  1793. memset(trans, 0, 1024);
  1794. int cnt = 0;
  1795. UINT16* p1 = in;
  1796. UINT16* p2 = trans;
  1797. while (*p1 != '\0')
  1798. {
  1799. if (cnt == 4 || cnt == 7) //在对年份和月份后增加斜杠
  1800. {
  1801. *p2 = '/';
  1802. p2++;
  1803. }
  1804. else
  1805. {
  1806. *p2 = *p1;
  1807. p1++;
  1808. p2++;
  1809. }
  1810. cnt++;
  1811. }
  1812. //*p2 = '\0';
  1813. UCS2_to_UTF8(trans, out);
  1814. return true;
  1815. }
  1816. BOOL CIDCertFSM::RemoveUCS2Blank(UINT16* ucs2_code)
  1817. {
  1818. if (!ucs2_code) return false;
  1819. bool findContent = false;
  1820. UINT16* tmp = ucs2_code;
  1821. UINT16* start = ucs2_code;
  1822. UINT16* end = ucs2_code;
  1823. while (*tmp == ' ')
  1824. {
  1825. tmp++;
  1826. }
  1827. while (*tmp != '\0')
  1828. {
  1829. if (*tmp != ' ' && findContent == false)
  1830. {
  1831. findContent = true;
  1832. start = tmp; //找到内容开始位置
  1833. end = tmp;
  1834. }
  1835. else
  1836. {
  1837. if (*tmp != ' ')
  1838. {
  1839. end = tmp;
  1840. }
  1841. }
  1842. tmp++;
  1843. }
  1844. tmp = end;
  1845. while (*tmp != '\0')
  1846. {
  1847. if (*tmp == ' ') //去除结尾空格
  1848. {
  1849. *tmp = '\0';
  1850. break;
  1851. }
  1852. tmp++;
  1853. }
  1854. ucs2_code = start;
  1855. return true;
  1856. }
  1857. int CIDCertFSM::GetUCS2ByteLength(UINT16* ucs2_code)
  1858. {
  1859. if (!ucs2_code) return 0;
  1860. int len = 0;
  1861. UINT16* tmp = ucs2_code;
  1862. while (*tmp != '\0' && *tmp != ' ')
  1863. {
  1864. len++;
  1865. tmp++;
  1866. }
  1867. return 2 * len;
  1868. }
  1869. void CIDCertFSM::CheckHanZi(UINT16* ucs2_code)
  1870. {
  1871. if (!ucs2_code) return;
  1872. UINT16* tmp = ucs2_code;
  1873. int count = 1;
  1874. while (*tmp != '\0')
  1875. {
  1876. if (*tmp >= 0x4e00 && *tmp <= 0x9fa5)
  1877. {
  1878. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("是汉字。");
  1879. }
  1880. else
  1881. {
  1882. BYTE fileHash[2];
  1883. memset(fileHash, 0, 2);
  1884. memcpy(fileHash, tmp, 2);
  1885. char* strFileHash = new char[4];
  1886. memset(strFileHash, 0, 4);
  1887. SP::Module::Util::HexBuf2StrBuf(fileHash, &strFileHash, 2);
  1888. CSimpleStringA warn = CSimpleStringA::Format("姓名第%d个字非汉字编码, 数据为:%s", count, strFileHash);
  1889. LogWarn(Severity_Low, Error_Debug, IDCertificate_UserErrorCode_ReadAndScan_NotHanZi, warn.GetData());
  1890. }
  1891. tmp++;
  1892. count++;
  1893. }
  1894. }
  1895. CSimpleStringA CIDCertFSM::GetFileHashStr(CSimpleStringA filePath)
  1896. {
  1897. //calculate file hash value
  1898. CSimpleStringA strHash;
  1899. char* strFileHash = new char[128];
  1900. if (ExistsFileA(filePath.GetData()))
  1901. {
  1902. BYTE fileHash[32];
  1903. SM3File(const_cast<char*>(filePath.GetData()), fileHash);
  1904. ZeroMemory(strFileHash, 128);
  1905. SP::Module::Util::HexBuf2StrBuf(fileHash, &strFileHash, 32);
  1906. strHash = strFileHash;
  1907. }
  1908. else
  1909. {
  1910. memset(strFileHash, '\0', sizeof(char) * 128);
  1911. }
  1912. if (strFileHash != nullptr)
  1913. {
  1914. delete[] strFileHash;
  1915. strFileHash = nullptr;
  1916. }
  1917. return strHash;
  1918. }
  1919. CSimpleStringA CIDCertFSM::GetFileLastModifyTime(CSimpleStringA filePath)
  1920. {
  1921. #if defined(_WIN32)
  1922. WIN32_FILE_ATTRIBUTE_DATA fileInfo;
  1923. if (!GetFileAttributesExA(filePath.GetData(), GetFileExInfoStandard, &fileInfo)) {
  1924. return "";
  1925. }
  1926. FILETIME localFileTime;
  1927. FileTimeToLocalFileTime(&fileInfo.ftLastWriteTime, &localFileTime);
  1928. SYSTEMTIME sysTime;
  1929. FileTimeToSystemTime(&localFileTime, &sysTime);
  1930. std::ostringstream oss;
  1931. oss << std::setfill('0')
  1932. << sysTime.wYear << "-"
  1933. << std::setw(2) << sysTime.wMonth << "-"
  1934. << std::setw(2) << sysTime.wDay << " "
  1935. << std::setw(2) << sysTime.wHour << ":"
  1936. << std::setw(2) << sysTime.wMinute << ":"
  1937. << std::setw(2) << sysTime.wSecond;
  1938. return oss.str().c_str();
  1939. #else
  1940. struct stat fileStat;
  1941. if (stat(filePath.GetData(), &fileStat) != 0) {
  1942. return "";
  1943. }
  1944. time_t modTime = fileStat.st_mtime;
  1945. struct tm* timeInfo = localtime(&modTime);
  1946. char buffer[20];
  1947. strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeInfo);
  1948. return buffer;
  1949. #endif
  1950. }
  1951. CSimpleStringA CIDCertFSM::SetRFControlContext(bool bControl)
  1952. {
  1953. CSimpleStringA keyContext = "";
  1954. if (bControl) //true
  1955. {
  1956. keyContext = "Open";
  1957. }
  1958. else //false
  1959. {
  1960. keyContext = "Close";
  1961. }
  1962. std::map<std::string, std::string> msgInfo;
  1963. msgInfo["RFControlFlag"] = keyContext.GetData();
  1964. std::pair<bool, std::string> strResult;
  1965. strResult = generateJsonStr(msgInfo);
  1966. CSimpleStringA rfContext = strResult.second.c_str();
  1967. return rfContext;
  1968. }
  1969. #ifdef RVC_OS_WIN
  1970. void CIDCertFSM::HttpsLogCallBack(const char* logtxt)
  1971. {
  1972. //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", logtxt);
  1973. }
  1974. #endif