HeartBeatFSM.cpp 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898
  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include "HeartBeatFSM.h"
  4. #include "HeartBeat_UserErrorCode.h"
  5. #ifdef RVC_OS_WIN
  6. #pragma comment (lib, "Ws2_32.lib")
  7. #pragma comment (lib, "Mswsock.lib")
  8. #pragma comment (lib, "AdvApi32.lib")
  9. #pragma comment(lib, "pdh.lib")
  10. #endif //RVC_OS_WIN
  11. using namespace CardIssuer;
  12. using namespace PinPad;
  13. using namespace CardReadAdapter;
  14. using namespace IDCertificate;
  15. #include "EventCode.h"
  16. #include "DeviceCrossHelper.h"
  17. const int DEFAULT_BUFLEN = 2048;
  18. const int MAX_SEND_FAILED_TIMES = 5;
  19. const int MAX_INIT_TIMES = 5;
  20. //#define DEFAULT_PORT "408"
  21. // Termainal Performance Counter Component [Josephus in 9:31:27 2016/4/23]
  22. CONST ULONG COUNTER_INTERVAL_MS = 1000;
  23. const char * AvailMemoryQuery = "\\Memory\\Available MBytes";
  24. const char * HandleNumQuery = "\\Process(_Total)\\Handle Count";
  25. const char * ThreadNumQuery = "\\Process(_Total)\\Thread Count";
  26. const char * ProcessNumQuery = "\\System\\Processes";
  27. const char * SystemElapsedQuery = "\\System\\System Up Time";
  28. const char * ProcessTimeQuery = "\\Processor Information(_Total)\\% Processor Time";
  29. #define DIV (1024 * 1024)
  30. #define DAY_DIV (24 * 60 * 60)
  31. #define HOURS_DIV (60 * 60)
  32. #define MINUS_DIV (60)
  33. // End Performance Component [Josephus in 9:32:05 2016/4/23]
  34. //oiltmp need to move together?
  35. int StrBuf2HexBuf(LPCTSTR strBuf, PBYTE* hexBuf)
  36. {
  37. int len = strlen(strBuf);
  38. if (len == 0 || len % 2 != 0)
  39. return 0;
  40. BYTE* buf = new BYTE[len / 2];
  41. if (buf == NULL)
  42. return 0;
  43. int j = 0;
  44. for (int i = 0; i < len;)
  45. {
  46. int tmpVal;
  47. sscanf(strBuf + i, "%2X", &tmpVal);
  48. buf[j] = tmpVal;
  49. //buf[j] = char2int(strBuf[i])*16 + char2int(strBuf[i+1]);
  50. i += 2;
  51. j++;
  52. }
  53. //memcpy(buf,strBuf,len);
  54. *hexBuf = buf;
  55. return j;
  56. }
  57. int HexBuf2StrBuf(PBYTE hexBuf, char** strBuf, DWORD len)
  58. {
  59. char* tmpStr = *strBuf;
  60. int count = 0;
  61. for (int i = 0; i < len; ++i)
  62. {
  63. sprintf(tmpStr + count, "%0.2X", hexBuf[i]);
  64. count += 2;
  65. }
  66. return count;
  67. }
  68. ErrorCodeEnum CHeartBeatFSM::OnInit()
  69. {
  70. LOG_FUNCTION();
  71. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","S");
  72. ErrorCodeEnum Error;
  73. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  74. CSmartPointer<IConfigInfo> spConfig;
  75. CSystemStaticInfo sysInfo;
  76. Error = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  77. if(Error == Error_Succeed) {
  78. m_bJBMachine = !sysInfo.strMachineType.Compare("RVC.IL", true);
  79. m_localDeviceNo = sysInfo.strTerminalID;
  80. }
  81. Error = spEntityFunction->OpenConfig(Config_CenterSetting, spConfig);
  82. if (Error != Error_Succeed) {
  83. LOG_TRACE("open cfg file failed!");
  84. //logwarn oiltest
  85. return Error_DevLoadFileFailed;
  86. }
  87. m_tmpTestFlag = 0;
  88. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server",m_servStr);
  89. spConfig->ReadConfigValue(GetEntityBase()->GetEntityName(),"Server_Backup",m_servStrB);
  90. if (!m_servStr.IsNullOrEmpty())
  91. {
  92. CAutoArray<CSimpleStringA> aaServ = m_servStr.Split(' ');
  93. if (aaServ.GetCount() >= 2)
  94. {
  95. m_servIP = aaServ[0];
  96. m_port = atoi(aaServ[1]);
  97. }
  98. else
  99. {
  100. Dbg("cfg error!");
  101. GetEntityBase()->GetFunction()->ShowFatalError("实体HeartBeat找不到对应的配置,请检查集中配置");
  102. return Error_Param;
  103. }
  104. }
  105. if (!m_servStrB.IsNullOrEmpty())
  106. {
  107. CAutoArray<CSimpleStringA> aaServB = m_servStrB.Split(' ');
  108. if (aaServB.GetCount() >= 2)
  109. {
  110. m_servIPB = aaServB[0];
  111. m_portB = atoi(aaServB[1]);
  112. }
  113. else
  114. {
  115. Dbg("no backup(%s).",(LPCSTR)m_servStrB);
  116. m_servIPB = m_servIP;
  117. m_portB = m_port;
  118. }
  119. }
  120. Dbg("%s,%d;%s,%d",(LPCTSTR)m_servIP,m_port,(LPCTSTR)m_servIPB,m_portB);
  121. spConfig->ReadConfigValueInt(GetEntityBase()->GetEntityName(),"TestFlag",m_tmpTestFlag);
  122. //网络字节序
  123. //由于双活改造,改成固定ip,分行服务有处理
  124. m_servIP = "99.1.100.215";
  125. m_dwServIP = inet_addr(m_servIP);
  126. m_csServerIP = m_servIP;
  127. CSimpleStringA csRunDiskName("C:\\");
  128. Error = GetEntityBase()->GetFunction()->GetPath("Run", csRunDiskName);
  129. Dbg("GetPath of run is %s 0x%x", (LPCTSTR)csRunDiskName, Error);
  130. CAutoArray<CSimpleStringA> arrays = csRunDiskName.Split('\\');
  131. if(arrays.GetCount() > 0)
  132. {
  133. m_csRunDiskName = arrays[0] + "\\";
  134. Dbg("m_csRunDiskName is %s", (LPCTSTR)m_csRunDiskName);
  135. }
  136. else
  137. {
  138. Dbg("Split rundisk file string(%s) failed", (LPCTSTR)csRunDiskName);
  139. return Error_Unexpect;
  140. }
  141. //CSimpleStringA csTradeState("B");
  142. //Error = GetEntityBase()->GetFunction()->GetSysVar("TradeManageState",csTradeState);
  143. //if (Error == Error_Succeed)
  144. //{
  145. // Dbg("First get TradeManageState:%s",(const char*)csTradeState);
  146. // if (csTradeState.Compare("L",true) == 0)
  147. // m_tradeState = 8;
  148. //}
  149. return Error_Succeed;
  150. }
  151. ErrorCodeEnum CHeartBeatFSM::OnExit()
  152. {
  153. return Error_NotImpl;
  154. }
  155. //Init(Stop)
  156. void CHeartBeatFSM::s0_on_entry()
  157. {
  158. //LOG_FUNCTION();
  159. {
  160. //check if can start to work(handshake...)
  161. //1.check if AccessAuthorization have finished
  162. //2.check if network connected
  163. //3.check if framework on Exitting or Terminating
  164. //all of above have checked,start to work
  165. if (m_pHandShakeConn != NULL)
  166. {
  167. Dbg("init connection.");
  168. m_pHandShakeConn->Close();
  169. m_pHandShakeConn->DecRefCount();
  170. m_pHandShakeConn = NULL;
  171. }
  172. FSMEvent *e = new FSMEvent(USER_EVT_START);
  173. PostEventFIFO(e);
  174. m_initTimes++;
  175. if (m_initTimes > 1)
  176. Sleep(30000);
  177. if (m_initTimes > MAX_INIT_TIMES)
  178. {
  179. Dbg("have try to init x times,give up!");
  180. //logwarn oiltest
  181. m_initTimes = 0;
  182. }
  183. }
  184. }
  185. void CHeartBeatFSM::s0_on_exit()
  186. {
  187. }
  188. unsigned int CHeartBeatFSM::s0_on_event(FSMEvent* pEvt)
  189. {
  190. switch(pEvt->iEvt)
  191. {
  192. case USER_EVT_START:
  193. {
  194. StartTask* task = new StartTask(this);
  195. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  196. pEvt->SetHandled();
  197. }
  198. return 0;
  199. default:
  200. break;
  201. }
  202. return 0;
  203. }
  204. //Starting
  205. void CHeartBeatFSM::s1_on_entry()
  206. {
  207. //LOG_FUNCTION();
  208. }
  209. void CHeartBeatFSM::s1_on_exit()
  210. {
  211. }
  212. unsigned int CHeartBeatFSM::s1_on_event(FSMEvent* pEvt)
  213. {
  214. switch(pEvt->iEvt)
  215. {
  216. case USER_EVT_STARTFINISHED:
  217. pEvt->SetHandled();
  218. if (pEvt->param1 == 0)
  219. {
  220. HandShakeTask* task = new HandShakeTask(this);
  221. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  222. pEvt->SetHandled();
  223. return 0;
  224. }
  225. else
  226. {
  227. // SetFlag for MobileDial entity. [Josephus in 11:40:29 2016/8/16]
  228. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","D");
  229. return 1;
  230. }
  231. break;
  232. default:
  233. break;
  234. }
  235. return 0;
  236. }
  237. //Connnected
  238. void CHeartBeatFSM::s2_on_entry()
  239. {
  240. LOG_FUNCTION();
  241. m_initTimes = 0;
  242. m_testResult = Error_Succeed;
  243. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_CONNECTED, "Branch heartbeat service connected.");
  244. }
  245. void CHeartBeatFSM::s2_on_exit()
  246. {
  247. }
  248. unsigned int CHeartBeatFSM::s2_on_event(FSMEvent* pEvt)
  249. {
  250. switch(pEvt->iEvt)
  251. {
  252. case USER_EVT_INSTRUCTION:
  253. {
  254. InstructionEvent *pIE = dynamic_cast<InstructionEvent*>(pEvt);
  255. pEvt->SetHandled();
  256. DoInstruction(pIE->ctx);
  257. }
  258. break;
  259. case USER_EVT_HANDSHAKEFINISHED:
  260. pEvt->SetHandled();
  261. break;
  262. case USER_EVT_STOP:
  263. pEvt->SetHandled();
  264. break;
  265. case USER_EVT_START:
  266. pEvt->SetHandled();
  267. break;
  268. case USER_EVT_CARD_ACTIVE:
  269. {
  270. Dbg("s2 card active.");
  271. pEvt->SetHandled();
  272. CardActiveEvent *pcae = dynamic_cast<CardActiveEvent*>(pEvt);
  273. CardActiveTask *pTask = new CardActiveTask(this);
  274. pTask->ctx = pcae->ctx;
  275. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  276. }
  277. break;
  278. case USER_EVT_CARD_ACTIVE_FINISHED:
  279. pEvt->SetHandled();
  280. break;
  281. case USER_EVT_CROSS_TERM_CALL:
  282. {
  283. pEvt->SetHandled();
  284. CrossTermCallEvent* pCTCE = dynamic_cast<CrossTermCallEvent*>(pEvt);
  285. CrossTermCallTask *pTask = new CrossTermCallTask(this);
  286. pTask->ctx = pCTCE->ctx;
  287. Dbg("s2 cross call,type %x.",pCTCE->ctx->Req.type);
  288. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  289. }
  290. break;
  291. case USER_EVT_CROSS_TERM_CALL_FINISHED:
  292. pEvt->SetHandled();
  293. break;
  294. case USER_EVT_ILCallToRVC:
  295. {
  296. pEvt->SetHandled();
  297. ILCallToRVCEvent* pCTCE = dynamic_cast<ILCallToRVCEvent*>(pEvt);
  298. ILCallToRVCTask *pTask = new ILCallToRVCTask(this);
  299. pTask->ctx = pCTCE->ctx;
  300. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  301. }
  302. break;
  303. case USER_EVT_CallResultToIL:
  304. {
  305. pEvt->SetHandled();
  306. CallResultToILEvent* pCTCE = dynamic_cast<CallResultToILEvent*>(pEvt);
  307. CallResultToILTask *pTask = new CallResultToILTask(this);
  308. pTask->ctx = pCTCE->ctx;
  309. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  310. }
  311. break;
  312. default:
  313. break;
  314. }
  315. return 0;
  316. }
  317. //Lost
  318. void CHeartBeatFSM::s3_on_entry()
  319. {
  320. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","L");
  321. }
  322. void CHeartBeatFSM::s3_on_exit()
  323. {
  324. }
  325. unsigned int CHeartBeatFSM::s3_on_event(FSMEvent* pEvt)
  326. {
  327. return 0;
  328. }
  329. //Reject
  330. void CHeartBeatFSM::s4_on_entry()
  331. {
  332. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","R");
  333. FSMEvent *pStopEvt = new FSMEvent(USER_EVT_STOP);
  334. PostEventFIFO(pStopEvt);
  335. }
  336. void CHeartBeatFSM::s4_on_exit()
  337. {
  338. }
  339. unsigned int CHeartBeatFSM::s4_on_event(FSMEvent* pEvt)
  340. {
  341. switch(pEvt->iEvt)
  342. {
  343. case USER_EVT_STOP:
  344. pEvt->SetHandled();
  345. break;
  346. default:
  347. break;
  348. }
  349. return 0;
  350. }
  351. //Failed
  352. void CHeartBeatFSM::s5_on_entry()
  353. {
  354. m_testResult = Error_InvalidState;
  355. }
  356. void CHeartBeatFSM::s5_on_exit()
  357. {
  358. }
  359. unsigned int CHeartBeatFSM::s5_on_event(FSMEvent* pEvt)
  360. {
  361. return 0;
  362. }
  363. int CHeartBeatFSM::Starting()
  364. {
  365. Dbg("starting.....");
  366. if (!m_pHandShakeConn)
  367. {
  368. //HeartBeatConnection* pHandShakeConn;
  369. m_pHandShakeConn = new HeartBeatConnection(m_pEntity, this);
  370. if (m_pHandShakeConn != NULL)
  371. {
  372. bool bConn = false;
  373. bConn = m_pHandShakeConn->ConnectFromCentralSetting();
  374. //if (!m_bUseBackup)
  375. //{
  376. // bConn = m_pHandShakeConn->Connect(m_servIP, m_port, 3);
  377. // m_dwServIP = inet_addr(m_servIP);
  378. // m_csServerIP = m_servIP;
  379. //}
  380. //else
  381. //{
  382. // bConn = m_pHandShakeConn->Connect(m_servIPB, m_portB, 3);
  383. // m_dwServIP = inet_addr(m_servIPB);
  384. // m_csServerIP = m_servIPB;
  385. //}
  386. if (!bConn)
  387. {
  388. m_pHandShakeConn->Close();
  389. //delete m_pHandShakeConn;//oiltest
  390. m_pHandShakeConn->DecRefCount();
  391. m_pHandShakeConn = NULL;
  392. Dbg("cannot connect to server.");
  393. //if (m_bUseBackup)
  394. LogEvent(Severity_Middle, LOG_EVT_HEARTBEAT_UN_CONNECTED, "Branch heartbeat service unconnected.");
  395. //m_bUseBackup = !m_bUseBackup;
  396. return 1;
  397. }
  398. }
  399. //else
  400. //Dbg("new heartbeatconnection failed.");
  401. }
  402. Dbg("start ok.");
  403. return 0;
  404. /*
  405. WSADATA wsaData;
  406. m_ConnSocket = INVALID_SOCKET;
  407. struct addrinfo *result = NULL,*ptr = NULL,hints;
  408. int iResult;
  409. int recvbuflen = DEFAULT_BUFLEN;
  410. // Initialize Winsock
  411. iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
  412. if (iResult != 0)
  413. {
  414. Dbg("WSAStartup failed with error: %d\n", iResult);
  415. return 1;
  416. }
  417. ZeroMemory( &hints, sizeof(hints) );
  418. hints.ai_family = AF_UNSPEC;
  419. hints.ai_socktype = SOCK_STREAM;
  420. hints.ai_protocol = IPPROTO_TCP;
  421. //oiltest get from ini file
  422. Dbg("server %s,port %d",(LPCSTR)m_servIP,m_port);
  423. iResult = getaddrinfo(m_servIP, m_servPort, &hints, &result);
  424. if ( iResult != 0 )
  425. {
  426. Dbg("getaddrinfo failed with error: %d\n", iResult);
  427. WSACleanup();
  428. return 1;
  429. }
  430. for(ptr=result; ptr != NULL ;ptr=ptr->ai_next)
  431. {
  432. m_ConnSocket = socket(ptr->ai_family, ptr->ai_socktype,
  433. ptr->ai_protocol);
  434. if (m_ConnSocket == INVALID_SOCKET)
  435. {
  436. Dbg("socket failed with error: %ld\n", WSAGetLastError());
  437. WSACleanup();
  438. return 1;
  439. }
  440. iResult = connect(m_ConnSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
  441. if (iResult == SOCKET_ERROR)
  442. {
  443. closesocket(m_ConnSocket);
  444. m_ConnSocket = INVALID_SOCKET;
  445. continue;
  446. }
  447. break;
  448. }
  449. Dbg("conn socket %d",m_ConnSocket);
  450. freeaddrinfo(result);
  451. if (m_ConnSocket == INVALID_SOCKET)
  452. {
  453. Dbg("Unable to connect to server!\n");
  454. WSACleanup();
  455. return 1;
  456. }
  457. */
  458. }
  459. int CHeartBeatFSM::DoHandShake()
  460. {
  461. if (m_pHandShakeConn) {
  462. Dbg("start handshake");
  463. //oiltest sp_var_client_set has no write privilege!
  464. //GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState","C");
  465. while (1)
  466. {
  467. //HeartBeatConnection* pHandShakeConn;
  468. //pHandShakeConn = new HeartBeatConnection(m_pEntity, this);
  469. //if (pHandShakeConn != NULL)
  470. //{
  471. // bool bConn = false;
  472. // if (!m_bUseBackup)
  473. // bConn = pHandShakeConn->Connect(m_servIP, m_port, 3);
  474. // else
  475. // bConn = pHandShakeConn->Connect(m_servIPB, m_portB, 3);
  476. // if (!bConn)
  477. // {
  478. // pHandShakeConn->Close();
  479. // //delete m_pHandShakeConn;//oiltest
  480. // pHandShakeConn->DecRefCount();
  481. // pHandShakeConn = NULL;
  482. // Dbg("cannot connect to server(%d).", m_bUseBackup);
  483. // m_bUseBackup = !m_bUseBackup;
  484. // }
  485. //}
  486. if (!m_pHandShakeConn || !m_pHandShakeConn->IsConnectionOK())
  487. {
  488. FSMEvent *e = new FSMEvent(USER_EVT_START);
  489. PostEventFIFO(e);
  490. break;
  491. }
  492. GetEntityBase()->GetFunction()->SetSysVar("HeartbeatState", "C");
  493. m_pHandShakeConn->SendHandShake();
  494. Sleep(20000);//oiltest
  495. if (m_tmpTestFlag)
  496. {
  497. Dbg("send spshell.exe restart event.");
  498. LogEvent(Severity_Middle, Event_Req_Framework_Restart, "spshell.exe restart");
  499. }
  500. }
  501. }
  502. /*
  503. char sendbuf[DEFAULT_BUFLEN];
  504. memset(sendbuf,0,sizeof(sendbuf));
  505. TerminalInfo* pTermInfo = (TerminalInfo*)sendbuf;
  506. memcpy(pTermInfo->TerminalNo,"12345678",8);
  507. //CSimpleStringA warningLevel,runState,customerHandle,callState,localMaintain,remoteMaintain;
  508. //oiltest set default value
  509. CSimpleStringA warningLevel("w"),runState("r"),customerHandle("c"),callState("s"),
  510. localMaintain("l"),remoteMaintain("m");
  511. Dbg("get sysvar");
  512. GetEntityBase()->GetFunction()->GetSysVar("WarningLevel",warningLevel);
  513. GetEntityBase()->GetFunction()->GetSysVar("RunState",runState);
  514. GetEntityBase()->GetFunction()->GetSysVar("CustomerHandle",customerHandle);
  515. GetEntityBase()->GetFunction()->GetSysVar("CallState",callState);
  516. GetEntityBase()->GetFunction()->GetSysVar("LocalMaintain",localMaintain);
  517. GetEntityBase()->GetFunction()->GetSysVar("RemoteMaintain",remoteMaintain);
  518. //oiltest byteorder
  519. pTermInfo->ip = m_ulServIP;
  520. pTermInfo->WarningLevel = warningLevel[0];
  521. pTermInfo->RunState = runState[0];
  522. pTermInfo->CustomerHandle = customerHandle[0];
  523. pTermInfo->CallState = callState[0];
  524. pTermInfo->LocalMaintain = localMaintain[0];
  525. pTermInfo->RemoteMaintain = remoteMaintain[0];
  526. Dbg("before send socket %d",m_ConnSocket);
  527. int sendFailedTimes = 0;
  528. while(1)
  529. {
  530. //oiltest break condition...
  531. //send machine info
  532. int iResult = send(m_ConnSocket, sendbuf, (int)sizeof(sendbuf), 0 );
  533. if (iResult == SOCKET_ERROR)
  534. {
  535. Dbg("send failed with error: %d\n", WSAGetLastError());
  536. sendFailedTimes++;
  537. if (sendFailedTimes > MAX_SEND_FAILED_TIMES)
  538. {
  539. Dbg("have failed %d times,no send anymore.",sendFailedTimes);
  540. closesocket(m_ConnSocket);
  541. WSACleanup();
  542. break;
  543. }
  544. }
  545. Sleep(20000);//oiltest
  546. }
  547. */
  548. return 0;
  549. }
  550. int CHeartBeatFSM::CardActive(SpReqAnsContext<HeartBeatService_CardActive_Req, HeartBeatService_CardActive_Ans>::Pointer ctx)
  551. {
  552. LOG_FUNCTION();
  553. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  554. {
  555. m_pHandShakeConn->SendCardActive(0,ctx->Req.slot, 0,(const char*)ctx->Req.term,(const char*)ctx->Req.account, ctx->Req.account.GetLength(), (const char*)ctx->Req.data, ctx->Req.data.GetLength(),0,0);
  556. ctx->Answer(Error_Succeed);
  557. }
  558. else
  559. {
  560. if (ctx->Req.account.GetLength() > 6)
  561. Dbg("acc:%s****%s,no connection.", (const char*)ctx->Req.account.SubString(0, 6), (const char*)ctx->Req.account.SubString(ctx->Req.account.GetLength() - 4, 4));
  562. else
  563. Dbg("acc:%s, size:%d", (const char*)ctx->Req.account,ctx->Req.account.GetLength());
  564. ctx->Answer(Error_Unexpect);
  565. }
  566. return 0;
  567. }
  568. void CHeartBeatFSM::DoInstruction(SpReqAnsContext<HeartBeatService_Instruction_Req, HeartBeatService_Instruction_Ans>::Pointer ctx)
  569. {
  570. switch(ctx->Req.type)
  571. {
  572. case INC_GLOBAL_SETTING_SYNC:
  573. break;
  574. case INC_COMM_RECONNECT:
  575. break;
  576. case INC_START_REMOTE_CONTROL:
  577. break;
  578. case INC_UPDATE_CHECK:
  579. break;
  580. case INC_RECOVER_SERVICE:
  581. break;
  582. case INC_PAUSE_SERVICE:
  583. break;
  584. case INC_AREA_SERVICE_SWITCH:
  585. break;
  586. default:
  587. break;
  588. }
  589. }
  590. ErrorCodeEnum CHeartBeatFSM::SetErrorList(int warmLevel,CSimpleStringA strList)
  591. {
  592. m_warnLevel = warmLevel;
  593. m_entErrorList = strList;
  594. Dbg("strList[%s]",(LPCTSTR)strList);
  595. return Error_Succeed;
  596. }
  597. void CHeartBeatFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  598. {
  599. //for simple
  600. pTransactionContext->SendAnswer(m_testResult);
  601. }
  602. void CHeartBeatFSM::LocalPreOnline(int slot, CSimpleStringA fromTermNo,CSimpleStringA termNo, CSimpleStringA account, CSimpleStringA data)
  603. {
  604. LOG_FUNCTION();
  605. CardReadAdapterService_ClientBase *pCardReadAdapterClient = NULL;
  606. ErrorCodeEnum eErr = Error_Unexpect;
  607. pCardReadAdapterClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  608. if (pCardReadAdapterClient != NULL)
  609. eErr = pCardReadAdapterClient->Connect();
  610. if (pCardReadAdapterClient == NULL || eErr != Error_Succeed)
  611. {
  612. CSimpleStringA errMsg = CSimpleStringA::Format("LocalPreOnline, pGuiConsoleClient is null or connect CardReadAdapter failed:%d(0x%x)", eErr, eErr);
  613. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardReader_Failed, errMsg.GetData());
  614. return;
  615. }
  616. CardReadAdapterService_PreOnline_Req req;
  617. CardReadAdapterService_PreOnline_Ans ans;
  618. CSimpleStringA outParam("");
  619. req.businessData = data;
  620. char buf[16];
  621. ZeroMemory(buf, sizeof(buf));
  622. _itoa(slot, buf, 10);
  623. CSimpleStringA kaku("kaku#");
  624. req.module = 1;
  625. req.reserved2.Init(2);
  626. req.reserved2[0] = kaku + CSimpleStringA(buf);
  627. Dbg("local:%s", (const char*)req.reserved2[0]);
  628. req.reserved2[1] = account;
  629. CSimpleStringA inParam = CSimpleStringA::Format("PreOnline, CardStore heartbeat invodk PreOnline, slot:%s, accountLen:%d", req.reserved2[0].GetData(), account.GetLength());
  630. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Inparam, inParam.GetData());
  631. eErr = pCardReadAdapterClient->PreOnline(req, ans, 65000);
  632. if (eErr != Error_Succeed) {
  633. outParam = CSimpleStringA::Format("local preonline failed:%d(0x%x)", eErr, eErr);
  634. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_PreOnline_Falied, inParam.GetData());
  635. }
  636. CardReadAdapterService_QueryCardInfoOnStore_Req reqX;
  637. CardReadAdapterService_QueryCardInfoOnStore_Ans ansX;
  638. ErrorCodeEnum eErrX = Error_Unexpect;
  639. eErrX = pCardReadAdapterClient->QueryCardInfoOnStore(reqX, ansX,12000);
  640. if (eErrX != Error_Succeed)
  641. {
  642. outParam = CSimpleStringA::Format("QueryCardInfoOnStore failed.%d", eErrX);
  643. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_Connect_CardStore_Invoke_QueryCardInfoOnStore_Falied, inParam.GetData());
  644. ansX.findCard = ansX.cardPos = 9999;
  645. }
  646. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  647. {
  648. m_pHandShakeConn->SendCardActive(1,slot,eErr, (const char*)termNo, (const char*)account,
  649. account.GetLength(), (const char*)ans.result, ans.result.GetLength(),ansX.findCard,ansX.cardPos);
  650. }
  651. }
  652. void CHeartBeatFSM::ReceivePreOnlineBack(unsigned long errCode,CSimpleStringA data, unsigned long findCard, unsigned long cardPos)
  653. {
  654. CardIssuerService_ClientBase *pCardIssuerClient = NULL;
  655. ErrorCodeEnum eErr = Error_Unexpect;
  656. pCardIssuerClient = new CardIssuerService_ClientBase(GetEntityBase());
  657. if (pCardIssuerClient != NULL)
  658. eErr = pCardIssuerClient->Connect();
  659. if (pCardIssuerClient == NULL || eErr != Error_Succeed)
  660. {
  661. Dbg("pGuiConsoleClient is null or connect to cardissuer failed.%d", eErr);
  662. return;
  663. }
  664. CardIssuerService_NotifyPreonline_Req req;
  665. CardIssuerService_NotifyPreonline_Ans ans;
  666. req.data = data;
  667. req.findCard = findCard;
  668. req.cardPos = cardPos;
  669. req.errCode = errCode;
  670. eErr = pCardIssuerClient->NotifyPreonline(req, ans, 10000);
  671. Dbg("NotifyPreonline ret:%d",eErr);
  672. }
  673. int CHeartBeatFSM::CrossTermCall(SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
  674. {
  675. int ret = 0;
  676. Dbg("cross term call,type:%x, entity: 0x%x",ctx->Req.type, ctx->Req.nEntityID);
  677. switch (ctx->Req.nEntityID)
  678. {
  679. case 0x206:
  680. case 0x201:
  681. case 0x218:
  682. case 0x21B:
  683. ret = ProcessCrossCallToHBService(ctx->Req.type,ctx);
  684. break;
  685. default:
  686. break;
  687. }
  688. return ret;
  689. }
  690. int CHeartBeatFSM::ProcessCrossCallToHBService(int callType, SpReqAnsContext<HeartBeatService_CrossTermCall_Req, HeartBeatService_CrossTermCall_Ans>::Pointer ctx)
  691. {
  692. LOG_FUNCTION();
  693. ctx->Answer(Error_Succeed);
  694. return SendToHeartBeatService(ctx->Req,ctx->Ans);
  695. }
  696. void CHeartBeatFSM::DoLocalProcessCrossCallTask(CrossCallReq *reqInfo, const int nBufSize)
  697. {
  698. if (GetTerminalStageState().Compare("A"))
  699. {
  700. Dbg("Terminal havn't been auth suc,forbid cross call.");
  701. return;
  702. }
  703. LocalProcessCrossCallTask *pTask = new LocalProcessCrossCallTask(this, reqInfo, nBufSize);
  704. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  705. }
  706. int CHeartBeatFSM::LocalProcessCrossCall(CrossCallReq* reqInfo, const int nBufSize)
  707. {
  708. LOG_FUNCTION();
  709. if(reqInfo == NULL) {
  710. return -1;
  711. }
  712. Dbg("entity sn:%x,is RVC.IL:%d,bTwoWay:%d", reqInfo->nEntityID, m_bJBMachine, reqInfo->bTwoWay);
  713. if(m_bJBMachine) { //简版心跳逻辑,那么接收到的应该是回收包
  714. switch(reqInfo->nEntityID) //实体ID
  715. {
  716. case 0x201:
  717. {
  718. ErrorCodeEnum ec = Error_Succeed;
  719. IDCertService_ClientBase* pClient = new IDCertService_ClientBase(GetEntityBase());
  720. ec = pClient->Connect();
  721. if (ec == Error_Succeed) {
  722. IDCertService_CrossTermInvokeInfo_Info info;
  723. info.type = reqInfo->CallType;
  724. info.nEntityID = reqInfo->nEntityID;
  725. info.result = reqInfo->ErrorCode;
  726. SpBuffer spbuf2;
  727. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  728. Dbg("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  729. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  730. if (bBuf) {
  731. Dbg("offset succ.");
  732. if (xSize > 0)
  733. info.paramX = spbuf2.ToBlob();
  734. }
  735. ec = pClient->CrossTermInvokeInfo(info);
  736. Dbg("CrossTermInvokeInfo return %d", ec);
  737. }
  738. else {
  739. Dbg("Connect to IDCertificate failed %d", ec);
  740. }
  741. }
  742. break;
  743. case 0x206://pinpad
  744. {
  745. ErrorCodeEnum ec = Error_Succeed;
  746. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(GetEntityBase());
  747. ec = pClient->Connect();
  748. if (ec == Error_Succeed) {
  749. PinPadService_CrossTermInvokeInfo_Info info;
  750. info.type = reqInfo->CallType;
  751. info.nEntityID = reqInfo->nEntityID;
  752. info.result = reqInfo->ErrorCode;
  753. SpBuffer spbuf2;
  754. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  755. Dbg("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  756. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  757. if (bBuf) {
  758. Dbg("offset succ.");
  759. if (xSize > 0)
  760. info.paramX = spbuf2.ToBlob();
  761. }
  762. ec = pClient->CrossTermInvokeInfo(info);
  763. Dbg("CrossTermInvokeInfo return %d", ec);
  764. }
  765. else {
  766. Dbg("Connect to PinPad failed %d", ec);
  767. }
  768. }
  769. break;
  770. case 0x218:
  771. {
  772. Dbg("Scanner set");
  773. ErrorCodeEnum ec = Error_Succeed;
  774. ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
  775. ec = pClient->Connect();
  776. if(ec == Error_Succeed) {
  777. ScannerService_CrossTermInvokeInfo_Info info;
  778. info.type = reqInfo->CallType;
  779. info.nEntityID = reqInfo->nEntityID;
  780. info.result = reqInfo->ErrorCode;
  781. SpBuffer spbuf2;
  782. int size = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  783. Dbg("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX) , size);
  784. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), size);
  785. if(bBuf) {
  786. Dbg("offset succ.");
  787. if(size > 0) {
  788. info.paramX = spbuf2.ToBlob();
  789. }
  790. }
  791. ec = pClient->CrossTermInvokeInfo(info);
  792. Dbg("CrossTermInvokeInfo return %d", ec);
  793. } else {
  794. Dbg("Connect to scanner failed %d", ec);
  795. }
  796. }
  797. break;
  798. case 0x21B:
  799. {
  800. ErrorCodeEnum ec = Error_Succeed;
  801. CardReadAdapterService_ClientBase* pClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  802. ec = pClient->Connect();
  803. if (ec == Error_Succeed) {
  804. CardReadAdapterService_CrossTermInvokeInfo_Info info;
  805. info.type = reqInfo->CallType;
  806. info.nEntityID = reqInfo->nEntityID;
  807. info.result = reqInfo->ErrorCode;
  808. SpBuffer spbuf2;
  809. int xSize = nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX);
  810. Dbg("offset %d, %d", FIELD_OFFSET(CrossCallReq, StrParamX), xSize);
  811. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), xSize);
  812. if (bBuf) {
  813. Dbg("offset succ.");
  814. if (xSize > 0)
  815. info.paramX = spbuf2.ToBlob();
  816. }
  817. ec = pClient->CrossTermInvokeInfo(info);
  818. Dbg("CrossTermInvokeInfo return %d", ec);
  819. }
  820. else {
  821. Dbg("Connect to CardReadAdapter failed %d", ec);
  822. }
  823. }
  824. break;
  825. case 0x999:
  826. {
  827. if (reqInfo->numOfBlobInParamX == 1)
  828. {
  829. NotifyIECallResult resultNote;
  830. resultNote.ans_context = reqInfo->StrParamX;
  831. Dbg("oiltest %s", (const char*)resultNote.ans_context.SubString(0, 512));
  832. resultNote.error = reqInfo->ErrorCode;
  833. Dbg("notify result to IE:error %d,len of ans_context %d", resultNote.error, reqInfo->lensOfBlobInParamX[0]);
  834. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
  835. }
  836. else
  837. {//oiltest 需要改成按照序号组包
  838. m_tmpMultiBlob += reqInfo->StrParamX;
  839. if (reqInfo->blobSN == reqInfo->numOfBlobInParamX-1)
  840. {
  841. NotifyIECallResult resultNote;
  842. resultNote.ans_context = m_tmpMultiBlob;
  843. if (resultNote.ans_context.GetLength() > 512)
  844. Dbg("oiltest substr %s", (const char*)resultNote.ans_context.SubString(0, 512));
  845. else
  846. Dbg("oiltest %s", (const char*)resultNote.ans_context);
  847. if (resultNote.ans_context.GetLength() > 100)
  848. Dbg("oiltest the last 100 str %s", (const char*)resultNote.ans_context.SubString(resultNote.ans_context.GetLength()-100, 100));
  849. resultNote.error = reqInfo->ErrorCode;
  850. Dbg("notify result to IE:error %d,len of ans_context %d", resultNote.error, resultNote.ans_context.GetLength());
  851. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIECallResult), SP_MSG_SIG_OF(NotifyIECallResult), resultNote);
  852. m_tmpMultiBlob = "";
  853. }
  854. }
  855. }
  856. break;
  857. default:
  858. break;
  859. }
  860. } else { //常规机型,连接适配器
  861. switch(reqInfo->nEntityID) //实体ID
  862. {
  863. case 0x201:
  864. {
  865. ErrorCodeEnum ec = Error_Succeed;
  866. if (m_pIDClient == NULL)
  867. {
  868. Dbg("creat IDCertService_ClientBase client");
  869. m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
  870. }
  871. if (m_pIDClient != NULL)
  872. {
  873. if (m_pIDClient->QuerySessionClosed())
  874. {
  875. m_pIDClient->SafeDelete();
  876. m_pIDClient = new IDCertService_ClientBase(GetEntityBase());
  877. Dbg("to connect to IDCertificate...");
  878. if (m_pIDClient != NULL)
  879. ec = m_pIDClient->Connect();
  880. }
  881. }
  882. if (ec == Error_Succeed) {
  883. IDCertService_CrossTermCall_Req reqX;
  884. IDCertService_CrossTermCall_Ans ansX;
  885. reqX.type = reqInfo->CallType;
  886. //这个应该不用存储
  887. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  888. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  889. SpBuffer spbuf2;
  890. Dbg("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  891. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  892. if (bBuf) {
  893. reqX.paramX = spbuf2.ToBlob();
  894. }
  895. ec = m_pIDClient->CrossTermCall(reqX, ansX, 20000);
  896. Dbg("local term call ret:%x", ec);
  897. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  898. {
  899. HeartBeatService_CrossTermCall_Req reqY;
  900. HeartBeatService_CrossTermCall_Ans ansY;
  901. reqY.type = reqInfo->CallType;
  902. reqY.nEntityID = reqInfo->nEntityID;
  903. //做返回
  904. ansY.retCode = ec;
  905. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  906. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  907. reqY.paramX = ansX.retParamX;
  908. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  909. Dbg("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
  910. SendToHeartBeatService(reqY, ansY);
  911. }
  912. }
  913. else {
  914. Dbg("Connect to IDCertificate failed %d", ec);
  915. m_pIDClient->SafeDelete();
  916. m_pIDClient = NULL;
  917. }
  918. }
  919. break;
  920. case 0x206://pinpad
  921. {
  922. ErrorCodeEnum ec = Error_Succeed;
  923. if (m_pPinPadClient == NULL)
  924. {
  925. Dbg("creat PinPadService_ClientBase client");
  926. m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
  927. }
  928. if (m_pPinPadClient != NULL)
  929. {
  930. if (m_pPinPadClient->QuerySessionClosed())
  931. {
  932. m_pPinPadClient->SafeDelete();
  933. m_pPinPadClient = new PinPadService_ClientBase(GetEntityBase());
  934. Dbg("to connect to PinPad...");
  935. if (m_pPinPadClient != NULL)
  936. ec = m_pPinPadClient->Connect();
  937. }
  938. }
  939. if (ec == Error_Succeed) {
  940. PinPadService_CrossTermCall_Req reqX;
  941. PinPadService_CrossTermCall_Ans ansX;
  942. reqX.type = reqInfo->CallType;
  943. //这个应该不用存储
  944. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  945. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  946. SpBuffer spbuf2;
  947. Dbg("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  948. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  949. if (bBuf) {
  950. reqX.paramX = spbuf2.ToBlob();
  951. }
  952. ec = m_pPinPadClient->CrossTermCall(reqX, ansX, 20000);
  953. Dbg("local term call ret:%x", ec);
  954. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  955. {
  956. HeartBeatService_CrossTermCall_Req reqY;
  957. HeartBeatService_CrossTermCall_Ans ansY;
  958. reqY.type = reqInfo->CallType;
  959. reqY.nEntityID = reqInfo->nEntityID;
  960. //做返回
  961. ansY.retCode = ec;
  962. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  963. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  964. reqY.paramX = ansX.retParamX;
  965. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  966. Dbg("send pkg to client: %d,Y len:%d", ec, reqY.paramX.m_iLength);
  967. SendToHeartBeatService(reqY, ansY);
  968. }
  969. }
  970. else {
  971. Dbg("Connect to PinPad failed %d", ec);
  972. }
  973. }
  974. break;
  975. case 0x218: // 高拍仪功能集
  976. {
  977. ErrorCodeEnum ec = Error_Succeed;
  978. ScannerService_ClientBase* pClient = new ScannerService_ClientBase(GetEntityBase());
  979. ec = pClient->Connect();
  980. if(ec == Error_Succeed) {
  981. ScannerService_CrossTermCall_Req reqX;
  982. ScannerService_CrossTermCall_Ans ansX;
  983. reqX.type = reqInfo->CallType;
  984. //这个应该不用存储
  985. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  986. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  987. SpBuffer spbuf2;
  988. Dbg("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX) );
  989. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1 );
  990. if(bBuf) {
  991. reqX.paramX = spbuf2.ToBlob();
  992. }
  993. ec = pClient->CrossTermCall(reqX, ansX, 20000);
  994. Dbg("local term call ret:%x",ec);
  995. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  996. {
  997. HeartBeatService_CrossTermCall_Req reqY;
  998. HeartBeatService_CrossTermCall_Ans ansY;
  999. reqY.type = reqInfo->CallType;
  1000. reqY.nEntityID = reqInfo->nEntityID;
  1001. //做返回
  1002. ansY.retCode = ec;
  1003. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  1004. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  1005. reqY.paramX = ansY.retParamX;
  1006. Dbg("send pkg to client: %d", ec);
  1007. SendToHeartBeatService(reqY, ansY);
  1008. }
  1009. } else {
  1010. Dbg("Connect to scanner failed %d", ec);
  1011. }
  1012. }
  1013. break;
  1014. case 0x21B:
  1015. {
  1016. ErrorCodeEnum ec = Error_Succeed;
  1017. if (m_pCRAClient == NULL)
  1018. {
  1019. Dbg("creat CardReadAdapterService_ClientBase client");
  1020. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1021. }
  1022. if (m_pCRAClient != NULL)
  1023. {
  1024. if (m_pCRAClient->QuerySessionClosed())
  1025. {
  1026. m_pCRAClient = NULL;
  1027. m_pCRAClient = new CardReadAdapterService_ClientBase(GetEntityBase());
  1028. Dbg("to connect to CardReadAdapter");
  1029. ec = m_pCRAClient->Connect();
  1030. }
  1031. }
  1032. if (ec == Error_Succeed) {
  1033. CardReadAdapterService_CrossTermCall_Req reqX;
  1034. CardReadAdapterService_CrossTermCall_Ans ansX;
  1035. reqX.type = reqInfo->CallType;
  1036. //这个应该不用存储
  1037. reqX.fromTerminalNo = reqInfo->ToTerminalNo;
  1038. reqX.toTerminalNo = reqInfo->FromTerminalNo;
  1039. SpBuffer spbuf2;
  1040. Dbg("offset %d", FIELD_OFFSET(CrossCallReq, StrParamX));
  1041. bool bBuf = spbuf2.OpenRead((const char*)&(reqInfo->StrParamX[0]), nBufSize - FIELD_OFFSET(CrossCallReq, StrParamX) + 1);
  1042. if (bBuf) {
  1043. reqX.paramX = spbuf2.ToBlob();
  1044. }
  1045. ec = m_pCRAClient->CrossTermCall(reqX, ansX, 20000);
  1046. Dbg("local term call ret:%x", ec);
  1047. if (reqInfo->bTwoWay)//if one way call, no need to feed back
  1048. {
  1049. HeartBeatService_CrossTermCall_Req reqY;
  1050. HeartBeatService_CrossTermCall_Ans ansY;
  1051. reqY.type = reqInfo->CallType;
  1052. reqY.nEntityID = reqInfo->nEntityID;
  1053. //做返回
  1054. ansY.retCode = ec;
  1055. reqY.fromTerminalNo = reqInfo->ToTerminalNo;
  1056. reqY.toTerminalNo = reqInfo->FromTerminalNo;
  1057. reqY.paramX = ansX.retParamX;
  1058. //reqY. = ansX.retParamY.m_iLength;//oiltest 暂时用来传递blob长度
  1059. Dbg("send pkg to client: %d,X len:%d", ec, reqY.paramX.m_iLength);
  1060. SendToHeartBeatService(reqY, ansY);
  1061. }
  1062. }
  1063. else {
  1064. Dbg("Connect to CardReadAdapter failed %d", ec);
  1065. }
  1066. }
  1067. break;
  1068. case 0x999:
  1069. {
  1070. m_ILDeviceNo = reqInfo->FromTerminalNo;
  1071. Dbg("save il TerminalNo:%s",(const char*)m_ILDeviceNo);
  1072. NotifyIEToCall note;
  1073. note.context = reqInfo->StrParamX;
  1074. Dbg("oiltest %s",(const char*)note.context);
  1075. Dbg("note IE to call:%d", reqInfo->lensOfBlobInParamX[0]);
  1076. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(NotifyIEToCall), SP_MSG_SIG_OF(NotifyIEToCall), note);
  1077. }
  1078. break;
  1079. default:
  1080. break;
  1081. }
  1082. }
  1083. //TODO: return
  1084. }
  1085. ErrorCodeEnum CHeartBeatFSM::GetPerformCounter(TermianlCounter& counter)
  1086. {
  1087. memset(&counter, 0, sizeof(TermianlCounter));//oiltmp@20210611
  1088. #ifdef RVC_OS_WIN
  1089. //oilyang@20171122 数量太多,暂时去掉
  1090. //LOG_FUNCTION();
  1091. PDH_STATUS Status;
  1092. HQUERY Query = NULL;
  1093. //HCOUNTER hcMemoryCount;
  1094. HCOUNTER hcHandleCount, hcProcessCount, hcThreadCount;
  1095. HCOUNTER hcElapsedTimeCount, hcProcessTimeCount;
  1096. DWORD CounterType;
  1097. MEMORYSTATUSEX statex;
  1098. Status = PdhOpenQuery(NULL, NULL, &Query);
  1099. if (Status != ERROR_SUCCESS)
  1100. {
  1101. Dbg("PdhOpenQuery failed with status 0x%x.", Status);
  1102. goto Cleanup;
  1103. }
  1104. Status = PdhAddCounter(Query, ProcessTimeQuery, NULL, &hcProcessTimeCount);
  1105. if (Status != ERROR_SUCCESS)
  1106. {
  1107. Dbg("PdhAddCounter for ProcessTimeQuery failed with status 0x%x.", Status);
  1108. goto Cleanup;
  1109. }
  1110. Status = PdhAddCounter(Query, HandleNumQuery, NULL, &hcHandleCount);
  1111. if (Status != ERROR_SUCCESS)
  1112. {
  1113. Dbg("PdhAddCounter for HandleNumQuery failed with status 0x%x.", Status);
  1114. goto Cleanup;
  1115. }
  1116. Status = PdhAddCounter(Query, ThreadNumQuery, NULL, &hcThreadCount);
  1117. if (Status != ERROR_SUCCESS)
  1118. {
  1119. Dbg("PdhAddCounter for ThreadNumQuery failed with status 0x%x.", Status);
  1120. goto Cleanup;
  1121. }
  1122. Status = PdhAddCounter(Query, ProcessNumQuery, NULL, &hcProcessCount);
  1123. if (Status != ERROR_SUCCESS)
  1124. {
  1125. Dbg("PdhAddCounter for ProcessNumQuery failed with status 0x%x.", Status);
  1126. goto Cleanup;
  1127. }
  1128. Status = PdhAddCounter(Query, SystemElapsedQuery, NULL, &hcElapsedTimeCount);
  1129. if (Status != ERROR_SUCCESS)
  1130. {
  1131. Dbg("PdhAddCounter for SystemElapsedQuery failed with status 0x%x.", Status);
  1132. goto Cleanup;
  1133. }
  1134. Status = PdhCollectQueryData(Query);
  1135. if (Status != ERROR_SUCCESS)
  1136. {
  1137. Dbg("PdhCollectQueryData failed with 0x%x.\n", Status);
  1138. goto Cleanup;
  1139. }
  1140. do
  1141. {
  1142. Sleep(COUNTER_INTERVAL_MS);
  1143. Status = PdhCollectQueryData(Query);
  1144. if (Status != ERROR_SUCCESS)
  1145. {
  1146. Dbg("PdhCollectQueryData failed with status 0x%x.", Status);
  1147. break;
  1148. }
  1149. memset(&statex, 0, sizeof(MEMORYSTATUSEX));
  1150. statex.dwLength = sizeof(statex);
  1151. if (GlobalMemoryStatusEx(&statex))
  1152. {
  1153. //Dbg("CPUUseRate:%u%%", statex.dwMemoryLoad);
  1154. counter.totalMem = (unsigned short)(statex.ullTotalPhys / DIV);
  1155. //Dbg("TotalPhysMemory:%I64dMB %d", statex.ullTotalPhys / DIV, counter.totalMem);
  1156. counter.freeMem = (unsigned short)(statex.ullAvailPhys / DIV);
  1157. //Dbg("AvailableMemory:%I64dMB %d", statex.ullAvailPhys / DIV, counter.freeMem);
  1158. }
  1159. PDH_FMT_COUNTERVALUE counterValue;
  1160. //Status = PdhGetFormattedCounterValue(hcMemoryCount, PDH_FMT_DOUBLE, NULL, &counterValue);
  1161. //if (Status == ERROR_SUCCESS)
  1162. //{
  1163. // Dbg("AvailableMemory:%.20gMB\n", counterValue.doubleValue);
  1164. //}
  1165. Status = PdhGetFormattedCounterValue(hcProcessTimeCount, PDH_FMT_DOUBLE, &CounterType, &counterValue);
  1166. if (Status == ERROR_SUCCESS)
  1167. {
  1168. counter.cpuLoad = (unsigned short)(counterValue.doubleValue + 0.5);
  1169. //Dbg("CPURate:%d %u", (long)counterValue.doubleValue, counter.cpuLoad);
  1170. }
  1171. Status = PdhGetFormattedCounterValue(hcHandleCount, PDH_FMT_LONG, NULL, &counterValue);
  1172. if (Status == ERROR_SUCCESS)
  1173. {
  1174. counter.handleNum = (unsigned int)(counterValue.longValue);
  1175. //Dbg("HandlesNum:%ld %u", counterValue.longValue, counter.handleNum);
  1176. }
  1177. Status = PdhGetFormattedCounterValue(hcThreadCount, PDH_FMT_LONG, NULL, &counterValue);
  1178. if (Status == ERROR_SUCCESS)
  1179. {
  1180. counter.threadNum = (unsigned short)(counterValue.longValue);
  1181. //Dbg("ThreadsNum:%ld %u", counterValue.longValue, counter.threadNum);
  1182. }
  1183. Status = PdhGetFormattedCounterValue(hcProcessCount, PDH_FMT_LONG, NULL, &counterValue);
  1184. if (Status == ERROR_SUCCESS)
  1185. {
  1186. counter.procNum = (unsigned short)(counterValue.longValue);
  1187. //Dbg("ProcessesNum:%ld %u", counterValue.longValue, counter.procNum);
  1188. }
  1189. Status = PdhGetFormattedCounterValue(hcElapsedTimeCount, PDH_FMT_LARGE, NULL, &counterValue);
  1190. if (Status == ERROR_SUCCESS)
  1191. {
  1192. ULONGLONG ulSinceSeconds = counterValue.largeValue;
  1193. ULONG days = 0, hours = 0, minutes = 0, seconds = 0;
  1194. days = ULONG(ulSinceSeconds / DAY_DIV);
  1195. ulSinceSeconds %= DAY_DIV;
  1196. hours = ULONG(ulSinceSeconds / HOURS_DIV);
  1197. ulSinceSeconds %= HOURS_DIV;
  1198. minutes = ULONG(ulSinceSeconds / MINUS_DIV);
  1199. ulSinceSeconds %= MINUS_DIV;
  1200. seconds = ULONG(ulSinceSeconds);
  1201. //Dbg("SystemElapseTime: %u:%02u:%02u:%02u", days, hours, minutes, seconds);
  1202. FILETIME ftCurTime, ftStartTime;
  1203. GetSystemTimeAsFileTime(&ftCurTime);
  1204. ULARGE_INTEGER uliCurTime;
  1205. uliCurTime.HighPart = ftCurTime.dwHighDateTime;
  1206. uliCurTime.LowPart = ftCurTime.dwLowDateTime;
  1207. uliCurTime.QuadPart -= counterValue.largeValue * 1e7;
  1208. ftStartTime.dwHighDateTime = uliCurTime.HighPart;
  1209. ftStartTime.dwLowDateTime = uliCurTime.LowPart;
  1210. SYSTEMTIME stUTC, stLocal;
  1211. FileTimeToSystemTime(&ftStartTime, &stUTC);
  1212. SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
  1213. sprintf_s(counter.osStartTime, 22, "%d-%02d-%02d %02d:%02d:%02d",
  1214. stLocal.wYear, stLocal.wMonth, stLocal.wDay, stLocal.wHour, stLocal.wMinute, stLocal.wSecond);
  1215. //Dbg("OSStartTime: %s", counter.osStartTime);
  1216. }
  1217. }while(false);
  1218. //Status = PdhRemoveCounter(hcMemoryCount);
  1219. Status = PdhRemoveCounter(hcHandleCount);
  1220. Status = PdhRemoveCounter(hcThreadCount);
  1221. Status = PdhRemoveCounter(hcProcessCount);
  1222. Status = PdhRemoveCounter(hcElapsedTimeCount);
  1223. Cleanup:
  1224. if (Query)
  1225. {
  1226. PdhCloseQuery(Query);
  1227. }
  1228. if(Status != ERROR_SUCCESS)
  1229. {
  1230. switch(Status)
  1231. {
  1232. case PDH_CSTATUS_BAD_COUNTERNAME :
  1233. Dbg("The counter path could not be parsed or interpreted.");
  1234. break;
  1235. case PDH_CSTATUS_NO_COUNTER :
  1236. Dbg("Unable to find the specified counter on the computer or in the log file.");
  1237. break;
  1238. case PDH_CSTATUS_NO_COUNTERNAME :
  1239. Dbg("The counter path is empty.");
  1240. break;
  1241. case PDH_CSTATUS_NO_MACHINE :
  1242. Dbg("The path did not contain a computer name, and function was unable to retrieve local computer name.");
  1243. break;
  1244. case PDH_CSTATUS_NO_OBJECT :
  1245. {
  1246. Dbg("Unable to find the specified object on the computer or in the log file.");
  1247. //CSystemStaticInfo sysInfo;
  1248. //if(GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo) == Error_Succeed)
  1249. //{
  1250. // if(!sysInfo.strMachineType.Compare("RVC.PAD", true))
  1251. // {
  1252. // Dbg("Pad MachineType, abort lodctr operation.");
  1253. // break;
  1254. // }
  1255. //}
  1256. if(!m_nLodCtrFlag || m_nLodCtrFlag == 2)
  1257. {
  1258. LodctrTask* task = new LodctrTask(this);
  1259. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1260. }
  1261. }
  1262. break;
  1263. case PDH_FUNCTION_NOT_FOUND :
  1264. Dbg("Unable to determine the calculation function to use for this counter.");
  1265. break;
  1266. case PDH_INVALID_ARGUMENT :
  1267. Dbg("One or more arguments are not valid.");
  1268. break;
  1269. case PDH_INVALID_HANDLE :
  1270. Dbg("The query handle is not valid.");
  1271. break;
  1272. case PDH_MEMORY_ALLOCATION_FAILURE :
  1273. Dbg("Unable to allocate memory required to complete the function.");
  1274. break;
  1275. default :
  1276. Dbg("Cannot figure the erroCode(0x%08x)(%d) in GetPerformCounter", Status, GetLastError());
  1277. break;
  1278. }
  1279. return Error_Unexpect;
  1280. }
  1281. return Error_Succeed;
  1282. #else
  1283. return Error_Succeed;
  1284. //oiltestlinux
  1285. #endif //RVC_OS_WIN
  1286. }
  1287. int CHeartBeatFSM::SendToHeartBeatService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
  1288. {
  1289. LOG_FUNCTION();
  1290. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1291. {
  1292. m_pHandShakeConn->SendCrossCallToService(req,ans);
  1293. }
  1294. return 0;
  1295. }
  1296. void CHeartBeatFSM::ILCallToRVC(SpOnewayCallContext<HeartBeatService_CallFromILToRVC_Info>::Pointer ctx)
  1297. {
  1298. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1299. {
  1300. CSimpleStringA csTerm("");
  1301. GetEntityBase()->GetFunction()->GetSysVar("AttachedTerminal", csTerm);
  1302. m_pHandShakeConn->SendILCallToService(ctx->Info.req_context,0,true, m_localDeviceNo,csTerm);
  1303. }
  1304. }
  1305. void CHeartBeatFSM::CallResultToIL(SpOnewayCallContext<HeartBeatService_CallResultToIL_Info>::Pointer ctx)
  1306. {
  1307. if (m_pHandShakeConn && m_pHandShakeConn->IsConnectionOK())
  1308. {
  1309. m_pHandShakeConn->SendILCallToService(ctx->Info.ans_context, ctx->Info.error, false, m_localDeviceNo,m_ILDeviceNo);
  1310. }
  1311. }
  1312. void HeartBeatConnection::OnPkgAnswer(const CSmartPointer<IPackage> &pRecvPkg)
  1313. {
  1314. string serviceCode = pRecvPkg->GetServiceCode();
  1315. if (serviceCode.compare("HANDSHK") == 0 || serviceCode.compare("INSTRUC") == 0)
  1316. {
  1317. PkgRcvProcHandAndInstruc(pRecvPkg);
  1318. }
  1319. else if (serviceCode.compare("CARDACT") == 0)
  1320. {
  1321. PkgRcvProcCardActive(pRecvPkg);
  1322. }
  1323. else if (serviceCode.compare("CRSSACT") == 0)
  1324. {
  1325. PkgRcvProcCrossCall(pRecvPkg);
  1326. }
  1327. else
  1328. {
  1329. Dbg("unknown service code!");
  1330. }
  1331. };
  1332. void HeartBeatConnection::SendHandShake()
  1333. {
  1334. HandReq req = {0};
  1335. //oiltest
  1336. //strcpy(req.TerminalNo,"75500000002");
  1337. //Dbg("get sysvar");
  1338. //oiltest set default value
  1339. CSimpleStringA warningLevel("w"),runState("r"),customerHandle("c"),callState("s"),
  1340. localMaintain("l"),remoteMaintain("m"),termStage("U");
  1341. //m_pEntity->GetFunction()->GetSysVar("WarningLevel",warningLevel);
  1342. strncpy(req.TerminalNo,m_TerminalNo.GetData(),m_TerminalNo.GetLength());
  1343. m_pEntity->GetFunction()->GetSysVar("RunState",runState);
  1344. m_pEntity->GetFunction()->GetSysVar("CustomerHandle",customerHandle);
  1345. m_pEntity->GetFunction()->GetSysVar("CallState",callState);
  1346. //m_pEntity->GetFunction()->GetSysVar("LocalMaintain",localMaintain);
  1347. //m_pEntity->GetFunction()->GetSysVar("RemoteMaintain",remoteMaintain);
  1348. m_pEntity->GetFunction()->GetSysVar("TerminalStage",termStage);
  1349. //Dbg("ts[%s]",(LPCTSTR)termStage);
  1350. //oiltest byteorder
  1351. #ifdef RVC_OS_WIN
  1352. char tmp[256];
  1353. gethostname(tmp, sizeof(tmp));
  1354. hostent *ent = gethostbyname(tmp);
  1355. unsigned long ip = 0xffffffff;
  1356. if (ent) {
  1357. for (int i = 0; ent->h_addr_list[i]; ++i) {
  1358. if (ent->h_addrtype == AF_INET) {
  1359. struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1360. if (in->S_un.S_un_b.s_b1 != 0) {
  1361. if (in->S_un.S_un_b.s_b1 == 192)
  1362. continue;
  1363. ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1364. +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1365. break;
  1366. }
  1367. }
  1368. }
  1369. }
  1370. req.ip = ip;
  1371. #else
  1372. //oiltest
  1373. req.ip = 0x0;
  1374. #endif //RVC_OS_WIN
  1375. req.WarningLevel = warningLevel[0];
  1376. req.RunState = runState[0];
  1377. req.CustomerHandle = customerHandle[0];
  1378. req.CallState = callState[0];
  1379. req.LocalMaintain = localMaintain[0];
  1380. req.RemoteMaintain = remoteMaintain[0];
  1381. req.TermStage = termStage[0];
  1382. CSmartPointer<IPackage> pkt = CreateNewPackage("HANDSHK");
  1383. Dbg("sizeof(HandReq):%d",sizeof(HandReq));
  1384. Dbg("sizeof(int):%d", sizeof(int));
  1385. Dbg("sizeof(long):%d", sizeof(long));
  1386. pkt->AddStruct("FNTSTAT", false, false, (LPBYTE)&req, sizeof(HandReq));
  1387. HandErrListReq errListReq;
  1388. errListReq.warnLevel = m_pFSM->GetWarnLevel();
  1389. errListReq.reserved1 = m_pFSM->GetTradeManagerState();
  1390. ZeroMemory(errListReq.errList, 512);
  1391. strncpy(errListReq.errList,m_pFSM->GetEntityErrorList(),m_pFSM->GetEntityErrorList().GetLength());
  1392. pkt->AddStruct("ENTSTAT", false, false, (LPBYTE)&errListReq, sizeof(HandErrListReq));
  1393. // [Josephus in 9:38:25 2016/4/23]
  1394. TermianlCounter counter;
  1395. ErrorCodeEnum erroCode = m_pFSM->GetPerformCounter(counter);
  1396. if(erroCode != Error_Succeed)
  1397. {
  1398. Dbg("Get Terminal Performance Information failed !!!");
  1399. }
  1400. else
  1401. {
  1402. //oilyang@20171122 数量太多,暂时去掉
  1403. //Dbg("Get Terminal Performance Information suc");
  1404. }
  1405. //const char* szIP = m_pFSM->GetRealIP();
  1406. //memset(tmp, 0, sizeof(tmp));
  1407. //strcpy_s(tmp, 256, szIP);
  1408. //Dbg("Calling gethostbyname with %s %s", tmp, szIP);
  1409. //ent = gethostbyname(tmp);
  1410. //ip = 0xffffffff;
  1411. //if (ent == NULL)
  1412. //{
  1413. // DWORD dwError = WSAGetLastError();
  1414. // if (dwError != 0)
  1415. // {
  1416. // if (dwError == WSAHOST_NOT_FOUND)
  1417. // {
  1418. // Dbg("Host not found");
  1419. // } else if (dwError == WSANO_DATA)
  1420. // {
  1421. // Dbg("No data record found");
  1422. // } else
  1423. // {
  1424. // Dbg("Function failed with error: %ld", dwError);
  1425. // }
  1426. // }
  1427. // counter.serverIP = 0xffffffff;
  1428. //}
  1429. //else
  1430. //{
  1431. // //unsigned long ulIP = ((struct in_addr*)ent->h_addr)->S_un.S_addr;
  1432. // for (int i = 0; ent->h_addr_list[i]; ++i)
  1433. // {
  1434. // if (ent->h_addrtype == AF_INET)
  1435. // {
  1436. // struct in_addr *in = (struct in_addr*)ent->h_addr_list[i];
  1437. // if (in->S_un.S_un_b.s_b1 != 0)
  1438. // {
  1439. // if (in->S_un.S_un_b.s_b1 == 192)
  1440. // continue;
  1441. // ip = (in->S_un.S_un_b.s_b1<<24)+(in->S_un.S_un_b.s_b2<<16)
  1442. // +(in->S_un.S_un_b.s_b3<<8)+in->S_un.S_un_b.s_b4;
  1443. // // test for ip with S_addr [Josephus in 11:15:43 2016/4/22]
  1444. // unsigned long ulIP = in->S_un.S_addr;
  1445. // unsigned long ul2IP = inet_addr(tmp);
  1446. // Dbg("joseph-test2: ip=0x%x, ulIp=0x%x, ul2IP=0x%x", ip, ulIP, ul2IP);
  1447. // break;
  1448. // }
  1449. // }
  1450. // }
  1451. //}
  1452. counter.serverIP = m_pFSM->m_dwServIP;
  1453. //Dbg("dwServIP 0x%x", counter.serverIP);
  1454. #ifdef RVC_OS_WIN
  1455. const char* diskPath = m_pFSM->GetRunDiskPath();
  1456. ULARGE_INTEGER uliFreeBytesAvailable;
  1457. if(GetDiskFreeSpaceEx(diskPath, &uliFreeBytesAvailable, NULL, NULL))
  1458. {
  1459. counter.freeDisk = (unsigned int)(uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0);
  1460. //Dbg("FreeDisk:%.2fMB, %u", uliFreeBytesAvailable.QuadPart / 1024.0 / 1024.0, counter.freeDisk);
  1461. }
  1462. else
  1463. {
  1464. Dbg("GetDiskFreeSpaceEx with %s failed failed 0x%x", diskPath, GetLastError());
  1465. }
  1466. #else
  1467. //oiltestlinux
  1468. counter.freeDisk = 0;
  1469. #endif //RVC_OS_WIN
  1470. pkt->AddStruct("CNTSTAT", false, false, (LPBYTE)&counter, sizeof(TermianlCounter));
  1471. SendPackage(pkt);
  1472. //delete pkt;
  1473. }
  1474. 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)
  1475. {
  1476. CSimpleStringA inParm = CSimpleStringA::Format("SendCardActive,type:%d, slot:%d, errCode:%d, fromTerm:%s, termNo:%s, findCard:%d, cardPos:%d, dataSize:%d",
  1477. type, slot, errCode, m_TerminalNo.GetData(), termNo, findCard, cardPos, dataSize);
  1478. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_SendCardActive_InParam, inParm.GetData());
  1479. //发起跨机调用包
  1480. if (type == 0)
  1481. {
  1482. CardActiveReq req = { 0 };
  1483. CSystemStaticInfo sysSInfo;
  1484. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1485. req.type = 0;
  1486. req.slot = slot;
  1487. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1488. strcpy_s(req.Account, accSize, account);
  1489. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1490. strcpy_s(req.Param2, dataSize, data);
  1491. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1492. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1493. SendPackage(pkt);
  1494. }
  1495. //发送跨机调用返回包
  1496. else if (type == 1)
  1497. {
  1498. CardActiveReq req = { 0 };
  1499. CSystemStaticInfo sysSInfo;
  1500. m_pEntity->GetFunction()->GetSystemStaticInfo(sysSInfo);
  1501. req.type = 1;
  1502. req.ErrCode = errCode;
  1503. req.findCard = findCard;
  1504. req.cardPos = cardPos;
  1505. strcpy_s(req.FromTerminalNo, sizeof(req.FromTerminalNo), m_TerminalNo.GetData());
  1506. strcpy_s(req.Account, accSize, account);
  1507. strcpy_s(req.TerminalNo, sizeof(req.TerminalNo), termNo);
  1508. strcpy_s(req.Param2, dataSize, data);
  1509. CSmartPointer<IPackage> pkt = CreateNewPackage("CARDACT");
  1510. pkt->AddStruct("INSREQX", false, false, (LPBYTE)&req, sizeof(CardActiveReq));
  1511. SendPackage(pkt);
  1512. }
  1513. }
  1514. void HeartBeatConnection::SendCrossCallToService(HeartBeatService_CrossTermCall_Req &req, HeartBeatService_CrossTermCall_Ans &ans)
  1515. {
  1516. LOG_FUNCTION();
  1517. Dbg("from term %s to term %s for entity %x,twoway:%d", (const char*)req.fromTerminalNo, (const char*)req.toTerminalNo, req.nEntityID, req.isTwoWay);
  1518. if (req.paramX.m_iLength > 0)
  1519. {
  1520. //char *pBuf = new char[64 * 1024];
  1521. //ZeroMemory(pBuf, 64 * 1024);
  1522. //HexBuf2StrBuf((PBYTE)req.paramX.m_pData, &pBuf, req.paramX.m_iLength);
  1523. //CSimpleStringA xStr(pBuf);
  1524. //int i = 0;
  1525. //for (; i < req.paramX.m_iLength / 900; i++)
  1526. //{
  1527. // Dbg("%s", xStr.SubString(i * 900, 900));
  1528. //}
  1529. //Dbg("%s", xStr.SubString(i * 900, req.paramX.m_iLength - i * 900));
  1530. }
  1531. int count = req.paramX.m_iLength / (50 * 1000);
  1532. int size = sizeof(CrossCallReq)*(count + 1) + req.paramX.m_iLength + count;
  1533. char* pBuf = new char[size];
  1534. ZeroMemory(pBuf, size);
  1535. CrossCallReq* pReqX = (CrossCallReq*)pBuf;
  1536. for (int i = 0; i < count+1; i++)
  1537. {
  1538. pReqX[i].CallType = req.type;
  1539. pReqX[i].bTwoWay = req.isTwoWay;
  1540. pReqX[i].nEntityID = req.nEntityID;
  1541. pReqX[i].ErrorCode = ans.retCode;
  1542. pReqX[i].lensOfBlobInParamX[0] = req.paramX.m_iLength;
  1543. pReqX[i].numOfBlobInParamX = count+1;
  1544. strcpy_s(pReqX[i].FromTerminalNo, sizeof(pReqX[i].FromTerminalNo),req.fromTerminalNo);
  1545. strcpy_s(pReqX[i].ToTerminalNo, sizeof(pReqX[i].ToTerminalNo), req.toTerminalNo);
  1546. strcpy_s(pReqX[i].StrParam1, sizeof(pReqX[i].StrParam1), req.param1);
  1547. strcpy_s(pReqX[i].StrParam2, sizeof(pReqX[i].StrParam2), req.param2);
  1548. if (i == count)
  1549. 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);
  1550. else
  1551. memcpy_s(pReqX[i].StrParamX, 50*1000, (char*)req.paramX.m_pData + 50 * 1000 *i, 50 * 1000);
  1552. }
  1553. //memcpy_s(pReqX->StrParamX,req.paramY.GetLength(),req.paramX, req.paramX.GetLength());
  1554. Dbg("from %s to %s,struct X size:%d, len:%d,struct count:%d", pReqX->FromTerminalNo, pReqX->ToTerminalNo, size, req.paramX.m_iLength,count);
  1555. CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
  1556. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, size,count+1);
  1557. SendPackage(pkt);
  1558. delete [] pBuf;
  1559. }
  1560. void HeartBeatConnection::SendILCallToService(CSimpleStringA csContent, int err, bool bFromIL, CSimpleStringA fromDevNo, CSimpleStringA toDevNo)
  1561. {
  1562. LOG_FUNCTION();
  1563. int count = csContent.GetLength() / (50 * 1000);
  1564. Dbg("count %d,size of content %d",count,csContent.GetLength());
  1565. if (csContent.GetLength() > 32)
  1566. Dbg("the last 32 str %s", (const char*)csContent.SubString(csContent.GetLength()-32,32));
  1567. for (int i = 0; i < count + 1; i++)
  1568. {
  1569. int size;
  1570. if (i == count)
  1571. {
  1572. size = sizeof(CrossCallReq) + csContent.GetLength() - 50*1000*i + 1;
  1573. }
  1574. else
  1575. size = sizeof(CrossCallReq) + 50 * 1000 + 1;
  1576. char* pBuf = new char[size];
  1577. ZeroMemory(pBuf, size);
  1578. Dbg("sz %d", size);
  1579. CrossCallReq* pReqX = (CrossCallReq*)pBuf;
  1580. pReqX->CallType = 999;
  1581. pReqX->bTwoWay = false;
  1582. pReqX->nEntityID = 0x999;
  1583. pReqX->blobSN = i;
  1584. pReqX->lensOfBlobInParamX[0] = csContent.GetLength();//no use 实际用到的时候需要修改这里
  1585. pReqX->numOfBlobInParamX = count + 1;
  1586. if (bFromIL)
  1587. {
  1588. pReqX->ErrorCode = 0;
  1589. }
  1590. else
  1591. {
  1592. pReqX->ErrorCode = err;
  1593. }
  1594. strcpy_s(pReqX->FromTerminalNo,sizeof(pReqX->FromTerminalNo), fromDevNo);
  1595. strcpy_s(pReqX->ToTerminalNo, sizeof(pReqX->ToTerminalNo), toDevNo);
  1596. CSmartPointer<IPackage> pkt = CreateNewPackage("CRSSACT");
  1597. if (i == count)
  1598. {
  1599. memcpy_s(pReqX->StrParamX, csContent.GetLength() - 50 * 1000 * i, (const char*)csContent+50 * 1000 * i, csContent.GetLength() - 50 * 1000 * i);
  1600. Dbg("to add the %d packet from %d",i, csContent.GetLength() - 50 * 1000 * i);
  1601. 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]);
  1602. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
  1603. Dbg("p len:%d", sizeof(CrossCallReq) + csContent.GetLength() - 50 * 1000 * i);
  1604. SendPackage(pkt);
  1605. Dbg("the last of %d",i);
  1606. }
  1607. else
  1608. {
  1609. memcpy_s(pReqX->StrParamX, 50 * 1000, (const char*)csContent + 50 * 1000 * i, 50 * 1000);
  1610. pkt->AddStruct("CRSSREQ", false, false, (LPBYTE)pReqX, sizeof(CrossCallReq)+50*1000);
  1611. 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]);
  1612. SendPackage(pkt);
  1613. Dbg("the %d packet",i);
  1614. }
  1615. delete[] pBuf;
  1616. }
  1617. }
  1618. void HeartBeatConnection::PkgRcvProcHandAndInstruc(const CSmartPointer<IPackage> &pRecvPkg)
  1619. {
  1620. int nLen = pRecvPkg->GetStructLen("FNTHAND");
  1621. if (nLen > 0) {
  1622. Dbg("nLen %d", nLen);
  1623. BYTE *pBuf = new BYTE[nLen+1];
  1624. memset(pBuf, 0, nLen+1);
  1625. int nArrayNum = 0;
  1626. if (pRecvPkg->GetStructData("FNTHAND", pBuf, &nLen, &nArrayNum)) {
  1627. Dbg("%s,%d,%d", pBuf, nLen, nArrayNum);
  1628. HandAns* pAns = (HandAns*)pBuf;
  1629. Dbg("hand recv %d events", nArrayNum);
  1630. for (int i = 0; i < nArrayNum; ++i)
  1631. {
  1632. bool bKnownEvent = true;
  1633. DWORD userEvtCode = 0;
  1634. unsigned long ulTmp = (pAns + i)->EventCode;
  1635. Dbg("event %d,param1 %s", ulTmp, (pAns + i)->param1);
  1636. switch (ulTmp)
  1637. {
  1638. case INC_GLOBAL_SETTING_SYNC:
  1639. userEvtCode = LOG_EVT_INC_GLOBAL_SETTING_SYNC;
  1640. break;
  1641. case INC_COMM_RECONNECT:
  1642. userEvtCode = LOG_EVT_INC_COMM_RECONNECT;
  1643. break;
  1644. case INC_START_REMOTE_CONTROL:
  1645. userEvtCode = LOG_EVT_INC_START_REMOTE_CONTROL;
  1646. break;
  1647. case INC_UPDATE_CHECK:
  1648. userEvtCode = LOG_EVT_INC_UPDATE_CHECK;
  1649. break;
  1650. case INC_RECOVER_SERVICE:
  1651. userEvtCode = LOG_EVT_INC_RECOVER_SERVICE;
  1652. break;
  1653. case INC_PAUSE_SERVICE:
  1654. userEvtCode = LOG_EVT_INC_PAUSE_SERVICE;
  1655. break;
  1656. case INC_AREA_SERVICE_SWITCH:
  1657. userEvtCode = LOG_EVT_INC_AREA_SERVICE_SWITCH;
  1658. break;
  1659. case INC_VERSION_ROLLBACK:
  1660. userEvtCode = LOG_EVT_INC_VERSION_ROLLBACK;
  1661. break;
  1662. case INC_BRIDGE:
  1663. userEvtCode = LOG_EVT_INC_BRIDGE;
  1664. break;
  1665. case INC_VEDIO_CONNECTING:
  1666. userEvtCode = LOG_EVT_INC_VEDIO_CONNECTING;
  1667. break;
  1668. case INC_TRADE_MANAGER_NORMAL:
  1669. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_NORMAL;
  1670. break;
  1671. case INC_TRADE_MANAGER_ON:
  1672. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_ON;
  1673. break;
  1674. case INC_TRADE_MANAGER_OFF:
  1675. userEvtCode = LOG_EVT_INC_TRADE_MANAGER_OFF;
  1676. break;
  1677. case INC_DEVICE_LOCK_ON:
  1678. userEvtCode = LOG_EVT_INC_DEVICE_LOCK_ON;
  1679. break;
  1680. case INC_DEVICE_UNLOCK:
  1681. userEvtCode = LOG_EVT_INC_DEVICE_UNLOCK;
  1682. break;
  1683. case INC_DEVICE_KICK_OFF:
  1684. userEvtCode = LOG_EVT_INC_DEVICE_KICK_OFF;
  1685. break;
  1686. default:
  1687. bKnownEvent = false;
  1688. Dbg("unknown ins %d", ulTmp);
  1689. break;
  1690. }
  1691. if (bKnownEvent)
  1692. {
  1693. LogEvent(Severity_Middle, userEvtCode, (pAns + i)->param1);
  1694. }
  1695. }
  1696. }
  1697. else {
  1698. Dbg("invalid handshakeans packet!");
  1699. //OnDisconnect();
  1700. }
  1701. delete pBuf;
  1702. }
  1703. }
  1704. void CHeartBeatFSM::ProcessCardActive(CardActiveReq* req)
  1705. {
  1706. ProcessPreOnlineTask* ppTask = new ProcessPreOnlineTask(this, req);
  1707. GetEntityBase()->GetFunction()->PostThreadPoolTask(ppTask);
  1708. }
  1709. void CHeartBeatFSM::ProcessPreOnline(CardActiveReq* req)
  1710. {
  1711. if (req->type == 0)
  1712. LocalPreOnline(req->slot, req->TerminalNo, req->FromTerminalNo, req->Account, req->Param2);
  1713. else if (req->type == 1)
  1714. ReceivePreOnlineBack(req->ErrCode, req->Param2, req->findCard, req->cardPos);
  1715. delete req;
  1716. }
  1717. void HeartBeatConnection::PkgRcvProcCardActive(const CSmartPointer<IPackage> &pRecvPkg)
  1718. {
  1719. LOG_FUNCTION();
  1720. int nLen = pRecvPkg->GetStructLen("INSREQX");
  1721. if (nLen > 0) {
  1722. Dbg("nLen %d", nLen);
  1723. BYTE *pBuf = new BYTE[nLen+1];
  1724. memset(pBuf, 0, nLen+1);
  1725. int nArrayNum = 0;
  1726. if (pRecvPkg->GetStructData("INSREQX", pBuf, &nLen, &nArrayNum)) {
  1727. Dbg("%s,%d,%d", pBuf, nLen, nArrayNum);
  1728. CardActiveReq* pAns = (CardActiveReq*)pBuf;
  1729. if (nArrayNum > 0)
  1730. {
  1731. CSimpleStringA inParam = CSimpleStringA::Format("PkgRcvProcCardActive, type %d, from term:%s, term:%s, accLen:%d, param2Len:%d, findCard:%d,cardPos:%d",
  1732. pAns->type, pAns->FromTerminalNo, pAns->TerminalNo, strlen(pAns->Account), strlen(pAns->Param2), pAns->findCard, pAns->cardPos);
  1733. LogWarn(Severity_Low, Error_Unexpect, HeartBeat_UserErrorCode_PkgRcvProcCardActive_InParam, inParam.GetData());
  1734. m_pFSM->ProcessCardActive(pAns);
  1735. }
  1736. }
  1737. else {
  1738. Dbg("invalid insreqx packet!");
  1739. }
  1740. delete pBuf;
  1741. }
  1742. }
  1743. void HeartBeatConnection::PkgRcvProcCrossCall(const CSmartPointer<IPackage> &pRecvPkg)
  1744. {
  1745. LOG_FUNCTION();
  1746. int nLen = pRecvPkg->GetStructLen("CRSSREQ");
  1747. Dbg("nLen: %d", nLen);
  1748. if (nLen > 0) {
  1749. BYTE *pBuf = new BYTE[nLen+1];
  1750. ZeroMemory(pBuf,nLen+1);
  1751. int nArrayNum = 0;
  1752. if (pRecvPkg->GetStructData("CRSSREQ", pBuf, &nLen, &nArrayNum)) {
  1753. Dbg("%d,array num:%d,last 3:%d,%d,%d", nLen, nArrayNum,pBuf[nLen-3], pBuf[nLen - 2], pBuf[nLen - 1]);
  1754. CrossCallReq* pAnsArray = (CrossCallReq*)pBuf;
  1755. Dbg("%x", ((CrossCallReq*)pBuf)->nEntityID);
  1756. Dbg("num %x", ((CrossCallReq*)pBuf)->numOfBlobInParamX);
  1757. int tmpXLen = 0;
  1758. for (int i = 0; i < nArrayNum; ++i)
  1759. {
  1760. tmpXLen += strlen(pAnsArray[i].StrParamX);
  1761. }
  1762. tmpXLen += (sizeof(CrossCallReq)*nArrayNum);
  1763. Dbg("tmpXLen:%d", tmpXLen);
  1764. BYTE *pAnsBuf = new BYTE[tmpXLen + 1];
  1765. ZeroMemory(pAnsBuf, tmpXLen + 1);
  1766. memcpy_s(pAnsBuf, tmpXLen+1, pBuf, tmpXLen);
  1767. CrossCallReq* pAns = (CrossCallReq*)pAnsBuf;
  1768. pAns->Appendix1 = pAnsArray->Appendix1;
  1769. pAns->Appendix2 = pAnsArray->Appendix2;
  1770. pAns->bTwoWay = pAnsArray->bTwoWay;
  1771. pAns->CallType = pAnsArray->CallType;
  1772. pAns->ErrorCode = pAnsArray->ErrorCode;
  1773. pAns->nEntityID = pAnsArray->nEntityID;
  1774. pAns->numOfBlobInParamX = pAnsArray->numOfBlobInParamX;
  1775. for (int i = 0; i < sizeof(pAns->lensOfBlobInParamX); i++)
  1776. pAns->lensOfBlobInParamX[i] = pAnsArray->lensOfBlobInParamX[i];
  1777. strcpy_s(pAns->FromTerminalNo, sizeof(pAns->FromTerminalNo), pAnsArray->FromTerminalNo);
  1778. strcpy_s(pAns->StrParam1, sizeof(pAns->StrParam1), pAnsArray->StrParam1);
  1779. strcpy_s(pAns->StrParam2, sizeof(pAns->StrParam2), pAnsArray->StrParam2);
  1780. strcpy_s(pAns->ToTerminalNo, sizeof(pAns->ToTerminalNo), pAnsArray->ToTerminalNo);
  1781. Dbg("%x",pAns->nEntityID);
  1782. for (int i = 0, start = 0; i < nArrayNum; ++i)
  1783. {
  1784. strcpy_s(pAns->StrParamX + start, tmpXLen - start, pAnsArray[i].StrParamX);
  1785. start += strlen(pAnsArray[i].StrParamX);
  1786. }
  1787. Dbg("type:%x,from %s,to %s", pAns->CallType, pAns->FromTerminalNo, pAns->ToTerminalNo);
  1788. Dbg("nEntityID: %x", pAns->nEntityID);
  1789. Dbg("appendix1: %d", pAns->Appendix1);
  1790. Dbg("bTwoWay:[%d]", pAns->bTwoWay);
  1791. Dbg("blobSN:[%d]", pAns->blobSN);
  1792. Dbg("param2:[%s]", pAns->StrParam2);
  1793. Dbg("param3:[%d]", pAns->Appendix2);//oiltest
  1794. Dbg("ErrorCode:[%x]", pAns->ErrorCode);//oiltest
  1795. //Dbg("paramX:[%s]", pAns->StrParamX);
  1796. //if (pAns->Appendix2 > 0)
  1797. //{
  1798. // char *pBuf = new char[64 * 1024];
  1799. // ZeroMemory(pBuf, 64 * 1024);
  1800. // HexBuf2StrBuf((PBYTE)pAns->StrParamX, &pBuf, pAns->Appendix2);
  1801. // CSimpleStringA xStr(pBuf);
  1802. // int i = 0;
  1803. // for (; i < pAns->Appendix2 / 900; i++)
  1804. // {
  1805. // Dbg("%s", xStr.SubString(i * 900, 900));
  1806. // }
  1807. // Dbg("%s", xStr.SubString(i * 900, pAns->Appendix2 - i * 900));
  1808. //}
  1809. m_pFSM->DoLocalProcessCrossCallTask(pAns, nLen);
  1810. }
  1811. else {
  1812. Dbg("invalid CRSSREQ packet!");
  1813. }
  1814. delete pBuf;
  1815. }
  1816. }