idcertimpl.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. #include "idcertimpl.h"
  2. #include "log4vendor.h"
  3. #include "idcertimpl.h"
  4. IDCertImpl::IDCertImpl()
  5. {
  6. m_id81Dev = new IDCertConn();
  7. memset(m_DevErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  8. strcat(m_DevErrInfo.szErrMsg, "成功");
  9. m_DevErrInfo.dwErrMsgLen = strlen(m_DevErrInfo.szErrMsg);
  10. m_bOpen = FALSE;
  11. m_iCardType = -1; //证件类型
  12. m_sLibPath[0] = 0;
  13. m_bReInsert = false;
  14. }
  15. void IDCertImpl::DeleteBmp()
  16. {
  17. if (m_sLibPath[0])
  18. {
  19. char sFile[300];
  20. sprintf(sFile, "%s/idfront.bmp", m_sLibPath);
  21. remove(sFile);
  22. sprintf(sFile, "%s/idback.bmp", m_sLibPath);
  23. remove(sFile);
  24. sprintf(sFile, "%s/zp.bmp", m_sLibPath);
  25. remove(sFile);
  26. }
  27. }
  28. IDCertImpl::~IDCertImpl()
  29. {
  30. if(m_id81Dev)
  31. {
  32. delete m_id81Dev;
  33. m_id81Dev = NULL;
  34. DeleteBmp();
  35. }
  36. m_bOpen= false;
  37. }
  38. int getFileVer(char* sFile, short& ch1, short& ch2)
  39. {
  40. ch1 = 0;
  41. ch2 = 0;
  42. char* pFind = strstr(sFile, ".so");
  43. char* pTemp = pFind;
  44. while (pTemp)
  45. {
  46. pFind = pTemp;
  47. pTemp = strstr(pFind + 3, ".so");
  48. }
  49. if (pFind == NULL) return 0;
  50. pTemp = pFind - 1;
  51. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  52. if (*pTemp == '.')
  53. ch2 = atoi(pTemp+1);
  54. pTemp--;
  55. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  56. if (*pTemp == '.')
  57. ch1 = atoi(pTemp+1);
  58. return 1;
  59. }
  60. ErrorCodeEnum IDCertImpl::GetDevCategory(DevCategoryInfo &devCategory)
  61. {
  62. LOG4VTM_FUNCTION();
  63. if (!m_bOpen)
  64. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  65. memset(&devCategory, 0, sizeof(devCategory));
  66. strcpy(devCategory.szVendor , "cw");
  67. strcpy(devCategory.szType ,"PVER=SNBC#MID=ID81");
  68. char sPath[256], sFile[128] = {0};
  69. GetCurLibsPath(sPath, sFile);
  70. short v1,v2;
  71. getFileVer(sFile, v1, v2);
  72. devCategory.version.wMajor = v1;
  73. devCategory.version.wMinor = v2;
  74. devCategory.version.wRevision = 0xffff;
  75. devCategory.version.wBuild = FILE_VERSION;
  76. Sleep(800);
  77. int iRt = m_id81Dev->getFWVersion(sPath); //"Main Firmware:FV1.001.05
  78. if (Error_Succeed == iRt)
  79. {
  80. char* pSP = strstr(sPath, "FV");
  81. if (pSP)
  82. strcpy(sFile, pSP+2);
  83. else
  84. strcpy(sFile, sPath);
  85. devCategory.eState = DEVICE_STATUS_NORMAL;
  86. }
  87. else
  88. {
  89. strcpy(sFile, "00000000");
  90. LOG4VTM(INFO, "GetDevCategory getFWVersion error");
  91. devCategory.eState = DEVICE_STATUS_CONNECTING;
  92. }
  93. sprintf(devCategory.szModel , "FWID=%s#STYLE=IG#FUNCTION=ITF", sFile);
  94. return Error_Succeed;
  95. }
  96. // Reset device.
  97. ErrorCodeEnum IDCertImpl::Reset()
  98. {
  99. LOG4VTM_FUNCTION();
  100. if (!m_bOpen)
  101. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  102. // SAutoLock lock(&m_MutexLock);
  103. CancelWaitMediaInsert();
  104. int iRt = Error_Succeed;
  105. iRt = m_id81Dev->Reset(2);
  106. return HandleDevError(iRt, __FUNCTION__);
  107. }
  108. //
  109. // Close device and do the cleaning work.
  110. // ex. close connection,close port,release memery and so on
  111. ErrorCodeEnum IDCertImpl::DevClose()
  112. {
  113. LOG4VTM_FUNCTION();
  114. if (!m_bOpen)
  115. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  116. // SAutoLock lock(&m_MutexLock);
  117. CancelWaitMediaInsert();
  118. int iRt = Error_Succeed;
  119. Sleep(300);
  120. iRt = m_id81Dev->closeDevice();
  121. m_bOpen = FALSE;
  122. if(iRt == CWERR_IDCARD_SUCCESS)
  123. return Error_Succeed;
  124. return Error_Succeed;
  125. }
  126. ErrorCodeEnum IDCertImpl::DevOpen(DWORD dwPort)
  127. {
  128. LOG4VTM_FUNCTION();
  129. // SAutoLock lock(&m_MutexLock);
  130. int iRt = Error_Succeed;
  131. m_bOpen = FALSE;
  132. GetCurLibsPath(m_sLibPath, NULL);
  133. char cFilePath[300] = {0};
  134. sprintf(cFilePath, "DevOpen GetCurProcPath = %s", m_sLibPath);
  135. LOG4VTM(INFO, cFilePath);
  136. sprintf(cFilePath, "%s/cw/libID81M.cw.so", m_sLibPath); //usr symbolic link to point the real so
  137. iRt = m_id81Dev->openDevice(cFilePath);
  138. if(iRt == CWERR_IDCARD_SUCCESS)
  139. {
  140. m_id81Dev->setAutoFeedEnable(0);
  141. m_bOpen = TRUE;
  142. }
  143. return HandleDevError(iRt, __FUNCTION__);
  144. }
  145. // 吞入式身份证读卡器的适配器,
  146. // 1.检测到有卡片插入,但不是身份证时,IDCerAuthenticate返回Error_DevMedia;
  147. // 2.未检测到卡片插入,IDCerAuthenticate返回Error_Unexpect;
  148. // 3.检测到身份证且认证成功(注意:部分厂商不做卡认证直接返回成功,需要根据实际情况按照步骤1和2返回对应值),IDCerAuthenticate返回Error_Succeed。
  149. ErrorCodeEnum IDCertImpl:: IDCerAuthenticate()
  150. {
  151. LOG4VTM_FUNCTION();
  152. if (!m_bOpen)
  153. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  154. // SAutoLock lock(&m_MutexLock);
  155. int nCardST = 0, iRt = Error_Succeed;
  156. ErrorCodeEnum eRt = Error_Unexpect;
  157. m_iCardType = -1;
  158. iRt = m_id81Dev->GetStatus(nCardST);
  159. if(CWERR_IDCARD_SUCCESS == iRt)
  160. {
  161. switch(nCardST)
  162. {
  163. case CWINF_IDCARD_NOCARD: //无卡
  164. eRt = Error_Unexpect;
  165. break;
  166. case CWINF_IDCARD_CARDMIDDLE: //在读卡位
  167. iRt = m_id81Dev->getIDCardType(&m_iCardType);
  168. if(Error_Succeed == iRt)
  169. {
  170. if(0 == m_iCardType || 1 == m_iCardType || 2 == m_iCardType) //0:二代证 1:外国人 2:港澳居住证
  171. {
  172. eRt = Error_Succeed;
  173. }
  174. }
  175. else
  176. {
  177. eRt = Error_DevMedia;
  178. }
  179. break;
  180. default:
  181. eRt = Error_Unexpect;
  182. break;
  183. }
  184. }
  185. return eRt;
  186. }
  187. //dep目录说明:应用在上层目录,动态库在dep目录,生成的临时文件也在dep目录
  188. //当前目录和进程所在目录为上层目录,动态库和临时文件目录为dep子目录
  189. ErrorCodeEnum IDCertImpl::IDCerGetData(IDCerInfo &idCerInfo)
  190. {
  191. LOG4VTM_FUNCTION();
  192. if (!m_bOpen)
  193. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  194. memset(&idCerInfo,0,sizeof(IDCerInfo));
  195. int iRt = Error_Succeed;
  196. char strName[256]={0};
  197. char strNameENG[256]={0};
  198. char strSex[256]={0};
  199. char strNation[256]={0};
  200. char strBirthday[256]={0};
  201. char strAddress[256]={0};
  202. char strNumber[256]={0};
  203. char strDepartment[256]={0};
  204. char strTimeLimitStart[256]={0};
  205. char strTimeLimitEnd[256]={0};
  206. char strVersion[256]={0};
  207. char strTXZCode[256]={0};
  208. char strIssuedSN[256]={0};
  209. char strReserveItem[256]={0};
  210. char strHeadPath[256] = {0};
  211. sprintf(strHeadPath, "%s/zp.bmp", m_sLibPath);
  212. remove(strHeadPath);
  213. // iRt = m_id81Dev->GetStatus(nCardST);
  214. // if((CWERR_IDCARD_INIT == iRt) || (CWERR_IDCARD_PORT_ERROR == iRt))
  215. // {
  216. // //LOG4VTM(INFO, "GetStatus failed!");
  217. // return HandleDevError(iRt,"GetStatus-nCardST = %d",nCardST);
  218. // }
  219. // SAutoLock lock(&m_MutexLock);
  220. iRt = m_id81Dev->GetID2InfoAll(strHeadPath, strName, strNameENG,
  221. strSex, strNation, strBirthday,
  222. strAddress, strNumber, strDepartment,
  223. strTimeLimitStart, strTimeLimitEnd, strVersion,
  224. strTXZCode, strReserveItem, strIssuedSN,
  225. m_iCardType);
  226. if(iRt != 0)
  227. return HandleDevError(iRt, __FUNCTION__);
  228. if (CWERR_IDCARD_SUCCESS == iRt)
  229. {
  230. char WZBuffer[64] = {0};
  231. char strTmp[30] = {0};
  232. //姓名
  233. memcpy(idCerInfo.name.data,strName,strlen(strName));
  234. idCerInfo.name.dwSize = strlen(strName);
  235. //性别
  236. memcpy(idCerInfo.sex.data,strSex,strlen(strSex));
  237. idCerInfo.sex.dwSize = strlen(strSex);
  238. //民族
  239. memcpy(idCerInfo.nation.data,strNation,strlen(strNation));
  240. idCerInfo.nation.dwSize = strlen(strNation);
  241. //出生日期
  242. memset(WZBuffer, 0, 64);
  243. memset(strTmp, 0, 30);
  244. memcpy(WZBuffer,strBirthday,8);
  245. memcpy(idCerInfo.birthday.data,&WZBuffer[0],4);
  246. strcat(idCerInfo.birthday.data,"年");
  247. memcpy(strTmp,&WZBuffer[4],2);
  248. strcat(idCerInfo.birthday.data,strTmp);
  249. strcat(idCerInfo.birthday.data,"月");
  250. memcpy(strTmp,&WZBuffer[6],2);
  251. strcat(idCerInfo.birthday.data,strTmp);
  252. strcat(idCerInfo.birthday.data,"日");
  253. idCerInfo.birthday.dwSize = 14;
  254. //地址
  255. memcpy(idCerInfo.address.data,strAddress,strlen(strAddress));
  256. idCerInfo.address.dwSize = strlen(strAddress);
  257. //身份证号码
  258. memcpy(idCerInfo.idno.data,strNumber,strlen(strNumber));
  259. idCerInfo.idno.dwSize = strlen(strNumber);
  260. //发证机关
  261. memcpy(idCerInfo.department.data,strDepartment,strlen(strDepartment));
  262. idCerInfo.department.dwSize = strlen(strDepartment);
  263. //有效期始
  264. memset(WZBuffer, 0, 64);
  265. memset(strTmp, 0, 30);
  266. memcpy(WZBuffer,strTimeLimitStart,8);
  267. memcpy(idCerInfo.startDate.data,&WZBuffer[0],4);
  268. strcat(idCerInfo.startDate.data,".");
  269. memcpy(strTmp,&WZBuffer[4],2);
  270. strcat(idCerInfo.startDate.data,strTmp);
  271. strcat(idCerInfo.startDate.data,".");
  272. memcpy(strTmp,&WZBuffer[6],2);
  273. strcat(idCerInfo.startDate.data,strTmp);
  274. idCerInfo.startDate.dwSize = 10;
  275. //有效期止
  276. if(strlen(strTimeLimitEnd)<8) //长期身份证
  277. {
  278. memcpy(idCerInfo.endDate.data,&strTimeLimitEnd[0],6);
  279. idCerInfo.endDate.dwSize = 6;
  280. }
  281. else
  282. {
  283. memset(WZBuffer, 0, 64);
  284. memset(strTmp, 0, 30);
  285. memcpy(WZBuffer,strTimeLimitEnd,8);
  286. memcpy(idCerInfo.endDate.data,&WZBuffer[0],4);
  287. strcat(idCerInfo.endDate.data,".");
  288. memcpy(strTmp,&WZBuffer[4],2);
  289. strcat(idCerInfo.endDate.data,strTmp);
  290. strcat(idCerInfo.endDate.data,".");
  291. memcpy(strTmp,&WZBuffer[6],2);
  292. strcat(idCerInfo.endDate.data,strTmp);
  293. idCerInfo.endDate.dwSize = 10;
  294. }
  295. //set result
  296. memcmp(idCerInfo.photoPath.data, strHeadPath, strlen(strHeadPath));
  297. idCerInfo.photoPath.dwSize = strlen(idCerInfo.photoPath.data);
  298. }
  299. return Error_Succeed;
  300. }
  301. //dep目录说明:应用在上层目录,动态库在dep目录,生成的临时文件也在dep目录
  302. //当前目录和进程所在目录为上层目录,动态库和临时文件目录为dep子目录
  303. ErrorCodeEnum IDCertImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
  304. {
  305. LOG4VTM_FUNCTION();
  306. if (!m_bOpen)
  307. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  308. memset(&idCerInfoEx,0,sizeof(IDCerInfoEx));
  309. int iRt = Error_Succeed;
  310. char strName[256]={0};
  311. char strNameENG[256]={0};
  312. char strSex[256]={0};
  313. char strNation[256]={0};
  314. char strBirthday[256]={0};
  315. char strAddress[256]={0};
  316. char strNumber[256]={0};
  317. char strDepartment[256]={0};
  318. char strTimeLimitStart[256]={0};
  319. char strTimeLimitEnd[256]={0};
  320. char strVersion[256]={0};
  321. char strTXZCode[256]={0};
  322. char strIssuedSN[256]={0};
  323. char strReserveItem[256]={0};
  324. char strHeadPath[256] = {0};
  325. sprintf(strHeadPath, "%s/zp.bmp", m_sLibPath);
  326. // iRt = m_id81Dev->GetStatus(nCardST);
  327. // if((CWERR_IDCARD_INIT == iRt) || (CWERR_IDCARD_PORT_ERROR == iRt))
  328. // {
  329. // //LOG4VTM(INFO, "GetStatus failed!");
  330. // return HandleDevError(iRt,"GetStatus-nCardST = %d",nCardST);
  331. // }
  332. // SAutoLock lock(&m_MutexLock);
  333. iRt = m_id81Dev->GetID2InfoAll(strHeadPath, strName, strNameENG,
  334. strSex, strNation, strBirthday,
  335. strAddress, strNumber, strDepartment,
  336. strTimeLimitStart, strTimeLimitEnd, strVersion,
  337. strTXZCode, strReserveItem, strIssuedSN,
  338. m_iCardType);
  339. if(iRt != 0)
  340. return HandleDevError(iRt, __FUNCTION__);
  341. char WZBuffer[64] = {0};
  342. char strTmp[30] = {0};
  343. sprintf(strTmp, "GetID2InfoAll type=%d",m_iCardType);
  344. LOG4VTM(INFO, strTmp);
  345. //姓名
  346. memcpy(idCerInfoEx.name.data,strName,strlen(strName));
  347. idCerInfoEx.name.dwSize = strlen(strName);
  348. //性别
  349. memcpy(idCerInfoEx.sex.data,strSex,strlen(strSex));
  350. idCerInfoEx.sex.dwSize = strlen(strSex);
  351. //出生日期
  352. memset(WZBuffer, 0, 64);
  353. memset(strTmp, 0, 30);
  354. memcpy(WZBuffer,strBirthday,8);
  355. memcpy(idCerInfoEx.birthday.data,&WZBuffer[0],4);
  356. strcat(idCerInfoEx.birthday.data,"年");
  357. memcpy(strTmp,&WZBuffer[4],2);
  358. strcat(idCerInfoEx.birthday.data,strTmp);
  359. strcat(idCerInfoEx.birthday.data,"月");
  360. memcpy(strTmp,&WZBuffer[6],2);
  361. strcat(idCerInfoEx.birthday.data,strTmp);
  362. strcat(idCerInfoEx.birthday.data,"日");
  363. idCerInfoEx.birthday.dwSize = 14;
  364. //身份证号码
  365. memcpy(idCerInfoEx.idno.data,strNumber,strlen(strNumber));
  366. idCerInfoEx.idno.dwSize = strlen(strNumber);
  367. //发证机关
  368. memcpy(idCerInfoEx.department.data,strDepartment,strlen(strDepartment));
  369. idCerInfoEx.department.dwSize = strlen(strDepartment);
  370. //有效期始
  371. memset(WZBuffer, 0, 64);
  372. memset(strTmp, 0, 30);
  373. memcpy(WZBuffer,strTimeLimitStart,8);
  374. memcpy(idCerInfoEx.startDate.data,&WZBuffer[0],4);
  375. strcat(idCerInfoEx.startDate.data,".");
  376. memcpy(strTmp,&WZBuffer[4],2);
  377. strcat(idCerInfoEx.startDate.data,strTmp);
  378. strcat(idCerInfoEx.startDate.data,".");
  379. memcpy(strTmp,&WZBuffer[6],2);
  380. strcat(idCerInfoEx.startDate.data,strTmp);
  381. idCerInfoEx.startDate.dwSize = 10;
  382. //有效期止
  383. if(strlen(strTimeLimitEnd)<8) //长期身份证
  384. {
  385. memcpy(idCerInfoEx.endDate.data,&strTimeLimitEnd[0],8);
  386. idCerInfoEx.endDate.dwSize = strlen(strTimeLimitEnd);
  387. }
  388. else
  389. {
  390. memset(WZBuffer, 0, 64);
  391. memset(strTmp, 0, 30);
  392. memcpy(WZBuffer,strTimeLimitEnd,8);
  393. memcpy(idCerInfoEx.endDate.data,&WZBuffer[0],4);
  394. strcat(idCerInfoEx.endDate.data,".");
  395. memcpy(strTmp,&WZBuffer[4],2);
  396. strcat(idCerInfoEx.endDate.data,strTmp);
  397. strcat(idCerInfoEx.endDate.data,".");
  398. memcpy(strTmp,&WZBuffer[6],2);
  399. strcat(idCerInfoEx.endDate.data,strTmp);
  400. idCerInfoEx.endDate.dwSize = 10;
  401. }
  402. //set result
  403. memcmp(idCerInfoEx.photoPath.data, strHeadPath, strlen(strHeadPath));
  404. idCerInfoEx.photoPath.dwSize = strlen(idCerInfoEx.photoPath.data);
  405. //不同证件类型字段区分开来
  406. switch(m_iCardType)
  407. {
  408. case 0://二代身份证
  409. {
  410. LOG4VTM(INFO, "证件类型为二代身份证");
  411. //类型:空
  412. memset(idCerInfoEx.idType.data, NULL, IDCER_EIGHT_BYTE_SIZE);
  413. //民族
  414. memcpy(idCerInfoEx.nation.data,strNation,strlen(strNation));
  415. idCerInfoEx.nation.dwSize = strlen(strNation);
  416. //地址
  417. memcpy(idCerInfoEx.address.data,strAddress,strlen(strAddress));
  418. idCerInfoEx.address.dwSize = strlen(strAddress);
  419. }
  420. break;
  421. case 1://外国人永久居留证
  422. {
  423. LOG4VTM(INFO, "IDCerGetDataEx 证件类型为外国人永久居留证");
  424. //类型:I
  425. memcpy(idCerInfoEx.idType.data, "I", 1);
  426. //英文姓名
  427. memcpy(idCerInfoEx.englishName.data,strNameENG,strlen(strNameENG));
  428. idCerInfoEx.englishName.dwSize = strlen(strNameENG);
  429. //国籍
  430. memcpy(idCerInfoEx.nationality.data,strNation,strlen(strNation));
  431. idCerInfoEx.nationality.dwSize = strlen(strNation);
  432. //证件版本号
  433. memcpy(idCerInfoEx.idVersion.data,strVersion,strlen(strVersion));
  434. idCerInfoEx.idVersion.dwSize = strlen(strVersion);
  435. //保留字段
  436. memcpy(idCerInfoEx.reserved.data,strReserveItem,strlen(strReserveItem));
  437. idCerInfoEx.reserved.dwSize = strlen(strReserveItem);
  438. }
  439. break;
  440. case 2://港澳台居民居住证
  441. {
  442. LOG4VTM(INFO, "IDCerGetDataEx 证件类型为港澳台居住证");
  443. //类型:J
  444. memcpy(idCerInfoEx.idType.data, "J", 1);
  445. //居住证号码
  446. memcpy(idCerInfoEx.txzCode.data,strTXZCode,strlen(strTXZCode));
  447. idCerInfoEx.txzCode.dwSize = strlen(strTXZCode);
  448. //签发次数
  449. memcpy(idCerInfoEx.issuedSN.data,strIssuedSN,strlen(strIssuedSN));
  450. idCerInfoEx.issuedSN.dwSize = strlen(strIssuedSN);
  451. //地址
  452. memcpy(idCerInfoEx.address.data,strAddress,strlen(strAddress));
  453. idCerInfoEx.address.dwSize = strlen(strAddress);
  454. }
  455. break;
  456. default:
  457. LOG4VTM(INFO, "IDCerGetDataEx 证件类型有误");
  458. break;
  459. }
  460. return Error_Succeed;
  461. }
  462. // 强制弹出身份证等证件
  463. // Force ID Card to eject。
  464. //
  465. ErrorCodeEnum IDCertImpl:: ForceIDEject()
  466. {
  467. LOG4VTM_FUNCTION();
  468. if (!m_bOpen)
  469. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  470. // SAutoLock lock(&m_MutexLock);
  471. CancelWaitMediaInsert();
  472. Sleep(300);
  473. int nCardST = 0;
  474. int iRt = m_id81Dev->GetStatus(nCardST);
  475. if(iRt != CWERR_IDCARD_SUCCESS)
  476. return HandleDevError(iRt, "ForceIDEject GetStatus");
  477. iRt = m_id81Dev->Tackout();
  478. return HandleDevError(iRt, __FUNCTION__);
  479. }
  480. //dep目录说明:应用在上层目录,动态库在dep目录,生成的临时文件也在dep目录
  481. //当前目录和进程所在目录为上层目录,动态库和临时文件目录为dep子目录
  482. ErrorCodeEnum IDCertImpl:: ScanIDAndSaveImage()
  483. {
  484. LOG4VTM_FUNCTION();
  485. if (!m_bOpen)
  486. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  487. char szIDFront[MAX_PATH] = {0};
  488. char szIDBack[MAX_PATH] = {0};
  489. sprintf(szIDFront, "%s/idfront.bmp", m_sLibPath);
  490. sprintf(szIDBack, "%s/idback.bmp", m_sLibPath);
  491. // SAutoLock lock(&m_MutexLock);
  492. if (m_bReInsert) Sleep(1000);//连续测试发热较大
  493. int iRt = m_id81Dev->DoScan(szIDFront,szIDBack);
  494. if(CWERR_IDCARD_SUCCESS != iRt)
  495. {
  496. return HandleDevError(iRt, __FUNCTION__);
  497. }
  498. // iRt = m_id81Dev->ejectToRerec();
  499. // if(CWERR_IDCARD_SUCCESS != iRt)
  500. // {
  501. // LOG4VTM(ERROR, "EjectToRerec Failed!");
  502. // }
  503. return HandleDevError(iRt, __FUNCTION__);
  504. }
  505. // 获取卡片是否插入或者取走
  506. // Query if ID Card have been inserted or fetched。
  507. // pos:
  508. // -- 0,未检测到任何证件;1,证件在读卡器内部;2,证件在进卡口
  509. ErrorCodeEnum IDCertImpl:: QueryCardPos(int &pos)
  510. {
  511. LOG4VTM_FUNCTION();
  512. if (!m_bOpen)
  513. HandleDevError(DEV_NOT_OPEN, __FUNCTION__);
  514. int iRt = Error_Succeed;
  515. int nCardST = 0;
  516. // SAutoLock lock(&m_MutexLock);
  517. iRt = m_id81Dev->GetStatus(nCardST);
  518. if(CWERR_IDCARD_SUCCESS == iRt)
  519. {
  520. switch(nCardST)
  521. {
  522. case CWINF_IDCARD_NOCARD:
  523. pos = 0;
  524. break;
  525. case CWINF_IDCARD_CARDMIDDLE:
  526. case CWINF_IDCARD_CARDSCAN:
  527. pos = 1;
  528. break;
  529. case CWINF_IDCARD_CARDENTRY:
  530. pos = 2;
  531. break;
  532. }
  533. char szRet[1024] = {0};
  534. sprintf(szRet, "QueryCardPos Card pos=%d Status(%d):NOCARD(1) SCAN(2) MIDDLE(3) ENTRY(4) JAM(5) UNKNOWN(9)",pos, nCardST);
  535. LOG4VTM(INFO, szRet);
  536. return Error_Succeed;
  537. }
  538. return HandleDevError(iRt, __FUNCTION__);
  539. }
  540. BOOL IDCertImpl::RecordSoftVersion(DevSoftVersion &devSoftVersion)
  541. {
  542. return TRUE;
  543. }
  544. // Get last error the device issued.
  545. // Error message must include explanatory memorandum ,the original error
  546. // code and anything in favour of location problem.
  547. ErrorCodeEnum IDCertImpl::GetLastErr(DevErrorInfo &devErrInfo)
  548. {
  549. ErrorCodeEnum eRt = Error_Succeed;
  550. devErrInfo.dwErrMsgLen = m_DevErrInfo.dwErrMsgLen;
  551. memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  552. memcpy(devErrInfo.szErrMsg,m_DevErrInfo.szErrMsg,m_DevErrInfo.dwErrMsgLen&0x0000FFFF);
  553. return eRt;
  554. }
  555. ErrorCodeEnum IDCertImpl::HandleDevError(int nRt, LPCTSTR lpszFormat, ...)
  556. {
  557. ErrorCodeEnum eRt = Error_Succeed;
  558. WORD wHWErrorCode = DEC_SUCCESS; //硬件设备错误码
  559. char errMsg[300] = {0};
  560. va_list arglist;
  561. va_start(arglist, lpszFormat);
  562. _vsnprintf(errMsg, 128, lpszFormat, arglist);
  563. va_end(arglist);
  564. string m_strError;
  565. switch (nRt)
  566. {
  567. case 0:
  568. wHWErrorCode = DEC_SUCCESS;
  569. eRt = Error_Succeed;
  570. strcat(errMsg, " success");
  571. break;
  572. case CWERR_PUBLIC_TIMEOUT:
  573. wHWErrorCode = DEC_TIMEOUT;
  574. eRt = Error_TimeOut;
  575. strcat(errMsg, " TimeOut");
  576. break;
  577. case CWERR_PUBLIC_WINAPI:
  578. wHWErrorCode = DEC_FILE_NOT_FOUND;
  579. strcat(errMsg, " FILE_NOT_FOUND");
  580. eRt = Error_Stoped;
  581. break;
  582. case -1:
  583. wHWErrorCode = DEC_HARDWARE;
  584. strcat(errMsg, " device error");
  585. eRt = Error_Hardware;
  586. break;
  587. case DEV_NOT_OPEN:
  588. wHWErrorCode = DEC_DEV_NOT_OPENED;
  589. strcat(errMsg, " device not open");
  590. eRt = Error_Stoped;
  591. break;
  592. case CWERR_IDCARD_CARD_JAM:
  593. strcat(errMsg, " CARD_JAM");
  594. wHWErrorCode = DEC_HARDWARE;
  595. eRt = Error_DevMedia;
  596. break;
  597. // case CWERR_IDCARD_NOT_CONNECTED:
  598. // strInfo += _T("-CWERR_IDCARD_NOT_CONNECTED");
  599. // wHWErrorCode = DEC_HARDWARE;
  600. // eRt = Error_Stoped;
  601. // break;
  602. case CWERR_IDCARD_PORT_ERROR:
  603. strcat(errMsg, " PORT_ERROR");
  604. wHWErrorCode = DEC_HARDWARE;
  605. eRt = Error_Stoped;
  606. break;
  607. case CWERR_IDCARD_COVER_OPENED:
  608. strcat(errMsg, " COVER_OPENED");
  609. wHWErrorCode = DEC_HARDWARE;
  610. eRt = Error_Stoped;
  611. break;
  612. case CWERR_IDCARD_NO_CARD:
  613. strcat(errMsg, " NO_CARD");
  614. wHWErrorCode = DEC_HARDWARE;
  615. eRt = Error_Stoped;
  616. break;
  617. case CWERR_IDCARD_IDDATA_ERR:
  618. strcat(errMsg, " IDDATA_ERR");
  619. wHWErrorCode = DEC_HARDWARE;
  620. eRt = Error_Stoped;
  621. break;
  622. case CWERR_IDCARD_NO_IDDATA:
  623. strcat(errMsg, " NO_IDDATA");
  624. wHWErrorCode = DEC_HARDWARE;
  625. eRt = Error_Stoped;
  626. break;
  627. default:
  628. strcat(errMsg, " other error");
  629. wHWErrorCode = DEC_HARDWARE;
  630. eRt = Error_Stoped;
  631. break;
  632. }
  633. //if(!strInfo.IsEmpty())
  634. // strInfo = strInfo +_T("+") + strInfo;
  635. //对dwErrMsgLen字段进行拆分
  636. // 高两字节存储硬件设备错误码 (dwErrMsgLen & 0xFFFF0000)
  637. // 低两字节保留以前的作用即:存储错误信息字符串szErrMsg的实际有效长度
  638. memset(m_DevErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  639. //int k = wcstombs(m_DevErrInfo.szErrMsg,wc,MAX_DEV_ERROR_MSG_LEN);
  640. //int nReturnlen=WideCharToMultiByte(CP_ACP,0,strInfo.GetBuffer(0),-1,m_DevErrInfo.szErrMsg,MAX_DEV_ERROR_MSG_LEN,NULL,NULL);
  641. sprintf(m_DevErrInfo.szErrMsg, "{\"ErrCode\":\"%04x\",\"Description\":\"%s\"}", eRt, errMsg);
  642. // memcpy(m_DevErrInfo.szErrMsg, strInfo.data(), strInfo.length());
  643. m_DevErrInfo.dwErrMsgLen = (wHWErrorCode<<16)&0xFFFF0000;
  644. m_DevErrInfo.dwErrMsgLen += strlen(m_DevErrInfo.szErrMsg)&0x0000FFFF;
  645. if (eRt != Error_Succeed)
  646. LOG4VTM(WARN, m_DevErrInfo.szErrMsg);
  647. else
  648. LOG4VTM(INFO, m_DevErrInfo.szErrMsg);
  649. return eRt;
  650. }
  651. void IDCertImpl::CancelWaitMediaInsert()
  652. {
  653. m_id81Dev->setAutoFeedEnable(0);
  654. }
  655. ErrorCodeEnum IDCertImpl:: IDCerRFControl(bool bControl)
  656. {
  657. LOG4VTM_FUNCTION();
  658. m_iCardType = -1;
  659. // SAutoLock lock(&m_MutexLock);
  660. // CancelWaitMediaInsert();
  661. // int nCardST = 0;
  662. // int iRt = m_id81Dev->GetStatus(nCardST);
  663. // if(iRt != CWERR_IDCARD_SUCCESS)
  664. // return HandleDevError(iRt, "IDCerRFControl GetStatus");
  665. int iRt = 0;
  666. if(bControl)
  667. {
  668. char sMsg[300] = {0};
  669. DeleteBmp();
  670. int iPos = 0;
  671. LOG4VTM(INFO, "IDCerRFControl enable");
  672. iRt = m_id81Dev->GetStatus(iPos);
  673. sprintf(sMsg, "IDCerRFControl enable ret %d pos %d", iRt, iPos);
  674. LOG4VTM(INFO, sMsg);
  675. if(iRt != CWERR_IDCARD_SUCCESS)
  676. return HandleDevError(iRt, "IDCerRFControl true GetStatus");
  677. if (iPos == CWINF_IDCARD_CARDJAM)
  678. {
  679. LOG4VTM(INFO, "IDCerRFControl CARDJAM");
  680. m_id81Dev->Reset(2);
  681. LOG4VTM(INFO, "IDCerRFControl GetStatus2");
  682. m_id81Dev->GetStatus(iPos);
  683. }
  684. if (iPos == CWINF_IDCARD_CARDENTRY)
  685. {
  686. /*
  687. m_id81Dev->doCardIn();
  688. m_id81Dev->GetStatus(iPos);
  689. if (iPos == CWINF_IDCARD_CARDENTRY)
  690. {
  691. iRt = m_id81Dev->BackInside();
  692. return HandleDevError(iRt, "IDCerRFControl true BackInside");
  693. }
  694. return HandleDevError(0, "IDCerRFControl true doCardIn ok");
  695. /*/
  696. m_bReInsert = true;
  697. LOG4VTM(INFO, "IDCerRFControl BackInside");
  698. iRt = m_id81Dev->BackInside();
  699. return HandleDevError(iRt, "IDCerRFControl true BackInside");
  700. //*/
  701. }
  702. else
  703. {
  704. m_bReInsert = false;
  705. iRt = m_id81Dev->setAutoFeedEnable(1);
  706. return HandleDevError(iRt, "IDCerRFControl true setAutoFeedEnable 1");
  707. }
  708. }
  709. else
  710. {
  711. m_id81Dev->setAutoFeedEnable(0);
  712. iRt = m_id81Dev->eject();
  713. return HandleDevError(iRt, "IDCerRFControl false setAutoFeedEnable 0");
  714. }
  715. }
  716. void IDCertImpl::ThreadRun()
  717. {
  718. }
  719. void IDCertImpl::Start()
  720. {
  721. pthread_attr_t attr;
  722. pthread_attr_init(&attr);
  723. pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
  724. pthread_create(&m_hThreadID, &attr, Proc, (void*) this);
  725. pthread_attr_destroy(&attr);
  726. }
  727. void* IDCertImpl::Proc(void* inPara)
  728. {
  729. IDCertImpl* pCtrl = (IDCertImpl*)inPara;
  730. pCtrl->ThreadRun();
  731. CloseThread(pCtrl->m_hThreadID);
  732. return 0;
  733. }
  734. void IDCertImpl::CloseThread(pthread_t& h)
  735. {
  736. pthread_exit(0);
  737. }