idcertificate.nantian.1.1.cpp 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. #include "GVar.h"
  2. #include "idcertificate.nantian.1.1.h"
  3. GVar g_pGvar;
  4. //自动日志对象
  5. #define _AUTOTRACE_(M) CILIXAutoTrace __at(g_pGvar.m_pTrace,#M,&iRet);
  6. IDCERTIFICATE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
  7. {
  8. baseObj = new IDCardReaderNantian();
  9. if (baseObj == NULL)
  10. return Error_Null;
  11. else
  12. return Error_Succeed;
  13. }
  14. IDCERTIFICATE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
  15. {
  16. if (pBaseObj == NULL)
  17. return Error_Param;
  18. IDCardReaderNantian* pTmp = (IDCardReaderNantian*)(pBaseObj);
  19. delete pTmp;
  20. pTmp = NULL;
  21. return Error_Succeed;
  22. }
  23. IDCardReaderNantian::IDCardReaderNantian()
  24. {
  25. int ret = g_pGvar.LoadDRVDLL();
  26. g_pGvar.m_pTrace->WriteTrace("IDCardReader", "idcer.Nantian.1.1.so - 1.0.0.5");
  27. }
  28. IDCardReaderNantian::~IDCardReaderNantian()
  29. {
  30. }
  31. ErrorCodeEnum IDCardReaderNantian::DevOpen(DWORD dwPort)
  32. {
  33. ErrorCodeEnum eRet = Error_Succeed;
  34. int iRet = 0;
  35. _AUTOTRACE_(DevOpen)
  36. try
  37. {
  38. if (g_pGvar.m_pDRVObj == NULL)
  39. {
  40. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  41. strcpy(g_pGvar.m_errMsg, "Load library error");
  42. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  43. "Load library error");
  44. throw Error_DevLoadFileFailed;
  45. }
  46. char sPort[32] = { 0 };
  47. int iBaud = 0;
  48. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open",
  49. "Call DRV OpenDev Method, sPort:[%s], iBaud:[%d]",
  50. sPort, iBaud);
  51. iRet = g_pGvar.m_pDRVObj->OpenDev(sPort, iBaud);
  52. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open",
  53. "DRV OpenDev return:[%d]", iRet);
  54. if(iRet != 0)
  55. {
  56. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  57. "OpenDevice,return:%d", iRet);
  58. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  59. sprintf(g_pGvar.m_errMsg, "open device error, code:%d", iRet);
  60. throw Error_DevCommFailed;
  61. }
  62. }
  63. catch (ErrorCodeEnum errcode)
  64. {
  65. eRet = errcode;
  66. }
  67. return eRet;
  68. }
  69. ErrorCodeEnum IDCardReaderNantian::Reset()
  70. {
  71. ErrorCodeEnum eRet = Error_Succeed;
  72. int iRet = 0;
  73. _AUTOTRACE_(Reset)
  74. try
  75. {
  76. if (g_pGvar.m_pDRVObj == NULL)
  77. {
  78. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  79. strcpy(g_pGvar.m_errMsg, "Load library error");
  80. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  81. "Load library error");
  82. throw Error_DevLoadFileFailed;
  83. }
  84. iRet =g_pGvar.m_pDRVObj->ResetDev(2,NULL);
  85. if (iRet != E_DRVBASE_SUCCESS)
  86. {
  87. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "Reset",
  88. "ResetDevice error, return:%d", iRet);
  89. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  90. sprintf(g_pGvar.m_errMsg, "reset device error, code:%d", iRet);
  91. throw Error_Hardware;
  92. }
  93. //复位后重新连接设备
  94. iRet = g_pGvar.m_pDRVObj->CloseDev();
  95. char sPort[32] = { 0 };
  96. int iBaud = 0;
  97. iRet = g_pGvar.m_pDRVObj->OpenDev(sPort, iBaud);
  98. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open",
  99. "DRV OpenDev return:[%d]", iRet);
  100. if(iRet != 0)
  101. {
  102. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  103. "OpenDevice,return:%d", iRet);
  104. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  105. sprintf(g_pGvar.m_errMsg, "open device error, code:%d", iRet);
  106. throw Error_DevCommFailed;
  107. }
  108. throw Error_Succeed;
  109. }
  110. catch (ErrorCodeEnum errcode)
  111. {
  112. eRet = errcode;
  113. }
  114. return eRet;
  115. }
  116. ErrorCodeEnum IDCardReaderNantian::DevClose()
  117. {
  118. ErrorCodeEnum eRet = Error_Succeed;
  119. int iRet = 0;
  120. _AUTOTRACE_(DevClose)
  121. try
  122. {
  123. if (g_pGvar.m_pDRVObj == NULL)
  124. {
  125. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  126. strcpy(g_pGvar.m_errMsg, "Load library error");
  127. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  128. "Load library error");
  129. throw Error_DevLoadFileFailed;
  130. }
  131. //停止等待进卡线程
  132. g_pGvar.m_bIsCancel = true;
  133. usleep(150000);
  134. iRet = g_pGvar.m_pDRVObj->CloseDev();
  135. if (iRet != E_DRVBASE_SUCCESS)
  136. {
  137. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevClose",
  138. "close dev error, return:%d", iRet);
  139. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  140. sprintf(g_pGvar.m_errMsg, "close device error, code:%d", iRet);
  141. throw Error_Hardware;
  142. }
  143. throw Error_Succeed;
  144. }
  145. catch (ErrorCodeEnum errcode)
  146. {
  147. eRet = errcode;
  148. }
  149. return eRet;
  150. }
  151. ErrorCodeEnum IDCardReaderNantian::GetLastErr(DevErrorInfo& devErrInfo)
  152. {
  153. memset(&devErrInfo, 0, sizeof(DevErrorInfo));
  154. devErrInfo.dwErrMsgLen = strlen(g_pGvar.m_errMsg);
  155. memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  156. memcpy(devErrInfo.szErrMsg, g_pGvar.m_errMsg, devErrInfo.dwErrMsgLen);
  157. return Error_Succeed;
  158. }
  159. ErrorCodeEnum IDCardReaderNantian::GetDevCategory(DevCategoryInfo& devCategory)
  160. {
  161. ErrorCodeEnum eRet = Error_Succeed;
  162. int iRet = 0;
  163. _AUTOTRACE_(GetDevCategory)
  164. char *sDevStatus[MIN_LEN];
  165. try
  166. {
  167. strcpy(devCategory.szType, "IDCertificate");
  168. strcpy(devCategory.szVendor, "Nantian");
  169. strcpy(devCategory.szModel, "STYLE=IG#FUNCTION=ITF");
  170. devCategory.version.wMajor = 1;
  171. devCategory.version.wMinor = 0;
  172. devCategory.version.wRevision = 0;
  173. devCategory.version.wBuild = 1;
  174. devCategory.eState = DEVICE_STATUS_NORMAL;
  175. if (g_pGvar.m_pDRVObj == NULL)
  176. {
  177. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  178. strcpy(g_pGvar.m_errMsg, "Load library error");
  179. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  180. "Load library error");
  181. throw Error_DevLoadFileFailed;
  182. }
  183. //查询设备状态
  184. for (int i = 0; i < MIN_LEN; i++)
  185. {
  186. sDevStatus[i] = new char[MID_LEN];
  187. memset(sDevStatus[i], 0, MID_LEN);
  188. }
  189. iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus);
  190. if (iRet != E_DRVBASE_SUCCESS)
  191. {
  192. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory",
  193. "GetDeviceStatus error return:%d", iRet);
  194. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  195. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  196. devCategory.eState = DEVICE_STATUS_NOT_READY;
  197. throw Error_Hardware;
  198. }
  199. else
  200. {
  201. switch (atoi(sDevStatus[1]))
  202. {
  203. case IDCARDREADER_DEVBUSY:
  204. //设备掉电
  205. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  206. strcpy(g_pGvar.m_errMsg, "device BUSY");
  207. devCategory.eState = DEVICE_STATUS_CONNECTING;
  208. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device BUSY");
  209. break;
  210. case IDCARDREADER_DEVHWERROR:
  211. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  212. strcpy(g_pGvar.m_errMsg, "device HWERROR");
  213. devCategory.eState = DEVICE_STATUS_FAULT;
  214. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device HWERROR");
  215. break;
  216. case IDCARDREADER_DEVOFFLINE:
  217. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  218. strcpy(g_pGvar.m_errMsg, "device OFFLINE");
  219. devCategory.eState = DEVICE_STATUS_FAULT;
  220. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device OFFLINE");
  221. break;
  222. }
  223. switch (atoi(sDevStatus[2]))
  224. {
  225. case IDCARDREADER_MEDIAJAMMED:
  226. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  227. strcpy(g_pGvar.m_errMsg, "device jamed");
  228. devCategory.eState = DEVICE_STATUS_FAULT;
  229. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device jamed");
  230. break;
  231. }
  232. }
  233. throw Error_Succeed;
  234. }
  235. catch (ErrorCodeEnum errcode)
  236. {
  237. eRet = errcode;
  238. }
  239. //if (sDevStatus != NULL)
  240. //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);
  241. return eRet;
  242. }
  243. ErrorCodeEnum IDCardReaderNantian::IDCerAuthenticate()
  244. {
  245. ErrorCodeEnum eRet = Error_Succeed;
  246. int iRet = 0;
  247. _AUTOTRACE_(IDCerAuthenticate)
  248. int idxFlag = 0;
  249. int iCardType = 0;
  250. char *sIDXData[MID_LEN];
  251. char *sDevStatus[MIN_LEN];
  252. try
  253. {
  254. if (g_pGvar.m_pDRVObj == NULL)
  255. {
  256. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  257. strcpy(g_pGvar.m_errMsg, "Load library error");
  258. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate",
  259. "Load library error");
  260. throw Error_DevLoadFileFailed;
  261. }
  262. if(g_pGvar.TheardEnd)
  263. {
  264. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate",
  265. "卡未插入");
  266. throw Error_DevMedia;
  267. }
  268. if(g_pGvar.ReadFlg)
  269. {
  270. iRet = g_pGvar.m_pDRVObj->EjectCard();
  271. usleep(500000);
  272. iRet = g_pGvar.m_pDRVObj->InsertCard(NULL);
  273. }
  274. for (int i = 0; i < MIN_LEN; i++)
  275. {
  276. sDevStatus[i] = new char[MID_LEN];
  277. memset(sDevStatus[i], 0, MID_LEN);
  278. }
  279. iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus);
  280. if (iRet != E_DRVBASE_SUCCESS)
  281. {
  282. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory",
  283. "GetDeviceStatus error return:%d", iRet);
  284. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  285. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  286. //budevCategory.eState = DEVICE_STATUS_NOT_READY;
  287. throw Error_Hardware;
  288. }
  289. else
  290. {
  291. if (atoi(sDevStatus[1]) == IDCARDREADER_DEVONLINE)
  292. {
  293. if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAPRESENT)
  294. {
  295. //第2个传感器(读卡位置)检测有卡
  296. //读卡
  297. /*SEA_AUX_X::SAU_GetModuleCurPath(szDllPath);
  298. sprintf(szHeadPath, "%szp.bmp", szDllPath);
  299. DeleteFile(szHeadPath);*/
  300. for (size_t i = 0; i < MID_LEN; i++)
  301. {
  302. sIDXData[i] = new char[MAX_LEN];
  303. memset(sIDXData[i], 0, MAX_LEN);
  304. }
  305. g_pGvar.ReadFlg = true;
  306. iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData);
  307. if (iRet != E_DRVBASE_SUCCESS)
  308. {
  309. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate",
  310. "ReadIDXData error,return:%d", iRet);
  311. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  312. sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet);
  313. throw Error_DevMedia;
  314. }
  315. else
  316. {
  317. throw Error_Succeed;
  318. }
  319. }
  320. else
  321. {
  322. throw Error_Unexpect;
  323. }
  324. }
  325. else
  326. {
  327. throw Error_Unexpect;
  328. }
  329. }
  330. }
  331. catch (ErrorCodeEnum errcode)
  332. {
  333. eRet = errcode;
  334. }
  335. /*if (sIDXData != NULL)
  336. g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN);
  337. if (sDevStatus != NULL)
  338. g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);*/
  339. return eRet;
  340. }
  341. ErrorCodeEnum IDCardReaderNantian::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
  342. {
  343. ErrorCodeEnum eRet = Error_Succeed;
  344. int iRet = 0;
  345. _AUTOTRACE_(IDCerGetDataEx)
  346. int idxFlag = 0;
  347. memset(&idCerInfoEx, 0, sizeof(IDCerInfoEx));
  348. char szDllPath[1024] = { 0 };
  349. char szHeadPath[1024] = { 0 };
  350. int iCardType = 0;
  351. char *sIDXData[MID_LEN];
  352. char *sDevStatus[MIN_LEN];
  353. try
  354. {
  355. if (g_pGvar.m_pDRVObj == NULL)
  356. {
  357. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  358. strcpy(g_pGvar.m_errMsg, "Load library error");
  359. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  360. "Load library error");
  361. throw Error_DevLoadFileFailed;
  362. }
  363. if(g_pGvar.ReadFlg)
  364. {
  365. iRet = g_pGvar.m_pDRVObj->EjectCard();
  366. usleep(500000);
  367. iRet = g_pGvar.m_pDRVObj->InsertCard(NULL);
  368. }
  369. //查询设备状态
  370. for (int i = 0; i < MIN_LEN; i++)
  371. {
  372. sDevStatus[i] = new char[MID_LEN];
  373. memset(sDevStatus[i], 0, MID_LEN);
  374. }
  375. iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus);
  376. if (iRet != E_DRVBASE_SUCCESS)
  377. {
  378. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  379. "GetDeviceStatus error return:%d", iRet);
  380. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  381. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  382. throw Error_Hardware;
  383. }
  384. else
  385. {
  386. if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT)
  387. {
  388. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  389. "no card in device");
  390. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  391. strcpy(g_pGvar.m_errMsg, "no card in device");
  392. throw Error_DevMedia;
  393. }
  394. }
  395. for (size_t i = 0; i < MID_LEN; i++)
  396. {
  397. sIDXData[i] = new char[MAX_LEN];
  398. memset(sIDXData[i], 0, MAX_LEN);
  399. }
  400. iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData);
  401. if (iRet != E_DRVBASE_SUCCESS)
  402. {
  403. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  404. "ReadAllIDInfo error,return:%d", iRet);
  405. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  406. sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet);
  407. throw Error_Hardware;
  408. }
  409. g_pGvar.ReadFlg = true;
  410. char szExpireStart[16] = { 0 };
  411. char szExpireEnd[16] = { 0 };
  412. //国内二代证
  413. if (atoi(sIDXData[0]) == 1)
  414. {
  415. if (strstr(sIDXData[3], "族"))
  416. {
  417. int len = strlen(sIDXData[3]);
  418. idCerInfoEx.nation.dwSize = strlen(sIDXData[3]) - (strlen("族"));
  419. memcpy(idCerInfoEx.nation.data, sIDXData[3], idCerInfoEx.nation.dwSize);
  420. idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0';
  421. }
  422. else
  423. {
  424. idCerInfoEx.nation.dwSize = strlen(sIDXData[3]);
  425. memcpy(idCerInfoEx.nation.data,sIDXData[3], idCerInfoEx.nation.dwSize);
  426. idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0';
  427. }
  428. //20200324 by qhw
  429. //如果民族超过56个名族代码,则直接返回代码
  430. char sTmpCode[1024] = { 0 };
  431. g_pGvar.SwitchNationToCode(idCerInfoEx.nation.data, sTmpCode);
  432. if (strlen(sTmpCode) > 0)
  433. {
  434. idCerInfoEx.nation.dwSize = strlen(sTmpCode);
  435. memcpy(idCerInfoEx.nation.data, sTmpCode, idCerInfoEx.nation.dwSize);
  436. idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0';
  437. }
  438. idCerInfoEx.name.dwSize = strlen(sIDXData[1]);
  439. memcpy(idCerInfoEx.name.data, sIDXData[1], idCerInfoEx.name.dwSize);
  440. idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0';
  441. idCerInfoEx.idno.dwSize = strlen(sIDXData[6]);
  442. memcpy(idCerInfoEx.idno.data, sIDXData[6], idCerInfoEx.idno.dwSize);
  443. idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0';
  444. idCerInfoEx.sex.dwSize = strlen(sIDXData[2]);
  445. memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize);
  446. idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0';
  447. //处理生日日期
  448. string str(sIDXData[4]);
  449. str.insert(4, "年");
  450. str.insert(6 + strlen("年"), "月");
  451. str.insert(str.size(), "日");
  452. char p[32] = { 0 };
  453. strcpy(p, str.c_str());
  454. idCerInfoEx.birthday.dwSize = strlen(p);
  455. memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize);
  456. idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0';
  457. idCerInfoEx.address.dwSize = strlen(sIDXData[5]);
  458. memcpy(idCerInfoEx.address.data, sIDXData[5], idCerInfoEx.address.dwSize);
  459. idCerInfoEx.address.data[idCerInfoEx.address.dwSize] = '\0';
  460. idCerInfoEx.newAddress.dwSize = 0;
  461. memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  462. idCerInfoEx.newAddress.data[idCerInfoEx.newAddress.dwSize] = '\0';
  463. idCerInfoEx.department.dwSize = strlen(sIDXData[7]);
  464. memcpy(idCerInfoEx.department.data, sIDXData[7], idCerInfoEx.department.dwSize);
  465. idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0';
  466. memcpy(szExpireStart, sIDXData[8],strlen(sIDXData[8]));
  467. memcpy(szExpireEnd, sIDXData[9],strlen(sIDXData[9]));
  468. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx",
  469. "EndData = %s", szExpireEnd);
  470. g_pGvar.AddCharToDate(szExpireStart, '.');
  471. /*if (strcmp(szExpireEnd, "长期") != NULL)
  472. {
  473. g_pGvar.AddCharToDate(szExpireEnd, '.');
  474. }*/
  475. char a[10] = {0};
  476. sprintf(a,"2");
  477. if (strncmp(szExpireEnd,a,1)==0)
  478. {
  479. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx",
  480. "EndData1 = %s", szExpireEnd);
  481. g_pGvar.AddCharToDate(szExpireEnd, '.');
  482. }
  483. else
  484. {
  485. memset(szExpireEnd,0,sizeof(szExpireEnd));
  486. strcpy(szExpireEnd,"长期");
  487. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx",
  488. "EndData2 = %s", szExpireEnd);
  489. }
  490. idCerInfoEx.startDate.dwSize = strlen(szExpireStart);
  491. memcpy(idCerInfoEx.startDate.data, szExpireStart, idCerInfoEx.startDate.dwSize);
  492. idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0';
  493. idCerInfoEx.endDate.dwSize = strlen(szExpireEnd);
  494. memcpy(idCerInfoEx.endDate.data, szExpireEnd, idCerInfoEx.endDate.dwSize);
  495. idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0';
  496. idCerInfoEx.photoPath.dwSize = strlen(sIDXData[13]);
  497. memcpy(idCerInfoEx.photoPath.data, sIDXData[13], idCerInfoEx.photoPath.dwSize);
  498. idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0';
  499. }
  500. else if (atoi(sIDXData[0]) == 2)
  501. {
  502. //外国人居住证
  503. idCerInfoEx.name.dwSize = strlen(sIDXData[5]);
  504. memcpy(idCerInfoEx.name.data, sIDXData[5], idCerInfoEx.name.dwSize);
  505. idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0';
  506. idCerInfoEx.sex.dwSize = strlen(sIDXData[2]);
  507. memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize);
  508. idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0';
  509. //处理生日日期
  510. string str(sIDXData[8]);
  511. str.insert(4, "年");
  512. str.insert(6 + strlen("年"), "月");
  513. str.insert(str.size(), "日");
  514. char p[32] = { 0 };
  515. strcpy(p, str.c_str());
  516. idCerInfoEx.birthday.dwSize = strlen(p);
  517. memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize);
  518. idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0';
  519. idCerInfoEx.idno.dwSize = strlen(sIDXData[3]);
  520. memcpy(idCerInfoEx.idno.data, sIDXData[3], idCerInfoEx.idno.dwSize);
  521. idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0';
  522. idCerInfoEx.department.dwSize = strlen(sIDXData[10]);
  523. memcpy(idCerInfoEx.department.data, sIDXData[10], idCerInfoEx.department.dwSize);
  524. idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0';
  525. g_pGvar.AddCharToDate(sIDXData[6], '.');
  526. g_pGvar.AddCharToDate(sIDXData[7], '.');
  527. idCerInfoEx.startDate.dwSize = strlen(sIDXData[6]);
  528. memcpy(idCerInfoEx.startDate.data, sIDXData[6], idCerInfoEx.startDate.dwSize);
  529. idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0';
  530. idCerInfoEx.endDate.dwSize = strlen(sIDXData[7]);
  531. memcpy(idCerInfoEx.endDate.data, sIDXData[7], idCerInfoEx.endDate.dwSize);
  532. idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0';
  533. idCerInfoEx.photoPath.dwSize = strlen(sIDXData[14]);
  534. memcpy(idCerInfoEx.photoPath.data, sIDXData[14], idCerInfoEx.photoPath.dwSize);
  535. idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0';
  536. idCerInfoEx.englishName.dwSize = strlen(sIDXData[1]);
  537. memcpy(idCerInfoEx.englishName.data, sIDXData[1], idCerInfoEx.englishName.dwSize);
  538. idCerInfoEx.englishName.data[idCerInfoEx.englishName.dwSize] = '\0';
  539. idCerInfoEx.nationality.dwSize = strlen(sIDXData[4]);
  540. memcpy(idCerInfoEx.nationality.data, sIDXData[4], idCerInfoEx.nationality.dwSize);
  541. idCerInfoEx.nationality.data[idCerInfoEx.nationality.dwSize] = '\0';
  542. idCerInfoEx.idVersion.dwSize = strlen(sIDXData[9]);
  543. memcpy(idCerInfoEx.idVersion.data, sIDXData[9], idCerInfoEx.idVersion.dwSize);
  544. idCerInfoEx.idVersion.data[idCerInfoEx.idVersion.dwSize] = '\0';
  545. idCerInfoEx.idType.dwSize = strlen("I");
  546. memcpy(idCerInfoEx.idType.data, "I", idCerInfoEx.idType.dwSize);
  547. idCerInfoEx.idType.data[idCerInfoEx.idType.dwSize] = '\0';
  548. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx",
  549. "%s", idCerInfoEx.idType.data);
  550. idCerInfoEx.reserved.dwSize = 0;
  551. memset(idCerInfoEx.reserved.data, 0, IDCER_EIGHT_BYTE_SIZE);
  552. }
  553. else if (atoi(sIDXData[0]) == 3)
  554. {
  555. idCerInfoEx.name.dwSize = strlen(sIDXData[1]);
  556. memcpy(idCerInfoEx.name.data, sIDXData[1], idCerInfoEx.name.dwSize);
  557. idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0';
  558. idCerInfoEx.sex.dwSize = strlen(sIDXData[2]);
  559. memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize);
  560. idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0';
  561. //处理生日日期
  562. string str(sIDXData[4]);
  563. str.insert(4, "年");
  564. str.insert(6 + strlen("年"), "月");
  565. str.insert(str.size(), "日");
  566. char p[32] = { 0 };
  567. strcpy(p, str.c_str());
  568. idCerInfoEx.birthday.dwSize = strlen(p);
  569. memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize);
  570. idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0';
  571. idCerInfoEx.address.dwSize = strlen(sIDXData[5]);
  572. memcpy(idCerInfoEx.address.data, sIDXData[5], idCerInfoEx.address.dwSize);
  573. idCerInfoEx.address.data[idCerInfoEx.address.dwSize] = '\0';
  574. idCerInfoEx.newAddress.dwSize = 0;
  575. memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  576. idCerInfoEx.newAddress.data[idCerInfoEx.newAddress.dwSize] = '\0';
  577. idCerInfoEx.idno.dwSize = strlen(sIDXData[6]);
  578. memcpy(idCerInfoEx.idno.data, sIDXData[6], idCerInfoEx.idno.dwSize);
  579. idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0';
  580. idCerInfoEx.department.dwSize = strlen(sIDXData[7]);
  581. memcpy(idCerInfoEx.department.data, sIDXData[7], idCerInfoEx.department.dwSize);
  582. idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0';
  583. memcpy(szExpireStart, sIDXData[8], 8);
  584. memcpy(szExpireEnd, sIDXData[8] + 9, 8);
  585. g_pGvar.AddCharToDate(szExpireStart, '.');
  586. if (strcmp(szExpireEnd, "长期") != NULL)
  587. {
  588. g_pGvar.AddCharToDate(szExpireEnd, '.');
  589. }
  590. idCerInfoEx.startDate.dwSize = strlen(szExpireStart);
  591. memcpy(idCerInfoEx.startDate.data, szExpireStart, idCerInfoEx.startDate.dwSize);
  592. idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0';
  593. idCerInfoEx.endDate.dwSize = strlen(szExpireEnd);
  594. memcpy(idCerInfoEx.endDate.data, szExpireEnd, idCerInfoEx.endDate.dwSize);
  595. idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0';
  596. idCerInfoEx.photoPath.dwSize = strlen(sIDXData[14]);
  597. memcpy(idCerInfoEx.photoPath.data, sIDXData[14], idCerInfoEx.photoPath.dwSize);
  598. idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0';
  599. idCerInfoEx.idType.dwSize = strlen("J");
  600. memcpy(idCerInfoEx.idType.data, "J", idCerInfoEx.idType.dwSize);
  601. idCerInfoEx.idType.data[idCerInfoEx.idType.dwSize] = '\0';
  602. idCerInfoEx.txzCode.dwSize = strlen(sIDXData[9]);
  603. memcpy(idCerInfoEx.txzCode.data, sIDXData[9], idCerInfoEx.txzCode.dwSize);
  604. idCerInfoEx.txzCode.data[idCerInfoEx.txzCode.dwSize] = '\0';
  605. idCerInfoEx.issuedSN.dwSize = strlen(sIDXData[10]);
  606. memcpy(idCerInfoEx.issuedSN.data, sIDXData[10], idCerInfoEx.issuedSN.dwSize);
  607. idCerInfoEx.issuedSN.data[idCerInfoEx.issuedSN.dwSize] = '\0';
  608. }
  609. throw Error_Succeed;
  610. }
  611. catch (ErrorCodeEnum errcode)
  612. {
  613. eRet = errcode;
  614. }
  615. /*if (sIDXData != NULL)
  616. g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN);
  617. if (sDevStatus != NULL)
  618. g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);*/
  619. return eRet;
  620. }
  621. ErrorCodeEnum IDCardReaderNantian::IDCerGetData(IDCerInfo& idCerInfo)
  622. {
  623. ErrorCodeEnum eRet = Error_Succeed;
  624. int iRet = 0;
  625. _AUTOTRACE_(IDCerGetData)
  626. memset(&idCerInfo, 0, sizeof(IDCerInfo));
  627. char szDllPath[1024] = { 0 };
  628. char szHeadPath[1024] = { 0 };
  629. int iCardType = 0;
  630. char *sIDXData[MID_LEN];
  631. int idxFlag = 0;
  632. char *sDevStatus[MIN_LEN];
  633. try
  634. {
  635. if (g_pGvar.m_pDRVObj == NULL)
  636. {
  637. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  638. strcpy(g_pGvar.m_errMsg, "Load library error");
  639. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  640. "Load library error");
  641. throw Error_DevLoadFileFailed;
  642. }
  643. //查询设备状态
  644. for (int i = 0; i < MIN_LEN; i++)
  645. {
  646. sDevStatus[i] = new char[MID_LEN];
  647. memset(sDevStatus[i], 0, MID_LEN);
  648. }
  649. iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus);
  650. if (iRet != E_DRVBASE_SUCCESS)
  651. {
  652. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  653. "GetDeviceStatus error return:%d", iRet);
  654. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  655. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  656. throw Error_Hardware;
  657. }
  658. else
  659. {
  660. if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT)
  661. {
  662. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  663. "no card in device");
  664. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  665. strcpy(g_pGvar.m_errMsg, "no card in device");
  666. throw Error_DevMedia;
  667. }
  668. }
  669. for (size_t i = 0; i < MID_LEN; i++)
  670. {
  671. sIDXData[i] = new char[MAX_LEN];
  672. memset(sIDXData[i], 0, MAX_LEN);
  673. }
  674. iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData);
  675. if (iRet != E_DRVBASE_SUCCESS)
  676. {
  677. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  678. "ReadAllIDInfo error,return:%d", iRet);
  679. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  680. sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet);
  681. throw Error_Hardware;
  682. }
  683. if (strstr(sIDXData[3], "族"))
  684. {
  685. int len = strlen(sIDXData[3]);
  686. idCerInfo.nation.dwSize = strlen(sIDXData[3]) - (strlen("族"));
  687. memcpy(idCerInfo.nation.data, sIDXData[3], idCerInfo.nation.dwSize);
  688. idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0';
  689. }
  690. else
  691. {
  692. idCerInfo.nation.dwSize = strlen(sIDXData[3]);
  693. memcpy(idCerInfo.nation.data, sIDXData[3], idCerInfo.nation.dwSize);
  694. idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0';
  695. }
  696. //20200324 by qhw
  697. //如果民族超过56个名族代码,则直接返回代码
  698. char sTmpCode[1024] = { 0 };
  699. g_pGvar.SwitchNationToCode(idCerInfo.nation.data, sTmpCode);
  700. if (strlen(sTmpCode) > 0)
  701. {
  702. idCerInfo.nation.dwSize = strlen(sTmpCode);
  703. memcpy(idCerInfo.nation.data, sTmpCode, idCerInfo.nation.dwSize);
  704. idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0';
  705. }
  706. idCerInfo.name.dwSize = strlen(sIDXData[1]);
  707. memcpy(idCerInfo.name.data, sIDXData[1], idCerInfo.name.dwSize);
  708. idCerInfo.name.data[idCerInfo.name.dwSize] = '\0';
  709. idCerInfo.idno.dwSize = strlen(sIDXData[6]);
  710. memcpy(idCerInfo.idno.data, sIDXData[6], idCerInfo.idno.dwSize);
  711. idCerInfo.idno.data[idCerInfo.idno.dwSize] = '\0';
  712. idCerInfo.sex.dwSize = strlen(sIDXData[2]);
  713. memcpy(idCerInfo.sex.data, sIDXData[2], idCerInfo.sex.dwSize);
  714. idCerInfo.sex.data[idCerInfo.sex.dwSize] = '\0';
  715. //处理生日日期
  716. string str(sIDXData[4]);
  717. str.insert(4, "年");
  718. str.insert(6 + strlen("年"), "月");
  719. str.insert(str.size(), "日");
  720. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetData",
  721. "1");
  722. char p[32] = { 0 };
  723. strcpy(p, str.c_str());
  724. idCerInfo.birthday.dwSize = strlen(p);
  725. memcpy(idCerInfo.birthday.data, p, idCerInfo.birthday.dwSize);
  726. idCerInfo.birthday.data[idCerInfo.birthday.dwSize] = '\0';
  727. idCerInfo.address.dwSize = strlen(sIDXData[5]);
  728. memcpy(idCerInfo.address.data, sIDXData[5], idCerInfo.address.dwSize);
  729. idCerInfo.address.data[idCerInfo.address.dwSize] = '\0';
  730. idCerInfo.newAddress.dwSize = 0;
  731. memset(idCerInfo.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  732. idCerInfo.newAddress.data[idCerInfo.newAddress.dwSize] = '\0';
  733. idCerInfo.department.dwSize = strlen(sIDXData[7]);
  734. memcpy(idCerInfo.department.data, sIDXData[7], idCerInfo.department.dwSize);
  735. idCerInfo.department.data[idCerInfo.department.dwSize] = '\0';
  736. char szExpireStart[16] = { 0 };
  737. char szExpireEnd[16] = { 0 };
  738. memcpy(szExpireStart, sIDXData[8], strlen(sIDXData[8]));
  739. memcpy(szExpireEnd, sIDXData[9], strlen(sIDXData[9]));
  740. g_pGvar.AddCharToDate(szExpireStart, '.');
  741. if (strcmp(szExpireEnd, "长期") != NULL)
  742. {
  743. g_pGvar.AddCharToDate(szExpireEnd, '.');
  744. }
  745. idCerInfo.startDate.dwSize = strlen(szExpireStart);
  746. memcpy(idCerInfo.startDate.data, szExpireStart, idCerInfo.startDate.dwSize);
  747. idCerInfo.startDate.data[idCerInfo.startDate.dwSize] = '\0';
  748. idCerInfo.endDate.dwSize = strlen(szExpireEnd);
  749. memcpy(idCerInfo.endDate.data, szExpireEnd, idCerInfo.endDate.dwSize);
  750. idCerInfo.endDate.data[idCerInfo.endDate.dwSize] = '\0';
  751. idCerInfo.photoPath.dwSize = strlen(sIDXData[13]);
  752. memcpy(idCerInfo.photoPath.data, sIDXData[13], idCerInfo.photoPath.dwSize);
  753. idCerInfo.photoPath.data[idCerInfo.photoPath.dwSize] = '\0';
  754. throw Error_Succeed;
  755. }
  756. catch (ErrorCodeEnum errcode)
  757. {
  758. eRet = errcode;
  759. }
  760. /*if (sDevStatus != NULL)
  761. g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);
  762. if (sIDXData != NULL)
  763. g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN);*/
  764. return eRet;
  765. }
  766. ErrorCodeEnum IDCardReaderNantian::ForceIDEject()
  767. {
  768. ErrorCodeEnum eRet = Error_Succeed;
  769. int iRet = 0;
  770. _AUTOTRACE_(ForceIDEject)
  771. int idxFlag = 0;
  772. char *sDevStatus[MIN_LEN];
  773. try
  774. {
  775. if (g_pGvar.m_pDRVObj == NULL)
  776. {
  777. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  778. strcpy(g_pGvar.m_errMsg, "Load library error");
  779. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  780. "Load library error");
  781. throw Error_DevLoadFileFailed;
  782. }
  783. //查询设备状态,是否存在卡
  784. for (int i = 0; i < MIN_LEN; i++)
  785. {
  786. sDevStatus[i] = new char[MID_LEN];
  787. memset(sDevStatus[i], 0, MID_LEN);
  788. }
  789. iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus);
  790. if (iRet != E_DRVBASE_SUCCESS)
  791. {
  792. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  793. "GetDeviceStatus error return:%d", iRet);
  794. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  795. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  796. throw Error_Hardware;
  797. }
  798. else
  799. {
  800. if (atoi(sDevStatus[1]) == IDCARDREADER_DEVBUSY)
  801. {
  802. //设备正在读卡或扫描,不能进行退卡
  803. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ForceIDEject",
  804. "dev is busy error return:%d", Error_DevMedia);
  805. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  806. strcpy(g_pGvar.m_errMsg, "device is busy");
  807. throw Error_DevMedia;
  808. }
  809. //三个传感器均未检测到卡
  810. if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIANOTPRESENT)
  811. {
  812. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ForceIDEject",
  813. "dev no media return:%d", Error_DevMedia);
  814. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  815. strcpy(g_pGvar.m_errMsg, "no card in device");
  816. throw Error_DevMedia;
  817. }
  818. }
  819. iRet = g_pGvar.m_pDRVObj->EjectCard();
  820. if (iRet != E_DRVBASE_SUCCESS)
  821. {
  822. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR,
  823. "ForceIDEject",
  824. "resetsoft and eject error,return:%d", iRet);
  825. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  826. sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet);
  827. throw Error_Hardware;
  828. }
  829. throw Error_Succeed;
  830. }
  831. catch (ErrorCodeEnum errcode)
  832. {
  833. eRet = errcode;
  834. }
  835. //if (sDevStatus != NULL)
  836. //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);
  837. return eRet;
  838. }
  839. void* thread( void *arg )
  840. {
  841. g_pGvar.TheardEnd = true;
  842. int iRet = 0;
  843. while (1)
  844. {
  845. if (g_pGvar.m_bIsCancel)
  846. {
  847. g_pGvar.g_flag = false;
  848. break;
  849. }
  850. //检查是否放入卡
  851. iRet = g_pGvar.m_pDRVObj->InsertCard(NULL);
  852. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ThreadInsertCard",
  853. " CheckCardIn return:%d", iRet);
  854. if (iRet != E_DRVBASE_SUCCESS)
  855. {
  856. //未插入卡,继续等待
  857. usleep(150000);
  858. continue;
  859. }
  860. else
  861. {
  862. g_pGvar.g_flag = false;
  863. break;
  864. }
  865. }
  866. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ThreadInsertCard",
  867. "InsertCard Thread End");
  868. g_pGvar.TheardEnd = false;
  869. return arg;
  870. }
  871. ErrorCodeEnum IDCardReaderNantian::IDCerRFControl(bool bControl)
  872. {
  873. ErrorCodeEnum eRet = Error_Succeed;
  874. int iRet = 0;
  875. _AUTOTRACE_(IDCerRFControl)
  876. pthread_t th;
  877. int arg = 0;
  878. int *thread_ret = NULL;
  879. char *sDevStatus[MIN_LEN] = {0};
  880. try
  881. {
  882. if (g_pGvar.m_pDRVObj == NULL)
  883. {
  884. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  885. strcpy(g_pGvar.m_errMsg, "Load library error");
  886. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen",
  887. "Load library error");
  888. throw Error_DevLoadFileFailed;
  889. }
  890. //accecpt insert card
  891. if (bControl)
  892. {
  893. g_pGvar.g_flag = true;
  894. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl",
  895. "bControl is true");
  896. g_pGvar.m_bIsCancel = TRUE;
  897. usleep(150000);
  898. g_pGvar.m_bIsCancel = FALSE;
  899. iRet = pthread_create( &th, NULL, thread, &arg );
  900. if( iRet != 0 )
  901. {
  902. printf( "Create thread error!\n");
  903. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  904. sprintf(g_pGvar.m_errMsg, "Create thread error, code:%d", iRet);
  905. throw Error_Hardware;
  906. }
  907. }
  908. //eject card
  909. else
  910. {
  911. g_pGvar.m_bIsCancel = TRUE;
  912. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl","bControl is false");
  913. //throw Error_Succeed;
  914. //get device status
  915. //查询设备状态
  916. for (int i = 0; i < MIN_LEN; i++)
  917. {
  918. sDevStatus[i] = new char[MID_LEN];
  919. memset(sDevStatus[i], 0, MID_LEN);
  920. }
  921. iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus);
  922. if (iRet != E_DRVBASE_SUCCESS)
  923. {
  924. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  925. "GetDeviceStatus error return:%d", iRet);
  926. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  927. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  928. throw Error_Hardware;
  929. }
  930. else
  931. {
  932. if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT)
  933. {
  934. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  935. "no card in device");
  936. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  937. strcpy(g_pGvar.m_errMsg, "no card in device");
  938. throw Error_DevMedia;
  939. }
  940. }
  941. iRet = g_pGvar.m_pDRVObj->EjectCard();
  942. if (iRet != E_DRVBASE_SUCCESS)
  943. {
  944. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR,
  945. "ForceIDEject",
  946. "resetsoft and eject error,return:%d", iRet);
  947. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  948. sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet);
  949. throw Error_Hardware;
  950. }
  951. }
  952. //g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl","eject card,return:%d", iRet);
  953. throw Error_Succeed;
  954. }
  955. catch (ErrorCodeEnum errcode)
  956. {
  957. eRet = errcode;
  958. }
  959. //if (sDevStatus != NULL)
  960. //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);
  961. return eRet;
  962. }
  963. ErrorCodeEnum IDCardReaderNantian::ScanIDAndSaveImage()
  964. {
  965. ErrorCodeEnum eRet = Error_Succeed;
  966. int iRet = 0;
  967. _AUTOTRACE_(ScanIDAndSaveImage)
  968. char *sDevStatus[MIN_LEN] = {0};
  969. /*char *picpath[MIN_LEN] = {0};
  970. for (int i = 0; i < MIN_LEN; i++)
  971. {
  972. picpath[i] = new char[MID_LEN];
  973. memset(picpath[i], 0, MID_LEN);
  974. }*/
  975. try
  976. {
  977. if (g_pGvar.m_pDRVObj == NULL)
  978. {
  979. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  980. strcpy(g_pGvar.m_errMsg, "Load library error");
  981. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage",
  982. "Load library error");
  983. throw Error_DevLoadFileFailed;
  984. }
  985. for (int i = 0; i < MIN_LEN; i++)
  986. {
  987. sDevStatus[i] = new char[MID_LEN];
  988. memset(sDevStatus[i], 0, MID_LEN);
  989. }
  990. iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus);
  991. if (iRet != E_DRVBASE_SUCCESS)
  992. {
  993. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage",
  994. "GetDeviceStatus error return:%d", iRet);
  995. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  996. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  997. throw Error_Hardware;
  998. }
  999. else
  1000. {
  1001. if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIANOTPRESENT)
  1002. {
  1003. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage",
  1004. "card in device begin eject");
  1005. iRet = g_pGvar.m_pDRVObj->EjectCard();
  1006. if (iRet != E_DRVBASE_SUCCESS)
  1007. {
  1008. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR,
  1009. "ScanIDAndSaveImage",
  1010. "resetsoft and eject error,return:%d", iRet);
  1011. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  1012. sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet);
  1013. throw Error_Hardware;
  1014. }
  1015. }
  1016. }
  1017. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "ScanIDAndSaveImage",
  1018. "Call Dev ScanIDAndSaveImage");
  1019. iRet = g_pGvar.m_pDRVObj->ScanIDXPic(NULL);
  1020. if (iRet != E_DRVBASE_SUCCESS)
  1021. {
  1022. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage",
  1023. "ScanIDXPic error return:%d", iRet);
  1024. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  1025. sprintf(g_pGvar.m_errMsg, "ScanIDXPic error return:%d", iRet);
  1026. throw Error_Hardware;
  1027. }
  1028. throw Error_Succeed;
  1029. }
  1030. catch (ErrorCodeEnum errcode)
  1031. {
  1032. eRet = errcode;
  1033. }
  1034. //g_pGvar.FreeArryBuf((void **)picpath, MID_LEN);
  1035. return eRet;
  1036. }
  1037. ErrorCodeEnum IDCardReaderNantian::QueryCardPos(int& pos)
  1038. {
  1039. ErrorCodeEnum eRet = Error_Succeed;
  1040. int iRet = 0;
  1041. _AUTOTRACE_(QueryCardPos)
  1042. int idxFlag = 0;
  1043. char *sDevStatus[MIN_LEN];
  1044. try
  1045. {
  1046. if (g_pGvar.m_pDRVObj == NULL)
  1047. {
  1048. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  1049. strcpy(g_pGvar.m_errMsg, "Load library error");
  1050. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos",
  1051. "Load library error");
  1052. throw Error_DevLoadFileFailed;
  1053. }
  1054. if(g_pGvar.TheardEnd)
  1055. {
  1056. pos = 0;
  1057. throw Error_Succeed;
  1058. }
  1059. //查询设备状态,是否存在卡
  1060. for (int i = 0; i < MIN_LEN; i++)
  1061. {
  1062. sDevStatus[i] = new char[MID_LEN];
  1063. memset(sDevStatus[i], 0, MID_LEN);
  1064. }
  1065. iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus);
  1066. if (iRet != E_DRVBASE_SUCCESS)
  1067. {
  1068. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx",
  1069. "GetDeviceStatus error return:%d", iRet);
  1070. memset(g_pGvar.m_errMsg, 0, MAX_LEN);
  1071. sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet);
  1072. throw Error_Hardware;
  1073. }
  1074. else
  1075. {
  1076. if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIANOTPRESENT)
  1077. {
  1078. pos = 0;
  1079. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIANOTPRESENT");
  1080. }
  1081. if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAENTERING)
  1082. {
  1083. pos = 2;
  1084. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIAENTERING");
  1085. }
  1086. if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAPRESENT)
  1087. {
  1088. pos = 1;
  1089. g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIAPRESENT");
  1090. }
  1091. }
  1092. throw Error_Succeed;
  1093. }
  1094. catch (ErrorCodeEnum errcode)
  1095. {
  1096. eRet = errcode;
  1097. }
  1098. //if (sDevStatus != NULL)
  1099. //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);
  1100. return eRet;
  1101. }