idcertimpl.cpp 25 KB

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