#include "GVar.h" #include "idcertificate.nantian.1.1.h" GVar g_pGvar; //自动日志对象 #define _AUTOTRACE_(M) CILIXAutoTrace __at(g_pGvar.m_pTrace,#M,&iRet); IDCERTIFICATE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj) { baseObj = new IDCardReaderNantian(); if (baseObj == NULL) return Error_Null; else return Error_Succeed; } IDCERTIFICATE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj) { if (pBaseObj == NULL) return Error_Param; IDCardReaderNantian* pTmp = (IDCardReaderNantian*)(pBaseObj); delete pTmp; pTmp = NULL; return Error_Succeed; } IDCardReaderNantian::IDCardReaderNantian() { int ret = g_pGvar.LoadDRVDLL(); g_pGvar.m_pTrace->WriteTrace("IDCardReader", "idcer.Nantian.1.1.so - 1.0.0.5"); } IDCardReaderNantian::~IDCardReaderNantian() { } ErrorCodeEnum IDCardReaderNantian::DevOpen(DWORD dwPort) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(DevOpen) try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } char sPort[32] = { 0 }; int iBaud = 0; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open", "Call DRV OpenDev Method, sPort:[%s], iBaud:[%d]", sPort, iBaud); iRet = g_pGvar.m_pDRVObj->OpenDev(sPort, iBaud); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open", "DRV OpenDev return:[%d]", iRet); if(iRet != 0) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "OpenDevice,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "open device error, code:%d", iRet); throw Error_DevCommFailed; } } catch (ErrorCodeEnum errcode) { eRet = errcode; } return eRet; } ErrorCodeEnum IDCardReaderNantian::Reset() { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(Reset) try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } iRet =g_pGvar.m_pDRVObj->ResetDev(2,NULL); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "Reset", "ResetDevice error, return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "reset device error, code:%d", iRet); throw Error_Hardware; } //复位后重新连接设备 iRet = g_pGvar.m_pDRVObj->CloseDev(); char sPort[32] = { 0 }; int iBaud = 0; iRet = g_pGvar.m_pDRVObj->OpenDev(sPort, iBaud); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "Open", "DRV OpenDev return:[%d]", iRet); if(iRet != 0) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "OpenDevice,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "open device error, code:%d", iRet); throw Error_DevCommFailed; } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } return eRet; } ErrorCodeEnum IDCardReaderNantian::DevClose() { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(DevClose) try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } //停止等待进卡线程 g_pGvar.m_bIsCancel = true; usleep(150000); iRet = g_pGvar.m_pDRVObj->CloseDev(); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevClose", "close dev error, return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "close device error, code:%d", iRet); throw Error_Hardware; } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } return eRet; } ErrorCodeEnum IDCardReaderNantian::GetLastErr(DevErrorInfo& devErrInfo) { memset(&devErrInfo, 0, sizeof(DevErrorInfo)); devErrInfo.dwErrMsgLen = strlen(g_pGvar.m_errMsg); memset(devErrInfo.szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN); memcpy(devErrInfo.szErrMsg, g_pGvar.m_errMsg, devErrInfo.dwErrMsgLen); return Error_Succeed; } ErrorCodeEnum IDCardReaderNantian::GetDevCategory(DevCategoryInfo& devCategory) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(GetDevCategory) char *sDevStatus[MIN_LEN]; try { strcpy(devCategory.szType, "IDCertificate"); strcpy(devCategory.szVendor, "Nantian"); strcpy(devCategory.szModel, "STYLE=IG#FUNCTION=ITF"); devCategory.version.wMajor = 1; devCategory.version.wMinor = 0; devCategory.version.wRevision = 0; devCategory.version.wBuild = 1; devCategory.eState = DEVICE_STATUS_NORMAL; if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } //查询设备状态 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); devCategory.eState = DEVICE_STATUS_NOT_READY; throw Error_Hardware; } else { switch (atoi(sDevStatus[1])) { case IDCARDREADER_DEVBUSY: //设备掉电 memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "device BUSY"); devCategory.eState = DEVICE_STATUS_CONNECTING; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device BUSY"); break; case IDCARDREADER_DEVHWERROR: memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "device HWERROR"); devCategory.eState = DEVICE_STATUS_FAULT; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device HWERROR"); break; case IDCARDREADER_DEVOFFLINE: memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "device OFFLINE"); devCategory.eState = DEVICE_STATUS_FAULT; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device OFFLINE"); break; } switch (atoi(sDevStatus[2])) { case IDCARDREADER_MEDIAJAMMED: memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "device jamed"); devCategory.eState = DEVICE_STATUS_FAULT; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory","device jamed"); break; } } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } //if (sDevStatus != NULL) //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN); return eRet; } ErrorCodeEnum IDCardReaderNantian::IDCerAuthenticate() { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(IDCerAuthenticate) int idxFlag = 0; int iCardType = 0; char *sIDXData[MID_LEN]; char *sDevStatus[MIN_LEN]; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate", "Load library error"); throw Error_DevLoadFileFailed; } if(g_pGvar.TheardEnd) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate", "卡未插入"); throw Error_DevMedia; } if(g_pGvar.ReadFlg) { iRet = g_pGvar.m_pDRVObj->EjectCard(); usleep(500000); iRet = g_pGvar.m_pDRVObj->InsertCard(NULL); } for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "GetDevCategory", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); //budevCategory.eState = DEVICE_STATUS_NOT_READY; throw Error_Hardware; } else { if (atoi(sDevStatus[1]) == IDCARDREADER_DEVONLINE) { if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAPRESENT) { //第2个传感器(读卡位置)检测有卡 //读卡 /*SEA_AUX_X::SAU_GetModuleCurPath(szDllPath); sprintf(szHeadPath, "%szp.bmp", szDllPath); DeleteFile(szHeadPath);*/ for (size_t i = 0; i < MID_LEN; i++) { sIDXData[i] = new char[MAX_LEN]; memset(sIDXData[i], 0, MAX_LEN); } g_pGvar.ReadFlg = true; iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerAuthenticate", "ReadIDXData error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet); throw Error_DevMedia; } else { throw Error_Succeed; } } else { throw Error_Unexpect; } } else { throw Error_Unexpect; } } } catch (ErrorCodeEnum errcode) { eRet = errcode; } /*if (sIDXData != NULL) g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN); if (sDevStatus != NULL) g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);*/ return eRet; } ErrorCodeEnum IDCardReaderNantian::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(IDCerGetDataEx) int idxFlag = 0; memset(&idCerInfoEx, 0, sizeof(IDCerInfoEx)); char szDllPath[1024] = { 0 }; char szHeadPath[1024] = { 0 }; int iCardType = 0; char *sIDXData[MID_LEN]; char *sDevStatus[MIN_LEN]; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } if(g_pGvar.ReadFlg) { iRet = g_pGvar.m_pDRVObj->EjectCard(); usleep(500000); iRet = g_pGvar.m_pDRVObj->InsertCard(NULL); } //查询设备状态 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "no card in device"); memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "no card in device"); throw Error_DevMedia; } } for (size_t i = 0; i < MID_LEN; i++) { sIDXData[i] = new char[MAX_LEN]; memset(sIDXData[i], 0, MAX_LEN); } iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "ReadAllIDInfo error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet); throw Error_Hardware; } g_pGvar.ReadFlg = true; char szExpireStart[16] = { 0 }; char szExpireEnd[16] = { 0 }; //国内二代证 if (atoi(sIDXData[0]) == 1) { if (strstr(sIDXData[3], "族")) { int len = strlen(sIDXData[3]); idCerInfoEx.nation.dwSize = strlen(sIDXData[3]) - (strlen("族")); memcpy(idCerInfoEx.nation.data, sIDXData[3], idCerInfoEx.nation.dwSize); idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0'; } else { idCerInfoEx.nation.dwSize = strlen(sIDXData[3]); memcpy(idCerInfoEx.nation.data,sIDXData[3], idCerInfoEx.nation.dwSize); idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0'; } //20200324 by qhw //如果民族超过56个名族代码,则直接返回代码 char sTmpCode[1024] = { 0 }; g_pGvar.SwitchNationToCode(idCerInfoEx.nation.data, sTmpCode); if (strlen(sTmpCode) > 0) { idCerInfoEx.nation.dwSize = strlen(sTmpCode); memcpy(idCerInfoEx.nation.data, sTmpCode, idCerInfoEx.nation.dwSize); idCerInfoEx.nation.data[idCerInfoEx.nation.dwSize] = '\0'; } idCerInfoEx.name.dwSize = strlen(sIDXData[1]); memcpy(idCerInfoEx.name.data, sIDXData[1], idCerInfoEx.name.dwSize); idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0'; idCerInfoEx.idno.dwSize = strlen(sIDXData[6]); memcpy(idCerInfoEx.idno.data, sIDXData[6], idCerInfoEx.idno.dwSize); idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0'; idCerInfoEx.sex.dwSize = strlen(sIDXData[2]); memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize); idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0'; //处理生日日期 string str(sIDXData[4]); str.insert(4, "年"); str.insert(6 + strlen("年"), "月"); str.insert(str.size(), "日"); char p[32] = { 0 }; strcpy(p, str.c_str()); idCerInfoEx.birthday.dwSize = strlen(p); memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize); idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0'; idCerInfoEx.address.dwSize = strlen(sIDXData[5]); memcpy(idCerInfoEx.address.data, sIDXData[5], idCerInfoEx.address.dwSize); idCerInfoEx.address.data[idCerInfoEx.address.dwSize] = '\0'; idCerInfoEx.newAddress.dwSize = 0; memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE); idCerInfoEx.newAddress.data[idCerInfoEx.newAddress.dwSize] = '\0'; idCerInfoEx.department.dwSize = strlen(sIDXData[7]); memcpy(idCerInfoEx.department.data, sIDXData[7], idCerInfoEx.department.dwSize); idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0'; memcpy(szExpireStart, sIDXData[8],strlen(sIDXData[8])); memcpy(szExpireEnd, sIDXData[9],strlen(sIDXData[9])); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx", "EndData = %s", szExpireEnd); g_pGvar.AddCharToDate(szExpireStart, '.'); /*if (strcmp(szExpireEnd, "长期") != NULL) { g_pGvar.AddCharToDate(szExpireEnd, '.'); }*/ char a[10] = {0}; sprintf(a,"2"); if (strncmp(szExpireEnd,a,1)==0) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx", "EndData1 = %s", szExpireEnd); g_pGvar.AddCharToDate(szExpireEnd, '.'); } else { memset(szExpireEnd,0,sizeof(szExpireEnd)); strcpy(szExpireEnd,"长期"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx", "EndData2 = %s", szExpireEnd); } idCerInfoEx.startDate.dwSize = strlen(szExpireStart); memcpy(idCerInfoEx.startDate.data, szExpireStart, idCerInfoEx.startDate.dwSize); idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0'; idCerInfoEx.endDate.dwSize = strlen(szExpireEnd); memcpy(idCerInfoEx.endDate.data, szExpireEnd, idCerInfoEx.endDate.dwSize); idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0'; idCerInfoEx.photoPath.dwSize = strlen(sIDXData[13]); memcpy(idCerInfoEx.photoPath.data, sIDXData[13], idCerInfoEx.photoPath.dwSize); idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0'; } else if (atoi(sIDXData[0]) == 2) { //外国人居住证 idCerInfoEx.name.dwSize = strlen(sIDXData[5]); memcpy(idCerInfoEx.name.data, sIDXData[5], idCerInfoEx.name.dwSize); idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0'; idCerInfoEx.sex.dwSize = strlen(sIDXData[2]); memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize); idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0'; //处理生日日期 string str(sIDXData[8]); str.insert(4, "年"); str.insert(6 + strlen("年"), "月"); str.insert(str.size(), "日"); char p[32] = { 0 }; strcpy(p, str.c_str()); idCerInfoEx.birthday.dwSize = strlen(p); memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize); idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0'; idCerInfoEx.idno.dwSize = strlen(sIDXData[3]); memcpy(idCerInfoEx.idno.data, sIDXData[3], idCerInfoEx.idno.dwSize); idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0'; idCerInfoEx.department.dwSize = strlen(sIDXData[10]); memcpy(idCerInfoEx.department.data, sIDXData[10], idCerInfoEx.department.dwSize); idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0'; g_pGvar.AddCharToDate(sIDXData[6], '.'); g_pGvar.AddCharToDate(sIDXData[7], '.'); idCerInfoEx.startDate.dwSize = strlen(sIDXData[6]); memcpy(idCerInfoEx.startDate.data, sIDXData[6], idCerInfoEx.startDate.dwSize); idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0'; idCerInfoEx.endDate.dwSize = strlen(sIDXData[7]); memcpy(idCerInfoEx.endDate.data, sIDXData[7], idCerInfoEx.endDate.dwSize); idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0'; idCerInfoEx.photoPath.dwSize = strlen(sIDXData[14]); memcpy(idCerInfoEx.photoPath.data, sIDXData[14], idCerInfoEx.photoPath.dwSize); idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0'; idCerInfoEx.englishName.dwSize = strlen(sIDXData[1]); memcpy(idCerInfoEx.englishName.data, sIDXData[1], idCerInfoEx.englishName.dwSize); idCerInfoEx.englishName.data[idCerInfoEx.englishName.dwSize] = '\0'; idCerInfoEx.nationality.dwSize = strlen(sIDXData[4]); memcpy(idCerInfoEx.nationality.data, sIDXData[4], idCerInfoEx.nationality.dwSize); idCerInfoEx.nationality.data[idCerInfoEx.nationality.dwSize] = '\0'; idCerInfoEx.idVersion.dwSize = strlen(sIDXData[9]); memcpy(idCerInfoEx.idVersion.data, sIDXData[9], idCerInfoEx.idVersion.dwSize); idCerInfoEx.idVersion.data[idCerInfoEx.idVersion.dwSize] = '\0'; idCerInfoEx.idType.dwSize = strlen("I"); memcpy(idCerInfoEx.idType.data, "I", idCerInfoEx.idType.dwSize); idCerInfoEx.idType.data[idCerInfoEx.idType.dwSize] = '\0'; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerGetDataEx", "%s", idCerInfoEx.idType.data); idCerInfoEx.reserved.dwSize = 0; memset(idCerInfoEx.reserved.data, 0, IDCER_EIGHT_BYTE_SIZE); } else if (atoi(sIDXData[0]) == 3) { idCerInfoEx.name.dwSize = strlen(sIDXData[1]); memcpy(idCerInfoEx.name.data, sIDXData[1], idCerInfoEx.name.dwSize); idCerInfoEx.name.data[idCerInfoEx.name.dwSize] = '\0'; idCerInfoEx.sex.dwSize = strlen(sIDXData[2]); memcpy(idCerInfoEx.sex.data, sIDXData[2], idCerInfoEx.sex.dwSize); idCerInfoEx.sex.data[idCerInfoEx.sex.dwSize] = '\0'; //处理生日日期 string str(sIDXData[4]); str.insert(4, "年"); str.insert(6 + strlen("年"), "月"); str.insert(str.size(), "日"); char p[32] = { 0 }; strcpy(p, str.c_str()); idCerInfoEx.birthday.dwSize = strlen(p); memcpy(idCerInfoEx.birthday.data, p, idCerInfoEx.birthday.dwSize); idCerInfoEx.birthday.data[idCerInfoEx.birthday.dwSize] = '\0'; idCerInfoEx.address.dwSize = strlen(sIDXData[5]); memcpy(idCerInfoEx.address.data, sIDXData[5], idCerInfoEx.address.dwSize); idCerInfoEx.address.data[idCerInfoEx.address.dwSize] = '\0'; idCerInfoEx.newAddress.dwSize = 0; memset(idCerInfoEx.newAddress.data, 0, MAX_IDCER_INFO_SIZE); idCerInfoEx.newAddress.data[idCerInfoEx.newAddress.dwSize] = '\0'; idCerInfoEx.idno.dwSize = strlen(sIDXData[6]); memcpy(idCerInfoEx.idno.data, sIDXData[6], idCerInfoEx.idno.dwSize); idCerInfoEx.idno.data[idCerInfoEx.idno.dwSize] = '\0'; idCerInfoEx.department.dwSize = strlen(sIDXData[7]); memcpy(idCerInfoEx.department.data, sIDXData[7], idCerInfoEx.department.dwSize); idCerInfoEx.department.data[idCerInfoEx.department.dwSize] = '\0'; memcpy(szExpireStart, sIDXData[8], 8); memcpy(szExpireEnd, sIDXData[8] + 9, 8); g_pGvar.AddCharToDate(szExpireStart, '.'); if (strcmp(szExpireEnd, "长期") != NULL) { g_pGvar.AddCharToDate(szExpireEnd, '.'); } idCerInfoEx.startDate.dwSize = strlen(szExpireStart); memcpy(idCerInfoEx.startDate.data, szExpireStart, idCerInfoEx.startDate.dwSize); idCerInfoEx.startDate.data[idCerInfoEx.startDate.dwSize] = '\0'; idCerInfoEx.endDate.dwSize = strlen(szExpireEnd); memcpy(idCerInfoEx.endDate.data, szExpireEnd, idCerInfoEx.endDate.dwSize); idCerInfoEx.endDate.data[idCerInfoEx.endDate.dwSize] = '\0'; idCerInfoEx.photoPath.dwSize = strlen(sIDXData[14]); memcpy(idCerInfoEx.photoPath.data, sIDXData[14], idCerInfoEx.photoPath.dwSize); idCerInfoEx.photoPath.data[idCerInfoEx.photoPath.dwSize] = '\0'; idCerInfoEx.idType.dwSize = strlen("J"); memcpy(idCerInfoEx.idType.data, "J", idCerInfoEx.idType.dwSize); idCerInfoEx.idType.data[idCerInfoEx.idType.dwSize] = '\0'; idCerInfoEx.txzCode.dwSize = strlen(sIDXData[9]); memcpy(idCerInfoEx.txzCode.data, sIDXData[9], idCerInfoEx.txzCode.dwSize); idCerInfoEx.txzCode.data[idCerInfoEx.txzCode.dwSize] = '\0'; idCerInfoEx.issuedSN.dwSize = strlen(sIDXData[10]); memcpy(idCerInfoEx.issuedSN.data, sIDXData[10], idCerInfoEx.issuedSN.dwSize); idCerInfoEx.issuedSN.data[idCerInfoEx.issuedSN.dwSize] = '\0'; } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } /*if (sIDXData != NULL) g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN); if (sDevStatus != NULL) g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN);*/ return eRet; } ErrorCodeEnum IDCardReaderNantian::IDCerGetData(IDCerInfo& idCerInfo) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(IDCerGetData) memset(&idCerInfo, 0, sizeof(IDCerInfo)); char szDllPath[1024] = { 0 }; char szHeadPath[1024] = { 0 }; int iCardType = 0; char *sIDXData[MID_LEN]; int idxFlag = 0; char *sDevStatus[MIN_LEN]; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } //查询设备状态 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "no card in device"); memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "no card in device"); throw Error_DevMedia; } } for (size_t i = 0; i < MID_LEN; i++) { sIDXData[i] = new char[MAX_LEN]; memset(sIDXData[i], 0, MAX_LEN); } iRet = g_pGvar.m_pDRVObj->ReadIDXData(sIDXData); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "ReadAllIDInfo error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "read card error, code:%d", iRet); throw Error_Hardware; } if (strstr(sIDXData[3], "族")) { int len = strlen(sIDXData[3]); idCerInfo.nation.dwSize = strlen(sIDXData[3]) - (strlen("族")); memcpy(idCerInfo.nation.data, sIDXData[3], idCerInfo.nation.dwSize); idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0'; } else { idCerInfo.nation.dwSize = strlen(sIDXData[3]); memcpy(idCerInfo.nation.data, sIDXData[3], idCerInfo.nation.dwSize); idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0'; } //20200324 by qhw //如果民族超过56个名族代码,则直接返回代码 char sTmpCode[1024] = { 0 }; g_pGvar.SwitchNationToCode(idCerInfo.nation.data, sTmpCode); if (strlen(sTmpCode) > 0) { idCerInfo.nation.dwSize = strlen(sTmpCode); memcpy(idCerInfo.nation.data, sTmpCode, idCerInfo.nation.dwSize); idCerInfo.nation.data[idCerInfo.nation.dwSize] = '\0'; } idCerInfo.name.dwSize = strlen(sIDXData[1]); memcpy(idCerInfo.name.data, sIDXData[1], idCerInfo.name.dwSize); idCerInfo.name.data[idCerInfo.name.dwSize] = '\0'; idCerInfo.idno.dwSize = strlen(sIDXData[6]); memcpy(idCerInfo.idno.data, sIDXData[6], idCerInfo.idno.dwSize); idCerInfo.idno.data[idCerInfo.idno.dwSize] = '\0'; idCerInfo.sex.dwSize = strlen(sIDXData[2]); memcpy(idCerInfo.sex.data, sIDXData[2], idCerInfo.sex.dwSize); idCerInfo.sex.data[idCerInfo.sex.dwSize] = '\0'; //处理生日日期 string str(sIDXData[4]); str.insert(4, "年"); str.insert(6 + strlen("年"), "月"); str.insert(str.size(), "日"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetData", "1"); char p[32] = { 0 }; strcpy(p, str.c_str()); idCerInfo.birthday.dwSize = strlen(p); memcpy(idCerInfo.birthday.data, p, idCerInfo.birthday.dwSize); idCerInfo.birthday.data[idCerInfo.birthday.dwSize] = '\0'; idCerInfo.address.dwSize = strlen(sIDXData[5]); memcpy(idCerInfo.address.data, sIDXData[5], idCerInfo.address.dwSize); idCerInfo.address.data[idCerInfo.address.dwSize] = '\0'; idCerInfo.newAddress.dwSize = 0; memset(idCerInfo.newAddress.data, 0, MAX_IDCER_INFO_SIZE); idCerInfo.newAddress.data[idCerInfo.newAddress.dwSize] = '\0'; idCerInfo.department.dwSize = strlen(sIDXData[7]); memcpy(idCerInfo.department.data, sIDXData[7], idCerInfo.department.dwSize); idCerInfo.department.data[idCerInfo.department.dwSize] = '\0'; char szExpireStart[16] = { 0 }; char szExpireEnd[16] = { 0 }; memcpy(szExpireStart, sIDXData[8], strlen(sIDXData[8])); memcpy(szExpireEnd, sIDXData[9], strlen(sIDXData[9])); g_pGvar.AddCharToDate(szExpireStart, '.'); if (strcmp(szExpireEnd, "长期") != NULL) { g_pGvar.AddCharToDate(szExpireEnd, '.'); } idCerInfo.startDate.dwSize = strlen(szExpireStart); memcpy(idCerInfo.startDate.data, szExpireStart, idCerInfo.startDate.dwSize); idCerInfo.startDate.data[idCerInfo.startDate.dwSize] = '\0'; idCerInfo.endDate.dwSize = strlen(szExpireEnd); memcpy(idCerInfo.endDate.data, szExpireEnd, idCerInfo.endDate.dwSize); idCerInfo.endDate.data[idCerInfo.endDate.dwSize] = '\0'; idCerInfo.photoPath.dwSize = strlen(sIDXData[13]); memcpy(idCerInfo.photoPath.data, sIDXData[13], idCerInfo.photoPath.dwSize); idCerInfo.photoPath.data[idCerInfo.photoPath.dwSize] = '\0'; throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } /*if (sDevStatus != NULL) g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN); if (sIDXData != NULL) g_pGvar.FreeArryBuf((void **)sIDXData, MID_LEN);*/ return eRet; } ErrorCodeEnum IDCardReaderNantian::ForceIDEject() { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(ForceIDEject) int idxFlag = 0; char *sDevStatus[MIN_LEN]; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } //查询设备状态,是否存在卡 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[1]) == IDCARDREADER_DEVBUSY) { //设备正在读卡或扫描,不能进行退卡 g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ForceIDEject", "dev is busy error return:%d", Error_DevMedia); memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "device is busy"); throw Error_DevMedia; } //三个传感器均未检测到卡 if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIANOTPRESENT) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ForceIDEject", "dev no media return:%d", Error_DevMedia); memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "no card in device"); throw Error_DevMedia; } } iRet = g_pGvar.m_pDRVObj->EjectCard(); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ForceIDEject", "resetsoft and eject error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet); throw Error_Hardware; } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } //if (sDevStatus != NULL) //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN); return eRet; } void* thread( void *arg ) { g_pGvar.TheardEnd = true; int iRet = 0; while (1) { if (g_pGvar.m_bIsCancel) { g_pGvar.g_flag = false; break; } //检查是否放入卡 iRet = g_pGvar.m_pDRVObj->InsertCard(NULL); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ThreadInsertCard", " CheckCardIn return:%d", iRet); if (iRet != E_DRVBASE_SUCCESS) { //未插入卡,继续等待 usleep(150000); continue; } else { g_pGvar.g_flag = false; break; } } g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_DEBUG, "ThreadInsertCard", "InsertCard Thread End"); g_pGvar.TheardEnd = false; return arg; } ErrorCodeEnum IDCardReaderNantian::IDCerRFControl(bool bControl) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(IDCerRFControl) pthread_t th; int arg = 0; int *thread_ret = NULL; char *sDevStatus[MIN_LEN] = {0}; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "DevOpen", "Load library error"); throw Error_DevLoadFileFailed; } //accecpt insert card if (bControl) { g_pGvar.g_flag = true; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl", "bControl is true"); g_pGvar.m_bIsCancel = TRUE; usleep(150000); g_pGvar.m_bIsCancel = FALSE; iRet = pthread_create( &th, NULL, thread, &arg ); if( iRet != 0 ) { printf( "Create thread error!\n"); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "Create thread error, code:%d", iRet); throw Error_Hardware; } } //eject card else { g_pGvar.m_bIsCancel = TRUE; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl","bControl is false"); //throw Error_Succeed; //get device status //查询设备状态 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIAPRESENT) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "no card in device"); memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "no card in device"); throw Error_DevMedia; } } iRet = g_pGvar.m_pDRVObj->EjectCard(); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ForceIDEject", "resetsoft and eject error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet); throw Error_Hardware; } } //g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "IDCerRFControl","eject card,return:%d", iRet); throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } //if (sDevStatus != NULL) //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN); return eRet; } ErrorCodeEnum IDCardReaderNantian::ScanIDAndSaveImage() { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(ScanIDAndSaveImage) char *sDevStatus[MIN_LEN] = {0}; /*char *picpath[MIN_LEN] = {0}; for (int i = 0; i < MIN_LEN; i++) { picpath[i] = new char[MID_LEN]; memset(picpath[i], 0, MID_LEN); }*/ try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage", "Load library error"); throw Error_DevLoadFileFailed; } for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(0, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[2]) != IDCARDREADER_MEDIANOTPRESENT) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage", "card in device begin eject"); iRet = g_pGvar.m_pDRVObj->EjectCard(); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage", "resetsoft and eject error,return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "force eject card error, code:%d", iRet); throw Error_Hardware; } } } g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_INFO, "ScanIDAndSaveImage", "Call Dev ScanIDAndSaveImage"); iRet = g_pGvar.m_pDRVObj->ScanIDXPic(NULL); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "ScanIDAndSaveImage", "ScanIDXPic error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "ScanIDXPic error return:%d", iRet); throw Error_Hardware; } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } //g_pGvar.FreeArryBuf((void **)picpath, MID_LEN); return eRet; } ErrorCodeEnum IDCardReaderNantian::QueryCardPos(int& pos) { ErrorCodeEnum eRet = Error_Succeed; int iRet = 0; _AUTOTRACE_(QueryCardPos) int idxFlag = 0; char *sDevStatus[MIN_LEN]; try { if (g_pGvar.m_pDRVObj == NULL) { memset(g_pGvar.m_errMsg, 0, MAX_LEN); strcpy(g_pGvar.m_errMsg, "Load library error"); g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos", "Load library error"); throw Error_DevLoadFileFailed; } if(g_pGvar.TheardEnd) { pos = 0; throw Error_Succeed; } //查询设备状态,是否存在卡 for (int i = 0; i < MIN_LEN; i++) { sDevStatus[i] = new char[MID_LEN]; memset(sDevStatus[i], 0, MID_LEN); } iRet = g_pGvar.m_pDRVObj->GetDevStatus(idxFlag, sDevStatus); if (iRet != E_DRVBASE_SUCCESS) { g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "IDCerGetDataEx", "GetDeviceStatus error return:%d", iRet); memset(g_pGvar.m_errMsg, 0, MAX_LEN); sprintf(g_pGvar.m_errMsg, "device is offline, code:%d", iRet); throw Error_Hardware; } else { if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIANOTPRESENT) { pos = 0; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIANOTPRESENT"); } if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAENTERING) { pos = 2; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIAENTERING"); } if (atoi(sDevStatus[2]) == IDCARDREADER_MEDIAPRESENT) { pos = 1; g_pGvar.m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "QueryCardPos","MEDIAPRESENT"); } } throw Error_Succeed; } catch (ErrorCodeEnum errcode) { eRet = errcode; } //if (sDevStatus != NULL) //g_pGvar.FreeArryBuf((void **)sDevStatus, MIN_LEN); return eRet; }