#include "stdafx.h" #include "IDCertFSM.h" #include "GetDevInfoHelper.h" #include "EventCode.h" #include "libimageproc.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 #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; void Process() { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ImgChekTask")("ImgChekTask Process"); CSystemStaticInfo si; m_fsm->GetEntityBase()->GetFunction()->GetSystemStaticInfo(si); IHttpFunc* client; client = create_http(m_fsm->HttpsLogCallBack); ImgCheckReq imgCheckReq; ImgCheckRet imgCheckRet; imgCheckReq.m_printDbg = true; 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; DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("m_iLength图片数据长度为%ld.", srclen); string encodeIn = base64_encode((unsigned char*)imgInput.m_pData, srclen); //string encodeIn; //Encode(imgIn, encodeIn); //传给服务端应base64编码 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("base64 encode 成功。"); 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) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("imgCheckRetTask").setBeginTime(beg).setEndTime(end). setResultCode(std::to_string(LONGLONG(imgCheckRet.m_sysCode)).c_str()). setResultMsg(imgCheckRet.m_errMsg.c_str()) ("imgCheckRetTask userCode:%s,resultdata:%s.", imgCheckRet.m_userCode.c_str(),imgCheckRet.m_resultData.c_str()); //Dbg("图片检测成功---"); if (imgCheckRet.m_success == true) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("图片检测通过。"); } else { errMsg = CSimpleStringA::Format("图片检测不通过,result_data:%s.", imgCheckRet.m_resultData.c_str()); LogWarn(Severity_Middle, Error_Resource, IDCertificate_UserErrorCode_ScanImg_Failed, errMsg.GetData()); if (client) client->Destory(); return; } } else { errMsg = CSimpleStringA::Format("图片质量检测失败,ret = %d.", ret); 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(USER_IDCERTIFICATE_IDLE); if (m_FirstStart) { m_FirstStart = FALSE; ToLogWarnInfoAboutTerm(); } #else //oilyang@20220413 except RVC.PAD without FWB CSimpleStringA tmpFWBDevSN(""); GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN); if (!m_logBefore && !(m_csMachineType.Compare("RVC.PAD", true) == 0 && tmpFWBDevSN.IsNullOrEmpty())) { ToLogWarnInfoAboutTermCustom(); m_logBefore = true; } m_devState = DEVICE_STATUS_NORMAL; GetEntityBase()->GetFunction()->SetUserDefineState(USER_IDCERTIFICATE_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("s0_on_event")("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(); ProcFWBReConnTask* task = new ProcFWBReConnTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } 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(USER_IDCERTIFICATE_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("s1_on_event")("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("s1_on_event")("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(); ProcFWBReConnTask* task = new ProcFWBReConnTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } 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(USER_IDCERTIFICATE_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("s4_on_event") ("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("s5_on_event")("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(); ProcFWBReConnTask* task = new ProcFWBReConnTask(this); GetEntityBase()->GetFunction()->PostThreadPoolTask(task); } 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; 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: %s", idInfo.startDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDate")(errMsg); } eErrCode = CheckDate(idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate: %s", idInfo.endDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDate")(errMsg); } eErrCode = CheckDate(idInfo.startDate.data, idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("起止日期不匹配:start=%s, end=%s", idInfo.startDate.data, idInfo.endDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_NotMatch, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDate")(errMsg); } eErrCode = CheckDate(idInfo.birthday.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate: %s", idInfo.birthday.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDate")(errMsg); } } void CIDCertFSM::LogDateEx(IDCerInfoEx idInfo) { ErrorCodeEnum eErrCode = CheckDate(idInfo.startDate.data); CSimpleStringA errMsg; if(Error_Succeed != eErrCode) { errMsg = CSimpleStringA::Format("Invalid startDate: %s", idInfo.startDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidStartDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDateEx")(errMsg); } eErrCode = CheckDate(idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid endDate: %s", idInfo.endDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidEndDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDateEx")(errMsg); } eErrCode = CheckDate(idInfo.startDate.data, idInfo.endDate.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("起止日期不匹配:start=%s, end=%s", idInfo.startDate.data, idInfo.endDate.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_NotMatch, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDateEx")(errMsg); } eErrCode = CheckDate(idInfo.birthday.data); if(Error_Succeed != eErrCode) { CSimpleStringA errMsg = CSimpleStringA::Format("Invalid birthDate: %s", idInfo.birthday.data); LogWarn(Severity_Low, eErrCode, IDCertificate_UserErrorCode_InvalidBirthDate, (const char*)errMsg); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("LogDateEx")(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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScan DevAdapter::IDCerRFControl"); #ifdef RVC_OS_LINUX ecForIDCerRFControl = errRF; #endif if (Error_Succeed == errRF) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("open rf succeed."); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("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 DevAdapter::IDCerAuthenticate"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("IDCerAuthenticate")("auth succeed."); bIDCerAuthenticate = true; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errReadEx = m_hDevHelper->IDCerGetDataEx(idInfo); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerGetDataEx").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScan DevAdapter::IDCerGetDataEx"); if (errReadEx == Error_NotImpl) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScan") ("to call old interface"); bInvokeReadEx = false; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errRead = m_hDevHelper->IDCerGetData(idInfoOld); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerGetData").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScan DevAdapter::IDCerGetData"); if (errRead != Error_Succeed) { bReadSuccess = false; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Invoke IDCerGetData failed: %s", SpStrError(eErr)); } else { DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).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[ctx->Ans.idcode.GetLength() - 1] == 'x') { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("x to 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("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s," ,idInfoOld.sex.data ,idInfoOld.nation.data ,idInfoOld.endDate.data ,(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()); GetPngBlobEx(ctx->Ans.headphoto, "zp", true); eErr = GetPngBlob(ctx->Ans.photodata, true); if (eErr != Error_Succeed) { bGetIDCert = false; LOG_TRACE("get photo failed."); break; } bGetIDCert = true; break; } } else { bInvokeReadEx = true; if (errReadEx != Error_Succeed) { bReadSuccess = false; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx failed: %s", SpStrError(eErr)); } else { DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).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[ctx->Ans.idcode.GetLength() - 1] == 'x') { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("x to 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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScan DevAdapter::ScanIDAndSaveImage"); if(Error_Succeed != eErr){ //SetErrPackage("ReadAndScan::ScanIDAndSaveImage", m_devSN, eErr, MEC_DEVAPI_IDCER_ScanIDAndSaveImage); //AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ScanIDAndSaveImage") .setBeginTime(m_ullBeginTime).setEndTime(m_ullEndTime) .setResultCode(std::to_string((long long)eErr).c_str()) ("ReadAndScan::ScanIDAndSaveImage 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 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; 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; 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("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s" , (const char*)ctx->Ans.sex, (const char*)ctx->Ans.nation , (const char*)ctx->Ans.enddate , (const char*)ctx->Ans.idcode.SubString(0, 4), (const char*)ctx->Ans.idcode.SubString(ctx->Ans.idcode.GetLength() - 1, 1) , (const char*)ctx->Ans.idtype); LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData()); eErr = GetPngBlob(ctx->Ans.photodata, true); if (eErr != Error_Succeed) { bGetIDCert = false; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get photo failed."); break; } bGetIDCert = true; break; } } } dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; } #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).setAPI("IDCerRFControl"). setResultCode(std::to_string((unsigned long)errRF).c_str()) ("ReadAndScan::IDCerRFControl with errcode: %d", errRF); } if(!m_bExit && bOpenRF && !bIDCerAuthenticate) { SetErrPackage("ReadAndScan::IDCerAuthenticate", m_devSN, errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerAuthenticate"). setResultCode(std::to_string((unsigned long)errAuth).c_str()) ("ReadAndScan::IDCerAuthenticate with errcode: %d", errAuth); } #endif 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("QueryCardPos")("old version.no need position."); } else { if(eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("exec QueryCardPos first time succ, pos : %d", pos); switch (pos) { case 1: case 2: eErr1 = m_hDevHelper->IDCerRFControl(false); if (eErr1 != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl"). setResultCode(std::to_string((long long)errRF).c_str()) ("exec IDCerRFControl(false) failed, force eject..."); SetErrPackage("ReadAndScan::IDCerRFControl", m_devSN, eErr1, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(); m_hDevHelper->ForceIDEject(); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("exec IDCerRFControl succ."); } break; case 0: default: break; } } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("exec QueryCardPos first time failed."); } //查询卡片位置以决定跳转 eErr1 = m_hDevHelper->QueryCardPos(pos); if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("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("QueryCardPos"). setResultCode(std::to_string((long long)eErr1).c_str()) ("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("ReadAndScan")("Close RF again..."); ErrorCodeEnum errRf = m_hDevHelper->IDCerRFControl(false); if (errRf != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl"). setResultCode(std::to_string((long long)errRF).c_str()) ("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("IDCerRFControl")("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_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).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("ReadAndScan")("return 4"); return 4; } #ifdef RVC_OS_WIN if(m_bCancelRead) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("return 2"); return 2; } if(bExitWhenReading) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("return 3"); return 3; } DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("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; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("supportUCS2 = %d, 厂商不支持新接口,请调用旧接口。", supportUCS2); 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_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("open rf succeed."); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("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); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime) ("IDCerAuthenticate failed %d,%s.", errAuth, devErrInfo.szErrMsg); #else DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerAuthenticate").setCostTime(m_ullEndTime - m_ullBeginTime) ("IDCerAuthenticate failed: %s", SpStrError(ecForIDCerAuthenticate)); #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 DevAdapter::IDCerAuthenticate"); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("IDCerAuthenticate")("auth succeed."); bIDCerAuthenticate = true; m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); errReadEx2 = m_hDevHelper->IDCerGetDataEx2(idInfoEx2); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerGetDataEx2").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::IDCerGetDataEx2"); if (errReadEx2 == Error_NotImpl) { ctx->Ans.msgtype = 0; //旧字段传递,GBK、字符串传递文字信息 DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("厂商不支持新接口,请调用旧接口。"); } else { ctx->Ans.msgtype = 1; //新字段传递,UTF8、二进制传递文字信息 //ex2数据读取功能代码、UCS2转UTF8代码 DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("使用新字段。"); bInvokeReadEx2 = true; if (errReadEx2 != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Invoke IDCerGetDataEx2 failed: %s", SpStrError(eErr)); 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); DbgWithLink(LOG_LEVEL_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).setLogCode("QLR040220106")("read succeed(sp2 scan)."); bReadSuccess = true; LogEvent(Severity_Middle, LOG_EVT_IDCERTIFICATE_OP, "IDCertifacate op."); 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); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("已去除空格"); #ifdef RVC_OS_WIN //转换成GBK用于debug上传 char* tSex = new char[32]; char* tNation = 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]; memcpy(tSex, idInfoEx2.sex.data, 32); memcpy(tNation, idInfoEx2.nation.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); char *gbkSex, *gbkNation, *gbkEndDate, *gbkIDcode, *gbkIDtype, *gbkName, *gbkNationality; 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); //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); //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); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("已转换成utf8"); 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)); 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)); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ReadAndScan")("已传递接口字段。"); m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr = m_hDevHelper->ScanIDAndSaveImage(); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::ScanIDAndSaveImage").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::ScanIDAndSaveImage"); if (Error_Succeed != eErr) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("ScanIDAndSaveImage") .setBeginTime(m_ullBeginTime).setEndTime(m_ullEndTime) .setResultCode(std::to_string((long long)eErr).c_str()) ("ReadAndScanUTF8::ScanIDAndSaveImage 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 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; 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; 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("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s" , (const char*)CSimpleStringA(gbkSex), (const char*)CSimpleStringA(gbkNation) , (const char*)CSimpleStringA(gbkEndDate) , (const char*)CSimpleStringA(gbkIDcode).SubString(0, 4) , (const char*)CSimpleStringA(gbkIDcode).SubString(CSimpleStringA(gbkIDcode).GetLength() - 1, 1) , (const char*)CSimpleStringA(gbkIDtype)); #else CSimpleStringA tIdcode = (char*)idno; CSimpleStringA csIDLogInfo = CSimpleStringA::Format("Sex:%s,Nation:%s,EndDate:%s,IDNo:%s****%s,IDType:%s" , (const char*)sex, (const char*)nation , (const char*)endDate , (const char*)tIdcode.SubString(0, 4), (const char*)tIdcode.SubString(tIdcode.GetLength() - 1, 1) , (const char*)idType); #endif LogWarn(Severity_Low, Error_Succeed, IDCertificate_UserErrorCode_ReadAndScan_GetIDInfo, csIDLogInfo.GetData()); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to get photo"); eErr = GetPngBlob(ctx->Ans.photodata, true); if (eErr != Error_Succeed) { bGetIDCert = false; DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("get photo failed."); break; } bGetIDCert = true; break; } } } dwEnd = SP::Module::Comm::RVCGetTickCount(); elapsed = dwEnd - dwStart; } #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).setAPI("IDCerRFControl"). setResultCode(std::to_string((unsigned long)errRF).c_str()) ("ReadAndScanUTF8::IDCerRFControl with errcode: %d", errRF); } if (!m_bExit && bOpenRF && !bIDCerAuthenticate) { SetErrPackage("ReadAndScanUTF8::IDCerAuthenticate", m_devSN, errAuth, MEC_DEVAPI_IDCER_IDCerAuthenticate); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerAuthenticate"). setResultCode(std::to_string((unsigned long)errAuth).c_str()) ("ReadAndScanUTF8::IDCerAuthenticate with errcode: %d", errAuth); } #endif 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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::QueryCardPos"); if (eErr1 == Error_NotImpl) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("old version.no need position."); } else { if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::IDCerRFControl"); if (eErr1 != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl"). setResultCode(std::to_string((long long)errRF).c_str()) ("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_DEBUG, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl")("exec IDCerRFControl succ."); } break; case 0: default: break; } } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("exec QueryCardPos first time failed."); } //查询卡片位置以决定跳转 m_ullBeginTime = SP::Module::Comm::RVCGetTickCount(); eErr1 = m_hDevHelper->QueryCardPos(pos); m_ullEndTime = SP::Module::Comm::RVCGetTickCount(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::QueryCardPos"); if (eErr1 == Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("QueryCardPos")("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("QueryCardPos"). setResultCode(std::to_string((long long)eErr1).c_str()) ("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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::IDCerRFControl").setCostTime(m_ullEndTime - m_ullBeginTime) ("ReadAndScanUTF8 DevAdapter::IDCerRFControl"); if (errRf != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("IDCerRFControl"). setResultCode(std::to_string((long long)errRF).c_str()) ("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("IDCerRFControl")("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_INFO, ctx->link.checkEmpty() ? LOG_TYPE_SYSTEM : LOG_TYPE_USER).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("ReadAndScanUTF8")("return 4"); return 4; } #ifdef RVC_OS_WIN if (m_bCancelRead) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("return 2"); return 2; } if (bExitWhenReading) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("return 3"); return 3; } #endif DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("ReadAndScanUTF8")("return 0"); return 0; } ErrorCodeEnum CIDCertFSM::GetPngBlob(CBlob &data, bool bClear) { CSimpleStringA strPath,strBkPath,strBmpPath,strPngPath,strTxtPath,strWltPath; ErrorCodeEnum err; err = m_pEntity->GetFunction()->GetPath("Dep", strPath); if (err != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Get path failed."); return Error_Param; } #ifdef RVC_OS_WIN strBkPath = strPath + "\\bk.PNG"; strBmpPath = strPath + "\\zp.bmp"; strPngPath = strPath + "\\zp.JPEG"; strTxtPath = strPath + "\\wz.txt"; strWltPath = strPath + "\\xp.wlt"; #else strBkPath = strPath + SPLIT_SLASH_STR + "bk.bmp"; strBmpPath = strPath + SPLIT_SLASH_STR + "zp.bmp"; strPngPath = strPath + SPLIT_SLASH_STR + "zp.JPEG"; strTxtPath = strPath + SPLIT_SLASH_STR + "wz.txt"; strWltPath = strPath + SPLIT_SLASH_STR + "xp.wlt"; #endif bool bResult = imageprocess((char*)strBkPath.GetData(), (char*)strBmpPath.GetData(), (char*)strPngPath.GetData()); if (!bResult) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetPngBlob") ("photo changed failed."); return Error_Unexpect; } FILE *fp = fopen(strPngPath, "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); } else { LOG_TRACE("fopen %s failed!", (LPCSTR)strPngPath); err = Error_IO; } if (bClear) DeleteZP(Bmp_ZP); return err; } 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("GetPngBlobEx")(errMsg.GetData()); if (transImgMsg.GetLength() != 0) { transImgMsg = transImgMsg + "," + errMsg; } else { transImgMsg = errMsg; } if (bClear) DeleteZP(Bmp_SCAN); 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); return Error_Succeed; } else { errMsg = CSimpleStringA::Format("fopen %s failed!", (const char*)strPath); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("GetPngBlobEx")(errMsg.GetData()); if (transImgMsg.GetLength() != 0) { transImgMsg = transImgMsg + "," + errMsg; } else { transImgMsg = errMsg; } if (bClear) DeleteZP(Bmp_SCAN); 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("DeleteFileIfExisted") ("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("DeleteFileIfExisted") ("DeleteFile(%s) suc.", (LPCTSTR)strAimPath); return Error_Succeed; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DeleteFileIfExisted") ("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("DeleteFileIfExisted") ("DeleteFile(%s) Unexpect GetLastError(%d).", (LPCTSTR)strAimPath, GetLastError()); return Error_Unexpect; } ErrorCodeEnum CIDCertFSM::GetDevCatInfo(DevCategoryInfo &devInfo, CSimpleStringA& devType) { #ifdef RVC_OS_LINUX LOG_FUNCTION(); if (m_bRVCIL) { 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); return Error_Succeed; } 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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::QueryCardPos").setCostTime(m_ullEndTime - m_ullBeginTime) ("WaitFetchIDCard DevAdapter::QueryCardPos"); 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_INFO, LOG_TYPE_SYSTEM).setAPI("Initial")("machineType:%s,terminalNo:%s", (const char*)m_csMachineType, (const char*)m_terminalNo); //oilyang@20220413 except RVC.PAD without FWB CSimpleStringA tmpFWBDevSN(""); GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpFWBDevSN); if (m_csMachineType.Compare("RVC.PAD", true) == 0 && tmpFWBDevSN.IsNullOrEmpty()) { return 0; } 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("Initial")("open cfg file failed!"); return 2; } GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN); GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor); GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion); if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1 tmpDLLVersion = "8.1"; if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("Initial")("This is fwb device."); m_devSN = tmpDevSN; VendorLibInfo tmpVendorLibInfo(GetEntityBase()->GetEntityName()); tmpVendorLibInfo.strVendor = tmpVendor; CAutoArray dllVersions = tmpDLLVersion.Split('.'); if (dllVersions.GetCount() >= 2) { tmpVendorLibInfo.strVersion = dllVersions[0]; tmpVendorLibInfo.strBatch = dllVersions[1]; } else { tmpVendorLibInfo.strVersion = tmpDLLVersion; } pEntity->vendorLibInfo = tmpVendorLibInfo; } else { m_devSN = ""; eErrDev = pEntity->LoadVendorLibName(); if (eErrDev != Error_Succeed) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("Initial")("get vendor dll(%s)name failed.", pEntity->GetVendorLibName().GetData()); return 2; } } FulfillAdapterInfoFrom(pEntity->vendorLibInfo); HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, m_adapterInfo.strVendor); //CSimpleStringA adaptorInfo = GenerateJson(m_adapterInfo, m_pEntity->GetEntityName()); //LogWarn(Severity_Low, Error_Unexpect, IDCertificate_UserErrorCode_Real_Root_Config, adaptorInfo.GetData()); 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("Initial") ("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)) { return 2; } DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI("Initial")("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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(m_ullEndTime - m_ullBeginTime) ("Initial DevAdapter::DevOpen"); if (err != Error_Succeed) { SetErrPackage("Initial::DevOpen", m_devSN, err, MEC_DEVAPI_IDCER_DevOpen); AlarmDEC(); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI("DevOpen"). setBeginTime(m_ullBeginTime).setEndTime(m_ullEndTime).setResultCode(std::to_string((unsigned long)err).c_str()) ("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(); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::GetDevCategory").setCostTime(m_ullEndTime - m_ullBeginTime) ("Initial DevAdapter::GetDevCategory"); if (eErrDev == Error_Succeed) { if (strlen(m_devCatInfo.szModel) < 256) DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("Initial")("%s", m_devCatInfo.szModel); CSimpleStringA szMod(m_devCatInfo.szModel); if (strstr(m_devCatInfo.szModel, "CODE=UCS2") != NULL) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UCS2新库。"); supportUCS2 = TRUE; } if (strstr(m_devCatInfo.szModel, "STYLE=IG") != NULL) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("吸入式设备"); igestionVer = 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("GetDevCategory")("Initial::GetDevCategory 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(); auto pEntity = GET_DEV_ENTITY_BASE_POINTER(); pEntity->InitializeVendorLogSwitch(); FulfillAdapterInfoFrom(pEntity->vendorLibInfo); if (_strnicmp((const char*)m_csMachineType, "RVC.IL", strlen("RVC.IL")) == 0) { m_bRVCIL = true; return 0; } m_devState = DEVICE_STATUS_NOT_READY; CSimpleStringA csLibFullName; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("To extra vendor lib file path..."); 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; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("To load up vendor lib..."); err = m_hDevHelper.LoadUp(csLibFullName); if (err != Error_Succeed) { LogErrMsg("LoadUp", err, DEC_DEV_OBJECT_CREATE_FAILED, TRUE); return 2; } CSimpleStringA dllName, tmpVendor(""), tmpDevSN(""), tmpDLLVersion, csDepPath(""); GetEntityBase()->GetFunction()->GetSysVar("FWBVendor", tmpVendor); GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", tmpDevSN); GetEntityBase()->GetFunction()->GetSysVar("FWBVersion", tmpDLLVersion); if (tmpDLLVersion.GetLength() < 2)//如果忘记配置,则直接使用默认值8.1 tmpDLLVersion = "8.1"; if (tmpDevSN.GetLength() > 12 && tmpDevSN.IndexOf("FWB") > 2) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("This is fwb device."); m_devSN = tmpDevSN; GetEntityBase()->GetFunction()->GetPath("Dep", csDepPath); dllName = csDepPath + SPLIT_SLASH_STR + "IDCertificate." + tmpVendor + "." + tmpDLLVersion + ".dll";//oiltmp DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s", (const char*)dllName); HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, tmpVendor); } else { 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); err = m_hDevHelper->DevOpen(tmpPort); if (err != Error_Succeed) { SetErrPackage("Initial::DevOpen", m_devSN, err, MEC_DEVAPI_IDCER_DevOpen); AlarmDEC(); return 2; } } while (!m_hDevHelper && bOpenFlag == false); if (m_hDevHelper) { err = m_hDevHelper->IDCerRFControl(false); if (err != Error_Succeed) { SetErrPackage("Initial::IDCerRFControl", m_devSN, err, MEC_DEVAPI_IDCER_IDCerRFControl); AlarmDEC(false, false); } else { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("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); err = m_hDevHelper->GetDevCategory(m_devCatInfo); if (err == Error_Succeed) { m_adapterInfo.FulfillCategoryInfo(m_devCatInfo); CSimpleStringA szMod(m_devCatInfo.szModel); if (strstr(m_devCatInfo.szModel, "CODE=UCS2") != NULL) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("UCS2新库。"); supportUCS2 = TRUE; } if (strstr(m_devCatInfo.szModel, "STYLE=IG") != NULL) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("吸入式设备"); igestionVer = TRUE; } } else { SetErrPackage("Initial::GetDevCategory", m_devSN, err, MEC_DEVAPI_IDCER_GetDevCategory); AlarmDEC(); } 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("ToLogWarnInfoAboutTermCustom")("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()); } } } } } } int CIDCertFSM::ProcFWBReConn() { if (m_hDevHelper != nullptr) { m_hDevHelper.TearDown(); } return 0; } #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 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("性别代码映射成功"); 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); //直接转成数字 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("民族编码转换成数字atoi成功。结果为%ld.", nCode); 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 DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("民族代码映射成功"); 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) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("长期身份证,转换日期为9999/12/31"); #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); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("日期格式转换成功!"); return true; } BOOL CIDCertFSM::RemoveUCS2Blank(UINT16* ucs2_code) { if (!ucs2_code) return false; bool findContent = false; UINT16* tmp = ucs2_code; while (*tmp != '\0') { if (*tmp != ' ' && findContent == false) { findContent = true; } else { if (findContent) //去除结尾空格 { if (*tmp == ' ') { *tmp = '\0'; break; } } } tmp++; } return true; } 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_INFO, 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_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("%s", logtxt); } #endif