idcertificate.cpp 60 KB

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