#include "stdafx.h" #include "IDCertFSM.h" #include "EventCode.h" #include "ModuleMix.h" #include "IDCertificate_UserErrorCode.h" #include #include #include #include #ifdef RVC_OS_LINUX #include "CommDevEntityErrorCode.h" #include #include #include "fileutil.h" #include #include using namespace SP::Module::Comm; #else #include "RVCComm.h" #include "publicFunExport.h" #include "json/json.h" #include #include #pragma comment(lib,"user32.lib") #endif // RVC_OS_LINUX #define IDCER_INIT_COUNT 3 #define IDCER_READ_TIMEOUT 60000 #define IDCER_AUTH_INTERVAL 300 #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/ #define IMAGE_DETECT_URL "https://carddetect.paasst.cmbchina.cn/api/card/image-detect" #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/ #define IMAGE_DETECT_URL "https://carddetect.paasuat.cmbchina.cn/api/card/image-detect" #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/ #define IMAGE_DETECT_URL "https://carddetect.paas.cmbchina.cn/api/card/image-detect" #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev&生产环境*/ #define IMAGE_DETECT_URL "https://carddetect.paas.cmbchina.cn/api/card/image-detect" #else/*本地编译等非DevOps环境编译的版本*/ #define IMAGE_DETECT_URL "https://carddetect.paasst.cmbchina.cn/api/card/image-detect" #endif #ifdef RVC_OS_WIN static const std::string base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) { std::string ret; int i = 0; int j = 0; unsigned char char_array_3[3]; unsigned char char_array_4[4]; while (in_len--) { char_array_3[i++] = *(bytes_to_encode++); if (i == 3) { char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (i = 0; (i < 4); i++) ret += base64_chars[char_array_4[i]]; i = 0; } } if (i) { for (j = i; j < 3; j++) char_array_3[j] = '\0'; char_array_4[0] = (char_array_3[0] & 0xfc) >> 2; char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4); char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6); char_array_4[3] = char_array_3[2] & 0x3f; for (j = 0; (j < i + 1); j++) ret += base64_chars[char_array_4[j]]; while ((i++ < 3)) ret += '='; } return ret; } struct ImgChekTask : ITaskSp { CIDCertFSM* m_fsm; ImgChekTask(CIDCertFSM* fsm) :m_fsm(fsm) {} CSimpleStringA idNum; CSimpleStringA inName; CBlob imgInput; CSimpleStringA inNationality; CSimpleStringA inIdType; CSimpleStringA imgType; void Process() { CSystemStaticInfo si; m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si); IHttpFunc* client; client = create_http(m_fsm->HttpsLogCallBack); ImgCheckReq imgCheckReq; ImgCheckRet imgCheckRet; imgCheckReq.terminalNo = si.strTerminalID.GetData(); imgCheckReq.name = inName.GetData(); imgCheckReq.idNo = idNum.GetData(); imgCheckReq.nationality = inNationality.GetData(); imgCheckReq.idType = inIdType.GetData(); imgCheckReq.topN = 1; imgCheckReq.returnImgBase64 = 1; string imgIn = imgInput.m_pData; //图片原始数据 long srclen = imgInput.m_iLength; string encodeIn = base64_encode((unsigned char*)imgInput.m_pData, srclen); //string encodeIn; //Encode(imgIn, encodeIn); //传给服务端应base64编码 imgCheckReq.imageBase64 = encodeIn; imgCheckReq.m_url = m_fsm->checkImgURL; long beg = GetTickCount(); bool ret = client->Post(imgCheckReq, imgCheckRet); long end = GetTickCount(); CSimpleStringA errMsg; if (ret) { if (imgCheckRet.m_success != true) { errMsg = CSimpleStringA::Format("图片检测不通过,result_data:%s,图片类型 = %s。", imgCheckRet.m_resultData.c_str(), imgType.GetData()); LogWarn(Severity_Middle, Error_Resource, IDCertificate_UserErrorCode_ScanImg_Failed, errMsg.GetData()); if (client) client->Destory(); return; } } else { errMsg = CSimpleStringA::Format("图片质量检测请求失败,请检查本地网络连接。图片类型 = %s。", imgType.GetData()); LogWarn(Severity_Middle, Error_Resource, IDCertificate_UserErrorCode_ScanImg_Failed, errMsg.GetData()); } client->Destory(); } }; #endif //RVC_OS_WIN //Normal/Idle void CIDCertFSM::s0_on_entry() { LOG_FUNCTION(); SetDevState(DEVICE_STATUS_NORMAL); } void CIDCertFSM::s0_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s0_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s0 evt %d",pEvt->iEvt); switch (pEvt->iEvt) { case USER_EVT_ERROR: pEvt->SetHandled(); break; case USER_EVT_QUIT: pEvt->SetHandled(); break; case USER_EVT_READ_AND_SCAN_UTF8: //ex1 { pEvt->SetHandled(); ReadAndScanUTF8Event* ide = dynamic_cast(pEvt); ReadAndScanUTF8Task* task = new ReadAndScanUTF8Task(this); task->ctx = ide->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } break; case USER_EVT_READ_AND_SCAN_UTF8JS: //ex1 { pEvt->SetHandled(); ReadAndScanUTF8JSEvent* ide = dynamic_cast(pEvt); ReadAndScanUTF8JSTask* task = new ReadAndScanUTF8JSTask(this); task->ctx = ide->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } break; case USER_EVT_TODO_INIT: { pEvt->SetHandled(); } break; case USER_EVT_TODO_INIT_FINISHED: { pEvt->SetHandled(); return pEvt->param1; } default: break; } return 0; } //Reading void CIDCertFSM::s1_on_entry() { LOG_FUNCTION(); } void CIDCertFSM::s1_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s1_on_event(FSMEvent *pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s1 evt %d", pEvt->iEvt); int ret = 0; switch(pEvt->iEvt) { case USER_EVT_CANCEL_READ: pEvt->SetHandled(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set cancel read flag"); m_bCancelRead = true; break; case USER_EVT_EXIT: pEvt->SetHandled(); SetExitFlag(); break; case USER_EVT_QUIT: pEvt->SetHandled(); break; case USER_EVT_READ_AND_SCAN_UTF8_FINISHED: if (pEvt->param1 == -1) { invalidBreak = true; return 5; } pEvt->SetHandled(); ret = pEvt->param1; break; case USER_EVT_READ_AND_SCAN_UTF8JS_FINISHED: if (pEvt->param1 == -1) { invalidBreak = true; return 5; } pEvt->SetHandled(); ret = pEvt->param1; break; case USER_EVT_TODO_INIT: { pEvt->SetHandled(); } break; case USER_EVT_TODO_INIT_FINISHED: { pEvt->SetHandled(); return pEvt->param1; } default: break; } return ret; } //failed void CIDCertFSM::s2_on_entry() { LOG_FUNCTION(); SetDevState(DEVICE_STATUS_FAULT); m_testResult = Error_InvalidState; } void CIDCertFSM::s2_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s2_on_event(FSMEvent* e) { LOG_FUNCTION(); if (e->iEvt == USER_EVT_QUIT) { e->SetHandled(); return 0; } return 0; } //Eject void CIDCertFSM::s3_on_entry() { } void CIDCertFSM::s3_on_exit() { } unsigned int CIDCertFSM::s3_on_event(FSMEvent* e) { return 0; } //WaitingFetch void CIDCertFSM::s4_on_entry() { LOG_FUNCTION(); WaitFetchIDCardTask* task = new WaitFetchIDCardTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } void CIDCertFSM::s4_on_exit() { } unsigned int CIDCertFSM::s4_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("wait fetch id card.event %d,%d", pEvt->iEvt, pEvt->param1); switch (pEvt->iEvt) { case USER_EVT_WAIT_FETCH_IDCARD_FINISHED: pEvt->SetHandled(); break; default: break; } return 0; } //Init void CIDCertFSM::s5_on_entry() { LOG_FUNCTION(); SetDevState(DEVICE_STATUS_NOT_READY); InitTask* task = new InitTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } void CIDCertFSM::s5_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s5_on_event(FSMEvent* pEvt) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("s5 evt %d", pEvt->iEvt); int ret = 0; switch (pEvt->iEvt) { case USER_EVT_ERROR: pEvt->SetHandled(); break; case USER_EVT_QUIT: pEvt->SetHandled(); break; case USER_EVT_INIT_FINISHED: { pEvt->SetHandled(); ret = pEvt->param1; } break; case USER_EVT_TODO_INIT: { pEvt->SetHandled(); } break; case USER_EVT_TODO_INIT_FINISHED: { pEvt->SetHandled(); return pEvt->param1; } default: break; } return ret; } ErrorCodeEnum CIDCertFSM::GetVendorDllPath(CSimpleStringA &strPath) { strPath = "termb.dll"; return Error_Succeed;//oiltest } ErrorCodeEnum CIDCertFSM::OnInit() { ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN); ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN); ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN); #ifdef RVC_OS_WIN //windows使用宽字符 nationalCode[1] = L"汉"; nationalCode[2] = L"蒙古"; nationalCode[3] = L"回"; nationalCode[4] = L"藏"; nationalCode[5] = L"维吾尔"; nationalCode[6] = L"苗"; nationalCode[7] = L"彝"; nationalCode[8] = L"壮"; nationalCode[9] = L"布依"; nationalCode[10] = L"朝鲜"; nationalCode[11] = L"满"; nationalCode[12] = L"侗"; nationalCode[13] = L"瑶"; nationalCode[14] = L"白"; nationalCode[15] = L"土家"; nationalCode[16] = L"哈尼"; nationalCode[17] = L"哈萨克"; nationalCode[18] = L"傣"; nationalCode[19] = L"黎"; nationalCode[20] = L"傈僳"; nationalCode[21] = L"佤"; nationalCode[22] = L"畲"; nationalCode[23] = L"高山"; nationalCode[24] = L"拉祜"; nationalCode[25] = L"水"; nationalCode[26] = L"东乡"; nationalCode[27] = L"纳西"; nationalCode[28] = L"景颇"; nationalCode[29] = L"阿尔克孜"; nationalCode[30] = L"土"; nationalCode[31] = L"达斡尔"; nationalCode[32] = L"仫佬"; nationalCode[33] = L"羌"; nationalCode[34] = L"布朗"; nationalCode[35] = L"撒拉"; nationalCode[36] = L"毛南"; nationalCode[37] = L"仡佬"; nationalCode[38] = L"锡伯"; nationalCode[39] = L"阿昌"; nationalCode[40] = L"普米"; nationalCode[41] = L"塔吉克"; nationalCode[42] = L"怒"; nationalCode[43] = L"乌孜别克"; nationalCode[44] = L"俄罗斯"; nationalCode[45] = L"鄂温克"; nationalCode[46] = L"德昂"; nationalCode[47] = L"保安"; nationalCode[48] = L"裕固"; nationalCode[49] = L"京"; nationalCode[50] = L"塔塔尔"; nationalCode[51] = L"独龙"; nationalCode[52] = L"鄂伦春"; nationalCode[53] = L"赫哲"; nationalCode[54] = L"门巴"; nationalCode[55] = L"珞巴"; nationalCode[56] = L"基诺"; #else nationalCode[1] = "汉"; nationalCode[2] = "蒙古"; nationalCode[3] = "回"; nationalCode[4] = "藏"; nationalCode[5] = "维吾尔"; nationalCode[6] = "苗"; nationalCode[7] = "彝"; nationalCode[8] = "壮"; nationalCode[9] = "布依"; nationalCode[10] = "朝鲜"; nationalCode[11] = "满"; nationalCode[12] = "侗"; nationalCode[13] = "瑶"; nationalCode[14] = "白"; nationalCode[15] = "土家"; nationalCode[16] = "哈尼"; nationalCode[17] = "哈萨克"; nationalCode[18] = "傣"; nationalCode[19] = "黎"; nationalCode[20] = "傈僳"; nationalCode[21] = "佤"; nationalCode[22] = "畲"; nationalCode[23] = "高山"; nationalCode[24] = "拉祜"; nationalCode[25] = "水"; nationalCode[26] = "东乡"; nationalCode[27] = "纳西"; nationalCode[28] = "景颇"; nationalCode[29] = "阿尔克孜"; nationalCode[30] = "土"; nationalCode[31] = "达斡尔"; nationalCode[32] = "仫佬"; nationalCode[33] = "羌"; nationalCode[34] = "布朗"; nationalCode[35] = "撒拉"; nationalCode[36] = "毛南"; nationalCode[37] = "仡佬"; nationalCode[38] = "锡伯"; nationalCode[39] = "阿昌"; nationalCode[40] = "普米"; nationalCode[41] = "塔吉克"; nationalCode[42] = "怒"; nationalCode[43] = "乌孜别克"; nationalCode[44] = "俄罗斯"; nationalCode[45] = "鄂温克"; nationalCode[46] = "德昂"; nationalCode[47] = "保安"; nationalCode[48] = "裕固"; nationalCode[49] = "京"; nationalCode[50] = "塔塔尔"; nationalCode[51] = "独龙"; nationalCode[52] = "鄂伦春"; nationalCode[53] = "赫哲"; nationalCode[54] = "门巴"; nationalCode[55] = "珞巴"; nationalCode[56] = "基诺"; #endif supportUCS2 = FALSE; igestionVer = FALSE; closeImgCheck = FALSE; CSmartPointer spCtSettingConfig; GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig); int tflag; spCtSettingConfig->ReadConfigValueInt("IDCertificate", "CloseImagCheckFlag", tflag); if (tflag != 0) { closeImgCheck = TRUE; } checkImgURL = IMAGE_DETECT_URL; CSimpleStringA tUrl; spCtSettingConfig->ReadConfigValue("IDCertificate", "CardDetectUrl", tUrl); if (!tUrl.IsNullOrEmpty()) { checkImgURL = tUrl.GetData(); } return Error_Succeed; } ErrorCodeEnum CIDCertFSM::OnExit() { if (m_hDevHelper) { ErrorCodeEnum err = Error_Succeed; m_hDevHelper.TearDown(); return err; } return Error_Succeed; } int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); DWORD elapsed = 0; DWORD dwStart = SP::Module::Comm::RVCGetTickCount(); DWORD dwEnd = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum eErr = Error_Unexpect; ErrorCodeEnum errRfOpen = Error_Unexpect; ErrorCodeEnum errAuth = Error_Unexpect; ErrorCodeEnum errRead = Error_Unexpect; ErrorCodeEnum errReadEx = Error_Unexpect; ErrorCodeEnum errReadEx2 = Error_Unexpect; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on"); DeleteZP(Bmp_ZP | Bmp_SCAN, 1); bool bOpenRF = false, bGetIDCert = false; IDCerInfoEx2 idInfoEx2; IDCerInfoEx idInfo; IDCerInfo idInfoOld; memset(&idInfoEx2, 0, sizeof(idInfoEx2)); memset(&idInfo, 0, sizeof(idInfo)); memset(&idInfoOld, 0, sizeof(idInfoOld)); m_bCancelRead = false; m_bWaitReadMore = false; m_bReading = true; m_bExit = false; bool bReadSuccess = false; bool bInvokeReadEx = false; bool bInvokeReadEx2 = false; bool bExitWhenReading = false; bool bIDCerAuthenticate = false; while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead) { if (m_bExit) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("exit"); break; } bReadSuccess = false; bInvokeReadEx = false; bInvokeReadEx2 = false; if (m_bWaitReadMore) { dwStart = SP::Module::Comm::RVCGetTickCount(); m_bWaitReadMore = false; } if (!bOpenRF) { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errRfOpen = m_hDevHelper->IDCerRFControl(true); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (Error_Succeed == errRfOpen) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; Sleep(IDCER_AUTH_INTERVAL); continue; } } bOpenRF = true; Sleep(IDCER_AUTH_INTERVAL); bIDCerAuthenticate = false; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errAuth = m_hDevHelper->IDCerAuthenticate(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (Error_Succeed != errAuth) { dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; continue; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)(); bIDCerAuthenticate = true; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errReadEx2 == Error_NotImpl) { ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息 } else { ctx->Ans.msgtype = 1; //新字段传递,UTF8、二进制传递文字信息 //ex2数据读取功能代码、UCS2转UTF8代码 bInvokeReadEx2 = true; if (errReadEx2 != Error_Succeed) { bReadSuccess = false; } else { unsigned char name[1024]; memset(name, 0, 1024); unsigned char sex[1024]; memset(sex, 0, 1024); unsigned char nation[1024]; memset(nation, 0, 1024); unsigned char birthday[1024]; memset(birthday, 0, 1024); unsigned char address[1024]; memset(address, 0, 1024); unsigned char idno[1024]; memset(idno, 0, 1024); unsigned char department[1024]; memset(department, 0, 1024); unsigned char startDate[1024]; memset(startDate, 0, 1024); unsigned char endDate[1024]; memset(endDate, 0, 1024); unsigned char englishName[1024]; memset(englishName, 0, 1024); unsigned char nationality[1024]; memset(nationality, 0, 1024); unsigned char idVersion[1024]; memset(idVersion, 0, 1024); unsigned char idType[1024]; memset(idType, 0, 1024); unsigned char reserved[1024]; memset(reserved, 0, 1024);//外国人永居证旧证件关联字段 unsigned char englishNameEx[1024]; memset(englishNameEx, 0, 1024); //英文名备用字段 unsigned char IssuedSN[1024]; memset(IssuedSN, 0, 1024); //换证次数 DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER) .setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime) .setLogCode(IDCertService_LogCode_ReadAndScanUTF8)(); bReadSuccess = true; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op."); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("各字段长度-姓名:%d; 性别:%d; 民族:%d; 身份证:%d;", GetUCS2ByteLength((UINT16*)idInfoEx2.name.data), GetUCS2ByteLength((UINT16*)idInfoEx2.sex.data), GetUCS2ByteLength((UINT16*)idInfoEx2.nation.data), GetUCS2ByteLength((UINT16*)idInfoEx2.idno.data)); //去除首尾空格 RemoveUCS2Blank((UINT16*)idInfoEx2.name.data); CheckHanZi((UINT16*)idInfoEx2.name.data); //检测汉字编码 RemoveUCS2Blank((UINT16*)idInfoEx2.sex.data); RemoveUCS2Blank((UINT16*)idInfoEx2.nation.data); RemoveUCS2Blank((UINT16*)idInfoEx2.birthday.data); RemoveUCS2Blank((UINT16*)idInfoEx2.address.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idno.data); RemoveUCS2Blank((UINT16*)idInfoEx2.department.data); RemoveUCS2Blank((UINT16*)idInfoEx2.startDate.data); RemoveUCS2Blank((UINT16*)idInfoEx2.endDate.data); RemoveUCS2Blank((UINT16*)idInfoEx2.englishName.data); RemoveUCS2Blank((UINT16*)idInfoEx2.nationality.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idVersion.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idType.data); RemoveUCS2Blank((UINT16*)idInfoEx2.reserved.data); //外国人永居证旧证件关联字段 RemoveUCS2Blank((UINT16*)idInfoEx2.reserved2.data); //英文名备用字段 RemoveUCS2Blank((UINT16*)idInfoEx2.issuedSN.data); //换证次数 #ifdef RVC_OS_WIN //转换成GBK用于debug上传 char* tSex = new char[32]; char* tNation = new char[32]; char* tBirthday = new char[32]; char* tStartDate = new char[32]; char* tEndDate = new char[32]; char* tIDcode = new char[1024]; char* tIDtype = new char[8]; char* tName = new char[128]; char* tNationality = new char[8]; char* tChecKNum = new char[8]; memcpy(tSex, idInfoEx2.sex.data, 32); memcpy(tNation, idInfoEx2.nation.data, 32); memcpy(tBirthday, idInfoEx2.birthday.data, 32); memcpy(tStartDate, idInfoEx2.startDate.data, 32); memcpy(tEndDate, idInfoEx2.endDate.data, 32); memcpy(tIDcode, idInfoEx2.idno.data, 1024); memcpy(tIDtype, idInfoEx2.idType.data, 8); memcpy(tName, idInfoEx2.name.data, 128); memcpy(tNationality, idInfoEx2.nationality.data, 8); memcpy(tChecKNum, idInfoEx2.issuedSN.data, 8); char *gbkSex, *gbkNation, *gbkBirthday, *gbkStartDate, *gbkEndDate, *gbkIDcode, *gbkIDtype, *gbkName, *gbkNationality, *gbktCheckNum; int iSize; //sex iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, NULL, 0, NULL, NULL); gbkSex = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, gbkSex, iSize, NULL, NULL); //nation iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, NULL, 0, NULL, NULL); gbkNation = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, gbkNation, iSize, NULL, NULL); //birthday iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, NULL, 0, NULL, NULL); gbkBirthday = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, gbkBirthday, iSize, NULL, NULL); //startdate iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, NULL, 0, NULL, NULL); gbkStartDate = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, gbkStartDate, iSize, NULL, NULL); //endate iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, NULL, 0, NULL, NULL); gbkEndDate = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, gbkEndDate, iSize, NULL, NULL); //idcode iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, NULL, 0, NULL, NULL); gbkIDcode = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, gbkIDcode, iSize, NULL, NULL); //idtype iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, NULL, 0, NULL, NULL); gbkIDtype = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, gbkIDtype, iSize, NULL, NULL); //name iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, NULL, 0, NULL, NULL); gbkName = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, gbkName, iSize, NULL, NULL); //natinality iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, NULL, 0, NULL, NULL); gbkNationality = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, gbkNationality, iSize, NULL, NULL); //issuedSN iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, NULL, 0, NULL, NULL); gbktCheckNum = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, gbktCheckNum, iSize, NULL, NULL); //gbk转换结束 #endif UCS2_to_UTF8((UINT16*)idInfoEx2.name.data, name); //UCS2_to_UTF8((UINT16*)idInfoEx2.sex.data, sex); GetSexUTF8String((UINT16*)idInfoEx2.sex.data, sex); //UCS2_to_UTF8((UINT16*)idInfoEx2.nation.data, nation); GetNationalUTF8String((UINT16*)idInfoEx2.nation.data, nation); //UCS2_to_UTF8((UINT16*)idInfoEx2.birthday.data, birthday); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.birthday.data, birthday); UCS2_to_UTF8((UINT16*)idInfoEx2.address.data, address); UCS2_to_UTF8((UINT16*)idInfoEx2.idno.data, idno); UCS2_to_UTF8((UINT16*)idInfoEx2.department.data, department); //UCS2_to_UTF8((UINT16*)idInfoEx2.startDate.data, startDate); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.startDate.data, startDate); //UCS2_to_UTF8((UINT16*)idInfoEx2.endDate.data, endDate); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.endDate.data, endDate); UCS2_to_UTF8((UINT16*)idInfoEx2.englishName.data, englishName); UCS2_to_UTF8((UINT16*)idInfoEx2.nationality.data, nationality); UCS2_to_UTF8((UINT16*)idInfoEx2.idVersion.data, idVersion); UCS2_to_UTF8((UINT16*)idInfoEx2.idType.data, idType); UCS2_to_UTF8((UINT16*)idInfoEx2.reserved.data, reserved); UCS2_to_UTF8((UINT16*)idInfoEx2.reserved2.data, englishNameEx); UCS2_to_UTF8((UINT16*)idInfoEx2.issuedSN.data, IssuedSN); ctx->Ans.name_utf8.Alloc(strlen((char*)name)); ctx->Ans.sex_utf8.Alloc(strlen((char*)sex)); ctx->Ans.nation_utf8.Alloc(strlen((char*)nation)); ctx->Ans.birthday_utf8.Alloc(strlen((char*)birthday)); ctx->Ans.address_utf8.Alloc(strlen((char*)address)); ctx->Ans.idcode_utf8.Alloc(strlen((char*)idno)); ctx->Ans.department_utf8.Alloc(strlen((char*)department)); ctx->Ans.startdate_utf8.Alloc(strlen((char*)startDate)); ctx->Ans.enddate_utf8.Alloc(strlen((char*)endDate)); ctx->Ans.englishname_utf8.Alloc(strlen((char*)englishName)); ctx->Ans.nationality_utf8.Alloc(strlen((char*)nationality)); ctx->Ans.idversion_utf8.Alloc(strlen((char*)idVersion)); ctx->Ans.idtype_utf8.Alloc(strlen((char*)idType)); ctx->Ans.reserved_utf8.Alloc(strlen((char*)reserved)); //新外国人永居证关联字段 ctx->Ans.othercode_utf8.Alloc(strlen((char*)englishNameEx)); //英文名备用字段 memcpy(ctx->Ans.name_utf8.m_pData, name, strlen((char*)name)); memcpy(ctx->Ans.sex_utf8.m_pData, sex, strlen((char*)sex)); memcpy(ctx->Ans.nation_utf8.m_pData, nation, strlen((char*)nation)); memcpy(ctx->Ans.birthday_utf8.m_pData, birthday, strlen((char*)birthday)); memcpy(ctx->Ans.address_utf8.m_pData, address, strlen((char*)address)); memcpy(ctx->Ans.idcode_utf8.m_pData, idno, strlen((char*)idno)); memcpy(ctx->Ans.department_utf8.m_pData, department, strlen((char*)department)); memcpy(ctx->Ans.startdate_utf8.m_pData, startDate, strlen((char*)startDate)); memcpy(ctx->Ans.enddate_utf8.m_pData, endDate, strlen((char*)endDate)); memcpy(ctx->Ans.englishname_utf8.m_pData, englishName, strlen((char*)englishName)); memcpy(ctx->Ans.nationality_utf8.m_pData, nationality, strlen((char*)nationality)); memcpy(ctx->Ans.idversion_utf8.m_pData, idVersion, strlen((char*)idVersion)); memcpy(ctx->Ans.idtype_utf8.m_pData, idType, strlen((char*)idType)); memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段 memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段 GetPngBlobEx(ctx->Ans.headphoto, "zp"); //转换头像图片 ctx->Ans.hasscan = 0; if (igestionVer == TRUE) //吸入式设备才调用正反扫描功能 { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr = m_hDevHelper->ScanIDAndSaveImage(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { if (eErr != Error_NotImpl) SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); } if (eErr == Error_Succeed) { transImgMsg.Clear(); //idfront.bmp" and "idback.bmp ErrorCodeEnum eErrFront, eErrBack; eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront"); eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback"); if (eErrFront == Error_Succeed && eErrBack == Error_Succeed) { ctx->Ans.hasscan = 1; #ifdef RVC_OS_WIN if (!closeImgCheck) { ImgChekTask* frontImgCheck = new ImgChekTask(this); frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode; frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName; frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality; frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype; frontImgCheck->imgInput = ctx->Ans.frontphoto; frontImgCheck->imgType = "正面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck); ImgChekTask* backImgCheck = new ImgChekTask(this); backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode; backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName; backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality; backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype; backImgCheck->imgInput = ctx->Ans.backphoto; frontImgCheck->imgType = "背面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck); } #endif } else { CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed."; if (transImgMsg.GetLength() != 0) { warnMsg = warnMsg + transImgMsg; } LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData()); } } } #ifdef RVC_OS_WIN CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s" , (const char*)CSimpleStringA(gbkIDcode).SubString(0, 4) , (const char*)CSimpleStringA(gbkIDcode).SubString(CSimpleStringA(gbkIDcode).GetLength() - 1, 1)); #else CSimpleStringA tIdcode = (char*)idno; CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s" , (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1)); #endif LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData()); ctx->Ans.photodata = ctx->Ans.headphoto; DeleteZP(Bmp_ZP | Bmp_SCAN, 2); bGetIDCert = true; break; } } } dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; } if (m_bExit) bExitWhenReading = true; m_bExit = false; m_bReading = false; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off"); int pos = 99; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum eErr1 = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 == Error_NotImpl) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")("old version.no need position."); } else { if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime)(); switch (pos) { case 1: case 2: m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr1 = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 != Error_Succeed) { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::IDCerRFControl", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errEject != Error_Succeed) { SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)(); } CheckEjectCardRes(eErr1, errEject); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl") .setCostTime(m_ullEndTime - m_ullBeginTime)(); } break; case 0: default: break; } } else { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); } //查询卡片位置以决定跳转 m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr1 = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); } } if (eErr1 != Error_Succeed || (eErr1 == Error_Succeed && (pos != 0))) { //oilyang@20180531 add for close enter card m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errRf = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errRf != Error_Succeed) { SetErrorAndLog(errRf, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errEject != Error_Succeed) { SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)(); } CheckEjectCardRes(errRf, errEject); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)(); } } if (bGetIDCert) { ctx->Answer(Error_Succeed); } else if (m_bCancelRead) { ctx->Answer(Error_Cancel); } else if (elapsed >= IDCER_READ_TIMEOUT) { if (bIDCerAuthenticate) { if (bInvokeReadEx2 && !bReadSuccess) { SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109 } } else if (!bOpenRF) { SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); ctx->Answer(Error_Unexpect, GetAlarmDEC()); } else { if (errAuth == Error_DevMedia) { SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate_NotIDCard, "DevAdapter::IDCerAuthenticate", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2108 ctx->Answer(Error_Unexpect, GetAlarmDEC()); } else { SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); //RTA2107 ctx->Answer(Error_Unexpect, GetAlarmDEC()); } } } else { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8 some thing wrong."); ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed); LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong."); } if (eErr1 == Error_Succeed && pos == 2) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 4"); return 4; } if (m_bCancelRead) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 2"); return 2; } if (bExitWhenReading) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 3"); return 3; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 0"); return 0; } int CIDCertFSM::ReadAndScanUTF8JS(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); DWORD elapsed = 0; DWORD dwStart = SP::Module::Comm::RVCGetTickCount(); DWORD dwEnd = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum eErr = Error_Unexpect; ErrorCodeEnum errRfOpen = Error_Unexpect; ErrorCodeEnum errAuth = Error_Unexpect; ErrorCodeEnum errRead = Error_Unexpect; ErrorCodeEnum errReadEx = Error_Unexpect; ErrorCodeEnum errReadEx2 = Error_Unexpect; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on"); DeleteZP(Bmp_ZP | Bmp_SCAN); bool bOpenRF = false, bGetIDCert = false; IDCerInfoEx2 idInfoEx2; IDCerInfoEx idInfo; IDCerInfo idInfoOld; memset(&idInfoEx2, 0, sizeof(idInfoEx2)); memset(&idInfo, 0, sizeof(idInfo)); memset(&idInfoOld, 0, sizeof(idInfoOld)); m_bCancelRead = false; m_bWaitReadMore = false; m_bReading = true; m_bExit = false; bool bReadSuccess = false; bool bInvokeReadEx = false; bool bInvokeReadEx2 = false; bool bExitWhenReading = false; bool bIDCerAuthenticate = false; while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead) { if (m_bExit) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("exit"); break; } bReadSuccess = false; bInvokeReadEx = false; bInvokeReadEx2 = false; if (m_bWaitReadMore) { dwStart = SP::Module::Comm::RVCGetTickCount(); m_bWaitReadMore = false; } if (!bOpenRF) { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errRfOpen = m_hDevHelper->IDCerRFControl(true); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (Error_Succeed == errRfOpen) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::OpenIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; Sleep(IDCER_AUTH_INTERVAL); continue; } } bOpenRF = true; Sleep(IDCER_AUTH_INTERVAL); bIDCerAuthenticate = false; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errAuth = m_hDevHelper->IDCerAuthenticate(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (Error_Succeed != errAuth) { dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; continue; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime)(); bIDCerAuthenticate = true; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errReadEx2 == Error_NotImpl) { ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息 } else { ctx->Ans.msgtype = 1; //新字段传递,UTF8、二进制传递文字信息 //ex2数据读取功能代码、UCS2转UTF8代码 bInvokeReadEx2 = true; if (errReadEx2 != Error_Succeed) { bReadSuccess = false; } else { unsigned char name[1024]; memset(name, 0, 1024); unsigned char sex[1024]; memset(sex, 0, 1024); unsigned char nation[1024]; memset(nation, 0, 1024); unsigned char birthday[1024]; memset(birthday, 0, 1024); unsigned char address[1024]; memset(address, 0, 1024); unsigned char idno[1024]; memset(idno, 0, 1024); unsigned char department[1024]; memset(department, 0, 1024); unsigned char startDate[1024]; memset(startDate, 0, 1024); unsigned char endDate[1024]; memset(endDate, 0, 1024); unsigned char englishName[1024]; memset(englishName, 0, 1024); unsigned char nationality[1024]; memset(nationality, 0, 1024); unsigned char idVersion[1024]; memset(idVersion, 0, 1024); unsigned char idType[1024]; memset(idType, 0, 1024); unsigned char reserved[1024]; memset(reserved, 0, 1024);//外国人永居证旧证件关联字段 unsigned char englishNameEx[1024]; memset(englishNameEx, 0, 1024); //英文名备用字段 unsigned char IssuedSN[1024]; memset(IssuedSN, 0, 1024); //换证次数 DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER) .setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime) .setLogCode(IDCertService_LogCode_ReadAndScanUTF8JS)(); bReadSuccess = true; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op."); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER)("各字段长度-姓名:%d; 性别:%d; 民族:%d; 身份证:%d;", GetUCS2ByteLength((UINT16*)idInfoEx2.name.data), GetUCS2ByteLength((UINT16*)idInfoEx2.sex.data), GetUCS2ByteLength((UINT16*)idInfoEx2.nation.data), GetUCS2ByteLength((UINT16*)idInfoEx2.idno.data)); //去除首尾空格 RemoveUCS2Blank((UINT16*)idInfoEx2.name.data); CheckHanZi((UINT16*)idInfoEx2.name.data); //检测汉字编码 RemoveUCS2Blank((UINT16*)idInfoEx2.sex.data); RemoveUCS2Blank((UINT16*)idInfoEx2.nation.data); RemoveUCS2Blank((UINT16*)idInfoEx2.birthday.data); RemoveUCS2Blank((UINT16*)idInfoEx2.address.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idno.data); RemoveUCS2Blank((UINT16*)idInfoEx2.department.data); RemoveUCS2Blank((UINT16*)idInfoEx2.startDate.data); RemoveUCS2Blank((UINT16*)idInfoEx2.endDate.data); RemoveUCS2Blank((UINT16*)idInfoEx2.englishName.data); RemoveUCS2Blank((UINT16*)idInfoEx2.nationality.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idVersion.data); RemoveUCS2Blank((UINT16*)idInfoEx2.idType.data); RemoveUCS2Blank((UINT16*)idInfoEx2.reserved.data); //外国人永居证旧证件关联字段 RemoveUCS2Blank((UINT16*)idInfoEx2.reserved2.data); //英文名备用字段 RemoveUCS2Blank((UINT16*)idInfoEx2.issuedSN.data); //换证次数 #ifdef RVC_OS_WIN //转换成GBK用于debug上传 char* tSex = new char[32]; char* tNation = new char[32]; char* tBirthday = new char[32]; char* tStartDate = new char[32]; char* tEndDate = new char[32]; char* tIDcode = new char[1024]; char* tIDtype = new char[8]; char* tName = new char[128]; char* tNationality = new char[8]; char* tChecKNum = new char[8]; memcpy(tSex, idInfoEx2.sex.data, 32); memcpy(tNation, idInfoEx2.nation.data, 32); memcpy(tBirthday, idInfoEx2.birthday.data, 32); memcpy(tStartDate, idInfoEx2.startDate.data, 32); memcpy(tEndDate, idInfoEx2.endDate.data, 32); memcpy(tIDcode, idInfoEx2.idno.data, 1024); memcpy(tIDtype, idInfoEx2.idType.data, 8); memcpy(tName, idInfoEx2.name.data, 128); memcpy(tNationality, idInfoEx2.nationality.data, 8); memcpy(tChecKNum, idInfoEx2.issuedSN.data, 8); char* gbkSex, * gbkNation, * gbkBirthday, * gbkStartDate, * gbkEndDate, * gbkIDcode, * gbkIDtype, * gbkName, * gbkNationality, * gbktCheckNum; int iSize; //sex iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, NULL, 0, NULL, NULL); gbkSex = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tSex, -1, gbkSex, iSize, NULL, NULL); //nation iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, NULL, 0, NULL, NULL); gbkNation = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNation, -1, gbkNation, iSize, NULL, NULL); //birthday iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, NULL, 0, NULL, NULL); gbkBirthday = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tBirthday, -1, gbkBirthday, iSize, NULL, NULL); //startdate iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, NULL, 0, NULL, NULL); gbkStartDate = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tStartDate, -1, gbkStartDate, iSize, NULL, NULL); //endate iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, NULL, 0, NULL, NULL); gbkEndDate = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tEndDate, -1, gbkEndDate, iSize, NULL, NULL); //idcode iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, NULL, 0, NULL, NULL); gbkIDcode = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDcode, -1, gbkIDcode, iSize, NULL, NULL); //idtype iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, NULL, 0, NULL, NULL); gbkIDtype = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tIDtype, -1, gbkIDtype, iSize, NULL, NULL); //name iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, NULL, 0, NULL, NULL); gbkName = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tName, -1, gbkName, iSize, NULL, NULL); //natinality iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, NULL, 0, NULL, NULL); gbkNationality = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tNationality, -1, gbkNationality, iSize, NULL, NULL); //issuedSN iSize = WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, NULL, 0, NULL, NULL); gbktCheckNum = (char*)malloc((iSize + 1)); WideCharToMultiByte(CP_ACP, 0, (wchar_t*)tChecKNum, -1, gbktCheckNum, iSize, NULL, NULL); //gbk转换结束 #endif UCS2_to_UTF8((UINT16*)idInfoEx2.name.data, name); //UCS2_to_UTF8((UINT16*)idInfoEx2.sex.data, sex); GetSexUTF8String((UINT16*)idInfoEx2.sex.data, sex); //UCS2_to_UTF8((UINT16*)idInfoEx2.nation.data, nation); GetNationalUTF8String((UINT16*)idInfoEx2.nation.data, nation); //UCS2_to_UTF8((UINT16*)idInfoEx2.birthday.data, birthday); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.birthday.data, birthday); UCS2_to_UTF8((UINT16*)idInfoEx2.address.data, address); UCS2_to_UTF8((UINT16*)idInfoEx2.idno.data, idno); UCS2_to_UTF8((UINT16*)idInfoEx2.department.data, department); //UCS2_to_UTF8((UINT16*)idInfoEx2.startDate.data, startDate); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.startDate.data, startDate); //UCS2_to_UTF8((UINT16*)idInfoEx2.endDate.data, endDate); GetDateStandardFormatUTF8((UINT16*)idInfoEx2.endDate.data, endDate); UCS2_to_UTF8((UINT16*)idInfoEx2.englishName.data, englishName); UCS2_to_UTF8((UINT16*)idInfoEx2.nationality.data, nationality); UCS2_to_UTF8((UINT16*)idInfoEx2.idVersion.data, idVersion); UCS2_to_UTF8((UINT16*)idInfoEx2.idType.data, idType); UCS2_to_UTF8((UINT16*)idInfoEx2.reserved.data, reserved); UCS2_to_UTF8((UINT16*)idInfoEx2.reserved2.data, englishNameEx); UCS2_to_UTF8((UINT16*)idInfoEx2.issuedSN.data, IssuedSN); ctx->Ans.name_utf8.Alloc(strlen((char*)name)); ctx->Ans.sex_utf8.Alloc(strlen((char*)sex)); ctx->Ans.nation_utf8.Alloc(strlen((char*)nation)); ctx->Ans.birthday_utf8.Alloc(strlen((char*)birthday)); ctx->Ans.address_utf8.Alloc(strlen((char*)address)); ctx->Ans.idcode_utf8.Alloc(strlen((char*)idno)); ctx->Ans.department_utf8.Alloc(strlen((char*)department)); ctx->Ans.startdate_utf8.Alloc(strlen((char*)startDate)); ctx->Ans.enddate_utf8.Alloc(strlen((char*)endDate)); ctx->Ans.englishname_utf8.Alloc(strlen((char*)englishName)); ctx->Ans.nationality_utf8.Alloc(strlen((char*)nationality)); ctx->Ans.idversion_utf8.Alloc(strlen((char*)idVersion)); ctx->Ans.idtype_utf8.Alloc(strlen((char*)idType)); ctx->Ans.reserved_utf8.Alloc(strlen((char*)reserved)); //新外国人永居证关联字段 ctx->Ans.othercode_utf8.Alloc(strlen((char*)englishNameEx)); //英文名备用字段 memcpy(ctx->Ans.name_utf8.m_pData, name, strlen((char*)name)); memcpy(ctx->Ans.sex_utf8.m_pData, sex, strlen((char*)sex)); memcpy(ctx->Ans.nation_utf8.m_pData, nation, strlen((char*)nation)); memcpy(ctx->Ans.birthday_utf8.m_pData, birthday, strlen((char*)birthday)); memcpy(ctx->Ans.address_utf8.m_pData, address, strlen((char*)address)); memcpy(ctx->Ans.idcode_utf8.m_pData, idno, strlen((char*)idno)); memcpy(ctx->Ans.department_utf8.m_pData, department, strlen((char*)department)); memcpy(ctx->Ans.startdate_utf8.m_pData, startDate, strlen((char*)startDate)); memcpy(ctx->Ans.enddate_utf8.m_pData, endDate, strlen((char*)endDate)); memcpy(ctx->Ans.englishname_utf8.m_pData, englishName, strlen((char*)englishName)); memcpy(ctx->Ans.nationality_utf8.m_pData, nationality, strlen((char*)nationality)); memcpy(ctx->Ans.idversion_utf8.m_pData, idVersion, strlen((char*)idVersion)); memcpy(ctx->Ans.idtype_utf8.m_pData, idType, strlen((char*)idType)); memcpy(ctx->Ans.reserved_utf8.m_pData, reserved, strlen((char*)reserved)); //新外国人永居证关联字段 memcpy(ctx->Ans.othercode_utf8.m_pData, englishNameEx, strlen((char*)englishNameEx)); //英文名备用字段 ctx->Ans.hasscan = 0; GetPngBlobEx(ctx->Ans.headphoto, "zp"); //转换头像图片 if (igestionVer == TRUE)//吸入式设备才调用正反扫描功能 { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr = m_hDevHelper->ScanIDAndSaveImage(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { if(eErr != Error_NotImpl) SetErrorAndLog(eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage, "DevAdapter::ScanIDAndSaveImage", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); } if (eErr == Error_Succeed) { transImgMsg.Clear(); //idfront.bmp" and "idback.bmp ErrorCodeEnum eErrFront, eErrBack; eErrFront = GetPngBlobEx(ctx->Ans.frontphoto, "idfront"); eErrBack = GetPngBlobEx(ctx->Ans.backphoto, "idback"); if (eErrFront == Error_Succeed && eErrBack == Error_Succeed) { ctx->Ans.hasscan = 1; #ifdef RVC_OS_WIN if (!closeImgCheck) { ImgChekTask* frontImgCheck = new ImgChekTask(this); frontImgCheck->idNum =/* ctx->Ans.idcode_utf8.m_pData*/gbkIDcode; frontImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName; frontImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality; frontImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype; frontImgCheck->imgInput = ctx->Ans.frontphoto; frontImgCheck->imgType = "正面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck); ImgChekTask* backImgCheck = new ImgChekTask(this); backImgCheck->idNum = /*ctx->Ans.idcode_utf8.m_pData*/gbkIDcode; backImgCheck->inName = /*ctx->Ans.name_utf8.m_pData*/gbkName; backImgCheck->inNationality = /*ctx->Ans.nationality_utf8.m_pData*/gbkNationality; backImgCheck->inIdType = /*ctx->Ans.idtype_utf8.m_pData*/gbkIDtype; backImgCheck->imgInput = ctx->Ans.backphoto; frontImgCheck->imgType = "背面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck); } #endif } else { CSimpleStringA warnMsg = "ScanIDAndSaveImage() suc. But GetPngBlobEx() failed."; if (transImgMsg.GetLength() != 0) { warnMsg = warnMsg + transImgMsg; } LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_TransImgFaild, warnMsg.GetData()); } } } #ifdef RVC_OS_WIN CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s" , (const char*)CSimpleStringA(gbkIDcode).SubString(0, 4) , (const char*)CSimpleStringA(gbkIDcode).SubString(CSimpleStringA(gbkIDcode).GetLength() - 1, 1)); #else CSimpleStringA tIdcode = (char*)idno; CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s" , (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1)); #endif LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData()); ctx->Ans.photodata = ctx->Ans.headphoto; DeleteZP(Bmp_ZP); bGetIDCert = true; break; } } } dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; } if (m_bExit) bExitWhenReading = true; if (!m_bExit && !bOpenRF && errRfOpen != Error_Succeed) { SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); /*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM) .setResultCode(std::to_string(errRfOpen).c_str()) ("ReadAndScanUTF8JS::IDCerRFControl Open failed with errcode: %d", errRfOpen);*/ } m_bExit = false; m_bReading = false; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off"); int pos = 99; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum eErr1 = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 == Error_NotImpl) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos")("old version.no need position."); } else { if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime)(); switch (pos) { case 1: case 2: m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr1 = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 != Error_Succeed) { //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("exec IDCerRFControl(false) failed, force eject..."); SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errEject != Error_Succeed) { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)(); } } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::CloseIDCerRFControl") .setCostTime(m_ullEndTime - m_ullBeginTime)(); } break; case 0: default: break; } } else { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); /*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210A") ("exec QueryCardPos first time failed.");*/ } //查询卡片位置以决定跳转 m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr1 = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime)(); } else { SetErrorAndLog(eErr1, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); /*DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210A") ("exec QueryCardPos second time failed with errcode: %d", eErr1);*/ } } if (eErr1 != Error_Succeed || (eErr1 == Error_Succeed && (pos != 0))) { //oilyang@20180531 add for close enter card m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errRfClose = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errRfClose != Error_Succeed) { SetErrorAndLog(errRfClose, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::CloseIDCerRFControl", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errEject = m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errEject != Error_Succeed) { SetErrorAndLog(errEject, MEC_DEVAPI_IDCER_ForceIDEject, "DevAdapter::ForceIDEject", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime)(); } } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM) .setAPI("DevAdapter::CloseIDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)(); } } if (bGetIDCert) { ctx->Answer(Error_Succeed); } else if (m_bCancelRead) { ctx->Answer(Error_Cancel); } else if (elapsed >= IDCER_READ_TIMEOUT) { if (bIDCerAuthenticate) { if (bInvokeReadEx2 && !bReadSuccess) { SetErrorAndLog(errReadEx2, MEC_DEVAPI_IDCER_IDCerGetDataEx2, "DevAdapter::IDCerGetDataEx2", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2(Timeout) failed: %s", SpStrError(errReadEx2)); ctx->Answer(Error_Unexpect, GetAlarmDEC()); //RTA2109 } } else if (!bOpenRF) { SetErrorAndLog(errRfOpen, MEC_DEVAPI_IDCER_IDCerRFControl, "DevAdapter::OpenIDCerRFControl", __FUNCTION__, true, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Open IDCerRFControl(Timeout) failed: %s", SpStrError(errRfOpen)); ctx->Answer(Error_Unexpect, GetAlarmDEC()); } else { //DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("ReadAndScanUTF8::IDCerAuthenticate(Timeout) failed with errcode: %d", errAuth); if (errAuth == Error_DevMedia) { SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate_NotIDCard, "DevAdapter::IDCerAuthenticate", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); //RTA2108 ctx->Answer(Error_Unexpect, GetAlarmDEC()); } else { SetErrorAndLog(errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate, "DevAdapter::IDCerAuthenticate", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8JS); //RTA2107 ctx->Answer(Error_Unexpect, GetAlarmDEC()); } } } else { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setLogCode(IDCertService_LogCode_ReadAndScanUTF8).setResultCode("RTA2104")("ReadAndScanUTF8JS some thing wrong."); ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed); LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScanUTF8 some thing wrong."); } if (eErr1 == Error_Succeed && pos == 2) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 4"); return 4; } if (m_bCancelRead) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 2"); return 2; } if (bExitWhenReading) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 3"); return 3; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 0"); return 0; } ErrorCodeEnum CIDCertFSM::GetPngBlobEx(CBlob &data, CSimpleStringA fileNamePrefix, bool bClear) { CSimpleStringA strPath, errMsg, strOldPath; ErrorCodeEnum eErr; eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath); if (eErr != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get [Dep] path failed! errcode:%s.", SpStrError(eErr)); if (bClear) DeleteZP(Bmp_SCAN); return Error_Param; } strPath = strPath + SPLIT_SLASH_STR + fileNamePrefix; //涉及到后缀名变更,单独实现 if (!ExistsFileA((const char*)(strPath + ".bmp"))) { eErr = m_pEntity->GetFunction()->GetPath("DepBak", strOldPath); if (eErr != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get [DepBak] Path failed! errcode:%s.", SpStrError(eErr)); if (bClear) DeleteZP(Bmp_SCAN); return Error_Param; } strOldPath = strOldPath + SPLIT_SLASH_STR + fileNamePrefix; if (ExistsFileA(strOldPath + ".bmp"))//在旧Dep路径下找到文件时告警 { strPath = strOldPath; CSimpleStringA warnMsg = CSimpleStringA::Format("Find %s.bmp in OLD dep path!", strOldPath.GetData()); LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_FindFile_in_DepBak, warnMsg.GetData()); } } IplImage *src = cvLoadImage(strPath + ".bmp"); if (!src) { errMsg = CSimpleStringA::Format("read file %s.bmp failed.err:%d", (const char*)strPath, GetLastError()); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg.GetData()); if (transImgMsg.GetLength() != 0) { transImgMsg = transImgMsg + "," + errMsg; } else { transImgMsg = errMsg; } if (bClear) DeleteZP(Bmp_SCAN); cvReleaseImage(&src); return Error_Unexpect; } cvSaveImage(strPath + ".jpg", src); FILE *fp = fopen(strPath + ".jpg", "rb"); if (fp) { fseek(fp, 0, SEEK_END); long flen = ftell(fp); fseek(fp, 0, SEEK_SET); data.Alloc(flen); fread(data.m_pData, 1, flen, fp); fclose(fp); if (bClear) DeleteZP(Bmp_SCAN); cvReleaseImage(&src); return Error_Succeed; } else { errMsg = CSimpleStringA::Format("fopen %s failed!", (const char*)strPath); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg.GetData()); if (transImgMsg.GetLength() != 0) { transImgMsg = transImgMsg + "," + errMsg; } else { transImgMsg = errMsg; } if (bClear) DeleteZP(Bmp_SCAN); cvReleaseImage(&src); return Error_IO; } } void CIDCertFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer pTransactionContext) { //for simple pTransactionContext->SendAnswer(m_testResult); } ErrorCodeEnum CIDCertFSM::DeleteFileIfExisted(LPCTSTR fileName, int deleteTiming) { if(strlen(fileName) == 0 || strchr(fileName, (int)'*') != NULL) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("Invalid or empty fileName(%s)", fileName); return Error_Param; } CSimpleStringA strAimPath, strAimOldPath; ErrorCodeEnum erroCode = m_pEntity->GetFunction()->GetPath("Dep", strAimPath); strAimPath = strAimPath + SPLIT_SLASH_STR + fileName; UpdateAndWarnFileFindInDepBak(strAimPath, fileName, IDCertificate_UserErrorCode_FindFile_in_DepBak); if (ExistsFileA((LPCTSTR)strAimPath)) { if (deleteTiming == 1) //检测到上次读证残留图片 { CSimpleStringA errMsg = CSimpleStringA::Format("检测到上次读证残留图片:[%s]", strAimPath.GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2112").setAPI("DeleteFileIfExisted")(errMsg.GetData()); } if (RemoveFileA((LPCTSTR)strAimPath)) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("RemoveFileA(%s) suc.", (LPCTSTR)strAimPath); return Error_Succeed; } else { CSimpleStringA rtaCode = ""; if (deleteTiming == 1) //删除上次读证残留图片失败 { rtaCode = "RTA2113"; } else if (deleteTiming == 2) //删除本次读证生成图片失败 { rtaCode = "RTA2115"; } DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(rtaCode.GetData()).setAPI("DeleteFileIfExisted") ("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError()); return Error_Unexpect; } } else { if (deleteTiming == 2) //未发现本次读证生成的图片 { CSimpleStringA errMsg = CSimpleStringA::Format("未发现本次读证生成的图片:[%s]", strAimPath.GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2114").setAPI("DeleteFileIfExisted")(errMsg.GetData()); } return Error_Succeed; } } ErrorCodeEnum CIDCertFSM::GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType) { if (m_getDevCategory != Error_Succeed) return m_getDevCategory; strncpy(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) + 1 : MAX_DEV_MODEL_LEN); strncpy(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) + 1 : MAX_DEV_TYPE_LEN); strncpy(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) + 1 : MAX_DEV_VENDOR_LEN); devType = m_adapterInfo.strVersion;//适配器版本号 return Error_Succeed; } int CIDCertFSM::WaitFetchIDCard() { LOG_FUNCTION(); ErrorCodeEnum eErr = Error_Unexpect; int pos = 99; DWORD64 dwStart = SP::Module::Comm::RVCGetTickCount(); DWORD64 dwEnd = 0; while ((dwEnd - dwStart) < 120 * 1000)//wait for 120 seconds { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (eErr == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("QueryCardPos succeed"); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210A") ("QueryCardPos failed."); } if (eErr == Error_Succeed && pos == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WaitFetchIDCard")("身份证被取回"); return 0; } Sleep(1000); } // BugFix [4/16/2020 14:27 @Gifur] return -1; } void CIDCertFSM::DeleteZP(int type, int deleteTiming) { if ((type&Bmp_ZP) == Bmp_ZP) { DeleteFileIfExisted("zp.jpg", deleteTiming); DeleteFileIfExisted("zp.bmp", deleteTiming); //All } if ((type&Bmp_SCAN) == Bmp_SCAN) { DeleteFileIfExisted("idfront.bmp", deleteTiming); DeleteFileIfExisted("idback.bmp", deleteTiming); DeleteFileIfExisted("idfront.jpg", deleteTiming); DeleteFileIfExisted("idback.jpg", deleteTiming); } } int CIDCertFSM::Initial() { LOG_FUNCTION(); CSystemStaticInfo sysInfo; GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo); m_csMachineType = sysInfo.strMachineType; m_terminalNo = sysInfo.strTerminalID; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("machineType:%s,terminalNo:%s", (const char*)m_csMachineType, (const char*)m_terminalNo); SetDevState(DEVICE_STATUS_NOT_READY); auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); //to do device init ErrorCodeEnum eErrDev; CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); CSmartPointer spConfig; eErrDev = spEntityFunction->OpenConfig(Config_Root, spConfig); if (eErrDev != Error_Succeed) { LogWarn(Severity_Middle, eErrDev, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "open cfg file failed!"); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("open cfg file failed!"); m_bOpening = false; return 2; } eErrDev = pEntity->LoadVendorLibName(); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("get vendor dll(%s)name failed.", pEntity->GetVendorLibName().GetData()); m_bOpening = false; return 2; } FulfillAdapterInfoFrom(pEntity->vendorLibInfo); pEntity->InitializeVendorLogSwitch(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("Vendor=%s#Version=%s#Batch=%s", (const char*)m_adapterInfo.strVendor, (const char*)m_adapterInfo.strVersion, (const char*)m_adapterInfo.strBatch); eErrDev = LoadUpAdapterLibrary(); if (!IS_SUCCEED(eErrDev)) { LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_DllLoadFailed, CSimpleStringA::Format("身份证加载厂商适配器失败!GLE=%d.", GetLastError())); m_bOpening = false; return 2; } DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("IDCer open with port %d", m_adapterInfo.GetPortInt()); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum err = m_hDevHelper->DevOpen(m_adapterInfo.GetPortInt()); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); m_bOpening = false; if (err == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(m_ullEndTime - m_ullBeginTime) ("Initial DevOpen succeed"); } else { SetErrorAndLog(err, MEC_DEVAPI_IDCER_DevOpen, "DevAdapter::DevOpen", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); m_hDevHelper.TearDown(); return 2; } memset(m_devCatInfo.szModel, 0, MAX_DEV_MODEL_LEN); memset(m_devCatInfo.szType, 0, MAX_DEV_TYPE_LEN); memset(m_devCatInfo.szVendor, 0, MAX_DEV_VENDOR_LEN); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErrDev = m_hDevHelper->GetDevCategory(m_devCatInfo); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); m_getDevCategory = err; //获取设备信息的api执行结果 if (eErrDev == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime) ("Initial GetDevCategory succeed"); if (strlen(m_devCatInfo.szModel) < 256) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", m_devCatInfo.szModel); CSimpleStringA szMod(m_devCatInfo.szModel); if (strstr(m_devCatInfo.szModel, "CODE=UCS2") != NULL) { supportUCS2 = TRUE; } if (strstr(m_devCatInfo.szModel, "STYLE=IG") != NULL) { igestionVer = TRUE; } if (strstr(m_devCatInfo.szModel, "FUNCTION=ITFY") != NULL) { supportNewForeigner = TRUE; } m_adapterInfo.FulfillCategoryInfo(m_devCatInfo); } else { SetErrorAndLog(eErrDev, MEC_DEVAPI_IDCER_GetDevCategory, "DevAdapter::GetDevCategory", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime); } if (m_hDevHelper != nullptr) { SetDevInitFlag(); LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_DevOpen_Success, "身份证打开成功"); return 0; } else return 2; return 0; } BOOL CIDCertFSM::UCS2_to_UTF8(UINT16* ucs2_code, UINT8* utf8_code) { UINT8* out = utf8_code; if (!utf8_code) { return FALSE; } while (*ucs2_code != 0) { if (0x0080 > *ucs2_code) { /* 1 byte UTF-8 Character.*/ *out = (UINT8)*ucs2_code; ++out; } else if (0x0800 > *ucs2_code) { /*2 bytes UTF-8 Character.*/ *out = ((UINT8)(*ucs2_code >> 6)) | 0xc0; *(out + 1) = ((UINT8)(*ucs2_code & 0x003F)) | 0x80; out += 2; } else { /* 3 bytes UTF-8 Character .*/ *out = ((UINT8)(*ucs2_code >> 12)) | 0xE0; *(out + 1) = ((UINT8)((*ucs2_code & 0x0FC0) >> 6)) | 0x80; *(out + 2) = ((UINT8)(*ucs2_code & 0x003F)) | 0x80; out += 3; } //挪动两个字节 ++ucs2_code; } return TRUE; } BOOL CIDCertFSM::GetSexUTF8String(UINT16* in, UINT8* out) { if (!out) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("性别转换out字段为空!"); return false; } #ifdef RVC_OS_WIN wstring man = L"男"; wstring woman = L"女"; wstring unknow = L"未说明"; unsigned char tmp[1024]; memset(tmp, 0, 1024); UCS2_to_UTF8(in, tmp); int sexCode = _wtoi((wchar_t*)in); switch (sexCode) { case 1: UCS2_to_UTF8((UINT16*)man.c_str(), out); break; case 2: UCS2_to_UTF8((UINT16*)woman.c_str(), out); break; case 9: UCS2_to_UTF8((UINT16*)unknow.c_str(), out); break; default: UCS2_to_UTF8(in, out); break; } #else //linux默认编码就是utf8,直接拷贝 char* man = "男"; char* woman = "女"; char* unknow = "未说明"; unsigned char sexIn[1024]; memset(sexIn, 0, 1024); UCS2_to_UTF8(in, sexIn); //linux默认编码就是utf8,转成utf8格式后直接就是linux下的char类型 long sexCode = atoi((char*)sexIn); //直接转成数字 switch (sexCode) { case 1: memcpy(out, man, strlen(man)); break; case 2: memcpy(out, woman, strlen(woman)); break; case 9: memcpy(out, unknow, strlen(unknow)); break; default: UCS2_to_UTF8(in, out); break; } #endif return true; } BOOL CIDCertFSM::GetNationalUTF8String(UINT16* in, UINT8* out) { if (!out) { return false; } #ifdef RVC_OS_WIN int sexCode = _wtoi((wchar_t*)in); if (sexCode >= 1 && sexCode <= 56) { UCS2_to_UTF8((UINT16*)nationalCode[sexCode].c_str(), out); } else { UCS2_to_UTF8(in, out); } #else unsigned char nationIn[1024]; memset(nationIn, 0, 1024); UCS2_to_UTF8(in, nationIn); //linux默认编码就是utf8,转成utf8格式后直接就是linux下的char类型 int nCode = atoi((char*)nationIn); //直接转成数字 if (nCode >= 1 && nCode <= 56) { //linux默认编码就是utf8,直接拷贝 memcpy(out, nationalCode[nCode].c_str(), strlen(nationalCode[nCode].c_str())); } else { UCS2_to_UTF8(in, out); } #endif return true; } BOOL CIDCertFSM::GetDateStandardFormatUTF8(UINT16* in, UINT8* out) { if (!out) { return false; } #ifdef RVC_OS_WIN wstring longtime = L"长期"; unsigned char ltimeCheck[1024]; memset(ltimeCheck, 0, 1024); UCS2_to_UTF8((UINT16*)longtime.c_str(), ltimeCheck); #else char* ltimeCheck = "长期"; //linux默认编码就是utf8 #endif unsigned char ltimeIn[1024]; memset(ltimeIn, 0, 1024); UCS2_to_UTF8(in, ltimeIn); int cmp = strcmp((char*)ltimeCheck, (char*)ltimeIn); //判断长期证件 if (cmp == 0) { #ifdef RVC_OS_WIN wstring time = L"9999/12/31"; UCS2_to_UTF8((UINT16*)time.c_str(), out); #else char tEndtime[1024] = "9999/12/31"; //linux默认编码就是utf8,不转换,直接传出去就好 memcpy(out, tEndtime, strlen(tEndtime)); #endif return true; } UINT16 trans[1024]; memset(trans, 0, 1024); int cnt = 0; UINT16* p1 = in; UINT16* p2 = trans; while (*p1 != '\0') { if (cnt == 4 || cnt == 7) //在对年份和月份后增加斜杠 { *p2 = '/'; p2++; } else { *p2 = *p1; p1++; p2++; } cnt++; } //*p2 = '\0'; UCS2_to_UTF8(trans, out); return true; } BOOL CIDCertFSM::RemoveUCS2Blank(UINT16* ucs2_code) { if (!ucs2_code) return false; bool findContent = false; UINT16* tmp = ucs2_code; UINT16* start = ucs2_code; UINT16* end = ucs2_code; while (*tmp == ' ') { tmp++; } while (*tmp != '\0') { if (*tmp != ' ' && findContent == false) { findContent = true; start = tmp; //找到内容开始位置 end = tmp; } else { if (*tmp != ' ') { end = tmp; } } tmp++; } tmp = end; while (*tmp != '\0') { if (*tmp == ' ') //去除结尾空格 { *tmp = '\0'; break; } tmp++; } ucs2_code = start; return true; } int CIDCertFSM::GetUCS2ByteLength(UINT16* ucs2_code) { if (!ucs2_code) return 0; int len = 0; UINT16* tmp = ucs2_code; while (*tmp != '\0' && *tmp != ' ') { len++; tmp++; } return 2 * len; } void CIDCertFSM::CheckHanZi(UINT16* ucs2_code) { if (!ucs2_code) return; UINT16* tmp = ucs2_code; int count = 1; while (*tmp != '\0') { if (*tmp >= 0x4e00 && *tmp <= 0x9fa5) { //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("是汉字。"); } else { BYTE fileHash[2]; memset(fileHash, 0, 2); memcpy(fileHash, tmp, 2); char* strFileHash = new char[4]; memset(strFileHash, 0, 4); SP::Module::Util::HexBuf2StrBuf(fileHash, &strFileHash, 2); CSimpleStringA warn = CSimpleStringA::Format("姓名第%d个字非汉字编码, 数据为:%s", count, strFileHash); LogWarn(Severity_Low, Error_Debug, IDCertificate_UserErrorCode_ReadAndScan_NotHanZi, warn.GetData()); } tmp++; count++; } } void CIDCertFSM::CheckEjectCardRes(ErrorCodeEnum errRf, ErrorCodeEnum errForceIDEject) { int pos = 99; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum posErr = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (posErr == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("执行吐卡后,获取卡片位置成功, pos : %d", pos); CSimpleStringA warnMsg = CSimpleStringA::Format("RFControl返回:%s. ForceIDEject返回%s. 获取卡片位置 pos = %d.", SpStrError(errRf), SpStrError(errForceIDEject), pos); switch (pos) { case 0: LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_EjectCardRes_Pos_0, warnMsg.GetData()); break; case 1: LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_EjectCardRes_Pos_1, warnMsg.GetData()); break; case 2: LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_EjectCardRes_Pos_2, warnMsg.GetData()); break; default: LogWarn(Severity_Middle, Error_Succeed, IDCertificate_UserErrorCode_EjectCardRes_Pos_X, warnMsg.GetData()); break; } } else { SetErrorAndLog(posErr, MEC_DEVAPI_IDCER_QueryCardPos, "DevAdapter::QueryCardPos", __FUNCTION__, false, m_ullEndTime - m_ullBeginTime, IDCertService_LogCode_ReadAndScanUTF8); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("执行吐卡后,获取卡片位置失败.", posErr); } } #ifdef RVC_OS_WIN void CIDCertFSM::HttpsLogCallBack(const char* logtxt) { //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", logtxt); } #endif