|
@@ -93,9 +93,9 @@ ErrorCodeEnum CHeartBeatFSM::OnInit()
|
|
|
|
|
|
//网络字节序
|
|
|
//由于双活改造,改成固定ip,分行服务有处理
|
|
|
- m_servIP = "99.1.100.215";
|
|
|
- m_dwServIP = inet_addr(m_servIP);
|
|
|
- m_csServerIP = m_servIP;
|
|
|
+ //m_servIP = "99.1.100.215";
|
|
|
+ m_dwServIP = inet_addr("99.1.100.215");
|
|
|
+ //m_csServerIP = m_servIP;
|
|
|
|
|
|
CSimpleStringA csRunDiskName("C:\\");
|
|
|
Error = GetEntityBase()->GetFunction()->GetPath("Run", csRunDiskName);
|
|
@@ -104,7 +104,6 @@ ErrorCodeEnum CHeartBeatFSM::OnInit()
|
|
|
if(arrays.GetCount() > 0)
|
|
|
{
|
|
|
m_csRunDiskName = arrays[0] + "\\";
|
|
|
- Dbg("m_csRunDiskName is %s", (LPCTSTR)m_csRunDiskName);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -275,37 +274,6 @@ unsigned int CHeartBeatFSM::s2_on_event(FSMEvent* pEvt)
|
|
|
case USER_EVT_CARD_ACTIVE_FINISHED:
|
|
|
pEvt->SetHandled();
|
|
|
break;
|
|
|
- case USER_EVT_CROSS_TERM_CALL:
|
|
|
- {
|
|
|
- pEvt->SetHandled();
|
|
|
- CrossTermCallEvent* pCTCE = dynamic_cast<CrossTermCallEvent*>(pEvt);
|
|
|
- CrossTermCallTask *pTask = new CrossTermCallTask(this);
|
|
|
- pTask->ctx = pCTCE->ctx;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 cross call,type %x.",pCTCE->ctx->Req.type);
|
|
|
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
|
|
|
- }
|
|
|
- break;
|
|
|
- case USER_EVT_CROSS_TERM_CALL_FINISHED:
|
|
|
- pEvt->SetHandled();
|
|
|
- break;
|
|
|
- case USER_EVT_ILCallToRVC:
|
|
|
- {
|
|
|
- pEvt->SetHandled();
|
|
|
- ILCallToRVCEvent* pCTCE = dynamic_cast<ILCallToRVCEvent*>(pEvt);
|
|
|
- ILCallToRVCTask *pTask = new ILCallToRVCTask(this);
|
|
|
- pTask->ctx = pCTCE->ctx;
|
|
|
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
|
|
|
- }
|
|
|
- break;
|
|
|
- case USER_EVT_CallResultToIL:
|
|
|
- {
|
|
|
- pEvt->SetHandled();
|
|
|
- CallResultToILEvent* pCTCE = dynamic_cast<CallResultToILEvent*>(pEvt);
|
|
|
- CallResultToILTask *pTask = new CallResultToILTask(this);
|
|
|
- pTask->ctx = pCTCE->ctx;
|
|
|
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
|
|
|
- }
|
|
|
- break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
@@ -622,6 +590,8 @@ void CHeartBeatFSM::HttpsLogCallBack(const char* logtxt)
|
|
|
{
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("HttpsLogCallBack")("http dbg: %s", logtxt);
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
@@ -666,7 +636,6 @@ ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
|
|
|
{
|
|
|
m_warnLevel = warmLevel;
|
|
|
m_entErrorList = strList;
|
|
|
- Dbg("strList[%s]",(LPCTSTR)strList);
|
|
|
return Error_Succeed;
|
|
|
}
|
|
|
void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
|
|
@@ -677,17 +646,29 @@ void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransaction
|
|
|
void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data)
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
|
- CardReadAdapterService_ClientBase *pCardReadAdapterClient = NULL;
|
|
|
- ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
- pCardReadAdapterClient = new CardReadAdapterService_ClientBase(GetEntityBase());
|
|
|
- eErr = pCardReadAdapterClient->Connect();
|
|
|
- if (eErr != Error_Succeed)
|
|
|
+ DWORD dwUserCode = 0;
|
|
|
+ if (!CheckCRASessionOrToConnect())
|
|
|
{
|
|
|
- CSimpleStringA errMsg = CSimpleStringA::Format("LocalPreOnline, pGuiConsoleClient is null or connect CardReadAdapter failed:%d(0x%x)", eErr, eErr);
|
|
|
- LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
|
|
|
- pCardReadAdapterClient->SafeDelete();
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("to call local preonline, but can't connect to CardReadAdapter.");
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ //oilyang@20230316 check CardIssuer state first
|
|
|
+ CardReadAdapterService_GetDevInfo_Req reqInfo;
|
|
|
+ CardReadAdapterService_GetDevInfo_Ans ansInfo;
|
|
|
+ reqInfo.module = 1;//Module_CardIssuer
|
|
|
+ ErrorCodeEnum eErr = m_pCRAClient->GetDevInfo(reqInfo, ansInfo, 3000, dwUserCode);
|
|
|
+ if (eErr != Error_Succeed || ansInfo.ModuleSN.GetCount() == 0 ||(ansInfo.ModuleSN.GetCount() == 1 && ansInfo.state[0] == 3))//3 for DEVICE_STATUS_FAULT defined in DevBaseClass.h
|
|
|
+ {
|
|
|
+ if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
|
|
|
+ {
|
|
|
+ m_pHandShakeConn->SendCardActive(1, slot, Error_Hardware, (const char*)termNo, (const char*)account,
|
|
|
+ account.GetLength(), "CardIssuer in fault state", 26, 9999, 9999, HeartBeat_UserErrorCode_CardIssuer_In_Fault_State);
|
|
|
+ }
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_CardIssuer_In_Fault_State, "CardIssuer in fault state");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Sleep(500);//oilyang@20230328 wait for entity CardReadAdapter to change back to normal state
|
|
|
CardReadAdapterService_PreOnline_Req req;
|
|
|
CardReadAdapterService_PreOnline_Ans ans;
|
|
|
CSimpleStringA outParam("");
|
|
@@ -703,22 +684,21 @@ void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleSt
|
|
|
req.reserved2[1] = account;
|
|
|
CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
|
|
|
LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
|
|
|
- eErr = pCardReadAdapterClient->PreOnline(req, ans, 65000);
|
|
|
- if (eErr != Error_Succeed) {
|
|
|
- outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x)", eErr, eErr);
|
|
|
+ eErr = m_pCRAClient->PreOnline(req, ans, 65000, dwUserCode);
|
|
|
+ if (eErr != Error_Succeed){
|
|
|
+ outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x),dwUserCode:%d(0x%x)", eErr, eErr, dwUserCode, dwUserCode);
|
|
|
if (eErr == Error_Duplication)
|
|
|
{
|
|
|
ReceivePreOnlineBack(Error_Duplication, "", 0, 0);
|
|
|
- pCardReadAdapterClient->GetFunction()->CloseSession();
|
|
|
return;
|
|
|
}
|
|
|
- LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, outParam.GetData());
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, outParam.GetData());
|
|
|
}
|
|
|
Sleep(500);
|
|
|
CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
|
|
|
CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
|
|
|
ErrorCodeEnum eErrX = Error_Unexpect;
|
|
|
- eErrX = pCardReadAdapterClient->QueryCardInfoOnStore(reqX, ansX,12000);
|
|
|
+ eErrX = m_pCRAClient->QueryCardInfoOnStore(reqX, ansX,12000);
|
|
|
if (eErrX != Error_Succeed)
|
|
|
{
|
|
|
outParam = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d",eErrX);
|
|
@@ -727,455 +707,28 @@ void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleSt
|
|
|
}
|
|
|
if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
|
|
|
{
|
|
|
- m_pHandShakeConn->SendCardActive(1,slot,eErr, (const char*)termNo, (const char*)account,
|
|
|
- account.GetLength(), (const char*)ans.result, ans.result.GetLength(),ansX.findCard,ansX.cardPos);
|
|
|
+ m_pHandShakeConn->SendCardActive(1, slot, eErr, (const char*)termNo, (const char*)account,
|
|
|
+ account.GetLength(), (const char*)ans.result, ans.result.GetLength(), ansX.findCard, ansX.cardPos, dwUserCode);
|
|
|
}
|
|
|
- pCardReadAdapterClient->GetFunction()->CloseSession();
|
|
|
}
|
|
|
-void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos)
|
|
|
+void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos, unsigned long userErrCode)
|
|
|
{
|
|
|
- LOG_FUNCTION();
|
|
|
- CardIssuerService_ClientBase *pCardIssuerClient = NULL;
|
|
|
- ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
- pCardIssuerClient = new CardIssuerService_ClientBase(GetEntityBase());
|
|
|
- eErr = pCardIssuerClient->Connect();
|
|
|
- if (eErr != Error_Succeed)
|
|
|
+ if (!CheckCRASessionOrToConnect())
|
|
|
{
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("pGuiConsoleClient is null or connect to cardissuer failed.%d", eErr);
|
|
|
- pCardIssuerClient->SafeDelete();
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("while receive preonline result, but can't connect to CardReadAdapter.");
|
|
|
return;
|
|
|
}
|
|
|
- CardIssuerService_NotifyPreonline_Req req;
|
|
|
- CardIssuerService_NotifyPreonline_Ans ans;
|
|
|
+
|
|
|
+ CardReadAdapterService_NotifyPreonline_Req req;
|
|
|
+ CardReadAdapterService_NotifyPreonline_Ans ans;
|
|
|
req.data = data;
|
|
|
req.findCard = findCard;
|
|
|
req.cardPos = cardPos;
|
|
|
req.errCode = errCode;
|
|
|
- eErr = pCardIssuerClient->NotifyPreonline(req, ans, 10000);
|
|
|
+ req.reserved1.Init(1);
|
|
|
+ req.reserved1[0] = userErrCode;
|
|
|
+ ErrorCodeEnum eErr = m_pCRAClient->NotifyPreonline(req, ans, 10000);
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("NotifyPreonline ret:%d",eErr);
|
|
|
- pCardIssuerClient->GetFunction()->CloseSession();
|
|
|
-}
|
|
|
-int CHeartBeatFSM::CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
|
|
|
-{
|
|
|
- int ret = 0;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cross term call,type:%x, entity: 0x%x",ctx->Req.type, ctx->Req.nEntityID);
|
|
|
- switch (ctx->Req.nEntityID)
|
|
|
- {
|
|
|
- case 0x206:
|
|
|
- case 0x201:
|
|
|
- case 0x218:
|
|
|
- case 0x21B:
|
|
|
- ret = ProcessCrossCallToHBService(ctx->Req.type,ctx);
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- return ret;
|
|
|
-}
|
|
|
-int CHeartBeatFSM::ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- ctx->Answer(Error_Succeed);
|
|
|
- return SendToHeartBeatService(ctx->Req,ctx->Ans);
|
|
|
-}
|
|
|
-void CHeartBeatFSM::DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize)
|
|
|
-{
|
|
|
- if (GetTerminalStageState().Compare("A"))
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Terminal havn't been auth suc,forbid cross call.");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- LocalProcessCrossCallTask *pTask = new LocalProcessCrossCallTask(this, reqInfo, nBufSize);
|
|
|
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
|
|
|
-}
|
|
|
-int CHeartBeatFSM::LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
-
|
|
|
- if(reqInfo == NULL) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("entity sn:%x,is RVC.IL:%d,bTwoWay:%d", reqInfo->nEntityID, m_bJBMachine, reqInfo->bTwoWay);
|
|
|
- if(m_bJBMachine) { //简版心跳逻辑,那么接收到的应该是回收包
|
|
|
- switch(reqInfo->nEntityID) //实体ID
|
|
|
- {
|
|
|
- case 0x201:
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- IDCertService_ClientBase* pClient = new IDCertService_ClientBase(GetEntityBase());
|
|
|
- ec = pClient->Connect();
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- IDCertService_CrossTermInvokeInfo_Info info;
|
|
|
- info.type = reqInfo->CallType;
|
|
|
- info.nEntityID = reqInfo->nEntityID;
|
|
|
- info.result = reqInfo->ErrorCode;
|
|
|
- SpBuffer spbuf2;
|
|
|
- int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
|
|
|
- if (bBuf) {
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
|
|
|
- if (xSize > 0)
|
|
|
- info.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
-
|
|
|
- ec = pClient->CrossTermInvokeInfo(info);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x206://pinpad
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- PinPadService_ClientBase* pClient = new PinPadService_ClientBase(GetEntityBase());
|
|
|
- ec = pClient->Connect();
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- PinPadService_CrossTermInvokeInfo_Info info;
|
|
|
- info.type = reqInfo->CallType;
|
|
|
- info.nEntityID = reqInfo->nEntityID;
|
|
|
- info.result = reqInfo->ErrorCode;
|
|
|
- SpBuffer spbuf2;
|
|
|
- int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
|
|
|
- if (bBuf) {
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
|
|
|
- if (xSize > 0)
|
|
|
- info.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
-
|
|
|
- ec = pClient->CrossTermInvokeInfo(info);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x218:
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Scanner set");
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
|
|
|
- ec = pClient->Connect();
|
|
|
- if(ec == Error_Succeed) {
|
|
|
- ScannerService_CrossTermInvokeInfo_Info info;
|
|
|
- info.type = reqInfo->CallType;
|
|
|
- info.nEntityID = reqInfo->nEntityID;
|
|
|
- info.result = reqInfo->ErrorCode;
|
|
|
- SpBuffer spbuf2;
|
|
|
- int size = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX) , size);
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), size);
|
|
|
- if(bBuf) {
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
|
|
|
- if(size > 0) {
|
|
|
- info.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
- }
|
|
|
- ec = pClient->CrossTermInvokeInfo(info);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
|
|
|
- } else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x21B:
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- CardReadAdapterService_ClientBase* pClient = new CardReadAdapterService_ClientBase(GetEntityBase());
|
|
|
- ec = pClient->Connect();
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- CardReadAdapterService_CrossTermInvokeInfo_Info info;
|
|
|
- info.type = reqInfo->CallType;
|
|
|
- info.nEntityID = reqInfo->nEntityID;
|
|
|
- info.result = reqInfo->ErrorCode;
|
|
|
- SpBuffer spbuf2;
|
|
|
- int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
|
|
|
- if (bBuf) {
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("offset succ.");
|
|
|
- if (xSize > 0)
|
|
|
- info.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
-
|
|
|
- ec = pClient->CrossTermInvokeInfo(info);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CrossTermInvokeInfo return %d", ec);
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x999:
|
|
|
- {
|
|
|
- if (reqInfo->numOfBlobInParamX == 1)
|
|
|
- {
|
|
|
- NotifyIECallResult resultNote;
|
|
|
- resultNote.ans_context = reqInfo->StrParamX;
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context.SubString(0, 512));
|
|
|
- resultNote.error = reqInfo->ErrorCode;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, reqInfo->lensOfBlobInParamX[0]);
|
|
|
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
|
|
|
- }
|
|
|
- else
|
|
|
- {//oiltest 需要改成按照序号组包
|
|
|
- m_tmpMultiBlob += reqInfo->StrParamX;
|
|
|
- if (reqInfo->blobSN == reqInfo->numOfBlobInParamX-1)
|
|
|
- {
|
|
|
- NotifyIECallResult resultNote;
|
|
|
- resultNote.ans_context = m_tmpMultiBlob;
|
|
|
- if (resultNote.ans_context.GetLength() > 512)
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest substr %s", (const char*)resultNote.ans_context.SubString(0, 512));
|
|
|
- else
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest %s", (const char*)resultNote.ans_context);
|
|
|
- if (resultNote.ans_context.GetLength() > 100)
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("oiltest the last 100 str %s", (const char*)resultNote.ans_context.SubString(resultNote.ans_context.GetLength()-100, 100));
|
|
|
- resultNote.error = reqInfo->ErrorCode;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("notify result to IE:error %d,len of ans_context %d", resultNote.error, resultNote.ans_context.GetLength());
|
|
|
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
|
|
|
- m_tmpMultiBlob = "";
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- } else { //常规机型,连接适配器
|
|
|
- switch(reqInfo->nEntityID) //实体ID
|
|
|
- {
|
|
|
- case 0x201:
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- if (m_pIDClient == NULL)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat IDCertService_ClientBase client");
|
|
|
- m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
|
|
|
- }
|
|
|
- if (m_pIDClient != NULL)
|
|
|
- {
|
|
|
- if (m_pIDClient->QuerySessionClosed())
|
|
|
- {
|
|
|
- m_pIDClient->SafeDelete();
|
|
|
- m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to IDCertificate...");
|
|
|
- if (m_pIDClient != NULL)
|
|
|
- ec = m_pIDClient->Connect();
|
|
|
- }
|
|
|
- }
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- IDCertService_CrossTermCall_Req reqX;
|
|
|
- IDCertService_CrossTermCall_Ans ansX;
|
|
|
- reqX.type = reqInfo->CallType;
|
|
|
- //这个应该不用存储
|
|
|
- reqX.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqX.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
-
|
|
|
- SpBuffer spbuf2;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
|
|
|
- if (bBuf) {
|
|
|
- reqX.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
- ec = m_pIDClient->CrossTermCall(reqX, ansX, 20000);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
|
|
|
- if (reqInfo->bTwoWay)//if one way call, no need to feed back
|
|
|
- {
|
|
|
- HeartBeatService_CrossTermCall_Req reqY;
|
|
|
- HeartBeatService_CrossTermCall_Ans ansY;
|
|
|
- reqY.type = reqInfo->CallType;
|
|
|
- reqY.nEntityID = reqInfo->nEntityID;
|
|
|
- //做返回
|
|
|
- ansY.retCode = ec;
|
|
|
- reqY.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqY.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
- reqY.paramX = ansX.retParamX;
|
|
|
- //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
|
|
|
- SendToHeartBeatService(reqY, ansY);
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to IDCertificate failed %d", ec);
|
|
|
- m_pIDClient->SafeDelete();
|
|
|
- m_pIDClient = NULL;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x206://pinpad
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- if (m_pPinPadClient == NULL)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat PinPadService_ClientBase client");
|
|
|
- m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
|
|
|
- }
|
|
|
- if (m_pPinPadClient != NULL)
|
|
|
- {
|
|
|
- if (m_pPinPadClient->QuerySessionClosed())
|
|
|
- {
|
|
|
- m_pPinPadClient->SafeDelete();
|
|
|
- m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to PinPad...");
|
|
|
- if (m_pPinPadClient != NULL)
|
|
|
- ec = m_pPinPadClient->Connect();
|
|
|
- }
|
|
|
- }
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- PinPadService_CrossTermCall_Req reqX;
|
|
|
- PinPadService_CrossTermCall_Ans ansX;
|
|
|
- reqX.type = reqInfo->CallType;
|
|
|
- //这个应该不用存储
|
|
|
- reqX.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqX.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
-
|
|
|
- SpBuffer spbuf2;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
|
|
|
- if (bBuf) {
|
|
|
- reqX.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
- ec = m_pPinPadClient->CrossTermCall(reqX, ansX, 20000);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
|
|
|
- if (reqInfo->bTwoWay)//if one way call, no need to feed back
|
|
|
- {
|
|
|
- HeartBeatService_CrossTermCall_Req reqY;
|
|
|
- HeartBeatService_CrossTermCall_Ans ansY;
|
|
|
- reqY.type = reqInfo->CallType;
|
|
|
- reqY.nEntityID = reqInfo->nEntityID;
|
|
|
- //做返回
|
|
|
- ansY.retCode = ec;
|
|
|
- reqY.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqY.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
- reqY.paramX = ansX.retParamX;
|
|
|
- //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
|
|
|
- SendToHeartBeatService(reqY, ansY);
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Connect to PinPad failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x218: // 高拍仪功能集
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
|
|
|
- ec = pClient->Connect();
|
|
|
- if(ec == Error_Succeed) {
|
|
|
- ScannerService_CrossTermCall_Req reqX;
|
|
|
- ScannerService_CrossTermCall_Ans ansX;
|
|
|
- reqX.type = reqInfo->CallType;
|
|
|
- //这个应该不用存储
|
|
|
- reqX.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqX.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
-
|
|
|
- SpBuffer spbuf2;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX) );
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1 );
|
|
|
- if(bBuf) {
|
|
|
- reqX.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
- ec = pClient->CrossTermCall(reqX, ansX, 20000);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x",ec);
|
|
|
- if (reqInfo->bTwoWay)//if one way call, no need to feed back
|
|
|
- {
|
|
|
- HeartBeatService_CrossTermCall_Req reqY;
|
|
|
- HeartBeatService_CrossTermCall_Ans ansY;
|
|
|
- reqY.type = reqInfo->CallType;
|
|
|
- reqY.nEntityID = reqInfo->nEntityID;
|
|
|
- //做返回
|
|
|
- ansY.retCode = ec;
|
|
|
- reqY.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqY.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
- reqY.paramX = ansY.retParamX;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d", ec);
|
|
|
- SendToHeartBeatService(reqY, ansY);
|
|
|
- }
|
|
|
- } else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to scanner failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x21B:
|
|
|
- {
|
|
|
- ErrorCodeEnum ec = Error_Succeed;
|
|
|
- if (m_pCRAClient == NULL)
|
|
|
- {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("creat CardReadAdapterService_ClientBase client");
|
|
|
- m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
|
|
|
- }
|
|
|
- if (m_pCRAClient != NULL)
|
|
|
- {
|
|
|
- if (m_pCRAClient->QuerySessionClosed())
|
|
|
- {
|
|
|
- m_pCRAClient = NULL;
|
|
|
- m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to connect to CardReadAdapter");
|
|
|
- ec = m_pCRAClient->Connect();
|
|
|
- }
|
|
|
- }
|
|
|
- if (ec == Error_Succeed) {
|
|
|
- CardReadAdapterService_CrossTermCall_Req reqX;
|
|
|
- CardReadAdapterService_CrossTermCall_Ans ansX;
|
|
|
- reqX.type = reqInfo->CallType;
|
|
|
- //这个应该不用存储
|
|
|
- reqX.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqX.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
-
|
|
|
- SpBuffer spbuf2;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
|
|
|
- bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
|
|
|
- if (bBuf) {
|
|
|
- reqX.paramX = spbuf2.ToBlob();
|
|
|
- }
|
|
|
- ec = m_pCRAClient->CrossTermCall(reqX, ansX, 20000);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("local term call ret:%x", ec);
|
|
|
- if (reqInfo->bTwoWay)//if one way call, no need to feed back
|
|
|
- {
|
|
|
- HeartBeatService_CrossTermCall_Req reqY;
|
|
|
- HeartBeatService_CrossTermCall_Ans ansY;
|
|
|
- reqY.type = reqInfo->CallType;
|
|
|
- reqY.nEntityID = reqInfo->nEntityID;
|
|
|
- //做返回
|
|
|
- ansY.retCode = ec;
|
|
|
- reqY.fromTerminalNo = reqInfo->ToTerminalNo;
|
|
|
- reqY.toTerminalNo = reqInfo->FromTerminalNo;
|
|
|
- reqY.paramX = ansX.retParamX;
|
|
|
- //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send pkg to client: %d,X len:%d", ec, reqY.paramX.m_iLength);
|
|
|
- SendToHeartBeatService(reqY, ansY);
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Connect to CardReadAdapter failed %d", ec);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case 0x999:
|
|
|
- {
|
|
|
- m_ILDeviceNo = reqInfo->FromTerminalNo;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("save il TerminalNo:%s",(const char*)m_ILDeviceNo);
|
|
|
- NotifyIEToCall note;
|
|
|
- note.context = reqInfo->StrParamX;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oiltest %s",(const char*)note.context);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("note IE to call:%d", reqInfo->lensOfBlobInParamX[0]);
|
|
|
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIEToCall), SP_MSG_SIG_OF(NotifyIEToCall), note);
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
|
|
|
ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
|
|
@@ -1402,31 +955,6 @@ Cleanup:
|
|
|
//oiltestlinux
|
|
|
#endif //RVC_OS_WIN
|
|
|
}
|
|
|
-int CHeartBeatFSM::SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
|
|
|
- {
|
|
|
- m_pHandShakeConn->SendCrossCallToService(req,ans);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-void CHeartBeatFSM::ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
|
|
|
-{
|
|
|
- if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
|
|
|
- {
|
|
|
- CSimpleStringA csTerm("");
|
|
|
- GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
|
|
|
- m_pHandShakeConn->SendILCallToService(ctx->Info.req_context,0,true, m_localDeviceNo,csTerm);
|
|
|
- }
|
|
|
-}
|
|
|
-void CHeartBeatFSM::CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
|
|
|
-{
|
|
|
- if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
|
|
|
- {
|
|
|
- m_pHandShakeConn->SendILCallToService(ctx->Info.ans_context, ctx->Info.error, false, m_localDeviceNo,m_ILDeviceNo);
|
|
|
- }
|
|
|
-}
|
|
|
void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
{
|
|
|
string serviceCode = pRecvPkg->GetServiceCode();
|
|
@@ -1439,10 +967,6 @@ void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
{
|
|
|
PkgRcvProcCardActive(pRecvPkg);
|
|
|
}
|
|
|
- else if (serviceCode.compare("CRSSACT") == 0)
|
|
|
- {
|
|
|
- PkgRcvProcCrossCall(pRecvPkg);
|
|
|
- }
|
|
|
else
|
|
|
{
|
|
|
DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown service code!");
|
|
@@ -1597,10 +1121,10 @@ void HeartBeatConnection::SendHandShake()
|
|
|
//delete pkt;
|
|
|
}
|
|
|
|
|
|
-void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned long errCode,const char *termNo, const char *account, const int accSize, const char *data, const int dataSize,int findCard,int cardPos)
|
|
|
+void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned long errCode,const char *termNo, const char *account, const int accSize, const char *data, const int dataSize,int findCard,int cardPos, unsigned long errCSCode)
|
|
|
{
|
|
|
- CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d",
|
|
|
- type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize);
|
|
|
+ CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d,errCSCode:%d",
|
|
|
+ type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize, errCSCode);
|
|
|
LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
|
|
|
//发起跨机调用包
|
|
|
if (type == 0)
|
|
@@ -1610,10 +1134,10 @@ void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned
|
|
|
m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
|
|
|
req.type = 0;
|
|
|
req.slot = slot;
|
|
|
- strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
|
|
|
- strcpy_s(req.Account, accSize, account);
|
|
|
- strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
|
|
|
- strcpy_s(req.Param2, dataSize, data);
|
|
|
+ strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
|
|
|
+ strncpy_s(req.Account, account, accSize);
|
|
|
+ strncpy_s(req.TerminalNo, termNo, strlen(termNo));
|
|
|
+ strncpy_s(req.Param2, data, dataSize);
|
|
|
CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
|
|
|
pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
|
|
|
|
|
@@ -1629,125 +1153,16 @@ void HeartBeatConnection::SendCardActive(const int type,const int slot,unsigned
|
|
|
req.ErrCode = errCode;
|
|
|
req.findCard = findCard;
|
|
|
req.cardPos = cardPos;
|
|
|
- strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
|
|
|
- strcpy_s(req.Account, accSize, account);
|
|
|
- strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
|
|
|
- strcpy_s(req.Param2, dataSize, data);
|
|
|
+ req.reserved1 = errCSCode;
|
|
|
+ strncpy_s(req.FromTerminalNo, m_TerminalNo.GetData(), m_TerminalNo.GetLength());
|
|
|
+ strncpy_s(req.Account, account, accSize);
|
|
|
+ strncpy_s(req.TerminalNo, termNo, strlen(termNo));
|
|
|
+ strncpy_s(req.Param2, data, dataSize);
|
|
|
CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
|
|
|
pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
|
|
|
|
|
|
SendPackage(pkt);
|
|
|
}
|
|
|
-}
|
|
|
-void HeartBeatConnection::SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- Dbg("from term %s to term %s for entity %x,twoway:%d", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, req.nEntityID, req.isTwoWay);
|
|
|
-
|
|
|
- if (req.paramX.m_iLength > 0)
|
|
|
- {
|
|
|
- //char *pBuf = new char[64 * 1024];
|
|
|
- //ZeroMemory(pBuf, 64 * 1024);
|
|
|
- //HexBuf2StrBuf((PBYTE)req.paramX.m_pData, &pBuf, req.paramX.m_iLength);
|
|
|
- //CSimpleStringA xStr(pBuf);
|
|
|
- //int i = 0;
|
|
|
- //for (; i < req.paramX.m_iLength / 900; i++)
|
|
|
- //{
|
|
|
- // Dbg("%s", xStr.SubString(i * 900, 900));
|
|
|
- //}
|
|
|
- //Dbg("%s", xStr.SubString(i * 900, req.paramX.m_iLength - i * 900));
|
|
|
- }
|
|
|
- int count = req.paramX.m_iLength / (50 * 1000);
|
|
|
- int size = sizeof(CrossCallReq)*(count + 1) + req.paramX.m_iLength + count;
|
|
|
- char* pBuf = new char[size];
|
|
|
- ZeroMemory(pBuf, size);
|
|
|
- CrossCallReq* pReqX = (CrossCallReq*)pBuf;
|
|
|
- for (int i = 0; i < count+1; i++)
|
|
|
- {
|
|
|
- pReqX[i].CallType = req.type;
|
|
|
- pReqX[i].bTwoWay = req.isTwoWay;
|
|
|
- pReqX[i].nEntityID = req.nEntityID;
|
|
|
- pReqX[i].ErrorCode = ans.retCode;
|
|
|
- pReqX[i].lensOfBlobInParamX[0] = req.paramX.m_iLength;
|
|
|
- pReqX[i].numOfBlobInParamX = count+1;
|
|
|
- strcpy_s(pReqX[i].FromTerminalNo, sizeof(pReqX[i].FromTerminalNo),req.fromTerminalNo);
|
|
|
- strcpy_s(pReqX[i].ToTerminalNo, sizeof(pReqX[i].ToTerminalNo), req.toTerminalNo);
|
|
|
- strcpy_s(pReqX[i].StrParam1, sizeof(pReqX[i].StrParam1), req.param1);
|
|
|
- strcpy_s(pReqX[i].StrParam2, sizeof(pReqX[i].StrParam2), req.param2);
|
|
|
- if (i == count)
|
|
|
- memcpy_s(pReqX[i].StrParamX, (req.paramX.m_iLength-50*1000*i), (char*)req.paramX.m_pData+50*1000*i, req.paramX.m_iLength - 50 * 1000 * i);
|
|
|
- else
|
|
|
- memcpy_s(pReqX[i].StrParamX, 50*1000, (char*)req.paramX.m_pData + 50 * 1000 *i, 50 * 1000);
|
|
|
- }
|
|
|
- //memcpy_s(pReqX->StrParamX,req.paramY.GetLength(),req.paramX, req.paramX.GetLength());
|
|
|
- Dbg("from %s to %s,struct X size:%d, len:%d,struct count:%d", pReqX->FromTerminalNo, pReqX->ToTerminalNo, size, req.paramX.m_iLength,count);
|
|
|
- CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
|
|
|
- pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, size,count+1);
|
|
|
- SendPackage(pkt);
|
|
|
- delete [] pBuf;
|
|
|
-}
|
|
|
-void HeartBeatConnection::SendILCallToService(CSimpleStringA csContent, int err, bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- int count = csContent.GetLength() / (50 * 1000);
|
|
|
- Dbg("count %d,size of content %d",count,csContent.GetLength());
|
|
|
- if (csContent.GetLength() > 32)
|
|
|
- Dbg("the last 32 str %s", (const char*)csContent.SubString(csContent.GetLength()-32,32));
|
|
|
-
|
|
|
- for (int i = 0; i < count + 1; i++)
|
|
|
- {
|
|
|
- int size;
|
|
|
- if (i == count)
|
|
|
- {
|
|
|
- size = sizeof(CrossCallReq) + csContent.GetLength() - 50*1000*i + 1;
|
|
|
- }
|
|
|
- else
|
|
|
- size = sizeof(CrossCallReq) + 50 * 1000 + 1;
|
|
|
-
|
|
|
- char* pBuf = new char[size];
|
|
|
- ZeroMemory(pBuf, size);
|
|
|
- Dbg("sz %d", size);
|
|
|
- CrossCallReq* pReqX = (CrossCallReq*)pBuf;
|
|
|
- pReqX->CallType = 999;
|
|
|
- pReqX->bTwoWay = false;
|
|
|
- pReqX->nEntityID = 0x999;
|
|
|
- pReqX->blobSN = i;
|
|
|
- pReqX->lensOfBlobInParamX[0] = csContent.GetLength();//no use 实际用到的时候需要修改这里
|
|
|
- pReqX->numOfBlobInParamX = count + 1;
|
|
|
- if (bFromIL)
|
|
|
- {
|
|
|
- pReqX->ErrorCode = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- pReqX->ErrorCode = err;
|
|
|
- }
|
|
|
- strcpy_s(pReqX->FromTerminalNo,sizeof(pReqX->FromTerminalNo), fromDevNo);
|
|
|
- strcpy_s(pReqX->ToTerminalNo, sizeof(pReqX->ToTerminalNo), toDevNo);
|
|
|
- CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
|
|
|
- if (i == count)
|
|
|
- {
|
|
|
- memcpy_s(pReqX->StrParamX, csContent.GetLength() - 50 * 1000 * i, (const char*)csContent+50 * 1000 * i, csContent.GetLength() - 50 * 1000 * i);
|
|
|
- Dbg("to add the %d packet from %d",i, csContent.GetLength() - 50 * 1000 * i);
|
|
|
- Dbg("[%d],%d%d%d", strlen(pReqX->StrParamX), pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2],pReqX->StrParamX[strlen(pReqX->StrParamX)-1]);
|
|
|
- pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
|
|
|
- Dbg("p len:%d", sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
|
|
|
- SendPackage(pkt);
|
|
|
- Dbg("the last of %d",i);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy_s(pReqX->StrParamX, 50 * 1000, (const char*)csContent + 50 * 1000 * i, 50 * 1000);
|
|
|
- pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq)+50*1000);
|
|
|
- Dbg("p len %d:%d,last 3:%d,%d,%d",i, sizeof(CrossCallReq) + 50 * 1000, pReqX->StrParamX[strlen(pReqX->StrParamX) - 3], pReqX->StrParamX[strlen(pReqX->StrParamX) - 2], pReqX->StrParamX[strlen(pReqX->StrParamX) - 1]);
|
|
|
- SendPackage(pkt);
|
|
|
- Dbg("the %d packet",i);
|
|
|
- }
|
|
|
- delete[] pBuf;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
{
|
|
@@ -1847,7 +1262,7 @@ void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
|
|
|
if (req->type == 0)
|
|
|
LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2);
|
|
|
else if (req->type == 1)
|
|
|
- ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos);
|
|
|
+ ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos, req->reserved1);
|
|
|
}
|
|
|
|
|
|
void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
|
|
@@ -1864,9 +1279,12 @@ void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pR
|
|
|
CardActiveReq* pAns = (CardActiveReq*)pBuf;
|
|
|
if (nArrayNum > 0)
|
|
|
{
|
|
|
- CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
|
|
|
- pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
|
|
|
- LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
|
|
|
+ CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, errorCode:%d,userErrCode:%d, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
|
|
|
+ pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, pAns->ErrCode, pAns->reserved1, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
|
|
|
+ if (pAns->ErrCode == Error_Succeed)
|
|
|
+ LogWarn(Severity_Low, Error_Succeed, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
|
|
|
+ else
|
|
|
+ LogWarn(Severity_Middle, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
|
|
|
m_pFSM->ProcessCardActive(pAns);
|
|
|
}
|
|
|
}
|
|
@@ -1877,71 +1295,6 @@ void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pR
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void HeartBeatConnection::PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg)
|
|
|
-{
|
|
|
- LOG_FUNCTION();
|
|
|
- int nLen = pRecvPkg->GetStructLen("CRSSREQ");
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("nLen: %d", nLen);
|
|
|
- if (nLen > 0) {
|
|
|
-
|
|
|
- BYTE *pBuf = new BYTE[nLen+1];
|
|
|
- ZeroMemory(pBuf,nLen+1);
|
|
|
- int nArrayNum = 0;
|
|
|
- if (pRecvPkg->GetStructData("CRSSREQ", pBuf, &nLen, &nArrayNum)) {
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%d,array num:%d,last 3:%d,%d,%d", nLen, nArrayNum,pBuf[nLen-3], pBuf[nLen - 2], pBuf[nLen - 1]);
|
|
|
- CrossCallReq* pAnsArray = (CrossCallReq*)pBuf;
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("%x", ((CrossCallReq*)pBuf)->nEntityID);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("num %x", ((CrossCallReq*)pBuf)->numOfBlobInParamX);
|
|
|
- int tmpXLen = 0;
|
|
|
- for (int i = 0; i < nArrayNum; ++i)
|
|
|
- {
|
|
|
- tmpXLen += strlen(pAnsArray[i].StrParamX);
|
|
|
- }
|
|
|
-
|
|
|
- tmpXLen += (sizeof(CrossCallReq)*nArrayNum);
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("tmpXLen:%d", tmpXLen);
|
|
|
- BYTE *pAnsBuf = new BYTE[tmpXLen + 1];
|
|
|
- ZeroMemory(pAnsBuf, tmpXLen + 1);
|
|
|
- memcpy_s(pAnsBuf, tmpXLen+1, pBuf, tmpXLen);
|
|
|
- CrossCallReq* pAns = (CrossCallReq*)pAnsBuf;
|
|
|
- pAns->Appendix1 = pAnsArray->Appendix1;
|
|
|
- pAns->Appendix2 = pAnsArray->Appendix2;
|
|
|
- pAns->bTwoWay = pAnsArray->bTwoWay;
|
|
|
- pAns->CallType = pAnsArray->CallType;
|
|
|
- pAns->ErrorCode = pAnsArray->ErrorCode;
|
|
|
- pAns->nEntityID = pAnsArray->nEntityID;
|
|
|
- pAns->numOfBlobInParamX = pAnsArray->numOfBlobInParamX;
|
|
|
- for (int i = 0; i < sizeof(pAns->lensOfBlobInParamX); i++)
|
|
|
- pAns->lensOfBlobInParamX[i] = pAnsArray->lensOfBlobInParamX[i];
|
|
|
- strcpy_s(pAns->FromTerminalNo, sizeof(pAns->FromTerminalNo), pAnsArray->FromTerminalNo);
|
|
|
- strcpy_s(pAns->StrParam1, sizeof(pAns->StrParam1), pAnsArray->StrParam1);
|
|
|
- strcpy_s(pAns->StrParam2, sizeof(pAns->StrParam2), pAnsArray->StrParam2);
|
|
|
- strcpy_s(pAns->ToTerminalNo, sizeof(pAns->ToTerminalNo), pAnsArray->ToTerminalNo);
|
|
|
-
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%x",pAns->nEntityID);
|
|
|
- for (int i = 0, start = 0; i < nArrayNum; ++i)
|
|
|
- {
|
|
|
- strcpy_s(pAns->StrParamX + start, tmpXLen - start, pAnsArray[i].StrParamX);
|
|
|
- start += strlen(pAnsArray[i].StrParamX);
|
|
|
- }
|
|
|
- DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("type:%x,from %s,to %s", pAns->CallType, pAns->FromTerminalNo, pAns->ToTerminalNo);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nEntityID: %x", pAns->nEntityID);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("appendix1: %d", pAns->Appendix1);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("bTwoWay:[%d]", pAns->bTwoWay);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("blobSN:[%d]", pAns->blobSN);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param2:[%s]", pAns->StrParam2);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("param3:[%d]", pAns->Appendix2);//oiltest
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ErrorCode:[%x]", pAns->ErrorCode);//oiltest
|
|
|
-
|
|
|
- m_pFSM->DoLocalProcessCrossCallTask(pAns, nLen);
|
|
|
- }
|
|
|
- else {
|
|
|
- DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("invalid CRSSREQ packet!");
|
|
|
- }
|
|
|
- delete pBuf;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore)
|
|
|
{
|
|
|
//卡库用新地址
|
|
@@ -2005,4 +1358,30 @@ ErrorCodeEnum CHeartBeatFSM::GetServerAddr(CSmartPointer<IConfigInfo> &spConfig,
|
|
|
}
|
|
|
|
|
|
return Error_Succeed;
|
|
|
-}
|
|
|
+}
|
|
|
+bool CHeartBeatFSM::CheckCRASessionOrToConnect()
|
|
|
+{
|
|
|
+ if (m_pCRAClient != NULL && !m_pCRAClient->QuerySessionClosed())
|
|
|
+ return true;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ErrorCodeEnum eErr = Error_Unexpect;
|
|
|
+ m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
|
|
|
+ if (m_pCRAClient != NULL) {
|
|
|
+ eErr = m_pCRAClient->Connect();
|
|
|
+ if (eErr != Error_Succeed)
|
|
|
+ {
|
|
|
+ CSimpleStringA errMsg = CSimpleStringA::Format("connect to CardReadAdapter failed:%d(0x%x)", eErr, eErr);
|
|
|
+ LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("connect to CardReadAdapter suc.");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+}
|