#include "stdafx.h" #include "IDCertFSM.h" #include "GetDevInfoHelper.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 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; CSmartPointer spCtSettingConfig; m_fsm->GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spCtSettingConfig); CSimpleStringA tUrl; spCtSettingConfig->ReadConfigValue("IDCertificate", "CardDetectUrl", tUrl); string m_url = tUrl.GetData(); if (m_url.size() == 0) { #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/ m_url = "https://carddetect.paasst.cmbchina.cn/api/card/image-detect"; #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/ m_url = "https://carddetect.paasuat.cmbchina.cn/api/card/image-detect"; #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/ m_url = "https://carddetect.paas.cmbchina.cn/api/card/image-detect"; #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev&生产环境*/ m_url = "https://carddetect.paas.cmbchina.cn/api/card/image-detect"; #else/*本地编译等非DevOps环境编译的版本*/ m_url = "https://carddetect.paasst.cmbchina.cn/api/card/image-detect"; #endif } imgCheckReq.m_url = m_url; 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(); #ifdef RVC_OS_LINUX m_devState = DEVICE_STATUS_NORMAL; //GetEntityBase()->GetFunction()->SetUserDefineState(IDCertificate_UserErrorCode_Status_Idle); if (m_FirstStart) { m_FirstStart = FALSE; ToLogWarnInfoAboutTerm(); } #else if (!m_logBefore) { ToLogWarnInfoAboutTermCustom(); m_logBefore = true; } m_devState = DEVICE_STATUS_NORMAL; //GetEntityBase()->GetFunction()->SetUserDefineState(IDCertificate_UserErrorCode_Status_Idle); #endif } void CIDCertFSM::s0_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s0_on_event(FSMEvent* pEvt) { LOG_FUNCTION(); 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: { pEvt->SetHandled(); ReadAndScanEvent* ide = dynamic_cast(pEvt); ReadAndScanTask* task = new ReadAndScanTask(this); task->ctx = ide->ctx; GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } 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_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(); //GetEntityBase()->GetFunction()->SetUserDefineState(IDCertificate_UserErrorCode_Status_Reading); } void CIDCertFSM::s1_on_exit() { LOG_FUNCTION(); } unsigned int CIDCertFSM::s1_on_event(FSMEvent *pEvt) { LOG_FUNCTION(); 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_FINISHED: if(pEvt->param1 == -1) { invalidBreak = true; return 5; } pEvt->SetHandled(); ret = pEvt->param1; 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_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(); m_devState = DEVICE_STATUS_FAULT; //GetEntityBase()->GetFunction()->SetUserDefineState(IDCertificate_UserErrorCode_Status_Failed); 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(); m_devState = 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) { LOG_FUNCTION(); 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 CSimpleStringA strDepPath; ErrorCodeEnum Error = m_pEntity->GetFunction()->GetPath("Dep", strDepPath); if (Error == Error_Succeed) { strPath = "termb.dll";//CSimpleStringA::Format("%s\\mod_IDCertificate\\termb.dll", (LPCSTR)strDepPath); } return Error; } bool isnostr(const char *str) { int len = strlen(str); if (len == 0) return true; for (int i = 0; i < len; ++i) { if (*(str+i) != ' ') return false; } return true; } 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_LINUX m_devCatInfo.eState = DEVICE_STATUS_NOT_READY; m_devCatInfo.version = { 0, 0, 0, 0 }; #endif // RVC_OS_LINUX #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; } return Error_Succeed; } ErrorCodeEnum CIDCertFSM::OnExit() { if (m_hDevHelper) { ErrorCodeEnum err = Error_Succeed; m_hDevHelper.TearDown(); return err; } return Error_Succeed; } ErrorCodeEnum CIDCertFSM::CheckDate(const char* date) { string strDate = date; if(strDate.find("长期") != string::npos) { return Error_Succeed; } else { regex pattern("^(([0-9]{4})(\.|-|年)(0[1-9]|1[0-2])(\.|-|月)(0[1-9]|[12][0-9]|3[01])(日)*)$"); smatch sm; if(regex_match(strDate, sm, pattern)) { int month = atoi(sm[4].str().c_str()); int day = atoi(sm[6].str().c_str()); if(month > 0 && month <= 12 && day > 0 && day <= 31) { return Error_Succeed; } } } return Error_Unexpect; } ErrorCodeEnum CIDCertFSM::CheckDate(const char* startDate, const char* endDate) { string strStartDate = startDate, strEndDate = endDate; regex pattern("^(([0-9]{4})(\.|-))"); smatch smStart, smEnd; if (regex_search(strStartDate, smStart, pattern) && regex_search(strEndDate, smEnd, pattern)) { strStartDate = smStart.suffix().str(); strEndDate = smEnd.suffix().str(); if(strStartDate == strEndDate) return Error_Succeed; } else if(strEndDate == "长期") return Error_Succeed; return Error_Unexpect; } void CIDCertFSM::LogDate(IDCerInfo idInfo) { ErrorCodeEnum eErrCode = CheckDate(idInfo.startDate.data); CSimpleStringA errMsg; if(Error_Succeed != eErrCode) { errMsg = CSimpleStringA::Format("Invalid startDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } eErrCode = CheckDate(idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } eErrCode = CheckDate(idInfo.birthday.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } } void CIDCertFSM::LogDateEx(IDCerInfoEx idInfo) { ErrorCodeEnum eErrCode = CheckDate(idInfo.startDate.data); CSimpleStringA errMsg; if(Error_Succeed != eErrCode) { errMsg = CSimpleStringA::Format("Invalid startDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } eErrCode = CheckDate(idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } eErrCode = CheckDate(idInfo.birthday.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate"); LogWarn(Severity_Middle, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)(errMsg); } } int CIDCertFSM::ReadAndScan(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); DWORD elapsed = 0; ErrorCodeEnum eErr = Error_Unexpect; ErrorCodeEnum errRF = Error_Unexpect; ErrorCodeEnum errAuth = Error_Unexpect; ErrorCodeEnum errRead = Error_Unexpect; ErrorCodeEnum errReadEx = Error_Unexpect; #ifdef RVC_OS_WIN m_readAndScanCtx = ctx; DWORD dwStart = GetTickCount(); DWORD dwEnd = GetTickCount(); #else DWORD dwStart = RVCGetTickCount(); DWORD dwEnd = RVCGetTickCount(); #endif LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_ON, "IDCer warning on"); DeleteZP(Bmp_ZP|Bmp_SCAN); bool bOpenRF = false, bGetIDCert = false; IDCerInfoEx idInfo; IDCerInfo idInfoOld; 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 bExitWhenReading = false; bool bIDCerAuthenticate = false; #ifdef RVC_OS_LINUX ErrorCodeEnum ecForIDCerRFControl(Error_Succeed); ErrorCodeEnum ecForIDCerAuthenticate(Error_Succeed); #endif while (elapsed < IDCER_READ_TIMEOUT && !bGetIDCert && !m_bCancelRead) { if (m_bExit) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("exit"); break; } bReadSuccess = false; bInvokeReadEx = false; if (m_bWaitReadMore) { dwStart = SP::Module::Comm::RVCGetTickCount(); m_bWaitReadMore = false; } if (!bOpenRF) { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errRF = m_hDevHelper->IDCerRFControl(true); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); #ifdef RVC_OS_LINUX ecForIDCerRFControl = errRF; #endif if (Error_Succeed == errRF) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("open rf succeed."); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("open rf failed."); dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; Sleep(IDCER_AUTH_INTERVAL); continue; } } bOpenRF = true; Sleep(IDCER_AUTH_INTERVAL); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errAuth = m_hDevHelper->IDCerAuthenticate(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); bIDCerAuthenticate = false; #ifdef RVC_OS_LINUX ecForIDCerAuthenticate = errAuth; #endif if (Error_Succeed != errAuth) { #ifdef RVC_OS_WIN DevErrorInfo devErrInfo; m_hDevHelper->GetLastErr(devErrInfo); #endif 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) ("ReadAndScan IDCerAuthenticate auth succeed."); bIDCerAuthenticate = true; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errReadEx = m_hDevHelper->IDCerGetDataEx(idInfo); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errReadEx == Error_NotImpl) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("to call old interface"); bInvokeReadEx = false; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errRead = m_hDevHelper->IDCerGetData(idInfoOld); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errRead != Error_Succeed) { bReadSuccess = false; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER) .setAPI("DevAdapter::IDCerGetData").setCostTime(m_ullEndTime - m_ullBeginTime) .setLogCode("QLR040220106")("read succeed."); bReadSuccess = true; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op."); ctx->Ans.name = idInfoOld.name.data; ctx->Ans.sex = idInfoOld.sex.data; ctx->Ans.nation = idInfoOld.nation.data; ctx->Ans.birthday = idInfoOld.birthday.data; ctx->Ans.address = idInfoOld.address.data; ctx->Ans.idcode = idInfoOld.idno.data; //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换 if (ctx->Ans.idcode.GetLength() != 0) { if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x') { ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X'; } } ctx->Ans.department = idInfoOld.department.data; ctx->Ans.startdate = idInfoOld.startDate.data; ctx->Ans.enddate = idInfoOld.endDate.data; //hyc@2021.3.24 LogDate(idInfoOld); CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s," ,(const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)); LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData()); ctx->Ans.photodata = ctx->Ans.headphoto; DeleteZP(Bmp_ZP); bGetIDCert = true; break; } } else { bInvokeReadEx = true; if (errReadEx != Error_Succeed) { bReadSuccess = false; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER) .setAPI("DevAdapter::IDCerGetDataEx").setCostTime(m_ullEndTime - m_ullBeginTime) .setLogCode("QLR040220106")("read succeed(sp scan)."); bReadSuccess = true; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op."); ctx->Ans.name = idInfo.name.data; ctx->Ans.sex = idInfo.sex.data; ctx->Ans.nation = idInfo.nation.data; ctx->Ans.birthday = idInfo.birthday.data; ctx->Ans.address = idInfo.address.data; ctx->Ans.idcode = idInfo.idno.data; //oilyang@20180309 根据俞根伟,生产上存在身份证异常为'x'的问题,统一进行转换 if (ctx->Ans.idcode.GetLength() != 0) { if (ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] == 'x') { ctx->Ans.idcode[ctx->Ans.idcode.GetLength() - 1] = 'X'; } } ctx->Ans.department = idInfo.department.data; ctx->Ans.startdate = idInfo.startDate.data; ctx->Ans.enddate = idInfo.endDate.data; ctx->Ans.englishname = idInfo.englishName.data; ctx->Ans.nationality = idInfo.nationality.data; ctx->Ans.idversion = idInfo.idVersion.data; ctx->Ans.idtype = idInfo.idType.data; ctx->Ans.reserved = idInfo.reserved.data; ctx->Ans.startdate = idInfo.startDate.data; 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) ("ReadAndScan ScanIDAndSaveImage succeed"); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210C") ("ReadAndScan::ScanIDAndSaveImage failed with errCode 0x%x", eErr); } ctx->Ans.hasscan = 0; #ifdef RVC_OS_WIN //hyc@2021.3.24 LogDateEx(idInfo); #endif 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", true); 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; frontImgCheck->inName = ctx->Ans.name; frontImgCheck->inNationality = ctx->Ans.nationality; frontImgCheck->inIdType = ctx->Ans.idtype; frontImgCheck->imgInput = ctx->Ans.frontphoto; frontImgCheck->imgType = "正面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(frontImgCheck); ImgChekTask* backImgCheck = new ImgChekTask(this); backImgCheck->idNum = ctx->Ans.idcode; backImgCheck->inName = ctx->Ans.name; backImgCheck->inNationality = ctx->Ans.nationality; backImgCheck->inIdType = ctx->Ans.idtype; backImgCheck->imgInput = ctx->Ans.backphoto; frontImgCheck->imgType = "背面"; GetEntityBase()->GetFunction()->PostThreadPoolTask(backImgCheck); } #endif } else { if (igestionVer == TRUE) { 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()); } } } GetPngBlobEx(ctx->Ans.headphoto, "zp", true); CSimpleStringA csIDLogInfo = CSimpleStringA::Format("IDNo:%s****%s" , (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1)); 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 (errRead != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2109") ("Invoke IDCerGetDataEx failed: %s", SpStrError(eErr)); } #ifdef RVC_OS_WIN if(m_bExit) bExitWhenReading = true; if(!m_bExit && !bOpenRF && errRF != Error_Succeed) { SetErrPackage("ReadAndScan::IDCerRFControl", m_devSN, errRF, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM). setResultCode(std::to_string(errRF).c_str()) ("ReadAndScan::IDCerRFControl failed with errcode: %d", errRF); } #endif if (!m_bExit && bOpenRF && !bIDCerAuthenticate) { SetErrPackage("ReadAndScan::IDCerAuthenticate", m_devSN, errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM). setResultCode("RTA2107") ("ReadAndScan::IDCerAuthenticate failed with errcode: %d", errAuth); } m_bExit = false; m_bReading = false; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_GREEN_OFF, "IDCer warning off"); int pos = 99; ErrorCodeEnum eErr1 = m_hDevHelper->QueryCardPos(pos); 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_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("exec QueryCardPos first time succ, pos : %d", pos); 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).setAPI("DevAdapter::IDCerRFControl"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("exec IDCerRFControl(false) failed, force eject..."); SetErrPackage("ReadAndScan::IDCerRFControl", m_devSN, eErr1, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); m_hDevHelper->ForceIDEject(); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ."); } break; case 0: default: break; } } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210A") ("exec QueryCardPos first time failed."); } //查询卡片位置以决定跳转 eErr1 = m_hDevHelper->QueryCardPos(pos); if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("exec QueryCardPos second time succ, pos : %d", pos); }else{ SetErrPackage("ReadAndScan::QueryCardPos", m_devSN, eErr1, MEC_DEVAPI_IDCER_QueryCardPos); AlarmDEC(); 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 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Close RF again..."); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errRf = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errRf != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("exec IDCerRFControl(false) failed, force eject..."); SetErrPackage("ReadAndScan::IDCerRFControl", m_devSN, errRf, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); m_hDevHelper->ForceIDEject(); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ."); } } #ifdef RVC_OS_WIN if (bGetIDCert) ctx->Answer(Error_Succeed); else if (m_bCancelRead) ctx->Answer(Error_Cancel); else if (elapsed >= IDCER_READ_TIMEOUT){ if(bIDCerAuthenticate){ if(bInvokeReadEx && !bReadSuccess){ SetErrPackage("ReadAndScan::IDCerGetDataEx", m_devSN, errReadEx, MEC_DEVAPI_IDCER_IDCerGetDataEx); ctx->Answer(Error_TimeOut, AlarmDEC()); }else if(!bInvokeReadEx && !bReadSuccess){ SetErrPackage("ReadAndScan::IDCerGetData", m_devSN, errRead, MEC_DEVAPI_IDCER_IDCerGetData); ctx->Answer(Error_TimeOut, AlarmDEC()); } } }else{ DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::IDCerGetDataEx").setLogCode("QLR040220106").setResultCode("RTA2104"); ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed); LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScan some thing wrong."); } #else //zjw@20191219 处理完相关操作再返回给前端,防止状态还未跳转又发起流程 if (bGetIDCert) { ctx->Answer(Error_Succeed); } else if (m_bCancelRead) { ctx->Answer(Error_Cancel); LogWarn(Severity_Low, Error_Debug, IDCertificate_UserErrorCode_CancelOperation, "User cancel read IDCard from front."); } else if (elapsed >= IDCER_READ_TIMEOUT) { ctx->Answer(Error_TimeOut); if (ecForIDCerRFControl != Error_Succeed) { SetErrPackage("ReadAndScan::IDCerRFControl(Timeout)", m_devSN, ecForIDCerRFControl, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); } if (ecForIDCerAuthenticate != Error_Succeed) { SetErrPackage("ReadAndScan::IDCerAuthenticate(Timeout)", m_devSN, ecForIDCerAuthenticate, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); } } else { ctx->Answer(Error_Unexpect); if (ecForIDCerRFControl != Error_Succeed) { SetErrPackage("ReadAndScan::IDCerRFControl", m_devSN, ecForIDCerRFControl, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); } if (ecForIDCerAuthenticate != Error_Succeed) { SetErrPackage("ReadAndScan::IDCerAuthenticate", m_devSN, ecForIDCerAuthenticate, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); } LogError(Severity_High, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Failed, "ReadAndScan some thing wrong."); } #endif //RVC_OS_WIN if (eErr1 == Error_Succeed && pos == 2) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("return 4"); return 4; } #ifdef RVC_OS_WIN 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"); #endif //RVC_OS_WIN return 0; } int CIDCertFSM::ReadAndScanUTF8(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); #ifdef RVC_OS_WIN m_readAndScanUTF8Ctx = ctx; #endif if (supportUCS2 == FALSE) { ctx->Ans.msgtype = 0; ctx->Answer(Error_Succeed); return 0; } DWORD elapsed = 0; DWORD dwStart = SP::Module::Comm::RVCGetTickCount(); DWORD dwEnd = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum eErr = Error_Unexpect; ErrorCodeEnum errRF = 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; #ifdef RVC_OS_LINUX ErrorCodeEnum ecForIDCerRFControl(Error_Succeed); ErrorCodeEnum ecForIDCerAuthenticate(Error_Succeed); #endif 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(); errRF = m_hDevHelper->IDCerRFControl(true); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime) ("RreadAndScanUTF8 DevAdapter::IDCerRFControl"); #ifdef RVC_OS_LINUX ecForIDCerRFControl = errRF; #endif if (Error_Succeed == errRF) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("open rf succeed."); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("open rf failed."); 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(); #ifdef RVC_OS_LINUX ecForIDCerAuthenticate = errAuth; #endif if (Error_Succeed != errAuth) { #ifdef RVC_OS_WIN DevErrorInfo devErrInfo; m_hDevHelper->GetLastErr(devErrInfo); #endif 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) ("ReadAndScanUTF8 IDCerAuthenticate auth succeed."); 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("QLR040220106")("read succeed(sp2 scan)."); 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)); //英文名备用字段 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) ("ReadAndScanUTF8 ScanIDAndSaveImage succeed."); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210C") ("ReadAndScanUTF8::ScanIDAndSaveImage failed with errCode 0x%x", eErr); } ctx->Ans.hasscan = 0; 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", true); 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 { if (igestionVer == TRUE) { 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()); } } } GetPngBlobEx(ctx->Ans.headphoto, "zp", true); #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 (errReadEx2 != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2109") ("Invoke IDCerGetDataEx2 failed: %s", SpStrError(eErr)); } #ifdef RVC_OS_WIN if (m_bExit) bExitWhenReading = true; if (!m_bExit && !bOpenRF && errRF != Error_Succeed) { SetErrPackage("ReadAndScanUTF8::IDCerRFControl", m_devSN, errRF, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM) .setResultCode(std::to_string(errRF).c_str()) ("ReadAndScanUTF8::IDCerRFControl failed with errcode: %d", errRF); } #endif if (!m_bExit && bOpenRF && !bIDCerAuthenticate) { SetErrPackage("ReadAndScanUTF8::IDCerAuthenticate", m_devSN, errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM). setResultCode("RTA2107") ("ReadAndScanUTF8::IDCerAuthenticate failed with errcode: %d", errAuth); } 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_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("exec QueryCardPos first time succ, pos : %d", pos); 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).setAPI("DevAdapter::IDCerRFControl"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("exec IDCerRFControl(false) failed, force eject..."); SetErrPackage("ReadAndScanUTF8::IDCerRFControl", m_devSN, eErr1, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::ForceIDEject"); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("exec IDCerRFControl succ."); } break; case 0: default: break; } } else { 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_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos") .setCostTime(m_ullEndTime - m_ullBeginTime) ("exec QueryCardPos second time succ, pos : %d", pos); } else { SetErrPackage("ReadAndScanUTF8::QueryCardPos", m_devSN, eErr1, MEC_DEVAPI_IDCER_QueryCardPos); AlarmDEC(); 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 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("Close RF again..."); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); ErrorCodeEnum errRf = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (errRf != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("exec IDCerRFControl(false) failed, force eject..."); SetErrPackage("ReadAndScanUTF8::IDCerRFControl", m_devSN, errRf, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); m_hDevHelper->ForceIDEject(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ForceIDEject").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::ForceIDEject"); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("Close RF again succ."); } } if (bGetIDCert) { ctx->Answer(Error_Succeed); } else if (m_bCancelRead) { ctx->Answer(Error_Cancel); } else if (elapsed >= IDCER_READ_TIMEOUT) { #ifdef RVC_OS_WIN if (bIDCerAuthenticate) { if (bInvokeReadEx && !bReadSuccess) { SetErrPackage("ReadAndScanUTF8::IDCerGetDataEx", m_devSN, errReadEx, MEC_DEVAPI_IDCER_IDCerGetDataEx); ctx->Answer(Error_TimeOut, AlarmDEC()); } else if (!bInvokeReadEx && !bReadSuccess) { SetErrPackage("ReadAndScanUTF8::IDCerGetData", m_devSN, errRead, MEC_DEVAPI_IDCER_IDCerGetData); ctx->Answer(Error_TimeOut, AlarmDEC()); } } #else ctx->Answer(Error_TimeOut); if (ecForIDCerRFControl != Error_Succeed) { SetErrPackage("ReadAndScanUTF8::IDCerRFControl(Timeout)", m_devSN, ecForIDCerRFControl, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); } if (ecForIDCerAuthenticate != Error_Succeed) { SetErrPackage("ReadAndScanUTF8::IDCerAuthenticate(Timeout)", m_devSN, ecForIDCerAuthenticate, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); } #endif //RVC_OS_WIN } else { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_USER).setAPI("DevAdapter::IDCerGetDataEx2").setLogCode("QLR040220106").setResultCode("RTA2104"); 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; } #ifdef RVC_OS_WIN 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; } #endif 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; ErrorCodeEnum eErr; eErr = m_pEntity->GetFunction()->GetPath("Dep", strPath); if (eErr != Error_Succeed) { if (bClear) DeleteZP(Bmp_SCAN); return Error_Param; } #ifdef RVC_OS_WIN strPath = strPath + "\\" + fileNamePrefix; #else strPath = strPath + SPLIT_SLASH_STR + fileNamePrefix; #endif 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) { 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 strPath, strAimPath; ErrorCodeEnum erroCode = m_pEntity->GetFunction()->GetPath("Dep", strPath); #ifdef RVC_OS_LINUX strAimPath = strPath + SPLIT_SLASH_STR + fileName; if (ExistsFileA((LPCTSTR)strAimPath)) { if (RemoveFileA((LPCTSTR)strAimPath)) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("RemoveFileA(%s) suc.", (LPCTSTR)strAimPath); return Error_Succeed; } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError()); return Error_Unexpect; } } #else strAimPath = strPath + "\\" + fileName; WIN32_FIND_DATA findData; if(FindFirstFileA((LPCTSTR)strAimPath, &findData) != INVALID_HANDLE_VALUE) { if(DeleteFileA((LPCTSTR)strAimPath) != 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("DeleteFile(%s) suc.", (LPCTSTR)strAimPath); return Error_Succeed; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("DeleteFile(%s) failed LastError(%d).", (LPCTSTR)strAimPath, GetLastError()); return Error_Unexpect; } } #endif // RVC_OS_LINUX if(GetLastError() == ERROR_FILE_NOT_FOUND) { return Error_Succeed; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("DeleteFile(%s) Unexpect GetLastError(%d).", (LPCTSTR)strAimPath, GetLastError()); return Error_Unexpect; } ErrorCodeEnum CIDCertFSM::GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType) { #ifdef RVC_OS_LINUX LOG_FUNCTION(); 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_devVer;//适配器版本号 devInfo.eState = DEVICE_STATUS_NORMAL; memcpy(&devInfo.version, &m_devCatInfo.version, sizeof(DevSoftVersion)); return Error_Succeed; #else LOG_FUNCTION(); strncpy_s(devInfo.szModel, m_devCatInfo.szModel, (MAX_DEV_MODEL_LEN > strlen(m_devCatInfo.szModel)) ? strlen(m_devCatInfo.szModel) : MAX_DEV_MODEL_LEN); strncpy_s(devInfo.szType, m_devCatInfo.szType, (MAX_DEV_TYPE_LEN > strlen(m_devCatInfo.szType)) ? strlen(m_devCatInfo.szType) : MAX_DEV_TYPE_LEN); strncpy_s(devInfo.szVendor, m_devCatInfo.szVendor, (MAX_DEV_VENDOR_LEN > strlen(m_devCatInfo.szVendor)) ? strlen(m_devCatInfo.szVendor) : MAX_DEV_VENDOR_LEN); devType = m_devVer;//适配器版本号 return Error_Succeed; #endif // RVC_OS_LINUX } 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) { if ((type&Bmp_ZP) == Bmp_ZP) { DeleteFileIfExisted("zp.JPEG"); DeleteFileIfExisted("zp.jpg"); DeleteFileIfExisted("zp.bmp"); //All DeleteFileIfExisted("wz.txt"); //Sankyo DeleteFileIfExisted("xp.wlt"); DeleteFileIfExisted("ImgTemp.bmp"); //Nantian DeleteFileIfExisted("BP8913_ID.bmp"); //Nantian } if ((type&Bmp_SCAN) == Bmp_SCAN) { DeleteFileIfExisted("idfront.bmp"); DeleteFileIfExisted("idback.bmp"); DeleteFileIfExisted("idfront.jpg"); DeleteFileIfExisted("idback.jpg"); } } #ifdef RVC_OS_WIN int CIDCertFSM::Initial() //windows ver { 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); m_devState = DEVICE_STATUS_NOT_READY; auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); //to do device init ErrorCodeEnum err; ErrorCodeEnum eErrDev; CSimpleStringA tmpVendor(""), tmpDevSN(""),tmpDLLVersion, csDepPath(""), csBackslash("\\"); 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; } m_devSN = ""; 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); HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, m_adapterInfo.strVendor); pEntity->InitializeVendorLogSwitch(); /** 如果是多合一,意义在哪? Gifur@2023330]*/ spConfig->ReadConfigValue("Device.IDCertificate", "Vendor", m_devVendor); spConfig->ReadConfigValue("Device.IDCertificate", "Version", m_devVer); spConfig->ReadConfigValue("Device.IDCertificate", "Batch", m_devBatch); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__) ("Vendor=%s#Version=%s#Batch=%s", (const char*)m_devVendor, (const char*)m_devVer, (const char*)m_devBatch); eErrDev = m_hDevHelper.LoadUp(m_adapterInfo.adapterFilePath); if (!IS_SUCCEED(eErrDev)) { LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_DllLoadFailed, CSimpleStringA::Format("身份证加载厂商适配器失败!GLE=%d.", GetLastError()).GetData()); 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(); 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 { SetErrPackage("Initial::DevOpen", m_devSN, err, MEC_DEVAPI_IDCER_DevOpen); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2105") ("Initial::DevOpen with errcode:%d", err); m_hDevHelper.TearDown(); return 2; } ToLogRootINIInfo(); ZeroMemory(m_devCatInfo.szModel, MAX_DEV_MODEL_LEN); ZeroMemory(m_devCatInfo.szType, MAX_DEV_TYPE_LEN); ZeroMemory(m_devCatInfo.szVendor, MAX_DEV_VENDOR_LEN); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErrDev = m_hDevHelper->GetDevCategory(m_devCatInfo); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); 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 { SetErrPackage("Initial::GetDevCategory", m_devSN, eErrDev, MEC_DEVAPI_IDCER_GetDevCategory); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210D") ("Initial::GetDevCategory failed with errcode : %d", eErrDev); } if (m_hDevHelper != nullptr) { m_bOpened = true; LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_DevOpen_Success, "身份证打开成功"); if(invalidBreak && m_readAndScanCtx != nullptr) { LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Interrupt, "读证件异常退出"); m_readAndScanCtx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Interrupt); invalidBreak = false; } else if (invalidBreak && m_readAndScanUTF8Ctx != nullptr) //ex3 { LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Interrupt, "读证件Ex异常退出"); m_readAndScanUTF8Ctx->Answer(Error_Unexpect, IDCertificate_UserErrorCode_ReadAndScan_Interrupt); invalidBreak = false; } return 0; } else return 2; return 0; } #else int CIDCertFSM::Initial() //linux ver { LOG_FUNCTION(); bkPicPath = "bk.png"; //初始化默认背景图片名称 auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); pEntity->InitializeVendorLogSwitch(); FulfillAdapterInfoFrom(pEntity->vendorLibInfo); m_devState = DEVICE_STATUS_NOT_READY; CSimpleStringA csLibFullName; ErrorCodeEnum err = pEntity->ExtractVendorLibFullPath(csLibFullName); if (err != Error_Succeed) { LogWarn(Severity_Middle, err, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "get dllname failed"); return Error_DevLoadFileFailed; } LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_RootInfo, csLibFullName.GetData()); m_adapterInfo.adapterFilePath = csLibFullName; err = m_hDevHelper.LoadUp(csLibFullName); if (err != Error_Succeed) { LogWarn(Severity_Middle, Error_Unexpect, IDCertificate_UserErrorCode_DllLoadFailed, CSimpleStringA::Format("身份证加载厂商适配器失败!GLE=%d.", GetLastError()).GetData()); //LogErrMsg("LoadUp", err, DEC_DEV_OBJECT_CREATE_FAILED, TRUE); return 2; } CSimpleStringA dllName, tmpVendor(""), tmpDevSN(""), tmpDLLVersion, csDepPath(""); dllName = pEntity->GetVendorLibName(); CSmartPointer pConfig; ErrorCodeEnum rc = GetEntityBase()->GetFunction()->OpenConfig(Config_Root, pConfig); CSimpleStringA strSection = CSimpleStringA("Device.") + GetEntityBase()->GetEntityName(); CSimpleStringA str; pConfig->ReadConfigValue(strSection, "Vendor", str); HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, str); bool bOpenFlag = false; do { int tmpPort = 0; CSmartPointer spConfig; CSmartPointer spEntityFunction = GetEntityBase()->GetFunction(); err = spEntityFunction->OpenConfig(Config_Root, spConfig); if (err != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed!"); LogWarn(Severity_Middle, err, IDCertificate_UserErrorCode_Open_RootCfg_Failed, "open root cfg failed."); return 2; } spConfig->ReadConfigValueInt("Device.IDCertificate", "Port", tmpPort); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("IDCer open with port %d", tmpPort); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); err = m_hDevHelper->DevOpen(tmpPort); 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 { SetErrPackage("Initial::DevOpen", m_devSN, err, MEC_DEVAPI_IDCER_DevOpen); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2105") ("Initial::DevOpen with errcode:%d", err); return 2; } } while (!m_hDevHelper && bOpenFlag == false); if (m_hDevHelper) { m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); err = m_hDevHelper->IDCerRFControl(false); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (err != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl"). setCostTime(m_ullEndTime - m_ullBeginTime).setResultCode("RTA2106") ("exec IDCerRFControl(false) failed"); SetErrPackage("Initial::IDCerRFControl", m_devSN, err, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(false, false); } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime)("close rf ok."); } } 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(); err = m_hDevHelper->GetDevCategory(m_devCatInfo); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); if (err == Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime) ("Initial GetDevCategory succeed"); m_adapterInfo.FulfillCategoryInfo(m_devCatInfo); 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; } } else { SetErrPackage("Initial::GetDevCategory", m_devSN, err, MEC_DEVAPI_IDCER_GetDevCategory); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory") .setCostTime(m_ullEndTime - m_ullBeginTime) .setResultCode("RTA210D") ("Initial::GetDevCategory failed with errcode : %d", err); } if (m_hDevHelper) { m_devInit = true; return 0; } else { return 2; } } #endif //RVC_OS_WIN #ifdef RVC_OS_WIN void CIDCertFSM::ToLogWarnInfoAboutTermCustom() { LOG_FUNCTION(); ToLogWarnInfoAboutTerm(); if(!m_csMachineType.Compare("RVC.Stand2S", true) && !m_adapterInfo.strVendor.Compare("kxd", true)) { //先读取系统变量是否有该值? CSimpleStringA deviceInfo(true); GetEntityBase()->GetFunction()->GetSysVar("kxdInfo", deviceInfo); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("deviceInfo = %s", deviceInfo.GetData()); if(!deviceInfo.Compare("KXD", true)) { //读取运行时信息,如果有值,不再写,如果没有值,读取告警的信息 //这中间会存在这里还在写,但其他模块已经要去读取该运行时的信息了,可能有先后顺序? CSimpleStringA strWarnMsg(true); CSimpleStringA szTypeInfo(true); CSimpleStringA deviceType(true); CSmartPointer spConfigRun; GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun); spConfigRun->ReadConfigValue("Run", "WarnMsg", strWarnMsg); if(!strWarnMsg.IsNullOrEmpty()) { Json::Value root; Json::Reader reader; if(reader.parse((const char*)strWarnMsg, root)) { szTypeInfo = root.isMember("szType") ? CSimpleStringA(root["szType"].asCString()) : ""; if(!szTypeInfo.IsNullOrEmpty()) { if(!szTypeInfo.Compare("KXD.IDCertificate.SNBC-ID8101", true) || !szTypeInfo.Compare("KXD.IDCertificate.SNBC-ID81", true)) { deviceType = "KS218"; } else { deviceType = "KL286"; } GetEntityBase()->GetFunction()->SetSysVar("kxdInfo", deviceType, true); //加个告警? LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_KxdDeviceInfo, deviceType.GetData()); } } } } } } #endif 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++; } } #ifdef RVC_OS_WIN void CIDCertFSM::HttpsLogCallBack(const char* logtxt) { //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("%s", logtxt); } #endif