idcertificate.cpp 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638
  1. #include "idcertificate.h"
  2. #include <stdarg.h>
  3. #include "log4vendor.h"
  4. #include "stdafx.h"
  5. LOG_EXTERN()
  6. #define MAX_PICTURE_SIZE 3*1024*1024
  7. #define MAX_FILE_PATH 260
  8. CHAR CurrendPath[MAX_FILE_PATH] = {0};
  9. CHAR PhotoPath[MAX_FILE_PATH] = {0};
  10. char* strcpy_s(char* dest, const char* src)
  11. {
  12. return strcpy(dest, src);
  13. }
  14. char* strcpy_s(char* dest, size_t size, const char* src)
  15. {
  16. if ((dest == NULL) || (size < strlen(src) + 1))
  17. {
  18. return NULL;
  19. }
  20. return strcpy(dest, src);
  21. }
  22. char* strcat_s(char* dest, const char* src)
  23. {
  24. return strcat(dest, src);
  25. }
  26. char* strcat_s(char* dest, size_t size, const char* src)
  27. {
  28. if ((dest == NULL) || (size < strlen(dest) + strlen(src) + 1))
  29. {
  30. return NULL;
  31. }
  32. return strcat(dest, src);
  33. }
  34. unsigned long GetTickCount()
  35. {
  36. struct timespec ts;
  37. clock_gettime(CLOCK_MONOTONIC, &ts);
  38. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  39. }
  40. int GetDllPathLocal(std::string& dllPath)
  41. {
  42. Dl_info path_info;
  43. dladdr("load_so",&path_info);
  44. char str_FilePath[256]{0};
  45. memcpy(str_FilePath,path_info.dli_fname,strlen(path_info.dli_fname));
  46. printf("first_str_FilePath=%s\n",str_FilePath);
  47. char *pLastSlath=strrchr(str_FilePath,'/');
  48. *(pLastSlath + 1)=0;
  49. std::string a(str_FilePath);
  50. dllPath = a;
  51. return 0;
  52. }
  53. IDCerClassImpl::IDCerClassImpl():
  54. m_bDevOpen(false)
  55. ,m_bAuthed(false)
  56. ,m_iCardType(-1)
  57. {
  58. LOG_FUNCTION();
  59. SecDeviceNum = 0;
  60. }
  61. IDCerClassImpl::~IDCerClassImpl()
  62. {
  63. LOG_FUNCTION();
  64. m_bDevOpen = false;
  65. DevClose();
  66. SecDeviceNum = 0;
  67. std::string tmpPath = "";
  68. if( GetDllPathLocal(tmpPath) == Error_Succeed )
  69. {
  70. }
  71. else
  72. {
  73. tmpPath = "/";
  74. }
  75. std::string strFile = tmpPath + "zp.bmp";
  76. if(access(strFile.c_str(), 0) != -1)
  77. {
  78. LogM("file del:%s\n", strFile.c_str());
  79. remove(strFile.c_str());
  80. }
  81. else
  82. {
  83. LogM("file not found:%s\n", strFile.c_str());
  84. }
  85. strFile = tmpPath + "idback.bmp";
  86. if(access(strFile.c_str(), 0) != -1)
  87. {
  88. LogM("file del:%s\n", strFile.c_str());
  89. remove(strFile.c_str());
  90. }
  91. else
  92. {
  93. LogM("file not found:%s\n", strFile.c_str());
  94. }
  95. strFile = tmpPath + "idfront.bmp";
  96. if(access(strFile.c_str(), 0) != -1)
  97. {
  98. LogM("file del:%s\n", strFile.c_str());
  99. remove(strFile.c_str());
  100. }
  101. else
  102. {
  103. LogM("file not found:%s\n", strFile.c_str());
  104. }
  105. strFile = tmpPath + "ck.bmp";
  106. if(access(strFile.c_str(), 0) != -1)
  107. {
  108. LogM("file del:%s\n", strFile.c_str());
  109. remove(strFile.c_str());
  110. }
  111. else
  112. {
  113. LogM("file not found:%s\n", strFile.c_str());
  114. }
  115. }
  116. int getFileVer(char* sFile, short &ch1, short &ch2)
  117. {
  118. ch1 = 0;
  119. ch2 = 0;
  120. char* pFind = strstr(sFile, ".so");
  121. char* pTemp = pFind;
  122. while(pTemp)
  123. {
  124. pFind = pTemp;
  125. pTemp = strstr(pFind + 3, ".so");
  126. }
  127. if(pFind == nullptr) return 0;
  128. pTemp = pFind - 1;
  129. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  130. if(*pTemp == '.')
  131. ch2 = atoi(pTemp + 1);
  132. pTemp--;
  133. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  134. if(*pTemp == '.')
  135. ch1 = atoi(pTemp + 1);
  136. return 1;
  137. }
  138. ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  139. {
  140. LOG_FUNCTION();
  141. LogM("GetDevCategory() Entry.");
  142. memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
  143. memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
  144. memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
  145. memcpy(devCategory.szType, "PVER=SNBC#MID=ID8101", strlen("PVER=SNBC#MID=ID8101"));
  146. memcpy(devCategory.szVendor, "keba", strlen("keba"));
  147. devCategory.eState = DEVICE_STATUS_NORMAL;
  148. char sPath[256], sFile[128] = {0};
  149. GetCurModulePath(sPath, sFile);
  150. short v1,v2;
  151. getFileVer(sFile, v1, v2);
  152. devCategory.version.wMajor = v1;
  153. devCategory.version.wMinor = v2;
  154. devCategory.version.wRevision = 0xffff;
  155. devCategory.version.wBuild = 2;
  156. memcpy(devCategory.szModel, "STYLE=IG#FUNCTION=ITF", strlen("STYLE=IG#FUNCTION=ITF"));
  157. LogM("GetDevCategory() return:\n\
  158. devCategory.szType = %s, \n\
  159. devCategory.szVendor = %s, \n\
  160. devCategory.eState = %d, \n\
  161. devCategory.version.wMajor = %d, \n\
  162. devCategory.version.wMinor = %d, \n\
  163. devCategory.version.wRevision = %d, \n\
  164. devCategory.version.wBuild= %d, \n\
  165. devCategory..szModel = %s, \n",
  166. devCategory.szType,
  167. devCategory.szVendor,
  168. devCategory.eState,
  169. devCategory.version.wMajor,
  170. devCategory.version.wMinor,
  171. devCategory.version.wRevision,
  172. devCategory.version.wBuild,
  173. devCategory.szModel);
  174. return Error_Succeed;
  175. }
  176. // Reset device.
  177. // Do the cleaning work and initialize device again in order to return to
  178. // the normal condition.
  179. ErrorCodeEnum IDCerClassImpl::Reset()
  180. {
  181. LOG_FUNCTION();
  182. LogM("Reset() Entry.");
  183. if(!m_bDevOpen)
  184. {
  185. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  186. LogM("Reset(), 设备未打开, nRet=%d", Error_DevNotAvailable);
  187. return Error_DevNotAvailable;
  188. }
  189. int nRet = m_cBS_ID81IDCImpl.ResetWithAction(SecDeviceNum, 0);//复位模式,0---退卡,1---吞卡,2---退卡并持卡,3---无动作。
  190. if (IDDIGITALCOPIER_NO_ERROR != nRet)
  191. {
  192. SaveErrorInfo("设备通信异常", Error_DevConnFailed);
  193. LogM("Reset() 复位模式, 0-- 退卡 动作失败");
  194. return Error_DevConnFailed;
  195. }
  196. m_bAuthed = false;
  197. m_iCardType = -1;
  198. LogM("Reset() 复位模式, 0-- 退卡 动作成功");
  199. return Error_Succeed;
  200. }
  201. //
  202. // Close device and do the cleaning work.
  203. // ex. close connection,close port,release memery and so on
  204. ErrorCodeEnum IDCerClassImpl::DevClose()
  205. {
  206. LOG_FUNCTION();
  207. LogM("DevClose() Entry.");
  208. int nRet = m_cBS_ID81IDCImpl.CloseDev(SecDeviceNum);
  209. if (IDDIGITALCOPIER_NO_ERROR != nRet)
  210. {
  211. SaveErrorInfo("设备通信异常", Error_DevConnFailed);
  212. LogM("DevClose(), 设备通信异常, nRet=%d", nRet);
  213. return Error_DevConnFailed;
  214. }
  215. m_bDevOpen = false;
  216. m_bAuthed = false;
  217. m_iCardType = -1;
  218. LogM("DevClose(), nRet=%d", nRet);
  219. return Error_Succeed;
  220. }
  221. // Get last error the device issued.
  222. // Error message must include explanatory memorandum ,the original error
  223. // code and anything in favour of location problem.
  224. ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  225. {
  226. LOG_FUNCTION();
  227. LogM("IDCerClassImpl::Entry->IDCerClassImpl GetLastErr()!");
  228. devErrInfo.dwErrMsgLen = strlen(m_szErrMsg);
  229. memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  230. memcpy(devErrInfo.szErrMsg, m_szErrMsg, MIN(devErrInfo.dwErrMsgLen, MAX_DEV_ERROR_MSG_LEN));
  231. LogM("GetLastErr() return:\n\
  232. devErrInfo.szErrMsg = %s, \n\
  233. devErrInfo.dwErrMsgLen = %d", devErrInfo.szErrMsg, devErrInfo.dwErrMsgLen);
  234. return Error_Succeed;
  235. }
  236. //
  237. // Open device.
  238. // if usb device,set dwPort=0
  239. //
  240. ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
  241. {
  242. LOG_FUNCTION();
  243. LogM("DevOpen(dwPort = %d) Entry.", dwPort);
  244. unsigned int DevNumber = 8; //统计当前设备数量
  245. ScannerInfoRec ScannerInfo[8] = {0}; //设备信息
  246. m_bAuthed = false;
  247. m_iCardType = -1;
  248. int nRet = m_cBS_ID81IDCImpl.EnumScannerDev(ScannerInfo, &DevNumber);
  249. if (DevNumber <= 0)
  250. {
  251. m_bDevOpen = false;
  252. SaveErrorInfo("未找到设备", Error_DevNotAvailable);
  253. SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
  254. SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
  255. SH_DeleteFileOrDirectory("..\\bin\\LogModuleErrMsg.log");
  256. return Error_DevNotAvailable;
  257. }
  258. for (unsigned int i = 0; i < DevNumber; i++)
  259. {
  260. SecDeviceNum = ScannerInfo[i].DeviceID;
  261. printf(" SecDeviceNum=%d", SecDeviceNum);
  262. nRet = m_cBS_ID81IDCImpl.OpenDev(SecDeviceNum);
  263. if (IDDIGITALCOPIER_NO_ERROR == nRet)
  264. {
  265. m_bDevOpen = true;
  266. SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
  267. SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
  268. SH_DeleteFileOrDirectory("..\\bin\\LogModuleErrMsg.log");
  269. LogM("DevOpen(), nRet=%d.", nRet);
  270. return Error_Succeed;
  271. }
  272. }
  273. m_bDevOpen = false;
  274. SaveErrorInfo("设备通信异常", Error_DevConnFailed);
  275. SH_DeleteFileOrDirectory("LogModuleErrMsg.log");
  276. SH_DeleteFileOrDirectory("bin\\LogModuleErrMsg.log");
  277. SH_DeleteFileOrDirectory("..\\bin\\LogModuleErrMsg.log");
  278. LogE("DevOpen, 设备通信异常, nRet = %d. ", nRet);
  279. return Error_DevConnFailed;
  280. }
  281. //
  282. // Optional.
  283. // Open or close RF.
  284. // Arguments:
  285. // - bControl:true:open RF,false close RF
  286. //
  287. ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
  288. {
  289. LOG_FUNCTION();
  290. LogM("IDCerRFControl(), bControl = %d", bControl);
  291. if(!m_bDevOpen)
  292. {
  293. //g_pLog->Print("IDCerRFControl(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
  294. LogE("IDCerRFControl(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
  295. return Error_DevNotAvailable;
  296. }
  297. if (bControl)
  298. {
  299. /*
  300. //------------2019-07-19--------根据DevTestTool连续测试的指令流程,应在此处检测入卡;
  301. //IDCerAuthenticate();
  302. DWORD dwStart = GetTickCount();
  303. DWORD dwNow = dwStart;
  304. DEVSTATUS m_DeviceStatus;
  305. int pos = -1;
  306. int nRet;
  307. bool bCard = false;
  308. while ((dwNow - dwStart) <= 1000)
  309. {
  310. pos = -1;
  311. memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
  312. nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
  313. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  314. {
  315. char err[MAX_DEV_ERROR_MSG_LEN] = {0};
  316. sprintf(err, "通讯异常%d", nRet);
  317. SaveErrorInfo(err, Error_DevCommFailed);
  318. //m_cBS_ID81IDCImpl.ResetDev(SecDeviceNum);
  319. return Error_DevCommFailed;
  320. //SaveErrorInfo("通讯异常", Error_DevCommFailed);
  321. //return Error_DevCommFailed;
  322. }
  323. if ((m_DeviceStatus.iStatusInputSensorHaveCard == 1) &&
  324. (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
  325. (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
  326. {
  327. pos = 2;
  328. }
  329. else if ((m_DeviceStatus.iStatusMiddleSensorHaveCard == 1) ||
  330. (m_DeviceStatus.iStatusScanSensorHaveCard ==1))
  331. {
  332. pos = 1;
  333. }
  334. else
  335. {
  336. pos = 0;
  337. }
  338. if (pos <= 0)
  339. {
  340. Sleep(100);
  341. dwNow = GetTickCount();
  342. }
  343. else
  344. {
  345. bCard = true;
  346. break;
  347. }
  348. }
  349. if (!bCard)
  350. {
  351. SaveErrorInfo("未检测到卡", Error_Unexpect);
  352. return Error_Unexpect;
  353. }
  354. nRet = m_cBS_ID81IDCImpl.CheckIdCard(SecDeviceNum, 100);
  355. if ((IDDIGITALCOPIER_TIMEOUT_ERROR == nRet) ||
  356. (IDDIGITALCOPIER_NO_CARD == nRet))
  357. {
  358. //2019-02-28 《可视化柜台设备厂商适配器开发说明文档V1.3.doc》 P12关于身份证读卡器改造说明
  359. //1. 检测到有卡片插入/放置,但不是身份证时,IDCerAuthenticate返回Error_DevMedia;
  360. //2. 未检测到卡片插入/放置,IDCerAuthenticate返回Error_Unexpect;
  361. //3. 检测到身份证且认证成功(注意:部分厂商不做卡认证直接返回成功,需要根据实际情况按照步骤1和2返回对应值),IDCerAuthenticate返回Error_Succeed。
  362. //SaveErrorInfo("未检测到卡", Error_DevMedia);
  363. //printf(" SecDeviceNum=%d",SecDeviceNum);
  364. //return Error_DevMedia;
  365. SaveErrorInfo("未检测到卡", Error_Unexpect);
  366. return Error_Unexpect;
  367. }
  368. else if (IDDIGITALCOPIER_NO_ERROR != nRet)
  369. {
  370. char err[MAX_DEV_ERROR_MSG_LEN] = {0};
  371. sprintf(err, "通讯失败%d", nRet);
  372. SaveErrorInfo(err, Error_DevConnFailed);
  373. //m_cBS_ID81IDCImpl.ResetDev(SecDeviceNum);
  374. return Error_DevConnFailed;
  375. }
  376. */
  377. }
  378. else
  379. {
  380. ForceIDEject();
  381. }
  382. LogM("IDCerRFControl(), nRet = %d", Error_Succeed);
  383. return Error_Succeed;
  384. }
  385. //
  386. // Optional.
  387. // Certificate authentication.
  388. //
  389. ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
  390. {
  391. LOG_FUNCTION();
  392. LogM("IDCerAuthenticate() Entry.");
  393. if(!m_bDevOpen)
  394. {
  395. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  396. LogE("IDCerAuthenticate(), !m_bDevOpen, nRet=%d", Error_DevNotAvailable);
  397. return Error_DevNotAvailable;
  398. }
  399. DWORD dwStart = GetTickCount();
  400. DWORD dwNow = dwStart;
  401. DEVSTATUS m_DeviceStatus;
  402. int pos = -1;
  403. int nRet;
  404. bool bCard = false;
  405. while ((dwNow - dwStart) <= 1000)
  406. {
  407. pos = -1;
  408. memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
  409. nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
  410. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  411. {
  412. char err[MAX_DEV_ERROR_MSG_LEN] = {0};
  413. sprintf(err, "通讯异常%d", nRet);
  414. SaveErrorInfo(err, Error_DevCommFailed);
  415. LogE("IDCerAuthenticate(), 通讯异常%d, nRet=%d", nRet, Error_DevCommFailed);
  416. return Error_DevCommFailed;
  417. }
  418. if ((m_DeviceStatus.iStatusInputSensorHaveCard == 1) &&
  419. (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
  420. (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
  421. {
  422. pos = 2;
  423. }
  424. else if ((m_DeviceStatus.iStatusMiddleSensorHaveCard == 1) ||
  425. (m_DeviceStatus.iStatusScanSensorHaveCard ==1))
  426. {
  427. pos = 1;
  428. }
  429. else
  430. {
  431. pos = 0;
  432. }
  433. if (pos <= 0)
  434. {
  435. usleep(100*1000);
  436. dwNow = GetTickCount();
  437. }
  438. else
  439. {
  440. bCard = true;
  441. break;
  442. }
  443. }
  444. if (!bCard)
  445. {
  446. SaveErrorInfo("未检测到卡", Error_Unexpect);
  447. LogE("IDCerAuthenticate(),未检测到卡, nRet=%d", Error_Unexpect);
  448. return Error_Unexpect;
  449. }
  450. nRet = m_cBS_ID81IDCImpl.CheckIdCard(SecDeviceNum, 100);
  451. if ((IDDIGITALCOPIER_TIMEOUT_ERROR == nRet) ||
  452. (IDDIGITALCOPIER_NO_CARD == nRet))
  453. {
  454. SaveErrorInfo("未检测到卡", Error_Unexpect);
  455. LogE("IDCerAuthenticate(),未检测到卡, nRet=%d", Error_Unexpect);
  456. return Error_Unexpect;
  457. }
  458. else if (IDDIGITALCOPIER_NO_ERROR != nRet)
  459. {
  460. char err[MAX_DEV_ERROR_MSG_LEN] = {0};
  461. sprintf(err, "通讯失败%d", nRet);
  462. SaveErrorInfo(err, Error_DevConnFailed);
  463. LogE("IDCerAuthenticate(),通讯失败,nRet=%d", nRet, Error_DevConnFailed);
  464. return Error_DevConnFailed;
  465. }
  466. int iCardType = -1;
  467. memset(&m_IDInfoEx, 0x00, sizeof(IDInfoEx));
  468. memset(&m_IDForeignInfo, 0x00, sizeof(IDInfoForeign));
  469. memset(&m_IDInfoGAT, 0x00, sizeof(IDInfoGAT));
  470. memset(PhotoPath, 0, MAX_FILE_PATH);
  471. std::string dllPath;
  472. int bRet = GetDllPathLocal(dllPath);
  473. memcpy(PhotoPath, dllPath.c_str(), dllPath.length());
  474. dllPath += "zp.bmp";
  475. char FileName0[256]={0};
  476. memcpy(FileName0, dllPath.c_str(), dllPath.length());
  477. std::string strLog = "IDCerAuthenticate(),PhotoPath=[" + dllPath + "]";
  478. LogM("%s",strLog.c_str());
  479. nRet = m_cBS_ID81IDCImpl.GetMyIDCardType(SecDeviceNum, &iCardType);
  480. if(nRet == IDDIGITALCOPIER_NO_ERROR)
  481. {
  482. }
  483. else if (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)
  484. {
  485. SaveErrorInfo("无效卡", Error_DevMedia);
  486. LogE("IDCerAuthenticate(),无效卡, nRet=%d", Error_DevMedia);
  487. //m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
  488. return Error_DevMedia;
  489. }
  490. else
  491. {
  492. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  493. LogE("IDCerAuthenticate(),通讯异常%d,nRet=%d", nRet, Error_DevCommFailed);
  494. return Error_DevCommFailed;
  495. }
  496. void *AllTypeInfo = NULL;
  497. if (iCardType == 0) // 0-身份证
  498. {
  499. AllTypeInfo = &m_IDInfoEx;
  500. }
  501. else if (iCardType == 1) //1-外国人居住证
  502. {
  503. AllTypeInfo = &m_IDForeignInfo;
  504. }
  505. else if (iCardType == 2) //2-港澳台
  506. {
  507. AllTypeInfo = &m_IDInfoGAT;
  508. }
  509. else
  510. {
  511. }
  512. if (iCardType == 2)
  513. {
  514. nRet = m_cBS_ID81IDCImpl.GetMyGATIDInfo(SecDeviceNum, &m_IDInfoGAT, FileName0);
  515. }
  516. else
  517. {
  518. nRet = m_cBS_ID81IDCImpl.GetAllTypeCardInfo(SecDeviceNum, iCardType, AllTypeInfo, FileName0);
  519. }
  520. if(nRet == IDDIGITALCOPIER_NO_ERROR)
  521. {
  522. LogM("IDCerAuthenticate(),认证成功");
  523. }
  524. else if ((nRet == IDDIGITALCOPIER_NO_ERROR) ||
  525. (nRet == IDDIGITALCOPIER_IDDATA_PROCESS_ERROR)) //身份证电子信息处理错误
  526. {
  527. SaveErrorInfo("无效卡", Error_DevMedia);
  528. LogE("IDCerAuthenticate(),无效卡, nRet=%d", Error_DevMedia);
  529. m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
  530. return Error_DevMedia;
  531. }
  532. else
  533. {
  534. char err[MAX_DEV_ERROR_MSG_LEN] = {0};
  535. sprintf(err, "通讯失败%d", nRet);
  536. SaveErrorInfo(err, Error_DevConnFailed);
  537. LogE("IDCerAuthenticate()通讯失败, nRet=%d", Error_DevCommFailed);
  538. return Error_DevConnFailed;
  539. }
  540. m_bAuthed = true; // true:认证成功;
  541. m_iCardType = iCardType; // 认证成功后,卡的类型;
  542. LogM("IDCerAuthenticate(), nRet=%d", Error_Succeed);
  543. return Error_Succeed;
  544. }
  545. // 获取证件信息,包括二代身份证、外国人永久居留证
  546. // Get Identity Card info.
  547. //
  548. ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo &idCerInfo)
  549. {
  550. LOG_FUNCTION();
  551. LogM("IDCerGetData() Entry.");
  552. if(!m_bDevOpen)
  553. {
  554. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  555. LogE("IDCerGetData(),设备未打开, nRet=%d", Error_DevNotAvailable);
  556. return Error_DevNotAvailable;
  557. }
  558. if (!m_bAuthed)
  559. {
  560. SaveErrorInfo("未认证成功。", Error_DevMedia);
  561. LogE("IDCerGetData(),未认证成功, nRet=%d", Error_DevMedia);
  562. return Error_DevMedia;
  563. }
  564. m_bAuthed = false; //认证成功只能读一次,下次必须重新认证;
  565. std::string dllPath;
  566. int bRet = GetDllPathLocal(dllPath);
  567. std::string ckStr = dllPath + "ck.bmp";
  568. std::string zpStr = dllPath + "zp.bmp";
  569. std::string commond="mv"+std::string(" ")+ckStr+std::string(" ")+zpStr;
  570. system(commond.c_str());
  571. std::string strLog = "IDCerGetData(),ckStr=[" + ckStr + "],zpStr=[" + zpStr + "]";
  572. LogM("%s",strLog.c_str());
  573. memset(PhotoPath, 0, MAX_FILE_PATH);
  574. memcpy(PhotoPath, zpStr.c_str(), zpStr.length());
  575. memset(&idCerInfo, 0, sizeof(IDCerInfo));
  576. //--------在IDCerAuthenticate里,对有效卡读出数据,在IDCerGetData和IDCerGetDataEx不再去读数据,否则应用会崩溃(未知原因,参考E1000的处理);
  577. if (m_iCardType == 0) //0-身份证
  578. {
  579. //身份证
  580. //1姓名
  581. std::string dataStr = m_IDInfoEx.name;
  582. dataStr = trim(dataStr);
  583. strcpy_s(idCerInfo.name.data,m_IDInfoEx.name);
  584. idCerInfo.name.dwSize = dataStr.size();
  585. //2性别
  586. dataStr = m_IDInfoEx.sex;
  587. dataStr = trim(dataStr);
  588. strcpy_s(idCerInfo.sex.data, m_IDInfoEx.sex);
  589. idCerInfo.sex.dwSize = dataStr.size();
  590. //3国籍(民族)
  591. dataStr = m_IDInfoEx.nation;
  592. dataStr = trim(dataStr);
  593. strcpy_s(idCerInfo.nation.data, m_IDInfoEx.nation);
  594. idCerInfo.nation.dwSize = dataStr.size();
  595. //4出生日期
  596. dataStr = m_IDInfoEx.birthday;
  597. dataStr = trim(dataStr);
  598. std::string year = dataStr.substr(0, 4);
  599. std::string month = dataStr.substr(4, 2);
  600. std::string day = dataStr.substr(6, 2);
  601. std::string date = year + "年" + month + "月" + day + "日";
  602. strcpy_s(idCerInfo.birthday.data, date.c_str());
  603. idCerInfo.birthday.dwSize = dataStr.size();
  604. //5地址
  605. dataStr = m_IDInfoEx.address;
  606. dataStr = trim(dataStr);
  607. strcpy_s(idCerInfo.address.data,m_IDInfoEx.address);
  608. idCerInfo.address.dwSize = dataStr.size();
  609. //6身份证号
  610. dataStr = m_IDInfoEx.number;
  611. dataStr = trim(dataStr);
  612. strcpy_s(idCerInfo.idno.data, m_IDInfoEx.number);
  613. idCerInfo.idno.dwSize = dataStr.size();
  614. //7发证机关
  615. dataStr = m_IDInfoEx.department;
  616. dataStr = trim(dataStr);
  617. strcpy_s(idCerInfo.department.data, m_IDInfoEx.department);
  618. idCerInfo.department.dwSize = dataStr.size();
  619. //8有效期起始时间
  620. char starttime[9];
  621. memset(starttime, 0, 9);
  622. for (int i=0; i<8; i++)
  623. {
  624. starttime[i] = m_IDInfoEx.timeLimit[i];
  625. }
  626. starttime[8]='\0';
  627. dataStr = starttime;
  628. dataStr = dataStr.insert(4,1,'.');
  629. dataStr = dataStr.insert(7,1,'.');
  630. strcpy_s(idCerInfo.startDate.data, dataStr.c_str());
  631. idCerInfo.startDate.dwSize = dataStr.size();
  632. //9有效期终止时间
  633. int len = strlen(m_IDInfoEx.timeLimit);
  634. if (len > 15)
  635. {
  636. char endtime[9]={0};
  637. for (int i=0; i<8; i++)
  638. {
  639. if( m_IDInfoEx.timeLimit[i] != '.' )
  640. {
  641. endtime[i] = m_IDInfoEx.timeLimit[i + 9];
  642. }
  643. }
  644. endtime[8] = '\0';
  645. dataStr = endtime;
  646. dataStr = dataStr.insert(4,1,'.');
  647. dataStr = dataStr.insert(7,1,'.');
  648. strcpy_s(idCerInfo.endDate.data, dataStr.c_str());
  649. idCerInfo.endDate.dwSize = dataStr.size();
  650. }
  651. else
  652. {
  653. dataStr = m_IDInfoEx.timeLimit;
  654. dataStr = dataStr.substr(9, len-9);
  655. strcpy_s(idCerInfo.endDate.data, dataStr.c_str());
  656. idCerInfo.endDate.dwSize = dataStr.size();
  657. }
  658. //10附加地址
  659. memset(idCerInfo.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  660. idCerInfo.newAddress.dwSize = 0;
  661. //11头像图片保存地址
  662. dataStr = PhotoPath;
  663. strcpy_s(idCerInfo.photoPath.data, PhotoPath);
  664. idCerInfo.photoPath.dwSize = dataStr.size();
  665. LogM("IDCerGetData(), 身份证");
  666. }
  667. else if (m_iCardType == 1) //1-外国人居住证
  668. {
  669. //外国人
  670. //1姓名
  671. std::string dataStr = m_IDForeignInfo.NameCHN;
  672. dataStr = trim(dataStr);
  673. strcpy_s(idCerInfo.name.data,m_IDForeignInfo.NameCHN);
  674. idCerInfo.name.dwSize = dataStr.size();
  675. //2性别
  676. dataStr = m_IDForeignInfo.Sex;
  677. dataStr = trim(dataStr);
  678. strcpy_s(idCerInfo.sex.data, m_IDForeignInfo.Sex);
  679. idCerInfo.sex.dwSize = dataStr.size();
  680. //2019-06-11
  681. //3国籍 ID81开发包没有中文国籍,先用英文代码;
  682. //2019-09-06 V1.0.0.9---------此项为民族,只是二代证专用,见IDCerInfoEx解释;
  683. //dataStr = m_IDForeignInfo.Nation;
  684. //dataStr = trim(dataStr);
  685. //strcpy_s(idCerInfo.nation.data, m_IDForeignInfo.Nation);
  686. //idCerInfo.nation.dwSize = dataStr.size();
  687. memset(idCerInfo.nation.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  688. idCerInfo.nation.dwSize = 0;
  689. //4出生日期
  690. dataStr = m_IDForeignInfo.Born;
  691. dataStr = trim(dataStr);
  692. std::string year = dataStr.substr(0, 4);
  693. std::string month = dataStr.substr(4, 2);
  694. std::string day = dataStr.substr(6, 2);
  695. std::string date = year + "年" + month + "月" + day + "日";
  696. strcpy_s(idCerInfo.birthday.data, date.c_str());
  697. idCerInfo.birthday.dwSize = dataStr.size();
  698. //5地址
  699. memset(idCerInfo.address.data, 0, MAX_IDCER_INFO_SIZE);
  700. idCerInfo.address.dwSize = 0;
  701. //6证件号码
  702. dataStr = m_IDForeignInfo.IDCardNO;
  703. dataStr = trim(dataStr);
  704. strcpy_s(idCerInfo.idno.data, m_IDForeignInfo.IDCardNO);
  705. idCerInfo.idno.dwSize = dataStr.size();
  706. //7发证机关
  707. dataStr = m_IDForeignInfo.Department;
  708. dataStr = trim(dataStr);
  709. strcpy_s(idCerInfo.department.data, m_IDForeignInfo.Department);
  710. idCerInfo.department.dwSize = dataStr.size();
  711. //8有效期起始时间
  712. dataStr = m_IDForeignInfo.TimeLimitBegin;
  713. dataStr = trim(dataStr);
  714. dataStr = dataStr.insert(4,1,'.');
  715. dataStr = dataStr.insert(7,1,'.');
  716. strcpy_s(idCerInfo.startDate.data, dataStr.c_str());
  717. idCerInfo.startDate.dwSize = dataStr.size();
  718. //9有效期终止时间
  719. dataStr = m_IDForeignInfo.TimeLimitEnd;
  720. dataStr = trim(dataStr);
  721. //2019-06-11 修改,注释下面语句,拷贝到endDate(原来拷贝到startDate,错);
  722. //if (strlen(m_IDForeignInfo.TimeLimitEnd) == 8)
  723. {
  724. dataStr = dataStr.insert(4,1,'.');
  725. dataStr = dataStr.insert(7,1,'.');
  726. }
  727. strcpy_s(idCerInfo.endDate.data, dataStr.c_str());
  728. idCerInfo.endDate.dwSize = dataStr.size();
  729. //10附加地址
  730. memset(idCerInfo.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  731. idCerInfo.newAddress.dwSize = 0;
  732. //11头像图片文件保存地址
  733. dataStr = PhotoPath;
  734. strcpy_s(idCerInfo.photoPath.data, PhotoPath);
  735. idCerInfo.photoPath.dwSize = dataStr.size();
  736. LogM("IDCerGetData(), 外国人");
  737. }
  738. else if (m_iCardType == 2) //2-港澳台
  739. {
  740. //港澳台
  741. //1姓名
  742. std::string dataStr = m_IDInfoGAT.name;
  743. dataStr = trim(dataStr);
  744. strcpy_s(idCerInfo.name.data, m_IDInfoGAT.name);
  745. idCerInfo.name.dwSize = dataStr.size();
  746. //2性别
  747. dataStr = m_IDInfoGAT.sex;
  748. dataStr = trim(dataStr);
  749. strcpy_s(idCerInfo.sex.data, m_IDInfoGAT.sex);
  750. idCerInfo.sex.dwSize = dataStr.size();
  751. //3民族
  752. memset(idCerInfo.nation.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  753. idCerInfo.nation.dwSize = 0;
  754. //4出生日期
  755. dataStr = m_IDInfoGAT.birthday;
  756. dataStr = trim(dataStr);
  757. std::string year = dataStr.substr(0, 4);
  758. std::string month = dataStr.substr(4, 2);
  759. std::string day = dataStr.substr(6, 2);
  760. std::string date = year + "年" + month + "月" + day + "日";
  761. strcpy_s(idCerInfo.birthday.data, date.c_str());
  762. idCerInfo.birthday.dwSize = dataStr.size();
  763. //5地址
  764. dataStr = m_IDInfoGAT.address;
  765. dataStr = trim(dataStr);
  766. strcpy_s(idCerInfo.address.data,m_IDInfoGAT.address);
  767. idCerInfo.address.dwSize = dataStr.size();
  768. //6身份证号
  769. dataStr = m_IDInfoGAT.number;
  770. dataStr = trim(dataStr);
  771. strcpy_s(idCerInfo.idno.data, m_IDInfoGAT.number);
  772. idCerInfo.idno.dwSize = dataStr.size();
  773. //7发证机关
  774. dataStr = m_IDInfoGAT.department;
  775. dataStr = trim(dataStr);
  776. strcpy_s(idCerInfo.department.data, m_IDInfoGAT.department);
  777. idCerInfo.department.dwSize = dataStr.size();
  778. //8有效期起始时间
  779. char starttime[9];
  780. memset(starttime, 0, 9);
  781. for (int i=0; i<8; i++)
  782. {
  783. starttime[i] = m_IDInfoGAT.timeLimit[i];
  784. }
  785. starttime[8]='\0';
  786. dataStr = starttime;
  787. dataStr = dataStr.insert(4,1,'.');
  788. dataStr = dataStr.insert(7,1,'.');
  789. strcpy_s(idCerInfo.startDate.data, dataStr.c_str());
  790. idCerInfo.startDate.dwSize = dataStr.size();
  791. //9有效期终止时间
  792. int len = strlen(m_IDInfoGAT.timeLimit);
  793. if (len > 15)
  794. {
  795. char endtime[9]={0};
  796. for (int i=0; i<8; i++)
  797. {
  798. if( m_IDInfoGAT.timeLimit[i] != '.' )
  799. {
  800. endtime[i] = m_IDInfoGAT.timeLimit[i + 9];
  801. }
  802. }
  803. endtime[8] = '\0';
  804. dataStr = endtime;
  805. dataStr = dataStr.insert(4,1,'.');
  806. dataStr = dataStr.insert(7,1,'.');
  807. strcpy_s(idCerInfo.endDate.data, dataStr.c_str());
  808. idCerInfo.endDate.dwSize = dataStr.size();
  809. }
  810. else
  811. {
  812. dataStr = m_IDInfoGAT.timeLimit;
  813. dataStr = dataStr.substr(9, len-9);
  814. strcpy_s(idCerInfo.endDate.data, dataStr.c_str());
  815. idCerInfo.endDate.dwSize = dataStr.size();
  816. }
  817. //10最新地址
  818. memset(idCerInfo.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  819. idCerInfo.newAddress.dwSize = 0;
  820. //11头像保存路径和文件名
  821. dataStr = PhotoPath;
  822. strcpy_s(idCerInfo.photoPath.data, PhotoPath);
  823. idCerInfo.photoPath.dwSize = dataStr.size();
  824. LogM("IDCerGetData(), 港澳台");
  825. }
  826. else
  827. {
  828. //无效卡(这里包括港澳台居住证,因为未接到招行提出改造此接口要求;)
  829. SaveErrorInfo("无效卡", Error_DevMedia);
  830. LogE("IDCerGetData(), 无效卡, nRet=%d", Error_DevMedia);
  831. return Error_DevMedia;
  832. }
  833. LogM("IDCerGetData(), nRet=%d", Error_Succeed);
  834. LogM("IDCerGetData() return:\
  835. \nName:%s\n Sex:%s\nNation: %s\nBirth: %s\nAddress:%s\nIDCode:%s\
  836. \nDepart: %s\nStartDate: %s\nEndDate: %s\nNewAddress:%s\nPhotoPath:%s\n",
  837. idCerInfo.name.data, idCerInfo.sex.data, idCerInfo.nation.data,
  838. idCerInfo.birthday.data, idCerInfo.address.data, idCerInfo.idno.data,
  839. idCerInfo.department.data, idCerInfo.startDate.data, idCerInfo.endDate.data,
  840. idCerInfo.newAddress.data, idCerInfo.photoPath.data);
  841. return Error_Succeed;
  842. }
  843. //2017-06-19 增加外国人永久居留证接口
  844. // 获取证件信息,包括二代身份证、外国人永久居留证
  845. // Get Identity Card info.
  846. //
  847. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
  848. {
  849. LOG_FUNCTION();
  850. if(!m_bDevOpen)
  851. {
  852. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  853. LogE("IDCerGetDataEx(),设备未打开, nRet=%d", Error_DevNotAvailable);
  854. return Error_DevNotAvailable;
  855. }
  856. if (!m_bAuthed)
  857. {
  858. SaveErrorInfo("未认证成功。", Error_DevMedia);
  859. LogE("IDCerGetDataEx(),未认证成功, nRet=%d", Error_DevMedia);
  860. return Error_DevMedia;
  861. }
  862. m_bAuthed = false; //认证成功只能读一次,下次必须重新认证;
  863. std::string dllPath;
  864. int bRet = GetDllPathLocal(dllPath);
  865. std::string ckStr = dllPath + "ck.bmp";
  866. std::string zpStr = dllPath + "zp.bmp";
  867. std::string commond="mv"+std::string(" ")+ckStr+std::string(" ")+zpStr;
  868. system(commond.c_str());
  869. std::string strLog = "IDCerGetData(),ckStr=[" + ckStr + "],zpStr=[" + zpStr + "]";
  870. LogM("%s",strLog.c_str());
  871. memset(PhotoPath, 0, MAX_FILE_PATH);
  872. memcpy(PhotoPath, zpStr.c_str(), zpStr.length());
  873. memset(&idCerInfoEx, 0, sizeof(IDCerInfoEx));
  874. if (m_iCardType == 0) //0-身份证
  875. {
  876. //身份证
  877. //1姓名
  878. std::string dataStr = m_IDInfoEx.name;
  879. dataStr = trim(dataStr);
  880. memset(idCerInfoEx.name.data, 0, MAX_IDCER_INFO_SIZE);
  881. strcpy_s(idCerInfoEx.name.data, m_IDInfoEx.name);
  882. idCerInfoEx.name.dwSize = dataStr.size();
  883. //2性别
  884. dataStr = m_IDInfoEx.sex;
  885. dataStr = trim(dataStr);
  886. memset(idCerInfoEx.sex.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  887. strcpy_s(idCerInfoEx.sex.data, m_IDInfoEx.sex);
  888. idCerInfoEx.sex.dwSize = dataStr.size();
  889. //3民族
  890. dataStr = m_IDInfoEx.nation;
  891. dataStr = trim(dataStr);
  892. memset(idCerInfoEx.nation.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  893. strcpy_s(idCerInfoEx.nation.data, m_IDInfoEx.nation);
  894. idCerInfoEx.nation.dwSize = dataStr.size();
  895. //4出生日期
  896. dataStr = m_IDInfoEx.birthday;
  897. dataStr = trim(dataStr);
  898. std::string year = dataStr.substr(0, 4);
  899. std::string month = dataStr.substr(4, 2);
  900. std::string day = dataStr.substr(6, 2);
  901. std::string date = year + "年" + month + "月" + day + "日";
  902. memset(idCerInfoEx.birthday.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  903. strcpy_s(idCerInfoEx.birthday.data, date.c_str());
  904. idCerInfoEx.birthday.dwSize = dataStr.size();
  905. //5地址
  906. dataStr = m_IDInfoEx.address;
  907. dataStr = trim(dataStr);
  908. memset(idCerInfoEx.address.data, 0, MAX_IDCER_INFO_SIZE);
  909. strcpy_s(idCerInfoEx.address.data,m_IDInfoEx.address);
  910. idCerInfoEx.address.dwSize = dataStr.size();
  911. //6身份证号
  912. dataStr = m_IDInfoEx.number;
  913. dataStr = trim(dataStr);
  914. memset(idCerInfoEx.idno.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  915. strcpy_s(idCerInfoEx.idno.data, m_IDInfoEx.number);
  916. idCerInfoEx.idno.dwSize = dataStr.size();
  917. //7发证机关
  918. dataStr = m_IDInfoEx.department;
  919. dataStr = trim(dataStr);
  920. memset(idCerInfoEx.department.data, 0, MAX_IDCER_INFO_SIZE);
  921. strcpy_s(idCerInfoEx.department.data, m_IDInfoEx.department);
  922. idCerInfoEx.department.dwSize = dataStr.size();
  923. //8有效期起始时间
  924. char starttime[9];
  925. memset(starttime, 0, 9);
  926. for (int i=0; i<8; i++)
  927. {
  928. starttime[i] = m_IDInfoEx.timeLimit[i];
  929. }
  930. starttime[8]='\0';
  931. dataStr = starttime;
  932. dataStr = dataStr.insert(4,1,'.');
  933. dataStr = dataStr.insert(7,1,'.');
  934. memset(idCerInfoEx.startDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  935. strcpy_s(idCerInfoEx.startDate.data, dataStr.c_str());
  936. idCerInfoEx.startDate.dwSize = dataStr.size();
  937. //9有效期终止时间
  938. int len = strlen(m_IDInfoEx.timeLimit);
  939. if (len > 15)
  940. {
  941. char endtime[9]={0};
  942. for (int i=0; i<8; i++)
  943. {
  944. if( m_IDInfoEx.timeLimit[i] != '.' )
  945. {
  946. endtime[i] = m_IDInfoEx.timeLimit[i + 9];
  947. }
  948. }
  949. endtime[8] = '\0';
  950. dataStr = endtime;
  951. dataStr = dataStr.insert(4,1,'.');
  952. dataStr = dataStr.insert(7,1,'.');
  953. memset(idCerInfoEx.endDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  954. strcpy_s(idCerInfoEx.endDate.data, dataStr.c_str());
  955. idCerInfoEx.endDate.dwSize = dataStr.size();
  956. }
  957. else
  958. {
  959. dataStr = m_IDInfoEx.timeLimit;
  960. dataStr = dataStr.substr(9, len-9);
  961. memset(idCerInfoEx.endDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  962. strcpy_s(idCerInfoEx.endDate.data, dataStr.c_str());
  963. idCerInfoEx.endDate.dwSize = dataStr.size();
  964. }
  965. //10最新地址
  966. memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  967. idCerInfoEx.newAddress.dwSize = 0;
  968. //11头像保存路径和文件名
  969. dataStr = PhotoPath;
  970. memset(idCerInfoEx.photoPath.data, 0, MAX_IDCER_PHOTO_PATH);
  971. strcpy_s(idCerInfoEx.photoPath.data, PhotoPath);
  972. idCerInfoEx.photoPath.dwSize = dataStr.size();
  973. //12英文姓名
  974. memset(idCerInfoEx.englishName.data, 0, MAX_IDCER_INFO_SIZE);
  975. idCerInfoEx.englishName.dwSize = 0;
  976. //13民族代码
  977. memset(idCerInfoEx.nationality.data, 0, IDCER_EIGHT_BYTE_SIZE);
  978. idCerInfoEx.nationality.dwSize = 0;
  979. //14证件版本号
  980. memset(idCerInfoEx.idVersion.data, 0, IDCER_EIGHT_BYTE_SIZE);
  981. idCerInfoEx.idVersion.dwSize = 0;
  982. //15证件类型标识,空(二代证),'I'(外国人),'J'(港澳台)
  983. memset(idCerInfoEx.idType.data, 0, IDCER_EIGHT_BYTE_SIZE);
  984. idCerInfoEx.idType.dwSize = 0;
  985. //16保留字段
  986. memset(idCerInfoEx.reserved.data, 0, IDCER_EIGHT_BYTE_SIZE);
  987. idCerInfoEx.reserved.dwSize = 0;
  988. //港澳台扩展
  989. /* 先注释这部分,因为测试工具DevTestTool.exe暂不支持;
  990. */
  991. //17通行证号码
  992. memset(idCerInfoEx.txzCode.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  993. idCerInfoEx.txzCode.dwSize = 0;
  994. //18签发次数
  995. memset(idCerInfoEx.issuedSN.data, 0, IDCER_EIGHT_BYTE_SIZE);
  996. idCerInfoEx.issuedSN.dwSize = 0;
  997. //19备用2
  998. memset(idCerInfoEx.reserved2.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  999. idCerInfoEx.reserved2.dwSize = 0;
  1000. //20备用3
  1001. memset(idCerInfoEx.reserved3.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1002. idCerInfoEx.reserved3.dwSize = 0;
  1003. //21备用4
  1004. memset(idCerInfoEx.reserved4.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1005. idCerInfoEx.reserved4.dwSize = 0;
  1006. //22备用5
  1007. memset(idCerInfoEx.reserved5.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1008. idCerInfoEx.reserved5.dwSize = 0;
  1009. LogM("IDCerGetDataEx(), 身份证");
  1010. }
  1011. else if (m_iCardType == 1) //1-外国人居住证
  1012. {
  1013. //外国人
  1014. //1姓名
  1015. std::string dataStr = m_IDForeignInfo.NameCHN;
  1016. dataStr = trim(dataStr);
  1017. memset(idCerInfoEx.name.data, 0, MAX_IDCER_INFO_SIZE);
  1018. strcpy_s(idCerInfoEx.name.data,m_IDForeignInfo.NameCHN);
  1019. idCerInfoEx.name.dwSize = dataStr.size();
  1020. //2性别
  1021. dataStr = m_IDForeignInfo.Sex;
  1022. dataStr = trim(dataStr);
  1023. memset(idCerInfoEx.sex.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1024. strcpy_s(idCerInfoEx.sex.data, m_IDForeignInfo.Sex);
  1025. idCerInfoEx.sex.dwSize = dataStr.size();
  1026. //2019-06-11
  1027. //3国籍 ID81开发包没有中文国籍,先用英文代码;
  1028. memset(idCerInfoEx.nation.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1029. idCerInfoEx.nation.dwSize = 0;
  1030. //4出生日期
  1031. dataStr = m_IDForeignInfo.Born;
  1032. dataStr = trim(dataStr);
  1033. std::string year = dataStr.substr(0, 4);
  1034. std::string month = dataStr.substr(4, 2);
  1035. std::string day = dataStr.substr(6, 2);
  1036. std::string date = year + "年" + month + "月" + day + "日";
  1037. memset(idCerInfoEx.birthday.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1038. strcpy_s(idCerInfoEx.birthday.data, date.c_str());
  1039. idCerInfoEx.birthday.dwSize = dataStr.size();
  1040. //5地址
  1041. memset(idCerInfoEx.address.data, 0, MAX_IDCER_INFO_SIZE);
  1042. idCerInfoEx.address.dwSize = 0;
  1043. //6证件号码
  1044. dataStr = m_IDForeignInfo.IDCardNO;
  1045. dataStr = trim(dataStr);
  1046. memset(idCerInfoEx.idno.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1047. strcpy_s(idCerInfoEx.idno.data, m_IDForeignInfo.IDCardNO);
  1048. idCerInfoEx.idno.dwSize = dataStr.size();
  1049. //7发证机关
  1050. dataStr = m_IDForeignInfo.Department;
  1051. dataStr = trim(dataStr);
  1052. memset(idCerInfoEx.department.data, 0, MAX_IDCER_INFO_SIZE);
  1053. strcpy_s(idCerInfoEx.department.data, m_IDForeignInfo.Department);
  1054. idCerInfoEx.department.dwSize = dataStr.size();
  1055. //8有效期起始时间
  1056. dataStr = m_IDForeignInfo.TimeLimitBegin;
  1057. dataStr = trim(dataStr);
  1058. dataStr = dataStr.insert(4,1,'.');
  1059. dataStr = dataStr.insert(7,1,'.');
  1060. memset(idCerInfoEx.startDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1061. strcpy_s(idCerInfoEx.startDate.data, dataStr.c_str());
  1062. idCerInfoEx.startDate.dwSize = dataStr.size();
  1063. //9有效期终止时间
  1064. dataStr = m_IDForeignInfo.TimeLimitEnd;
  1065. dataStr = trim(dataStr);
  1066. //2019-06-11 修改,注释下面语句,拷贝到endDate(原来拷贝到startDate,错);
  1067. //if (strlen(m_IDForeignInfo.TimeLimitEnd) == 8)
  1068. {
  1069. dataStr = dataStr.insert(4,1,'.');
  1070. dataStr = dataStr.insert(7,1,'.');
  1071. }
  1072. memset(idCerInfoEx.endDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1073. strcpy_s(idCerInfoEx.endDate.data, dataStr.c_str());
  1074. idCerInfoEx.endDate.dwSize = dataStr.size();
  1075. //----------------------------------------------
  1076. //10最新地址
  1077. memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  1078. idCerInfoEx.newAddress.dwSize = 0;
  1079. //11头像保存路径和文件名
  1080. dataStr = PhotoPath;
  1081. memset(idCerInfoEx.photoPath.data, 0, MAX_IDCER_PHOTO_PATH);
  1082. strcpy_s(idCerInfoEx.photoPath.data, PhotoPath);
  1083. idCerInfoEx.photoPath.dwSize = dataStr.size();
  1084. //12英文姓名,外国人专用
  1085. dataStr = m_IDForeignInfo.NameENG;
  1086. dataStr = trim(dataStr);
  1087. memset(idCerInfoEx.englishName.data, 0, MAX_IDCER_INFO_SIZE);
  1088. strcpy_s(idCerInfoEx.englishName.data, m_IDForeignInfo.NameENG);
  1089. idCerInfoEx.englishName.dwSize = dataStr.size();
  1090. //13国籍或地区代码,外国人专用
  1091. dataStr = m_IDForeignInfo.Nation;
  1092. dataStr = trim(dataStr);
  1093. memset(idCerInfoEx.nationality.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1094. strcpy_s(idCerInfoEx.nationality.data, m_IDForeignInfo.Nation);
  1095. idCerInfoEx.nationality.dwSize = dataStr.size();
  1096. //14证件版本号,外国人专用
  1097. dataStr = m_IDForeignInfo.IDVersion;
  1098. dataStr = trim(dataStr);
  1099. memset(idCerInfoEx.idVersion.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1100. strcpy_s(idCerInfoEx.idVersion.data, m_IDForeignInfo.IDVersion);
  1101. idCerInfoEx.idVersion.dwSize = dataStr.size();
  1102. //15证件类型标识,外国人取值'I',二代证为空,'J'(港澳台)
  1103. memset(idCerInfoEx.idType.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1104. idCerInfoEx.idType.dwSize = 1;
  1105. idCerInfoEx.idType.data[0] = 'I';
  1106. //16保留字段,外国人专用
  1107. memset(idCerInfoEx.reserved.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1108. idCerInfoEx.reserved.dwSize = 0;
  1109. //港澳台扩展
  1110. /* 先注释这部分,因为测试工具DevTestTool.exe暂不支持;
  1111. */
  1112. //17通行证号码
  1113. memset(idCerInfoEx.txzCode.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1114. idCerInfoEx.txzCode.dwSize = 0;
  1115. //18签发次数
  1116. memset(idCerInfoEx.issuedSN.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1117. idCerInfoEx.issuedSN.dwSize = 0;
  1118. //19备用2
  1119. memset(idCerInfoEx.reserved2.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1120. idCerInfoEx.reserved2.dwSize = 0;
  1121. //20备用3
  1122. memset(idCerInfoEx.reserved3.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1123. idCerInfoEx.reserved3.dwSize = 0;
  1124. //21备用4
  1125. memset(idCerInfoEx.reserved4.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1126. idCerInfoEx.reserved4.dwSize = 0;
  1127. //22备用5
  1128. memset(idCerInfoEx.reserved5.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1129. idCerInfoEx.reserved5.dwSize = 0;
  1130. LogM("IDCerGetDataEx(), 外国人");
  1131. }
  1132. else if (m_iCardType == 2) //2-港澳台
  1133. {
  1134. //港澳台
  1135. //1姓名
  1136. std::string dataStr = m_IDInfoGAT.name;
  1137. dataStr = trim(dataStr);
  1138. memset(idCerInfoEx.name.data, 0, MAX_IDCER_INFO_SIZE);
  1139. strcpy_s(idCerInfoEx.name.data, m_IDInfoGAT.name);
  1140. idCerInfoEx.name.dwSize = dataStr.size();
  1141. //2性别
  1142. dataStr = m_IDInfoGAT.sex;
  1143. dataStr = trim(dataStr);
  1144. memset(idCerInfoEx.sex.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1145. strcpy_s(idCerInfoEx.sex.data, m_IDInfoGAT.sex);
  1146. idCerInfoEx.sex.dwSize = dataStr.size();
  1147. //3民族
  1148. memset(idCerInfoEx.nation.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1149. idCerInfoEx.nation.dwSize = 0;
  1150. //4出生日期
  1151. dataStr = m_IDInfoGAT.birthday;
  1152. dataStr = trim(dataStr);
  1153. std::string year = dataStr.substr(0, 4);
  1154. std::string month = dataStr.substr(4, 2);
  1155. std::string day = dataStr.substr(6, 2);
  1156. std::string date = year + "年" + month + "月" + day + "日";
  1157. memset(idCerInfoEx.birthday.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1158. strcpy_s(idCerInfoEx.birthday.data, date.c_str());
  1159. idCerInfoEx.birthday.dwSize = dataStr.size();
  1160. //5地址
  1161. dataStr = m_IDInfoGAT.address;
  1162. dataStr = trim(dataStr);
  1163. memset(idCerInfoEx.address.data, 0, MAX_IDCER_INFO_SIZE);
  1164. strcpy_s(idCerInfoEx.address.data,m_IDInfoGAT.address);
  1165. idCerInfoEx.address.dwSize = dataStr.size();
  1166. //6身份证号
  1167. dataStr = m_IDInfoGAT.number;
  1168. dataStr = trim(dataStr);
  1169. memset(idCerInfoEx.idno.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1170. strcpy_s(idCerInfoEx.idno.data, m_IDInfoGAT.number);
  1171. idCerInfoEx.idno.dwSize = dataStr.size();
  1172. //7发证机关
  1173. dataStr = m_IDInfoGAT.department;
  1174. dataStr = trim(dataStr);
  1175. memset(idCerInfoEx.department.data, 0, MAX_IDCER_INFO_SIZE);
  1176. strcpy_s(idCerInfoEx.department.data, m_IDInfoGAT.department);
  1177. idCerInfoEx.department.dwSize = dataStr.size();
  1178. //8有效期起始时间
  1179. char starttime[9];
  1180. memset(starttime, 0, 9);
  1181. for (int i=0; i<8; i++)
  1182. {
  1183. starttime[i] = m_IDInfoGAT.timeLimit[i];
  1184. }
  1185. starttime[8]='\0';
  1186. dataStr = starttime;
  1187. dataStr = dataStr.insert(4,1,'.');
  1188. dataStr = dataStr.insert(7,1,'.');
  1189. memset(idCerInfoEx.startDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1190. strcpy_s(idCerInfoEx.startDate.data, dataStr.c_str());
  1191. idCerInfoEx.startDate.dwSize = dataStr.size();
  1192. //9有效期终止时间
  1193. int len = strlen(m_IDInfoGAT.timeLimit);
  1194. if (len > 15)
  1195. {
  1196. char endtime[9]={0};
  1197. for (int i=0; i<8; i++)
  1198. {
  1199. if( m_IDInfoGAT.timeLimit[i] != '.' )
  1200. {
  1201. endtime[i] = m_IDInfoGAT.timeLimit[i + 9];
  1202. }
  1203. }
  1204. endtime[8] = '\0';
  1205. dataStr = endtime;
  1206. dataStr = dataStr.insert(4,1,'.');
  1207. dataStr = dataStr.insert(7,1,'.');
  1208. memset(idCerInfoEx.endDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1209. strcpy_s(idCerInfoEx.endDate.data, dataStr.c_str());
  1210. idCerInfoEx.endDate.dwSize = dataStr.size();
  1211. }
  1212. else
  1213. {
  1214. dataStr = m_IDInfoGAT.timeLimit;
  1215. dataStr = dataStr.substr(9, len-9);
  1216. memset(idCerInfoEx.endDate.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1217. strcpy_s(idCerInfoEx.endDate.data, dataStr.c_str());
  1218. idCerInfoEx.endDate.dwSize = dataStr.size();
  1219. }
  1220. //10最新地址
  1221. memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE);
  1222. idCerInfoEx.newAddress.dwSize = 0;
  1223. //11头像保存路径和文件名
  1224. dataStr = PhotoPath;
  1225. memset(idCerInfoEx.photoPath.data, 0, MAX_IDCER_PHOTO_PATH);
  1226. strcpy_s(idCerInfoEx.photoPath.data, PhotoPath);
  1227. idCerInfoEx.photoPath.dwSize = dataStr.size();
  1228. //12英文姓名
  1229. memset(idCerInfoEx.englishName.data, 0, MAX_IDCER_INFO_SIZE);
  1230. idCerInfoEx.englishName.dwSize = 0;
  1231. //13民族代码
  1232. memset(idCerInfoEx.nationality.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1233. idCerInfoEx.nationality.dwSize = 0;
  1234. //14证件版本号
  1235. memset(idCerInfoEx.idVersion.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1236. idCerInfoEx.idVersion.dwSize = 0;
  1237. //15证件类型标识,空(二代证),'I'(外国人),'J'(港澳台)
  1238. memset(idCerInfoEx.idType.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1239. idCerInfoEx.idType.dwSize = 1;
  1240. idCerInfoEx.idType.data[0] = 'J';
  1241. //16保留字段
  1242. memset(idCerInfoEx.reserved.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1243. idCerInfoEx.reserved.dwSize = 0;
  1244. //港澳台扩展
  1245. /* 先注释这部分,因为测试工具DevTestTool.exe暂不支持;
  1246. */
  1247. //17通行证号码
  1248. dataStr = m_IDInfoGAT.passport;
  1249. dataStr = trim(dataStr);
  1250. memset(idCerInfoEx.txzCode.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1251. strcpy_s(idCerInfoEx.txzCode.data, m_IDInfoGAT.passport);
  1252. idCerInfoEx.txzCode.dwSize = dataStr.size();
  1253. //18签发次数
  1254. dataStr = m_IDInfoGAT.issue;
  1255. dataStr = trim(dataStr);
  1256. memset(idCerInfoEx.issuedSN.data, 0, IDCER_EIGHT_BYTE_SIZE);
  1257. strcpy_s(idCerInfoEx.issuedSN.data,m_IDInfoGAT.issue);
  1258. idCerInfoEx.issuedSN.dwSize = dataStr.size();
  1259. //19备用2
  1260. memset(idCerInfoEx.reserved2.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1261. idCerInfoEx.reserved2.dwSize = 0;
  1262. //20备用3
  1263. memset(idCerInfoEx.reserved3.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1264. idCerInfoEx.reserved3.dwSize = 0;
  1265. //21备用4
  1266. memset(idCerInfoEx.reserved4.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1267. idCerInfoEx.reserved4.dwSize = 0;
  1268. //22备用5
  1269. memset(idCerInfoEx.reserved5.data, 0, MAX_IDCER_SIMPLE_INFO_SIZE);
  1270. idCerInfoEx.reserved5.dwSize = 0;
  1271. //g_pLog->Print("IDCerGetDataEx(), 港澳台");
  1272. LogM("IDCerGetDataEx(), 港澳台");
  1273. }
  1274. else
  1275. {
  1276. //无效卡(这里包括港澳台居住证,因为未接到招行提出改造此接口要求;)
  1277. SaveErrorInfo("无效卡", Error_DevMedia);
  1278. //g_pLog->Print("IDCerGetDataEx(), 无效卡, nRet=%d", Error_DevMedia);
  1279. return Error_DevMedia;
  1280. }
  1281. LogM("IDCerGetDataEx(), nRet=%d", Error_Succeed);
  1282. LogM("IDCerGetDataEx() return:\
  1283. \nName:%s\n Sex:%s\nNation: %s\nBirth: %s\nAddress:%s\nIDCode:%s\nDepart: %s\nStartDate: %s\nEndDate: %s\
  1284. \nNewAddress: %s\nphotoPath: %s\nEnglishName: %s\nNationality: %s\nIdVersin: %s\nIdType: %s\nreserved: %s\nissuedSN: %s\
  1285. \nzCotxde: %s\nreserved2: %s\nreserved3: %s\nreserved4: %s\nreserved5: %s",
  1286. idCerInfoEx.name.data, idCerInfoEx.sex.data, idCerInfoEx.nation.data,
  1287. idCerInfoEx.birthday.data, idCerInfoEx.address.data, idCerInfoEx.idno.data,
  1288. idCerInfoEx.department.data, idCerInfoEx.startDate.data, idCerInfoEx.endDate.data,
  1289. idCerInfoEx.newAddress.data, idCerInfoEx.photoPath.data, idCerInfoEx.englishName.data,
  1290. idCerInfoEx.nationality.data, idCerInfoEx.idVersion.data, idCerInfoEx.idType.data,
  1291. idCerInfoEx.reserved.data, idCerInfoEx.issuedSN.data, idCerInfoEx.txzCode.data,
  1292. idCerInfoEx.reserved2.data, idCerInfoEx.reserved3.data, idCerInfoEx.reserved4.data, idCerInfoEx.reserved5.data);
  1293. return Error_Succeed;
  1294. }
  1295. ErrorCodeEnum IDCerClassImpl::ForceIDEject()
  1296. {
  1297. LOG_FUNCTION();
  1298. LogM("ForceIDEject() Entry.");
  1299. if(!m_bDevOpen)
  1300. {
  1301. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  1302. //g_pLog->Print("ForceIDEject(), 设备未打开, nRet=%d", Error_DevNotAvailable);
  1303. LogM("ForceIDEject(), 设备未打开, nRet=%d", Error_DevNotAvailable);
  1304. return Error_DevNotAvailable;
  1305. }
  1306. int pos = -1;
  1307. ErrorCodeEnum nRet = QueryCardPos(pos);
  1308. if ((nRet == Error_Succeed) && pos == 0)
  1309. {
  1310. SaveErrorInfo("未检测到卡", Error_DevMedia);
  1311. LogM("ForceIDEject(), 未检测到卡, nRet=%d", Error_DevMedia);
  1312. return Error_DevMedia;
  1313. }
  1314. int bRet = m_cBS_ID81IDCImpl.EjectIdCard(SecDeviceNum);
  1315. if (bRet != IDDIGITALCOPIER_NO_ERROR)
  1316. {
  1317. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  1318. LogM("ForceIDEject(), 通讯异常, nRet=%d", Error_DevCommFailed);
  1319. return Error_DevCommFailed;
  1320. }
  1321. LogM("ForceIDEject(), nRet=%d", Error_Succeed);
  1322. return Error_Succeed;
  1323. }
  1324. ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
  1325. {
  1326. LOG_FUNCTION();
  1327. if(!m_bDevOpen)
  1328. {
  1329. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  1330. LogM("ScanIDAndSaveImage(), 设备未打开, nRet=%d", Error_DevNotAvailable);
  1331. return Error_DevNotAvailable;
  1332. }
  1333. memset(PhotoPath, 0, MAX_FILE_PATH);
  1334. std::string dllPath;
  1335. GetDllPathLocal(dllPath);
  1336. memcpy(PhotoPath, dllPath.c_str(), dllPath.length());
  1337. char FileNamefront[256] = {0};
  1338. char FileNameback[256] = {0};
  1339. strcpy_s(FileNamefront, PhotoPath);
  1340. strcat_s(FileNamefront, "idfront.bmp");
  1341. strcpy_s(FileNameback, PhotoPath);
  1342. strcat_s(FileNameback, "idback.bmp");
  1343. int nRet = m_cBS_ID81IDCImpl.StartScan(SecDeviceNum);
  1344. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  1345. {
  1346. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  1347. LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
  1348. return Error_DevCommFailed;
  1349. }
  1350. int iFrontLen;
  1351. int iRearLen;
  1352. //--------------改为与厂家DEMO相似,采用NEW方式申请数组空间;
  1353. char* cFrontImgBuf = new char[MAX_PICTURE_SIZE];
  1354. char* cRearImgBuf = new char[MAX_PICTURE_SIZE];
  1355. nRet=m_cBS_ID81IDCImpl.ReadCard(SecDeviceNum, cFrontImgBuf, cRearImgBuf, &iFrontLen, &iRearLen);
  1356. if (iFrontLen > 0)
  1357. {
  1358. nRet = m_cBS_ID81IDCImpl.SaveToFile(SecDeviceNum, cFrontImgBuf, iFrontLen, FileNamefront, 1);
  1359. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  1360. {
  1361. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  1362. nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
  1363. LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
  1364. delete []cFrontImgBuf;
  1365. delete []cRearImgBuf;
  1366. return Error_DevCommFailed;
  1367. }
  1368. }
  1369. if (iRearLen>0)
  1370. {
  1371. nRet = m_cBS_ID81IDCImpl.SaveToFile(SecDeviceNum,cRearImgBuf,iRearLen,FileNameback,1);
  1372. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  1373. {
  1374. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  1375. nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
  1376. LogM("ScanIDAndSaveImage(), 通讯异常, nRet=%d", Error_DevCommFailed);
  1377. delete []cFrontImgBuf;
  1378. delete []cRearImgBuf;
  1379. return Error_DevCommFailed;
  1380. }
  1381. }
  1382. nRet = m_cBS_ID81IDCImpl.BackAndHoldCard(SecDeviceNum);
  1383. LogM("ScanIDAndSaveImage(), nRet=%d", Error_Succeed);
  1384. delete []cFrontImgBuf;
  1385. delete []cRearImgBuf;
  1386. return Error_Succeed;
  1387. }
  1388. ErrorCodeEnum IDCerClassImpl::QueryCardPos(int &pos)
  1389. {
  1390. LOG_FUNCTION();
  1391. LogM("QueryCardPos() Entry.");
  1392. if(!m_bDevOpen)
  1393. {
  1394. SaveErrorInfo("设备未打开", Error_DevNotAvailable);
  1395. LogM("QueryCardPos(), 设备未打开, nRet=%d", Error_DevNotAvailable);
  1396. return Error_DevNotAvailable;
  1397. }
  1398. DEVSTATUS m_DeviceStatus;
  1399. memset(&m_DeviceStatus, 0x00, sizeof(DEVSTATUS));
  1400. int nRet = m_cBS_ID81IDCImpl.DeviceStatus(SecDeviceNum, &m_DeviceStatus);
  1401. if (nRet != IDDIGITALCOPIER_NO_ERROR)
  1402. {
  1403. SaveErrorInfo("通讯异常", Error_DevCommFailed);
  1404. LogM("QueryCardPos(), 通讯异常, nRet=%d", Error_DevCommFailed);
  1405. return Error_DevCommFailed;
  1406. }
  1407. if ((m_DeviceStatus.iStatusInputSensorHaveCard == 1) &&
  1408. (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
  1409. (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
  1410. {
  1411. pos = 2;
  1412. LogM("QueryCardPos(), pos=2, 证件在进卡口");
  1413. }
  1414. if ((m_DeviceStatus.iStatusMiddleSensorHaveCard == 1) ||
  1415. (m_DeviceStatus.iStatusScanSensorHaveCard ==1))
  1416. {
  1417. pos = 1;
  1418. LogM("QueryCardPos(), pos=1, 证件在读卡器内部");
  1419. }
  1420. if ((m_DeviceStatus.iStatusInputSensorHaveCard == 0) &&
  1421. (m_DeviceStatus.iStatusMiddleSensorHaveCard == 0) &&
  1422. (m_DeviceStatus.iStatusScanSensorHaveCard ==0))
  1423. {
  1424. pos = 0;
  1425. LogM("QueryCardPos(), pos=0, 未检测到任何证件");
  1426. }
  1427. LogM("QueryCardPos(), nRet=%d", Error_Succeed);
  1428. return Error_Succeed;
  1429. }
  1430. //Private
  1431. void IDCerClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode)
  1432. {
  1433. LOG_FUNCTION();
  1434. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  1435. sprintf(m_szErrMsg, "%s[%d]", errMsg, errCode);
  1436. }
  1437. int IDCerClassImpl::string_format(std::string &str, const std::string fmt, ...)
  1438. {
  1439. char *buf;
  1440. va_list ap;
  1441. va_start(ap, fmt);
  1442. int len = vprintf (fmt.c_str(), ap) + 1;
  1443. buf = (char *) malloc (len * sizeof (char));
  1444. if (!buf)
  1445. {
  1446. return -1;
  1447. }
  1448. memset(buf, 0, len);
  1449. int nRet = vsnprintf (buf, len, fmt.c_str(), ap);
  1450. va_end(ap);
  1451. str = std::string(buf);
  1452. free(buf);
  1453. return nRet;
  1454. }
  1455. //删除某目录下的文件,不删除子目录文件,不放回回收站,支持通配符*、?,例如:SH_DeleteFileOrDirectory("c:\\data\\1??.*");
  1456. //删除所有文件夹及文件,不放回回收站,例如:SH_DeleteFileOrDirectory("c:\\data");
  1457. bool IDCerClassImpl::SH_DeleteFileOrDirectory(char *strFileName)
  1458. {
  1459. int nLength = strlen(strFileName);
  1460. char *strSrc = new char[nLength+2];
  1461. memset(strSrc, 0, nLength+2);
  1462. //strcpy(strSrc, strFileName);
  1463. strcpy_s(strSrc, nLength+1, strFileName);
  1464. strSrc[nLength+1] = '\0';
  1465. std::string trash_path="/root/.local/share/Trash/";
  1466. trash_path=trash_path+std::string(strSrc);
  1467. std::string commond="cp"+std::string(" ")+std::string(strSrc)+std::string(" ")+trash_path;
  1468. bool ret=system(commond.c_str());
  1469. if (ret == false)
  1470. {
  1471. return ret;
  1472. }
  1473. //ret = file.remove(); //删除文件
  1474. ret=remove(strSrc);
  1475. delete []strSrc;
  1476. return ret;
  1477. }
  1478. std::string& IDCerClassImpl::trim(std::string &sStr, std::string sPatten)
  1479. {
  1480. if (sStr.empty())
  1481. {
  1482. return sStr;
  1483. }
  1484. sStr.erase(0, sStr.find_first_not_of(sPatten));
  1485. sStr.erase(sStr.find_last_not_of(sPatten) + 1);
  1486. return sStr;
  1487. }