HeartBeatFSM.cpp 58 KB

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