HeartBeatFSM.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  1. #ifndef __HEARTBEAT_FSM_H
  2. #define __HEARTBEAT_FSM_H
  3. #pragma once
  4. #ifdef RVC_OS_WIN
  5. #define WIN32_LEAN_AND_MEAN
  6. #include <windows.h>
  7. #include <winsock2.h>
  8. #include <ws2tcpip.h>
  9. #include <tchar.h>
  10. #include <conio.h>
  11. #include <pdh.h>
  12. #include <pdhmsg.h>
  13. #include <Loadperf.h>
  14. #else
  15. //oiltestlinux
  16. #endif //RVC_OS_WIN
  17. //#pragma comment(lib, "Loadperf.lib")
  18. #include "SpFSM.h"
  19. #include "HeartBeat_def_g.h"
  20. #include "HeartBeat_msg_g.h"
  21. using namespace HeartBeat;
  22. #include "SpSecureClient.h"
  23. #include "EventCode.h"
  24. #include "IHttpFunc.h"
  25. #include "CardIssuer_client_g.h"
  26. //using namespace CardIssuer;
  27. #include "PinPad_client_g.h"
  28. //using namespace PinPad;
  29. #include "CardReadAdapter_client_g.h"
  30. //using namespace CardReadAdapter;
  31. #include "IDCertificate_client_g.h"
  32. //using namespace IDCertificate;
  33. #include "ScannerSet_client_g.h"
  34. using namespace ScannerSet;
  35. typedef DWORD (__stdcall *LpRestorePerfRegistryFromFile)(LPCWSTR szFileName, LPCWSTR szLangId);
  36. #define LOG_EVT_HEARTBEAT_TASK_START 0x50310000 //新心跳服务启动
  37. #define LOG_EVT_HEARTBEAT_TASK_NOT_START 0x50310001 //新心跳服务未启动
  38. #define LOG_EVT_HEARTBEAT_HTTP_ERROR 0x50310002 //新心跳服务连接失败
  39. #pragma pack(1)
  40. // [StructName("FNTSTAT")]
  41. struct HandReq
  42. {
  43. char TerminalNo[16];
  44. uint32_t ip;
  45. char WarningLevel;
  46. char RunState;
  47. char CustomerHandle;
  48. char CallState;
  49. char LocalMaintain;
  50. char RemoteMaintain;
  51. char TermStage;
  52. char PreTermStage;
  53. char NetState;
  54. char PreNetState;
  55. };
  56. // [StructName("xxx")]
  57. struct HandErrListReq
  58. {
  59. int warnLevel;
  60. char reserved1;//用来存放交易控制标志
  61. char reserved2;
  62. char reserved3;
  63. char reserved4;
  64. char errList[512];
  65. };
  66. //[StructName("HANDANS")]
  67. struct HandAns
  68. {
  69. uint32_t EventCode;
  70. char param1[16];
  71. //int count;
  72. };
  73. struct CardActiveReq
  74. {
  75. uint32_t type;
  76. uint32_t slot;
  77. uint32_t reserved1;
  78. uint32_t reserved2;
  79. char Account[32];
  80. char FromTerminalNo[16];
  81. char TerminalNo[16];
  82. uint32_t EvtCode;
  83. uint32_t ErrCode;
  84. uint32_t findCard;
  85. uint32_t cardPos;
  86. char Param1[16];
  87. char Param2[1024];
  88. char Reserved3[128];
  89. char Reserved4[128];
  90. };
  91. struct CrossCallReq
  92. {
  93. uint32_t CallType;//跨机调用类型,同def文件的method id,实体内唯一
  94. bool bTwoWay;//true :two way call; false: one way call
  95. char FromTerminalNo[16];
  96. char ToTerminalNo[16];
  97. uint32_t nEntityID;
  98. uint32_t Appendix1;
  99. uint32_t Appendix2;
  100. //返回包时用于标注错误
  101. uint32_t ErrorCode;
  102. //oilyang@20190118
  103. uint32_t blobSN;//拆包时用于标注序号
  104. //本来以为StrParamX足够大,用这个值来划分blob,结果一个blob就塞满了
  105. //故numOfBlobInParamX用于标注拆包数量(结构个数)
  106. uint32_t numOfBlobInParamX;
  107. uint32_t lensOfBlobInParamX[16];//多个blob塞到StrParamX用于标注每一个的长度
  108. char StrParam1[128];
  109. char StrParam2[1024];
  110. char StrParamX[0];//用于传递图片信息
  111. };
  112. #pragma pack()
  113. enum EvtType
  114. {
  115. USER_EVT_TEST = EVT_USER+1,
  116. USER_EVT_QUIT,
  117. USER_EVT_START,
  118. USER_EVT_STARTFINISHED,
  119. USER_EVT_HANDSHAKEFINISHED,
  120. USER_EVT_INSTRUCTION,
  121. USER_EVT_LOST,
  122. USER_EVT_STOP,
  123. USER_EVT_REJECT,
  124. USER_EVT_EXIT,
  125. USER_EVT_CARD_ACTIVE,
  126. USER_EVT_CARD_ACTIVE_FINISHED,
  127. USER_EVT_CROSS_TERM_CALL,
  128. USER_EVT_CROSS_TERM_CALL_FINISHED,
  129. USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED,
  130. USER_EVT_ILCallToRVC,
  131. USER_EVT_CallResultToIL,
  132. };
  133. struct TerminalInfo
  134. {
  135. char TerminalNo[16];
  136. uint32_t ip;
  137. char WarningLevel;
  138. char RunState;
  139. char CustomerHandle;
  140. char CallState;
  141. char LocalMaintain;
  142. char RemoteMaintain;
  143. char TermStage;
  144. char PreTermStage;
  145. char NetState;
  146. char PreNetState;
  147. };
  148. // Terminal Performance Information Struct[Josephus in 9:09:47 2016/4/23]
  149. struct TermianlCounter
  150. {
  151. DWORD serverIP;
  152. uint16_t totalMem; //MB
  153. uint16_t freeMem; //MB
  154. uint16_t procNum;
  155. uint16_t threadNum;
  156. DWORD handleNum;
  157. DWORD freeDisk; //MB
  158. char osStartTime[22];
  159. uint16_t cpuLoad;
  160. };
  161. namespace HttpStruct
  162. {
  163. //发送心跳接口
  164. struct SendHandShakeReq : CHTTPReq {
  165. string m_reqStr;
  166. string ToJson() {
  167. return m_reqStr;
  168. }
  169. };
  170. struct SendHandShakeRet : CHTTPRet {
  171. string m_retStr;
  172. bool Parse(string strData) {
  173. m_retStr = strData;
  174. return true;
  175. }
  176. };
  177. }
  178. struct CShakeHandVO
  179. {
  180. string terminalNo;
  181. long ip;
  182. string warningLevel;
  183. string runState;
  184. string customerHandle;
  185. string callState;
  186. string localMaintain;
  187. string remoteMaintain;
  188. string termStage;
  189. string preTermStage;
  190. string netState;
  191. string preNetState;
  192. };
  193. struct CShakeHandSystemInfo
  194. {
  195. long serverIP;
  196. long totalMem;
  197. long freeMem;
  198. long procNum;
  199. long threadNum;
  200. long handleNum;
  201. long freeDisk;
  202. string osStartTime;
  203. long cpuLoad;
  204. };
  205. struct CShakeHandErrorVO
  206. {
  207. long warnLevel;
  208. string reserved1;
  209. string errList;
  210. };
  211. struct CHandShakeHttp
  212. { //存储到运行时
  213. CShakeHandVO shakehandvo;
  214. CShakeHandSystemInfo shakeHandSystemInfo;
  215. CShakeHandErrorVO shakeHandErrorVO;
  216. };
  217. enum InstructionType
  218. {
  219. INC_UNKNOWN = 0,
  220. INC_GLOBAL_SETTING_SYNC,
  221. INC_COMM_RECONNECT,
  222. INC_START_REMOTE_CONTROL,
  223. INC_UPDATE_CHECK,
  224. INC_RECOVER_SERVICE,
  225. INC_PAUSE_SERVICE,
  226. INC_AREA_SERVICE_SWITCH,
  227. INC_VERSION_ROLLBACK,
  228. INC_BRIDGE,
  229. INC_VEDIO_CONNECTING,
  230. INC_TRADE_MANAGER_NORMAL,
  231. INC_TRADE_MANAGER_ON,
  232. INC_TRADE_MANAGER_OFF,
  233. INC_DEVICE_LOCK_ON,
  234. INC_DEVICE_UNLOCK,
  235. INC_DEVICE_KICK_OFF,
  236. };
  237. class CHeartBeatEntity;
  238. class CHeartBeatFSM;
  239. class InstructionEvent : public FSMEvent
  240. {
  241. public:
  242. InstructionEvent() : FSMEvent(USER_EVT_INSTRUCTION){}
  243. virtual ~InstructionEvent(){}
  244. SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx;
  245. protected:
  246. private:
  247. };
  248. class CardActiveEvent : public FSMEvent
  249. {
  250. public:
  251. CardActiveEvent() : FSMEvent(USER_EVT_CARD_ACTIVE){}
  252. virtual ~CardActiveEvent(){}
  253. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  254. protected:
  255. private:
  256. };
  257. class CrossTermCallEvent : public FSMEvent
  258. {
  259. public:
  260. CrossTermCallEvent() : FSMEvent(USER_EVT_CROSS_TERM_CALL) {}
  261. virtual ~CrossTermCallEvent() {}
  262. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  263. protected:
  264. private:
  265. };
  266. class ILCallToRVCEvent : public FSMEvent
  267. {
  268. public:
  269. ILCallToRVCEvent() : FSMEvent(USER_EVT_ILCallToRVC) {}
  270. virtual ~ILCallToRVCEvent() {}
  271. SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
  272. };
  273. class CallResultToILEvent : public FSMEvent
  274. {
  275. public:
  276. CallResultToILEvent() : FSMEvent(USER_EVT_CallResultToIL) {}
  277. virtual ~CallResultToILEvent() {}
  278. SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
  279. };
  280. class HeartBeatConnection;
  281. class CHeartBeatFSM : public FSMImpl<CHeartBeatFSM>
  282. {
  283. public:
  284. enum {s0,s1,s2,s3,s4,s5};
  285. BEGIN_FSM_STATE(CHeartBeatFSM)
  286. FSM_STATE_ENTRY(s0,"Init",s0_on_entry,s0_on_exit,s0_on_event)
  287. FSM_STATE_ENTRY(s1,"Starting",s1_on_entry,s1_on_exit,s1_on_event)
  288. FSM_STATE_ENTRY(s2,"Connected",s2_on_entry,s2_on_exit,s2_on_event)
  289. FSM_STATE_ENTRY(s3,"Lost",s3_on_entry,s3_on_exit,s3_on_event)
  290. FSM_STATE_ENTRY(s4,"Reject",s4_on_entry,s4_on_exit,s4_on_event)
  291. FSM_STATE_ENTRY(s5,"Failed",s5_on_entry,s5_on_exit,s5_on_event)
  292. END_FSM_STATE()
  293. BEGIN_FSM_RULE(CHeartBeatFSM,s0)
  294. FSM_RULE_ENTRY(s0,s1,USER_EVT_START,0)
  295. FSM_RULE_ENTRY(s1,s2,USER_EVT_STARTFINISHED,0)
  296. FSM_RULE_ENTRY(s1,s0,USER_EVT_STARTFINISHED,1)
  297. FSM_RULE_ENTRY(s2,s0,USER_EVT_STOP,0)
  298. FSM_RULE_ENTRY(s2,s0,USER_EVT_START,0)
  299. FSM_RULE_ENTRY(s4,s0,USER_EVT_STOP,0)
  300. END_FSM_RULE()
  301. CHeartBeatFSM():m_initTimes(0),m_bUseBackup(false),m_testResult(Error_Succeed),
  302. m_warnLevel(0), m_entErrorList(""), m_nLodCtrFlag(0), m_pHandShakeConn(NULL)
  303. , m_tradeState(99),m_bJBMachine(false), m_pCRAClient(NULL), m_pIDClient(NULL) , m_pPinPadClient(NULL)
  304. , m_localDeviceNo(""), m_ILDeviceNo(""), m_tmpMultiBlob(""), m_terminalStage(""), m_strHandShakeUrl(""),m_bAlarmed(false)
  305. ,m_longConnInterval(20000),m_handShakeConnInterval(20000){}
  306. ~CHeartBeatFSM(){}
  307. virtual ErrorCodeEnum OnInit();
  308. virtual ErrorCodeEnum OnExit();
  309. void s0_on_entry();
  310. void s0_on_exit();
  311. unsigned int s0_on_event(FSMEvent* pEvt);
  312. void s1_on_entry();
  313. void s1_on_exit();
  314. unsigned int s1_on_event(FSMEvent* pEvt);
  315. void s2_on_entry();
  316. void s2_on_exit();
  317. unsigned int s2_on_event(FSMEvent* pEvt);
  318. void s3_on_entry();
  319. void s3_on_exit();
  320. unsigned int s3_on_event(FSMEvent* pEvt);
  321. void s4_on_entry();
  322. void s4_on_exit();
  323. unsigned int s4_on_event(FSMEvent* pEvt);
  324. void s5_on_entry();
  325. void s5_on_exit();
  326. unsigned int s5_on_event(FSMEvent* pEvt);
  327. DWORD m_dwServIP;
  328. CSimpleStringA m_strHandShakeUrl;//心跳地址
  329. int Starting();
  330. int DoHandShake();
  331. int DoNewHandShake();
  332. bool HandShakeHttp(IHttpFunc* client,bool &isHeartBeatOk);
  333. string HandShakeJsonStr();
  334. static void HttpsLogCallBack(const char* logtxt);
  335. void SetConnNULL(){}
  336. ErrorCodeEnum SetErrorList(int warmLevel,CSimpleStringA strList);
  337. void SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext);
  338. int GetWarnLevel(){return m_warnLevel;}
  339. void SetTradeManagerState(int tState){ m_tradeState = tState; }
  340. void SetTerminalStageState(CSimpleStringA stage) { m_terminalStage = stage; }
  341. CSimpleStringA GetTerminalStageState() { return m_terminalStage; }
  342. int GetTradeManagerState(){ return m_tradeState; }
  343. CSimpleString GetEntityErrorList(){return m_entErrorList;}
  344. // Terminal Performance Counter component [Josephus in 9:17:13 2016/4/23]
  345. ErrorCodeEnum GetPerformCounter(TermianlCounter& counter);
  346. const CSimpleStringA GetRealIP()
  347. {
  348. return m_csServerIP;
  349. }
  350. const char* GetRunDiskPath()
  351. {
  352. return (LPCTSTR)m_csRunDiskName;
  353. }
  354. void SetLodCtrStatus(int val)
  355. {
  356. m_nLodCtrFlag = val;
  357. }
  358. int CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx);
  359. void LocalPreOnline(int slot, CSimpleStringA fromTermNo, CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data);
  360. void ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos);
  361. int CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
  362. int ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx);
  363. int SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);
  364. void DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize);
  365. int LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize);
  366. void ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx);
  367. void CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx);
  368. void ProcessPreOnline(CardActiveReq* req);
  369. void ProcessCardActive(CardActiveReq* req);
  370. protected:
  371. void DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx);
  372. private:
  373. ErrorCodeEnum GetServerAddr(CSmartPointer<IConfigInfo> &spConfig, bool isCardStore);
  374. int m_tmpTestFlag;
  375. int m_longConnInterval;//长连接时间间隔
  376. int m_handShakeConnInterval;//新心跳时间间隔
  377. SOCKET m_ConnSocket;
  378. CSimpleStringA m_servStr,m_servIP,m_servStrB,m_servIPB,m_entErrorList,m_localDeviceNo,m_ILDeviceNo,m_tmpMultiBlob, m_terminalStage;
  379. int m_port,m_portB,m_initTimes,m_warnLevel,m_tradeState;
  380. unsigned long m_ulServIP;
  381. HeartBeatConnection* m_pHandShakeConn;
  382. bool m_bUseBackup;
  383. ErrorCodeEnum m_testResult;
  384. CSimpleStringA m_csServerIP, m_csRunDiskName;
  385. int m_nLodCtrFlag;
  386. bool m_bJBMachine;
  387. CardReadAdapter::CardReadAdapterService_ClientBase *m_pCRAClient;
  388. IDCertificate::IDCertService_ClientBase *m_pIDClient;
  389. PinPad::PinPadService_ClientBase *m_pPinPadClient;
  390. bool m_bAlarmed;
  391. bool m_isCardStore;
  392. };
  393. struct StartTask : public ITaskSp
  394. {
  395. CHeartBeatFSM* fsm;
  396. StartTask(CHeartBeatFSM* f) : fsm(f) {}
  397. void Process()
  398. {
  399. FSMEvent *e = new FSMEvent(USER_EVT_STARTFINISHED);
  400. e->param1 = fsm->Starting();
  401. fsm->PostEventFIFO(e);
  402. }
  403. };
  404. struct HandShakeTask : public ITaskSp
  405. {
  406. CHeartBeatFSM* fsm;
  407. HandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  408. void Process()
  409. {
  410. FSMEvent *e = new FSMEvent(USER_EVT_HANDSHAKEFINISHED);
  411. e->param1 = fsm->DoHandShake();
  412. fsm->PostEventFIFO(e);
  413. }
  414. };
  415. struct LodctrTask : public ITaskSp
  416. {
  417. CHeartBeatFSM* fsm;
  418. LodctrTask(CHeartBeatFSM* f) : fsm(f) {}
  419. void Process()
  420. {
  421. HMODULE hDll = LoadLibrary("loadperf.dll");
  422. if(hDll == NULL)
  423. {
  424. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Load loadperf.dll failed %d", GetLastError());
  425. return;
  426. }
  427. LpRestorePerfRegistryFromFile restoreFunc = (LpRestorePerfRegistryFromFile)GetProcAddress(
  428. hDll,
  429. "RestorePerfRegistryFromFileW");
  430. if(restoreFunc == NULL)
  431. {
  432. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("GetProcAddress of RestorePerfRegistryFromFileW failed %d", GetLastError());
  433. return;
  434. }
  435. DWORD dwRet = restoreFunc(NULL, NULL);
  436. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("restoreFunc returned 0x%08x", dwRet);
  437. if(dwRet == 0)
  438. {
  439. fsm->SetLodCtrStatus(1);
  440. }
  441. else
  442. {
  443. fsm->SetLodCtrStatus(2);
  444. }
  445. return;
  446. }
  447. };
  448. struct CardActiveTask : public ITaskSp
  449. {
  450. CHeartBeatFSM* fsm;
  451. SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx;
  452. CardActiveTask(CHeartBeatFSM* f) : fsm(f) {}
  453. void Process()
  454. {
  455. FSMEvent *e = new FSMEvent(USER_EVT_CARD_ACTIVE_FINISHED);
  456. e->param1 = fsm->CardActive(ctx);
  457. fsm->PostEventFIFO(e);
  458. }
  459. };
  460. struct CrossTermCallTask : public ITaskSp
  461. {
  462. CHeartBeatFSM* fsm;
  463. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  464. CrossTermCallTask(CHeartBeatFSM* f) : fsm(f) {}
  465. void Process()
  466. {
  467. FSMEvent *e = new FSMEvent(USER_EVT_CROSS_TERM_CALL_FINISHED);
  468. e->param1 = fsm->CrossTermCall(ctx);
  469. fsm->PostEventFIFO(e);
  470. }
  471. };
  472. struct ILCallToRVCTask : public ITaskSp
  473. {
  474. CHeartBeatFSM* fsm;
  475. SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx;
  476. ILCallToRVCTask(CHeartBeatFSM* f) : fsm(f) {}
  477. void Process()
  478. {
  479. fsm->ILCallToRVC(ctx);
  480. }
  481. };
  482. struct CallResultToILTask : public ITaskSp
  483. {
  484. CHeartBeatFSM* fsm;
  485. SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx;
  486. CallResultToILTask(CHeartBeatFSM* f) : fsm(f) {}
  487. void Process()
  488. {
  489. fsm->CallResultToIL(ctx);
  490. }
  491. };
  492. struct LocalProcessCrossCallTask : public ITaskSp
  493. {
  494. CHeartBeatFSM* fsm;
  495. CrossCallReq *xreqInfo;
  496. int xnBufSize;
  497. SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx;
  498. LocalProcessCrossCallTask(CHeartBeatFSM* f, CrossCallReq *reqInfo, const int nBufSize) : fsm(f),xnBufSize(nBufSize)
  499. {
  500. BYTE *pBuf = new BYTE[nBufSize + 1];
  501. ZeroMemory(pBuf, nBufSize + 1);
  502. memcpy(pBuf, reqInfo, nBufSize);
  503. xreqInfo = (CrossCallReq*)pBuf;
  504. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("id:%x",xreqInfo->nEntityID);
  505. }
  506. ~LocalProcessCrossCallTask()
  507. {
  508. if (xreqInfo) {
  509. delete[] (BYTE*)xreqInfo;
  510. }
  511. }
  512. void Process()
  513. {
  514. FSMEvent *e = new FSMEvent(USER_EVT_LOCAL_CROSS_TERM_CALL_FINISHED);
  515. e->param1 = fsm->LocalProcessCrossCall(xreqInfo,xnBufSize);
  516. fsm->PostEventFIFO(e);
  517. }
  518. };
  519. struct ProcessPreOnlineTask : public ITaskSp
  520. {
  521. CHeartBeatFSM* fsm;
  522. CardActiveReq* cardActiveReq;
  523. ProcessPreOnlineTask(CHeartBeatFSM* f, CardActiveReq* req) : fsm(f),cardActiveReq(NULL)
  524. {
  525. if (req != NULL) {
  526. cardActiveReq = (CardActiveReq*)malloc(sizeof(struct CardActiveReq));
  527. if(cardActiveReq != NULL)
  528. memcpy(cardActiveReq, req, sizeof(struct CardActiveReq));
  529. }
  530. }
  531. ~ProcessPreOnlineTask()
  532. {
  533. if (cardActiveReq != nullptr) {
  534. free((void*)cardActiveReq);
  535. cardActiveReq = nullptr;
  536. }
  537. }
  538. void Process()
  539. {
  540. fsm->ProcessPreOnline(cardActiveReq);
  541. }
  542. };
  543. struct NewHandShakeTask : public ITaskSp
  544. {
  545. CHeartBeatFSM* fsm;
  546. NewHandShakeTask(CHeartBeatFSM* f) : fsm(f) {}
  547. void Process()
  548. {
  549. fsm->DoNewHandShake();
  550. }
  551. };
  552. class HeartBeatConnection : public SpSecureClient
  553. {
  554. public:
  555. HeartBeatConnection(CEntityBase *pEntity, CHeartBeatFSM *pFSM) : SpSecureClient(pEntity), m_pFSM(pFSM), m_TerminalNo("")
  556. {
  557. CSystemStaticInfo sysSInfo;
  558. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  559. m_TerminalNo = sysSInfo.strTerminalID;
  560. }
  561. virtual ~HeartBeatConnection() {}
  562. void SendHandShake();
  563. //type:0,send preonline; 1,result of preonline
  564. void SendCardActive(const int type, const int slot,unsigned long errCode, const char *termNo, const char *account, const int accSize
  565. , const char *data, const int dataSize,int findCard,int cardPos);
  566. void SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans);
  567. void SendILCallToService(CSimpleStringA csContent,int err,bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo);
  568. void PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg);
  569. void PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg);
  570. void PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg);
  571. protected:
  572. virtual void OnDisconnect()
  573. {
  574. m_pFSM->SetConnNULL();
  575. this->Close();
  576. }
  577. virtual void OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg);
  578. //virtual void OnReceivePackage(CSmartPointer<IPackage> &pRecvPkg)
  579. //{
  580. // //oiltest
  581. //}
  582. private:
  583. CSimpleStringA m_TerminalNo;
  584. CHeartBeatFSM *m_pFSM;
  585. };
  586. #endif //__HEARTBEAT_FSM_H