HealthManagerFSM.cpp 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124
  1. #include "stdafx.h"
  2. #include <fstream>
  3. #include <string>
  4. #include <algorithm>
  5. #ifdef RVC_OS_WIN
  6. #include <io.h>
  7. #include "publicFunExport.h"
  8. #pragma comment(lib, "libpublicFun.lib")
  9. #else
  10. #include <unistd.h>
  11. #include <fcntl.h>
  12. #include <errno.h>
  13. #endif
  14. #include "mod_healthmanager.h"
  15. using namespace std;
  16. const int MAX_AYSNC_TIMEOUT = 60000;
  17. const int MAX_IGNORE_TIMEOUT = 100;
  18. unsigned long long GetTickCountRVC() {
  19. #ifdef RVC_OS_WIN
  20. return GetTickCount64();
  21. #else
  22. struct timespec ts;
  23. clock_gettime(CLOCK_MONOTONIC, &ts);
  24. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  25. #endif //RVC_OS_WIN
  26. }
  27. unsigned long long GetLastErrorRVC() {
  28. #ifdef RVC_OS_WIN
  29. return GetLastError();
  30. #else
  31. return errno;
  32. #endif //RVC_OS_WIN
  33. }
  34. enum EntityOP
  35. {
  36. OP_STOP_ENTITY,
  37. OP_START_ENTITY,
  38. OP_PAUSE_ENTITY,
  39. OP_TERMINATE_ENTITY,
  40. OP_CONTINUE_ENTITY,
  41. };
  42. bool StrEqualNoCase(const char *s1, const char *s2,int len)
  43. {
  44. if (strlen(s1) != strlen(s2))
  45. return false;
  46. for (int i = 0; i < len; ++i)
  47. {
  48. if (toupper(s1[i]) != toupper(s2[i]))
  49. return false;
  50. }
  51. return true;
  52. }
  53. ErrorCodeEnum CHealthManagerFSM::OnInit(void)
  54. {
  55. m_hMD5OKEvt = CreateEventA(NULL, FALSE, FALSE, NULL);
  56. if (m_hMD5OKEvt == NULL)
  57. {
  58. Dbg("CreateEvent failed(%d).", GetLastErrorRVC());
  59. }
  60. return Initial();
  61. }
  62. ErrorCodeEnum CHealthManagerFSM::OnExit(void)
  63. {
  64. return Error_Succeed;
  65. }
  66. void CHealthManagerFSM::s0_on_entry(void)
  67. {
  68. LOG_FUNCTION();
  69. m_fsmState = HM_FSM_INIT;
  70. }
  71. void CHealthManagerFSM::s0_on_exit(void)
  72. {
  73. }
  74. unsigned int CHealthManagerFSM::s0_on_event(FSMEvent* pEvt)
  75. {
  76. LOG_FUNCTION();
  77. int ret = 0;
  78. switch(pEvt->iEvt)
  79. {
  80. case USER_EVT_WAIT_DEAMON_FINISHED:
  81. ret = pEvt->param1;
  82. pEvt->SetHandled();
  83. break;
  84. default:
  85. break;
  86. }
  87. return ret;
  88. }
  89. //CoreBoot
  90. void CHealthManagerFSM::s1_on_entry()
  91. {
  92. m_fsmState = HM_FSM_STATE_COREBOOT;
  93. //oilyang@20190924
  94. //修改为判断冷热启动,热重启不再等待10s
  95. //系统启动小于3分钟,认为是冷启动
  96. ULONGLONG dwElapse = GetTickCountRVC();
  97. Dbg("have elapsed %d seconds from system start",dwElapse/1000);
  98. if (dwElapse < 1000*60*3)
  99. Sleep(10000);
  100. ErrorCodeEnum eErrCode;
  101. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","B");
  102. if (eErrCode != Error_Succeed)
  103. {
  104. Dbg("set RunState B failed (%d).",eErrCode);
  105. }
  106. //CoreBootTask* pTask = new CoreBootTask(this);
  107. //GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  108. LOG_FUNCTION();
  109. bool bWatchDog = false,bAsync = false;
  110. m_eStage = LOADSTAGE_COREBOOT;
  111. int ret = 0;
  112. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  113. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  114. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  115. //start entity
  116. vector<CSimpleStringA>::iterator vIt;
  117. if (m_coreBootOpt.size() == 0)
  118. goto COREBOOT_FINISH;
  119. char startMsg[128];
  120. for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++ vIt)
  121. //for (it = m_coreBootOpt.begin();it != m_coreBootOpt.end(); ++it)
  122. {
  123. CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
  124. it = m_coreBootOpt.find(*vIt);
  125. if (it == m_coreBootOpt.end())
  126. {
  127. Dbg("cannot find %s",(LPCSTR)*vIt);
  128. continue;
  129. }
  130. Dbg("start,%s,%d",(LPCSTR)it->first,it->second.loadOpt);
  131. CEntityRunInfo entRunInfo;
  132. ErrorCodeEnum errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  133. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  134. {
  135. it->second.eResult = LOADING_SUCCEED;
  136. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  137. if (ret == 0 || ret == 2)
  138. goto COREBOOT_FINISH;
  139. else
  140. continue;
  141. }
  142. ZeroMemory(startMsg, 128);
  143. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  144. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  145. switch(it->second.loadOpt)
  146. {
  147. case LOADOPT_IGNORE:
  148. {
  149. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  150. if (spWait != NULL)
  151. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
  152. it->second.eResult = LOADING_SUCCEED;
  153. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  154. if (ret == 0 || ret == 2)
  155. goto COREBOOT_FINISH;
  156. }
  157. break;
  158. case LOADOPT_ASYNC_VERIFY:
  159. errCode = AsyncStartEntity(it->first,NULL,NULL);
  160. Dbg("%d",errCode);
  161. bAsync = true;
  162. break;
  163. case LOADOPT_SYNC_VERIFY:
  164. {
  165. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  166. if (spWait != NULL)
  167. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  168. Dbg("(coreboot)sync...%d",errCode);
  169. if (errCode == Error_Succeed)
  170. it->second.eResult = LOADING_SUCCEED;
  171. else if (errCode == Error_TimeOut)
  172. it->second.eResult = LOADING_TIMEOUT;
  173. else
  174. it->second.eResult = LOADING_FAILED;
  175. if (_strnicmp(it->first,"WatchDog",strlen("WatchDog")) == 0
  176. && it->second.eResult == LOADING_SUCCEED)
  177. bWatchDog = true;
  178. if (errCode != Error_Succeed)
  179. return;
  180. else
  181. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  182. Dbg("s1 check ret %d",ret);
  183. if (ret == 0 || ret == 2)
  184. goto COREBOOT_FINISH;
  185. }
  186. break;
  187. default:
  188. break;
  189. }
  190. }
  191. COREBOOT_FINISH:
  192. //start watchdog if have load it sucessfully
  193. if (bWatchDog)
  194. {
  195. }
  196. if (!bAsync)
  197. {
  198. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  199. e->param1 = ret;
  200. PostEventFIFO(e);
  201. }
  202. else
  203. {
  204. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  205. if (ret == 0 || ret == 2)
  206. {
  207. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  208. e->param1 = ret;
  209. PostEventFIFO(e);
  210. }
  211. }
  212. return;
  213. }
  214. void CHealthManagerFSM::s1_on_exit()
  215. {
  216. LOG_FUNCTION();
  217. }
  218. unsigned int CHealthManagerFSM::s1_on_event(FSMEvent* pEvt)
  219. {
  220. LOG_FUNCTION();
  221. Dbg("s1 evt %d",pEvt->iEvt);
  222. switch(pEvt->iEvt)
  223. {
  224. case USER_EVT_COREBOOT_FINISHED:
  225. pEvt->SetHandled();
  226. return pEvt->param1;
  227. break;
  228. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  229. pEvt->SetHandled();
  230. break;
  231. default:
  232. break;
  233. }
  234. return 0;
  235. }
  236. //SafeLoad
  237. void CHealthManagerFSM::s2_on_entry()
  238. {
  239. m_fsmState = HM_FSM_STATE_SAFELOAD;
  240. Sleep(1000);
  241. USBControl();//open usb port oilyang 20150526
  242. ErrorCodeEnum eErrCode;
  243. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","S");
  244. if (eErrCode != Error_Succeed)
  245. {
  246. Dbg("set RunState S failed (%d).",eErrCode);
  247. }
  248. // SafeLoadTask *pTask = new SafeLoadTask(this);
  249. // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  250. LOG_FUNCTION();
  251. //MessageBoxA(0,0,0,0);
  252. bool bAsync = false;
  253. m_eStage = LOADSTAGE_SAFELOAD;
  254. int ret = 0;
  255. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  256. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  257. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  258. ErrorCodeEnum errCode;
  259. vector<CSimpleStringA>::iterator vIt;
  260. if (m_safeLoadOpt.size() == 0)
  261. goto SAFELOAD_FINISH;
  262. char startMsg[128];
  263. for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
  264. //for (it = m_safeLoadOpt.begin();it != m_safeLoadOpt.end(); ++it)
  265. {
  266. CSmartPointer<IAsynWaitSp> spWait;
  267. it = m_safeLoadOpt.find(*vIt);
  268. //Dbg("s %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  269. if (it == m_safeLoadOpt.end())
  270. {
  271. Dbg("cannot find %s",(LPCSTR)*vIt);
  272. continue;
  273. }
  274. CEntityRunInfo entRunInfo;
  275. errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  276. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  277. {
  278. it->second.eResult = LOADING_SUCCEED;
  279. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  280. if (ret == 0 || ret == 2)
  281. goto SAFELOAD_FINISH;
  282. else
  283. continue;
  284. }
  285. Dbg("start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  286. ZeroMemory(startMsg, 128);
  287. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  288. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  289. switch(it->second.loadOpt)
  290. {
  291. case LOADOPT_IGNORE:
  292. {
  293. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  294. if (spWait != NULL)
  295. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  296. it->second.eResult = LOADING_SUCCEED;
  297. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  298. if (ret == 0 || ret == 2)
  299. goto SAFELOAD_FINISH;
  300. }
  301. break;
  302. case LOADOPT_ASYNC_VERIFY:
  303. AsyncStartEntity(it->first,NULL,NULL);
  304. bAsync = true;
  305. break;
  306. case LOADOPT_SYNC_VERIFY:
  307. {
  308. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  309. if (spWait != NULL)
  310. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  311. Dbg("sync...%d",eErrCode);
  312. if (errCode == Error_Succeed) {
  313. it->second.eResult = LOADING_SUCCEED;
  314. if (StrEqualNoCase("MaintainWatcher",it->first,strlen("MaintainWatcher")))
  315. {
  316. Sleep(10000);
  317. if (m_custMngerState == CM_ENTER)
  318. {
  319. Dbg("enter CMS...");
  320. FSMEvent *pEvt = new FSMEvent(USER_EVT_ENTER_CUSTOMER_MANAGER);
  321. PostEventFIFO(pEvt);
  322. goto SAFELOAD_END;
  323. }
  324. }
  325. }
  326. else if (errCode == Error_TimeOut)
  327. it->second.eResult = LOADING_TIMEOUT;
  328. else
  329. it->second.eResult = LOADING_FAILED;
  330. if (it->second.eResult != Error_Succeed)
  331. {
  332. char tmp[64] = {0};
  333. sprintf(tmp,"实体 %s 启动失败",it->first.GetData());
  334. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  335. Dbg("%s",tmp);
  336. }
  337. if (errCode != Error_Succeed)
  338. return;
  339. else
  340. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  341. if (ret == 0 || ret == 2)
  342. goto SAFELOAD_FINISH;
  343. }
  344. break;
  345. default:
  346. break;
  347. }
  348. }
  349. SAFELOAD_FINISH:
  350. if (!bAsync)
  351. {
  352. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  353. e->param1 = ret;
  354. PostEventFIFO(e);
  355. }
  356. else
  357. {
  358. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  359. Dbg("s2 %d",ret);
  360. if (ret == 0 || ret == 2)
  361. {
  362. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  363. e->param1 = ret;
  364. PostEventFIFO(e);
  365. }
  366. }
  367. SAFELOAD_END:
  368. return ;
  369. }
  370. void CHealthManagerFSM::s2_on_exit()
  371. {
  372. LOG_FUNCTION();
  373. }
  374. unsigned int CHealthManagerFSM::s2_on_event(FSMEvent* pEvt)
  375. {
  376. LOG_FUNCTION();
  377. int ret = 0;
  378. Dbg("s2 event %d,%d",pEvt->iEvt,pEvt->param1);
  379. switch(pEvt->iEvt)
  380. {
  381. case USER_EVT_SAFELOAD_FINISHED:
  382. {
  383. pEvt->SetHandled();
  384. ToCheckUPS();
  385. //oiltmp
  386. //according to the system varible TerminalState to do sth.
  387. //Configed
  388. //Breakdown
  389. //Blocking
  390. //Authentication
  391. {
  392. if(pEvt->param1 == 0)
  393. {
  394. //initializer if configured
  395. CSimpleStringA csTermStage("");
  396. ErrorCodeEnum eErrCode;
  397. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  398. Dbg("after safeload to get termstage %s",(LPCTSTR)csTermStage);
  399. //comment this by oilyang 20141018
  400. //if (csTermStage == "B" || csTermStage == "D" || csTermStage == "N")
  401. if (csTermStage == "B" || csTermStage == "N")
  402. return 1;
  403. }
  404. else if (pEvt->param1 == 2)
  405. {
  406. ret = 2;
  407. }
  408. }
  409. //Unsubscrible
  410. }
  411. break;
  412. case USER_EVT_SAFELOAD_EXMINE_FINISHED:
  413. if (pEvt->param1 == 0)
  414. ret = 0;
  415. //do something else oiltmp
  416. pEvt->SetHandled();
  417. break;
  418. case USER_EVT_ACCESSAUTH_FINISHED:
  419. pEvt->SetHandled();
  420. ret = pEvt->param1;
  421. break;
  422. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  423. pEvt->SetHandled();
  424. break;
  425. default:
  426. break;
  427. }
  428. return ret;
  429. }
  430. //Operating
  431. void CHealthManagerFSM::s3_on_entry()
  432. {
  433. m_fsmState = HM_FSM_STATE_OP;
  434. Sleep(5000);//oilyang for nantian pinpad 20150703
  435. if (m_custMngerState == CM_ENTER)
  436. {
  437. Dbg("in CMS,no need to start hardware.");
  438. return;
  439. }
  440. ErrorCodeEnum eErrCode;
  441. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  442. if (eErrCode != Error_Succeed)
  443. {
  444. Dbg("set RunState O failed (%d).",eErrCode);
  445. }
  446. // OpLoadTask *pTask = new OpLoadTask(this);
  447. // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  448. LOG_FUNCTION();
  449. bool bAsync = false;
  450. m_eStage = LOADSTAGE_OPERATING;
  451. int ret = 0;
  452. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  453. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  454. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  455. //start entity
  456. ErrorCodeEnum errCode;
  457. vector<CSimpleStringA>::iterator vIt;
  458. if (m_operatingOpt.size() == 0)
  459. goto OPERATING_FINISH;
  460. char startMsg[128];
  461. for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
  462. //for (it = m_operatingOpt.begin();it != m_operatingOpt.end(); ++it)
  463. {
  464. CSmartPointer<IAsynWaitSp> spWait;
  465. it = m_operatingOpt.find(*vIt);
  466. if (it == m_operatingOpt.end())
  467. {
  468. Dbg("cannot find %s",(LPCSTR)*vIt);
  469. continue;
  470. }
  471. CEntityRunInfo entRunInfo;
  472. errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
  473. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  474. {
  475. it->second.eResult = LOADING_SUCCEED;
  476. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  477. if (ret == 0 || ret == 2)
  478. goto OPERATING_FINISH;
  479. else
  480. continue;
  481. }
  482. Dbg("op start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
  483. ZeroMemory(startMsg, 128);
  484. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  485. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  486. switch(it->second.loadOpt)
  487. {
  488. case LOADOPT_IGNORE:
  489. {
  490. pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  491. if (spWait != NULL)
  492. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  493. it->second.eResult = LOADING_SUCCEED;
  494. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  495. if (ret == 0 || ret == 2)
  496. goto OPERATING_FINISH;
  497. }
  498. break;
  499. case LOADOPT_ASYNC_VERIFY:
  500. errCode = AsyncStartEntity(it->first,NULL,NULL);
  501. bAsync = true;
  502. break;
  503. case LOADOPT_SYNC_VERIFY:
  504. {
  505. errCode = pFuncPrivilege->StartEntity(it->first,NULL,spWait);
  506. if (errCode == Error_Succeed)
  507. {
  508. if (spWait != NULL)
  509. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  510. }
  511. else
  512. {
  513. Dbg("StartEntity %s failed(%d).",(LPCSTR)it->first,errCode);
  514. break;
  515. }
  516. if (errCode == Error_Succeed)
  517. it->second.eResult = LOADING_SUCCEED;
  518. else if (errCode == Error_TimeOut)
  519. it->second.eResult = LOADING_TIMEOUT;
  520. else
  521. it->second.eResult = LOADING_FAILED;
  522. if (it->second.eResult != Error_Succeed)
  523. {
  524. char tmp[64] = {0};
  525. sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
  526. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  527. Dbg("%s", tmp);
  528. }
  529. if (errCode != Error_Succeed)
  530. return;
  531. else
  532. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  533. if (ret == 0 || ret == 2)
  534. goto OPERATING_FINISH;
  535. }
  536. break;
  537. default:
  538. break;
  539. }
  540. }
  541. OPERATING_FINISH:
  542. Dbg("s3 ret %d",ret);
  543. if (!bAsync)
  544. {
  545. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  546. e->param1 = ret;
  547. PostEventFIFO(e);
  548. }
  549. else
  550. {
  551. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  552. if (ret == 0 || ret == 2)
  553. {
  554. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  555. e->param1 = ret;
  556. PostEventFIFO(e);
  557. }
  558. }
  559. return ;
  560. }
  561. void CHealthManagerFSM::s3_on_exit()
  562. {
  563. LOG_FUNCTION();
  564. }
  565. unsigned int CHealthManagerFSM::s3_on_event(FSMEvent* pEvt)
  566. {
  567. LOG_FUNCTION();
  568. Dbg("s3(Operating) event %d,%d",pEvt->iEvt,pEvt->param1);
  569. int ret = 0;
  570. switch(pEvt->iEvt)
  571. {
  572. case USER_EVT_OPERATING_FINISHED:
  573. ret = pEvt->param1;
  574. pEvt->SetHandled();
  575. break;
  576. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  577. pEvt->SetHandled();
  578. break;
  579. default:
  580. break;
  581. }
  582. return ret;
  583. }
  584. //Idle(Operating finished)
  585. void CHealthManagerFSM::s4_on_entry()
  586. {
  587. m_fsmState = HM_FSM_STATE_IDLE;
  588. LOG_FUNCTION();
  589. //oiltmp need to summary info
  590. char buf[256];
  591. memset(buf,0, sizeof(buf));
  592. sprintf(buf, "ver:%s||", m_sysInfo.InstallVersion.ToString().GetData());
  593. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, buf);
  594. m_accessAuthCheckMD5 = 0;
  595. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  596. CSmartPointer<IConfigInfo> spConfig, spCerConfig;
  597. ErrorCodeEnum eErrCer = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  598. if (eErrCer != Error_Succeed) {
  599. Dbg("open central cfg file failed!");
  600. }
  601. else
  602. spCerConfig->ReadConfigValueInt("AccessAuthorization", "CheckMD5", m_accessAuthCheckMD5);
  603. Dbg("before access auth,read MD5 flag:%d",m_accessAuthCheckMD5);
  604. if (!m_bIdleToMaintain)
  605. {
  606. AccessAuthTask *pTask = new AccessAuthTask(this);
  607. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  608. }
  609. else
  610. m_bIdleToMaintain = false;
  611. }
  612. void CHealthManagerFSM::s4_on_exit()
  613. {
  614. LOG_FUNCTION();
  615. }
  616. unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
  617. {
  618. LOG_FUNCTION();
  619. Dbg("s4 event %d,%d",pEvt->iEvt,pEvt->param1);
  620. switch(pEvt->iEvt)
  621. {
  622. case USER_EVT_ACCESSAUTH_FINISHED:
  623. {
  624. pEvt->SetHandled();
  625. if (pEvt->param1 == 1)
  626. {
  627. //why to do this???
  628. //LogEvent(Severity_Middle,EVENT_CONSOLE_REQ_RESTART_SHELL,"AccessAuth failed,to restart spshell.");
  629. return 1;
  630. }
  631. ToLogWarnTermAboutInfo();
  632. CSimpleStringA csTermStage;
  633. ErrorCodeEnum eErrCode;
  634. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  635. Dbg("after accessauth to get termstage %s",(LPCTSTR)csTermStage);
  636. //oilyang@20170316@comment
  637. //for user desktop,start iebrowser no matter what TerminalStage is.
  638. //if (csTermStage[0] != 'A')
  639. // break;
  640. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  641. if (eErrCode != Error_Succeed)
  642. {
  643. Dbg("set RunState O failed (%d).",eErrCode);
  644. }
  645. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  646. CSmartPointer<IConfigInfo> spConfigRun,spCerConfig;
  647. ErrorCodeEnum eErrIE = spEntityFunction->OpenConfig(Config_Run, spConfigRun);
  648. if (eErrIE != Error_Succeed) {
  649. Dbg("open cfg file(ie) failed!");
  650. //return err;
  651. }
  652. ErrorCodeEnum eErrCerUrl = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  653. if (eErrCerUrl != Error_Succeed) {
  654. Dbg("open central cfg file(ie) failed!");
  655. }
  656. //if load successfully,set FailTimes to 0
  657. spConfigRun->WriteConfigValueInt("Run","FailTimes",0);
  658. if (m_bAccessAuth)
  659. {
  660. m_checkCode = QueryCheckCode();
  661. if (m_checkCode.GetLength() > 1)
  662. m_bEverAuthSucWithDevice = true;
  663. else
  664. m_bEverAuthSucWithDevice = false;
  665. }
  666. else
  667. {
  668. AuthStatus as;
  669. if (m_bEverAuthSucWithDevice)
  670. {
  671. as.result = 1;
  672. as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
  673. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  674. }
  675. else
  676. {
  677. as.result = 11;
  678. as.msg = "请检查设备是否正常初始化或是否对应绑定设备";
  679. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  680. }
  681. }
  682. m_strURLValue = "";
  683. eErrCerUrl = spCerConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), m_strURL, m_strURLValue);
  684. if (eErrIE == Error_Succeed)
  685. {
  686. Dbg("write ie url.sys [%s]", (const char*)m_strURLValue);
  687. GetEntityBase()->GetFunction()->SetSysVar("IEUrl", m_strURLValue);
  688. }
  689. CSmartPointer<IAsynWaitSp> spWait;
  690. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  691. CEntityRunInfo acInfo;
  692. eErrCode = spEntityFunction->GetEntityRunInfo("IEBrowser",acInfo);
  693. if (eErrCode == Error_Succeed && acInfo.eState == EntityState_NoStart)
  694. {
  695. GetEntityBase()->GetFunction()->ShowStartupInfo("正在启动实体IEBrowser...");
  696. eErrIE = pFuncPrivilege->StartEntity("IEBrowser", m_strURLValue, spWait);
  697. if (eErrIE == Error_Succeed)
  698. {
  699. if (spWait != NULL)
  700. eErrIE = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  701. }
  702. else
  703. {
  704. Dbg("Start IEBrowser failed(%d).",eErrIE);
  705. }
  706. }
  707. else if (eErrCode == Error_Succeed && acInfo.eState == EntityState_Idle)
  708. {//if IEBrowser start before healthmanager,we suppose healthmanager is restart unexpectly,then set m_bEnterMainPageEver true
  709. m_bIEBeforeHealth = true;
  710. }
  711. if (!m_bAccessAuth)
  712. PostProcessAfterUpgrade();
  713. }
  714. break;
  715. case USER_EVT_MAITAIN:
  716. Dbg("to maintain...");
  717. m_stateBeforeMaintain = m_fsmState;
  718. m_bIdleToMaintain = true;
  719. pEvt->SetHandled();
  720. break;
  721. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  722. pEvt->SetHandled();
  723. break;
  724. default:
  725. break;
  726. }
  727. return 0;
  728. }
  729. //Fault
  730. void CHealthManagerFSM::s5_on_entry()
  731. {
  732. LOG_FUNCTION();
  733. ToLogWarnTermAboutInfo();
  734. m_fsmState = HM_FSM_STATE_FAULT;
  735. CSmartPointer<IConfigInfo> spConfig,spConfigRun;
  736. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  737. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  738. int failTimes = 0,maxFailTimes = 3;
  739. spConfig->ReadConfigValueInt("Run","MaxFailTimes",maxFailTimes);
  740. spConfigRun->ReadConfigValueInt("Run","FailTimes",failTimes);
  741. failTimes++;
  742. if (failTimes > maxFailTimes)
  743. {
  744. LogEvent(Severity_Middle,LOG_EVT_HEADLIGHT_RED_ON,"设备故障");
  745. LogWarn(Severity_High,Error_Unexpect,LOG_ERR_HEALTH_FAILED,"HealthManager failed.");
  746. eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","D");
  747. if (eErr != Error_Succeed)
  748. Dbg("set termstage D failed (%d).",eErr);
  749. else
  750. Dbg("Set TerminalStage D.");
  751. }
  752. else
  753. {
  754. Dbg("have failed %d times.",failTimes);
  755. spConfigRun->WriteConfigValueInt("Run","FailTimes",failTimes);
  756. eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","F");
  757. if (eErr != Error_Succeed)
  758. {
  759. Dbg("set RunState failed (%d).",eErr);
  760. }
  761. }
  762. PostProcessAfterUpgrade();
  763. }
  764. void CHealthManagerFSM::s5_on_exit()
  765. {
  766. LOG_FUNCTION();
  767. }
  768. unsigned int CHealthManagerFSM::s5_on_event(FSMEvent* pEvt)
  769. {
  770. LOG_FUNCTION();
  771. Dbg("s5(Fault) event %d,%d",pEvt->iEvt,pEvt->param1);
  772. switch(pEvt->iEvt)
  773. {
  774. case USER_EVT_MAITAIN:
  775. Dbg("to maintain...");
  776. m_stateBeforeMaintain = m_fsmState;
  777. pEvt->SetHandled();
  778. break;
  779. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  780. pEvt->SetHandled();
  781. break;
  782. default:
  783. break;
  784. }
  785. return 0;
  786. }
  787. //Maintaining
  788. void CHealthManagerFSM::s6_on_entry()
  789. {
  790. LOG_FUNCTION();
  791. m_preFsmState = m_fsmState;
  792. m_fsmState = HM_FSM_STATE_MAINTAINING;
  793. ErrorCodeEnum eErrCode;
  794. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","M");
  795. if (eErrCode != Error_Succeed)
  796. {
  797. Dbg("set RunState M failed (%d).",eErrCode);
  798. }
  799. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  800. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  801. if (pFuncPrivilege == NULL)
  802. {
  803. Dbg("display screen NoPrivilege");
  804. return;
  805. }
  806. ErrorCodeEnum eErr = pFuncPrivilege->DisplayBlueScreen("暂停服务");
  807. Dbg("display blue screen %d",eErr);
  808. }
  809. void CHealthManagerFSM::s6_on_exit()
  810. {
  811. LOG_FUNCTION();
  812. }
  813. unsigned int CHealthManagerFSM::s6_on_event(FSMEvent* pEvt)
  814. {
  815. LOG_FUNCTION();
  816. int ret = 0;
  817. switch(pEvt->iEvt)
  818. {
  819. case USER_EVT_MAITAIN_FINISHED:
  820. pEvt->SetHandled();
  821. {
  822. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  823. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  824. if (pFuncPrivilege == NULL)
  825. {
  826. Dbg("un-display screen NoPrivilege");
  827. return 1;
  828. }
  829. ErrorCodeEnum eErr = pFuncPrivilege->UndisplayBlueScreen();
  830. Dbg("un-display blue screen %d",eErr);
  831. if (m_stateBeforeMaintain == HM_FSM_STATE_IDLE)
  832. {
  833. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  834. if (eErr != Error_Succeed)
  835. {
  836. Dbg("set RunState O failed (%d).",eErr);
  837. }
  838. }
  839. ret = m_preFsmState;
  840. }
  841. break;
  842. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  843. pEvt->SetHandled();
  844. break;
  845. default:
  846. break;
  847. }
  848. return ret;
  849. }
  850. //PrepareOff
  851. void CHealthManagerFSM::s7_on_entry()
  852. {
  853. LOG_FUNCTION();
  854. m_fsmState = HM_FSM_STATE_PREPAREOFF;
  855. ErrorCodeEnum eErrCode;
  856. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","P");
  857. if (eErrCode != Error_Succeed)
  858. {
  859. Dbg("set RunState P failed (%d).",eErrCode);
  860. }
  861. }
  862. void CHealthManagerFSM::s7_on_exit()
  863. {
  864. LOG_FUNCTION();
  865. }
  866. unsigned int CHealthManagerFSM::s7_on_event(FSMEvent* pEvt)
  867. {
  868. LOG_FUNCTION();
  869. Dbg("s7(PrepareOff) event %d",pEvt->iEvt);
  870. switch(pEvt->iEvt)
  871. {
  872. case USER_EVT_MAITAIN:
  873. Dbg("to maintain...");
  874. m_stateBeforeMaintain = m_fsmState;
  875. pEvt->SetHandled();
  876. break;
  877. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  878. pEvt->SetHandled();
  879. break;
  880. default:
  881. break;
  882. }
  883. return 0;
  884. }
  885. //Terminating
  886. void CHealthManagerFSM::s8_on_entry()
  887. {
  888. LOG_FUNCTION();
  889. m_fsmState = HM_FSM_STATE_TERMINATING;
  890. ErrorCodeEnum eErrCode;
  891. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","T");
  892. if (eErrCode != Error_Succeed)
  893. {
  894. Dbg("set RunState T failed (%d).",eErrCode);
  895. }
  896. }
  897. void CHealthManagerFSM::s8_on_exit()
  898. {
  899. LOG_FUNCTION();
  900. }
  901. unsigned int CHealthManagerFSM::s8_on_event(FSMEvent* pEvt)
  902. {
  903. LOG_FUNCTION();
  904. Dbg("s8(Terminating) event %d",pEvt->iEvt);
  905. switch(pEvt->iEvt)
  906. {
  907. case USER_EVT_MAITAIN:
  908. Dbg("to maintain...");
  909. m_stateBeforeMaintain = m_fsmState;
  910. pEvt->SetHandled();
  911. break;
  912. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  913. pEvt->SetHandled();
  914. break;
  915. default:
  916. break;
  917. }
  918. return 0;
  919. }
  920. //Exitting
  921. void CHealthManagerFSM::s9_on_entry()
  922. {
  923. LOG_FUNCTION();
  924. m_fsmState = HM_FSM_STATE_EXITTING;
  925. ErrorCodeEnum eErrCode;
  926. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","E");
  927. if (eErrCode != Error_Succeed)
  928. {
  929. Dbg("set RunState E failed (%d).",eErrCode);
  930. }
  931. }
  932. void CHealthManagerFSM::s9_on_exit()
  933. {
  934. LOG_FUNCTION();
  935. }
  936. unsigned int CHealthManagerFSM::s9_on_event(FSMEvent* pEvt)
  937. {
  938. LOG_FUNCTION();
  939. Dbg("s9(Exitting) event %d",pEvt->iEvt);
  940. switch(pEvt->iEvt)
  941. {
  942. case USER_EVT_MAITAIN:
  943. Dbg("to maintain...");
  944. m_stateBeforeMaintain = m_fsmState;
  945. pEvt->SetHandled();
  946. break;
  947. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  948. pEvt->SetHandled();
  949. break;
  950. default:
  951. break;
  952. }
  953. return 0;
  954. }
  955. //Sleep(L)
  956. void CHealthManagerFSM::s10_on_entry()
  957. {
  958. LOG_FUNCTION();
  959. m_fsmState = HM_FSM_STATE_SLEEP;
  960. ErrorCodeEnum eErrCode;
  961. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","L");
  962. if (eErrCode != Error_Succeed)
  963. {
  964. Dbg("set RunState L failed (%d).",eErrCode);
  965. }
  966. }
  967. void CHealthManagerFSM::s10_on_exit()
  968. {
  969. LOG_FUNCTION();
  970. }
  971. unsigned int CHealthManagerFSM::s10_on_event(FSMEvent* pEvt)
  972. {
  973. LOG_FUNCTION();
  974. Dbg("s10(Sleep) event %d",pEvt->iEvt);
  975. switch(pEvt->iEvt)
  976. {
  977. case USER_EVT_MAITAIN:
  978. Dbg("to maintain...");
  979. m_stateBeforeMaintain = m_fsmState;
  980. pEvt->SetHandled();
  981. break;
  982. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  983. pEvt->SetHandled();
  984. break;
  985. default:
  986. break;
  987. }
  988. return 0;
  989. }
  990. //In Customer Manager System
  991. void CHealthManagerFSM::s11_on_entry()
  992. {
  993. LOG_FUNCTION();
  994. m_preFsmState = m_fsmState;
  995. m_fsmState = HM_FSM_STATE_CMS;
  996. }
  997. void CHealthManagerFSM::s11_on_exit()
  998. {
  999. LOG_FUNCTION();
  1000. }
  1001. unsigned int CHealthManagerFSM::s11_on_event(FSMEvent* pEvt)
  1002. {
  1003. LOG_FUNCTION();
  1004. Dbg("s11(In CMS) event %d",pEvt->iEvt);
  1005. int ret = 0;
  1006. switch (pEvt->iEvt)
  1007. {
  1008. case USER_EVT_MAITAIN:
  1009. Dbg("to maintain...");
  1010. m_stateBeforeMaintain = m_fsmState;
  1011. pEvt->SetHandled();
  1012. break;
  1013. case USER_EVT_SWITCH_BACK_TO_RVC:
  1014. pEvt->SetHandled();
  1015. ret = m_preFsmState;
  1016. break;
  1017. default:
  1018. break;
  1019. }
  1020. return ret;
  1021. }
  1022. ErrorCodeEnum CHealthManagerFSM::Initial()
  1023. {
  1024. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1025. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1026. //start entity
  1027. CSmartPointer<IAsynWaitSp> spWait;
  1028. //close all entity if any? oiltmp
  1029. ifstream is;
  1030. ErrorCodeEnum err;
  1031. CSimpleStringA cfgPath = "",strCoreBoot("CoreBoot"),strSafeLoad("SafeLoad"),strOp("Operating"),strIEBrower("IEBrowser");
  1032. err = GetEntityBase()->GetFunction()->GetPath("cfg",cfgPath);
  1033. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  1034. Dbg("machinetype[%s],terminalID[%s]", (LPCTSTR)m_sysInfo.strMachineType,(LPCTSTR)m_sysInfo.strTerminalID);
  1035. strCoreBoot = strCoreBoot + "." + m_sysInfo.strMachineType;
  1036. strSafeLoad = strSafeLoad + "." + m_sysInfo.strMachineType;
  1037. strOp = strOp + "." + m_sysInfo.strMachineType;
  1038. m_strURL = strIEBrower + "." + m_sysInfo.strMachineType + ".Url";
  1039. cfgPath = cfgPath + "/HealthManager.ini";
  1040. Dbg("cfgpath[%s]",(const char*)cfgPath);
  1041. is.open (cfgPath, ios::binary);
  1042. if (!is.is_open())
  1043. {
  1044. DWORD dwErr = GetLastErrorRVC();
  1045. Dbg("open cfg file failed. [%d]",dwErr);
  1046. return Error_IO;
  1047. }
  1048. string line;
  1049. //line = new char[MAX_KEY_VALUE_SIZE];
  1050. long curr,end;
  1051. is.seekg(0,ios_base::end);
  1052. end = is.tellg();
  1053. is.seekg(0,ios_base::beg);
  1054. LoadStage eSection = LOADSTAGE_UNKNOWN;
  1055. CSmartPointer<IConfigInfo> spConfig;
  1056. err = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  1057. if (err != Error_Succeed) {
  1058. Dbg("open cfg file failed!");
  1059. return Error_IO;
  1060. }
  1061. m_AccessAuthTries = 4;
  1062. m_InitTries = 4;
  1063. m_AccessAuthTimeout = 180000;
  1064. m_InitializationTimeout = 180000;
  1065. int tmpAATries,tmpInitTries,tmpAATimeout,tmpInitTimout;
  1066. if (spConfig->ReadConfigValueInt("init","AccessAuthTries",tmpAATries) == Error_Succeed)
  1067. m_AccessAuthTries = tmpAATries;
  1068. if (spConfig->ReadConfigValueInt("init","InitTries",tmpInitTries) == Error_Succeed)
  1069. m_InitTries = tmpInitTries;
  1070. if (spConfig->ReadConfigValueInt("init","AccessAuthTimeout",tmpAATimeout) == Error_Succeed)
  1071. m_AccessAuthTimeout = tmpAATimeout;
  1072. if (spConfig->ReadConfigValueInt("init","InitializationTimeout",tmpInitTimout) == Error_Succeed)
  1073. m_InitializationTimeout = tmpInitTimout;
  1074. CSmartPointer<IConfigInfo> spConfigRoot;
  1075. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  1076. CSimpleStringA csGpioVendor("");
  1077. spConfigRoot->ReadConfigValue("Device.Gpio", "Vendor", csGpioVendor);
  1078. if (csGpioVendor.GetLength() > 1)
  1079. m_hasCfgGpioInRootIni = true;
  1080. int count,cbNum,slNum,opNum;
  1081. count = cbNum = slNum = opNum = 0;
  1082. do
  1083. {
  1084. //memset(line,0,MAX_KEY_VALUE_SIZE);
  1085. getline(is,line);
  1086. if (line[0] == '[')
  1087. {
  1088. size_t secEnd = line.find(']',1);
  1089. if (secEnd != string::npos)
  1090. {
  1091. string strSec = line.substr(1,secEnd-1);
  1092. if (StrEqualNoCase(strSec.c_str(),strCoreBoot,strSec.length()))
  1093. eSection = LOADSTAGE_COREBOOT;
  1094. else if (StrEqualNoCase(strSec.c_str(),strSafeLoad,strSec.length()))
  1095. eSection = LOADSTAGE_SAFELOAD;
  1096. else if (StrEqualNoCase(strSec.c_str(),strOp,strSec.length()))
  1097. eSection = LOADSTAGE_OPERATING;
  1098. else
  1099. eSection = LOADSTAGE_UNKNOWN;
  1100. }
  1101. }
  1102. else if (((unsigned)(line[0]+1) > 256) || line[0] == ';')
  1103. {//Chinese and other...
  1104. curr = is.tellg();
  1105. continue;
  1106. }
  1107. else if (isalpha(line[0]))
  1108. {
  1109. if (eSection == LOADSTAGE_UNKNOWN)
  1110. {
  1111. curr = is.tellg();
  1112. continue;
  1113. }
  1114. size_t keyPos = line.find('=',0);
  1115. if (keyPos != string::npos)
  1116. {
  1117. string keyName = line.substr(0,keyPos);
  1118. count++;
  1119. switch(eSection)
  1120. {
  1121. case LOADSTAGE_COREBOOT:
  1122. spConfig->ReadConfigValueInt(strCoreBoot,keyName.c_str(),m_coreBootOpt[keyName.c_str()].loadOpt);
  1123. m_vCoreBoot.push_back(keyName.c_str());
  1124. m_coreBootOpt[keyName.c_str()].eResult = LOADING_INIT;
  1125. m_coreBootOpt[keyName.c_str()].initSn = cbNum;
  1126. cbNum++;
  1127. break;
  1128. case LOADSTAGE_SAFELOAD:
  1129. spConfig->ReadConfigValueInt(strSafeLoad,keyName.c_str(),m_safeLoadOpt[keyName.c_str()].loadOpt);
  1130. m_vSafeLoad.push_back(keyName.c_str());
  1131. m_safeLoadOpt[keyName.c_str()].eResult = LOADING_INIT;
  1132. m_safeLoadOpt[keyName.c_str()].initSn = slNum;
  1133. slNum++;
  1134. break;
  1135. case LOADSTAGE_OPERATING:
  1136. spConfig->ReadConfigValueInt(strOp,keyName.c_str(),m_operatingOpt[keyName.c_str()].loadOpt);
  1137. if (keyName.compare("Gpio") == 0 && !m_hasCfgGpioInRootIni)
  1138. Dbg("have configure gpio in HealthManager.ini,but can't find gpio in root.ini,ignore start gpio.");
  1139. else
  1140. {
  1141. m_vOperating.push_back(keyName.c_str());
  1142. m_operatingOpt[keyName.c_str()].eResult = LOADING_INIT;
  1143. m_operatingOpt[keyName.c_str()].initSn = opNum;
  1144. opNum++;
  1145. }
  1146. break;
  1147. default:
  1148. break;
  1149. }
  1150. }
  1151. }
  1152. curr = is.tellg();
  1153. }while(curr < end);
  1154. is.close();
  1155. Dbg("opt num:[%d]c[%d]s[%d]o[%d]",count,m_coreBootOpt.size(),m_safeLoadOpt.size(),m_operatingOpt.size());
  1156. //read entity loading history record
  1157. CSimpleStringA sysinfoPath = "";
  1158. WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
  1159. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  1160. return Error_Succeed;
  1161. }
  1162. int CHealthManagerFSM::WaitDeamonFinish()
  1163. {
  1164. int count = 0;
  1165. while(1)//max waiting time
  1166. {
  1167. count++;
  1168. //query if update deamon process is started oiltmp
  1169. //case custody
  1170. //case needreboot
  1171. //case rollback
  1172. //case timeout
  1173. if (count > 2)
  1174. break;
  1175. //Sleep(5000);
  1176. }
  1177. return 0;
  1178. }
  1179. int CHealthManagerFSM::DoInitialization()
  1180. {
  1181. ErrorCodeEnum eErr;
  1182. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1183. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1184. CEntityRunInfo acInfo;
  1185. eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
  1186. Dbg("Initializer state return %d",eErr);
  1187. if (eErr == Error_Succeed && (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Idle))
  1188. {
  1189. if (acInfo.eState == EntityState_NoStart)
  1190. {
  1191. CSmartPointer<IAsynWaitSp> spWaitInit;
  1192. eErr = pFuncPrivilege->StartEntity("Initializer",NULL,spWaitInit);
  1193. if (eErr == Error_Succeed)
  1194. eErr = spWaitInit->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1195. eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
  1196. if (eErr != Error_Succeed || acInfo.eState != EntityState_Idle)
  1197. {
  1198. Dbg("start Initializer failed(%d,%d).",eErr,acInfo.eState);
  1199. return 1;
  1200. }
  1201. }
  1202. if (m_pInitClient == NULL)
  1203. {
  1204. m_pInitClient = new InitializerService_ClientBase(this->GetEntityBase());
  1205. eErr = m_pInitClient->Connect();
  1206. if (eErr != Error_Succeed) {
  1207. Dbg("Initializer connected failed.");
  1208. m_pInitClient->SafeDelete();
  1209. m_pInitClient = NULL;
  1210. return 2;
  1211. }
  1212. else
  1213. Dbg("Initializer connected.");
  1214. }
  1215. InitializerService_Initialize_Info initInfo;
  1216. m_pInitClient->Initialize(initInfo);
  1217. //no need to wait,just go
  1218. return 0;
  1219. }
  1220. else
  1221. {
  1222. Dbg("Get Initializer RunInfo failed(%d).",eErr);
  1223. return 3;
  1224. }
  1225. }
  1226. int CHealthManagerFSM::CoreBootDoWork()
  1227. {
  1228. return 0;
  1229. }
  1230. int CHealthManagerFSM::SafeLoadDoWork()
  1231. {
  1232. return 0;
  1233. }
  1234. int CHealthManagerFSM::OpLoadDoWork()
  1235. {
  1236. return 0;
  1237. }
  1238. //0:auth suc or have already authed;1:auth failed;
  1239. int CHealthManagerFSM::AccessAuthDoWork()
  1240. {
  1241. //oilyang@20190924 comment the following Sleep(5000);
  1242. //Sleep(5000);//oilyang wait for a few seconds
  1243. if (m_bFirstAccessAuth && m_accessAuthCheckMD5 == 1 && m_havReceiveMD5OK == 0)
  1244. {
  1245. Dbg("wait md5 ok.");
  1246. WaitForSingleObject(m_hMD5OKEvt, INFINITE);
  1247. m_bFirstAccessAuth = false;
  1248. Dbg("have received md5 ok event.");
  1249. }
  1250. CSimpleStringA csTermStage("");
  1251. ErrorCodeEnum eErr;
  1252. eErr = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  1253. Dbg("oninit get termstage %s",(LPCTSTR)csTermStage);
  1254. bool bToDoInit = false;
  1255. if (eErr == Error_Succeed)
  1256. {
  1257. if (csTermStage[0] == 'U')
  1258. {
  1259. bToDoInit = true;
  1260. int initTime = 0;
  1261. INITIALIZATION:
  1262. int rc = DoInitialization();
  1263. Dbg("the %d init",initTime);
  1264. initTime++;
  1265. DWORD dwStart = GetTickCountRVC();
  1266. while(1)
  1267. {
  1268. if (!m_bInitSuc && !m_bInitFail)
  1269. {
  1270. Sleep(1000);
  1271. continue;
  1272. }
  1273. else if (m_bInitSuc || m_bInitFail)
  1274. {
  1275. Dbg("init result %d,%d",m_bInitSuc,m_bInitFail);
  1276. //if (m_bInitFail && initTime < m_InitTries)
  1277. if (m_bInitFail)
  1278. {
  1279. Sleep(5000);
  1280. m_bInitFail = false;
  1281. goto INITIALIZATION;
  1282. }
  1283. if (m_bInitSuc)
  1284. break;
  1285. }
  1286. //20130826 oilyang according to xkm,wait forever
  1287. //DWORD dwEnd,dwElapse;
  1288. //dwEnd = GetTickCount();
  1289. //dwElapse = dwEnd - dwStart;
  1290. //if (dwElapse > m_InitializationTimeout)
  1291. //{
  1292. // Dbg("wait init timeout");
  1293. // break;
  1294. //}
  1295. }
  1296. }
  1297. }
  1298. else
  1299. {
  1300. Dbg("get TerminalStage failed(%d).",eErr);
  1301. return 1;
  1302. }
  1303. Dbg("after proc initialization.");
  1304. if (bToDoInit)
  1305. {
  1306. if (m_bInitSuc)
  1307. {
  1308. eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1309. Dbg("set TerminalStage C");
  1310. if (eErr != Error_Succeed)
  1311. Dbg("set TerminalStage C failed(%d).",eErr);
  1312. }
  1313. else
  1314. {
  1315. Dbg("initialization failed.");
  1316. return 1;
  1317. }
  1318. }
  1319. //to accessauth
  1320. ErrorCodeEnum eErrCode;
  1321. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  1322. Dbg("before accessauth get termstage %s",(LPCTSTR)csTermStage);
  1323. if (eErrCode == Error_Succeed)
  1324. {
  1325. //if (csTermStage[0] == 'C' || csTermStage[0] == 'A')
  1326. if (csTermStage[0] != 'U')
  1327. {
  1328. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1329. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1330. //terminate pinpad
  1331. //CSmartPointer<IAsynWaitSp> spWait;
  1332. //eErrCode = pFuncPrivilege->CloseEntity("PinPad",spWait);
  1333. //Dbg("close pinpad %d.",eErrCode);
  1334. //eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1335. //if (eErrCode != Error_Succeed)
  1336. //{
  1337. // //terminate pinpad
  1338. // CSmartPointer<IAsynWaitSp> spWait;
  1339. // pFuncPrivilege->TerminateEntity("PinPad",spWait);
  1340. // spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1341. //}
  1342. //if (eErrCode == Error_Succeed)
  1343. {
  1344. CEntityRunInfo acInfo;
  1345. eErrCode = pFunc->GetEntityRunInfo("AccessAuthorization",acInfo);
  1346. Dbg("AccessAuth state return %d",eErrCode);
  1347. if (eErrCode == Error_Succeed)
  1348. {
  1349. switch(acInfo.eState)
  1350. {
  1351. case EntityState_NoStart:
  1352. {
  1353. CSmartPointer<IAsynWaitSp> spWaitAC;
  1354. eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization",NULL,spWaitAC);
  1355. eErrCode = spWaitAC->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1356. Dbg("start accessauth %d.",eErrCode);
  1357. }
  1358. break;
  1359. case EntityState_Idle:
  1360. Dbg("AccessAuth state idle.");
  1361. break;
  1362. default:
  1363. break;
  1364. }
  1365. if (m_pACClient == NULL)
  1366. {
  1367. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  1368. eErrCode = m_pACClient->Connect();
  1369. if (eErrCode != Error_Succeed) {
  1370. Dbg("accessauth connected failed.");
  1371. m_pACClient->SafeDelete();
  1372. m_pACClient = NULL;
  1373. StartPinPadEntity();
  1374. return 1;
  1375. }
  1376. else
  1377. Dbg("accessauth connected.");
  1378. }
  1379. }
  1380. else
  1381. {
  1382. Dbg("Get AccessAuth RunInfo failed(%d).",eErrCode);
  1383. StartPinPadEntity();
  1384. return 1;
  1385. }
  1386. if (m_pACClient != NULL)
  1387. {
  1388. DWORD dwStart = GetTickCountRVC();
  1389. int registCount = 0;
  1390. REGIST: eErrCode = m_pACClient->Regist();
  1391. m_bHasAuthEver = true;
  1392. registCount++;
  1393. Dbg("accessauth regist %d",eErrCode);
  1394. if (eErrCode == Error_Succeed)
  1395. {
  1396. while(1)
  1397. {
  1398. DWORD dwEnd = GetTickCountRVC();
  1399. DWORD dwElapse = dwEnd-dwStart;
  1400. if (dwElapse > m_AccessAuthTimeout)
  1401. {
  1402. Dbg("after x minute");
  1403. StartPinPadEntity();
  1404. //auth failed,rollback to C
  1405. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1406. Dbg("auth fail,set TerminalStage C 1");
  1407. if (eErr != Error_Succeed)
  1408. Dbg("set TerminalStage C failed(%d).",eErr);
  1409. m_bFirstAccessAuth = false;
  1410. return 1;
  1411. }
  1412. Sleep(1000);
  1413. if (!m_bAccessAuth && !m_bACFailed)
  1414. continue;
  1415. if (m_bACFailed && registCount < m_AccessAuthTries)
  1416. {
  1417. LogWarn(Severity_Low,Error_Unexpect,LOG_WARN_HEALTH_ACCESSAUTH_FAILED,"AccessAuth failed.");
  1418. m_bACFailed = false;
  1419. Sleep(5000);
  1420. goto REGIST;
  1421. }
  1422. Dbg("regist try %d times",registCount);
  1423. StartPinPadEntity();
  1424. if (!m_bAccessAuth)
  1425. {
  1426. //auth failed,rollback to C
  1427. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1428. Dbg("auth fail,set TerminalStage C 2");
  1429. if (eErr != Error_Succeed)
  1430. Dbg("set TerminalStage C failed(%d).",eErr);
  1431. }
  1432. break;
  1433. //}
  1434. }
  1435. m_bFirstAccessAuth = false;
  1436. return 0;
  1437. }
  1438. else
  1439. {
  1440. Dbg("accessauth regist failed(%d).",eErrCode);
  1441. StartPinPadEntity();
  1442. //auth failed,rollback to C
  1443. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1444. Dbg("auth fail,set TerminalStage C 3");
  1445. if (eErr != Error_Succeed)
  1446. Dbg("set TerminalStage C failed(%d).",eErr);
  1447. return 1;
  1448. }
  1449. }
  1450. else
  1451. {
  1452. Dbg("Start accessauth failed(%d).",eErrCode);
  1453. StartPinPadEntity();
  1454. //auth failed,rollback to C
  1455. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
  1456. Dbg("auth fail,set TerminalStage C 4");
  1457. if (eErr != Error_Succeed)
  1458. Dbg("set TerminalStage C failed(%d).",eErr);
  1459. return 1;
  1460. }
  1461. }
  1462. }
  1463. else
  1464. {
  1465. StartPinPadEntity();
  1466. return 0;
  1467. }
  1468. }
  1469. else
  1470. Dbg("Get termstage failed(%d).",eErrCode);
  1471. return 1;
  1472. }
  1473. //return value:
  1474. //0:all entity have started suc
  1475. //1:some entity havn't try to start
  1476. //2:all entity have tried to started,but some failed
  1477. int CHealthManagerFSM::CheckLoadResult(LoadStage eStage)
  1478. {
  1479. int ret = 0;
  1480. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1481. if (eStage == LOADSTAGE_COREBOOT)
  1482. it = m_coreBootOpt.begin();
  1483. else if (eStage == LOADSTAGE_SAFELOAD)
  1484. it = m_safeLoadOpt.begin();
  1485. else
  1486. it = m_operatingOpt.begin();
  1487. while(1)
  1488. {
  1489. switch(it->second.loadOpt)
  1490. {
  1491. case LOADOPT_IGNORE:
  1492. if (it->second.eResult == LOADING_INIT)
  1493. return 1;
  1494. break;
  1495. case LOADOPT_ASYNC_VERIFY:
  1496. case LOADOPT_SYNC_VERIFY:
  1497. default:
  1498. if (it->second.eResult == LOADING_INIT)
  1499. return 3;
  1500. else if (it->second.eResult != LOADING_SUCCEED)
  1501. {
  1502. m_csErrEntity = it->first;
  1503. ret = 2;
  1504. }
  1505. break;
  1506. }
  1507. it++;
  1508. if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
  1509. break;
  1510. else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
  1511. break;
  1512. else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
  1513. break;
  1514. }
  1515. return ret;
  1516. }
  1517. void CHealthManagerFSM::SetAccessAuth(bool bResult)
  1518. {
  1519. m_bAccessAuth = bResult;
  1520. ErrorCodeEnum eErrCode;
  1521. if (bResult)
  1522. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","A");
  1523. else
  1524. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  1525. Dbg("SetAccessAuth %d",bResult);
  1526. if (m_pACClient != NULL)
  1527. {
  1528. }
  1529. }
  1530. int CHealthManagerFSM::StartPinPadEntity()
  1531. {
  1532. if (m_coreBootOpt.find("PinPad") == m_coreBootOpt.end() && m_safeLoadOpt.find("PinPad") == m_safeLoadOpt.end()
  1533. && m_operatingOpt.find("PinPad") == m_operatingOpt.end())
  1534. {
  1535. Dbg("not configure pinpad.");
  1536. return 0;
  1537. }
  1538. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1539. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1540. CEntityRunInfo acInfo;
  1541. ErrorCodeEnum eErrCode;
  1542. eErrCode = pFunc->GetEntityRunInfo("PinPad",acInfo);
  1543. Dbg("pinpad state %d,%d",eErrCode,acInfo.eState);
  1544. if (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Close || acInfo.eState == EntityState_Killed)
  1545. {
  1546. CSmartPointer<IAsynWaitSp> spWait;
  1547. eErrCode = pFuncPrivilege->StartEntity("PinPad",NULL,spWait);
  1548. Dbg("start pinpad %d.",eErrCode);
  1549. if (spWait != NULL)
  1550. eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1551. Dbg("start pinpad wait %d",eErrCode);
  1552. }
  1553. return eErrCode;
  1554. }
  1555. void CHealthManagerFSM::ToReAccessAuth(bool bEver)
  1556. {
  1557. if (m_bFirstAccessAuth)
  1558. return;
  1559. SetAccessAuth(false);
  1560. AccessAuthTask *pTask = new AccessAuthTask(this);
  1561. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  1562. }
  1563. ErrorCodeEnum CHealthManagerFSM::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
  1564. {
  1565. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1566. ErrorCodeEnum errCode;
  1567. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1568. if (pFuncPrivilege != NULL) {
  1569. CSmartPointer<IAsynWaitSp> spWait;
  1570. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  1571. Dbg("start entity %s",entity_name);
  1572. if (errCode == Error_Succeed) {
  1573. callback_entry *entry = new callback_entry();
  1574. entry->pRawData = pData;
  1575. entry->EntityName = entity_name;
  1576. entry->ErrorResult = Error_Unexpect;
  1577. entry->op = OP_START_ENTITY;
  1578. if (spWait != NULL)
  1579. spWait->SetCallback(this, entry);
  1580. }
  1581. return errCode;
  1582. } else {
  1583. return Error_NoPrivilege;
  1584. }
  1585. }
  1586. ErrorCodeEnum CHealthManagerFSM::AsyncStopEntity(const char *entity_name, void *pData)
  1587. {
  1588. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1589. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1590. if (pFuncPrivilege != NULL) {
  1591. CSmartPointer<IAsynWaitSp> spWait;
  1592. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  1593. if (Error == Error_Succeed) {
  1594. callback_entry *entry = new callback_entry();
  1595. entry->pRawData = pData;
  1596. entry->EntityName = entity_name;
  1597. entry->ErrorResult = Error_Unexpect;
  1598. entry->op = OP_STOP_ENTITY;
  1599. if (spWait != NULL)
  1600. spWait->SetCallback(this, entry);
  1601. }
  1602. return Error;
  1603. } else {
  1604. return Error_NoPrivilege;
  1605. }
  1606. }
  1607. ErrorCodeEnum CHealthManagerFSM::AsyncPauseEntity(const char *entity_name, void *pData)
  1608. {
  1609. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1610. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1611. if (pFuncPrivilege != NULL) {
  1612. CSmartPointer<IAsynWaitSp> spWait;
  1613. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  1614. if (Error == Error_Succeed) {
  1615. callback_entry *entry = new callback_entry();
  1616. entry->pRawData = pData;
  1617. entry->EntityName = entity_name;
  1618. entry->ErrorResult = Error_Unexpect;
  1619. entry->op = OP_PAUSE_ENTITY;
  1620. if (spWait != NULL)
  1621. spWait->SetCallback(this, entry);
  1622. }
  1623. return Error;
  1624. } else {
  1625. return Error_NoPrivilege;
  1626. }
  1627. }
  1628. ErrorCodeEnum CHealthManagerFSM::AsyncContinueEntity(const char *entity_name, void *pData)
  1629. {
  1630. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1631. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1632. if (pFuncPrivilege != NULL) {
  1633. CSmartPointer<IAsynWaitSp> spWait;
  1634. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  1635. if (Error == Error_Succeed) {
  1636. callback_entry *entry = new callback_entry();
  1637. entry->pRawData = pData;
  1638. entry->EntityName = entity_name;
  1639. entry->ErrorResult = Error_Unexpect;
  1640. entry->op = OP_CONTINUE_ENTITY;
  1641. if (spWait != NULL)
  1642. spWait->SetCallback(this, entry);
  1643. }
  1644. return Error;
  1645. } else {
  1646. return Error_NoPrivilege;
  1647. }
  1648. }
  1649. ErrorCodeEnum CHealthManagerFSM::AsyncTerminateEntity(const char *entity_name, void *pData)
  1650. {
  1651. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1652. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1653. if (pFuncPrivilege != NULL) {
  1654. CSmartPointer<IAsynWaitSp> spWait;
  1655. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  1656. if (Error == Error_Succeed) {
  1657. callback_entry *entry = new callback_entry();
  1658. entry->pRawData = pData;
  1659. entry->EntityName = entity_name;
  1660. entry->ErrorResult = Error_Unexpect;
  1661. entry->op = OP_TERMINATE_ENTITY;
  1662. if (spWait != NULL)
  1663. spWait->SetCallback(this, entry);
  1664. }
  1665. return Error;
  1666. } else {
  1667. return Error_NoPrivilege;
  1668. }
  1669. }
  1670. void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1671. {
  1672. CSmartPointer<ICallbackListener> spCallback;
  1673. CSmartPointer<IReleasable> pData;
  1674. pAsynWaitSp->GetCallback(spCallback, pData);
  1675. //LOG_ASSERT(pData);
  1676. callback_entry *entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
  1677. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1678. callback_entry *new_entry = new callback_entry();
  1679. new_entry->EntityName = entry->EntityName;
  1680. new_entry->ErrorResult = entry->ErrorResult;
  1681. new_entry->op = entry->op;
  1682. new_entry->state = entry->state;
  1683. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1684. int ret;
  1685. Dbg("stage %d,%s,result %d",m_eStage,(LPCSTR)new_entry->EntityName,new_entry->ErrorResult);
  1686. switch(m_eStage)
  1687. {
  1688. case LOADSTAGE_COREBOOT:
  1689. it = m_coreBootOpt.find(new_entry->EntityName);
  1690. if (it != m_coreBootOpt.end())
  1691. {
  1692. if (new_entry->ErrorResult == Error_Succeed)
  1693. it->second.eResult = LOADING_SUCCEED;
  1694. else if (new_entry->ErrorResult == Error_TimeOut)
  1695. it->second.eResult = LOADING_TIMEOUT;
  1696. else
  1697. it->second.eResult = LOADING_FAILED;
  1698. if (it->second.eResult != Error_Succeed)
  1699. {
  1700. char tmp[64] = {0};
  1701. sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
  1702. //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  1703. Dbg("%s", tmp);
  1704. }
  1705. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  1706. if (ret == 0 || ret == 2)
  1707. {
  1708. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  1709. e->param1 = ret;
  1710. PostEventFIFO(e);
  1711. }
  1712. }
  1713. break;
  1714. case LOADSTAGE_SAFELOAD:
  1715. it = m_safeLoadOpt.find(new_entry->EntityName);
  1716. if (it != m_safeLoadOpt.end())
  1717. {
  1718. if (new_entry->ErrorResult == Error_Succeed)
  1719. it->second.eResult = LOADING_SUCCEED;
  1720. else if (new_entry->ErrorResult == Error_TimeOut)
  1721. it->second.eResult = LOADING_TIMEOUT;
  1722. else
  1723. it->second.eResult = LOADING_FAILED;
  1724. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  1725. Dbg("safeload answer %d",ret);
  1726. if (ret == 0 || ret == 2)
  1727. {
  1728. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  1729. e->param1 = ret;
  1730. PostEventFIFO(e);
  1731. }
  1732. }
  1733. else
  1734. Dbg("cannot find %s",(LPCTSTR)new_entry->EntityName);
  1735. break;
  1736. case LOADSTAGE_OPERATING:
  1737. it = m_operatingOpt.find(new_entry->EntityName);
  1738. if (it != m_operatingOpt.end())
  1739. {
  1740. if (new_entry->ErrorResult == Error_Succeed)
  1741. it->second.eResult = LOADING_SUCCEED;
  1742. else if (new_entry->ErrorResult == Error_TimeOut)
  1743. it->second.eResult = LOADING_TIMEOUT;
  1744. else
  1745. it->second.eResult = LOADING_FAILED;
  1746. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  1747. if (ret == 0 || ret == 2)
  1748. {
  1749. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  1750. e->param1 = ret;
  1751. PostEventFIFO(e);
  1752. }
  1753. }
  1754. break;
  1755. default:
  1756. break;
  1757. }
  1758. }
  1759. void CHealthManagerFSM::ToCheckUPS()
  1760. {
  1761. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1762. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1763. CEntityRunInfo acInfo;
  1764. ErrorCodeEnum eErrCode;
  1765. eErrCode = pFunc->GetEntityRunInfo("Ups",acInfo);
  1766. Dbg("ups state %d,%d",eErrCode,acInfo.eState);
  1767. if (acInfo.eState != EntityState_NoStart)
  1768. {
  1769. CSmartPointer<IAsynWaitSp> spWait;
  1770. eErrCode = pFuncPrivilege->TerminateEntity("Ups",spWait);
  1771. Sleep(2000);
  1772. eErrCode = pFuncPrivilege->StartEntity("Ups",NULL,spWait);
  1773. if (spWait != NULL)
  1774. eErrCode = spWait->WaitAnswer(5000);
  1775. Dbg("restart ups wait %d",eErrCode);
  1776. }
  1777. }
  1778. int CHealthManagerFSM::USBControl()
  1779. {
  1780. CSystemStaticInfo sysInfo;
  1781. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
  1782. if (eErr != Error_Succeed)
  1783. {
  1784. Dbg("Get system static info failed(%d).",eErr);
  1785. return -1;
  1786. }
  1787. Dbg("machinetype[%s]",(LPCTSTR)sysInfo.strMachineType);
  1788. if (sysInfo.strMachineType.Compare("RVC.PAD") == 0)
  1789. {
  1790. if (m_pDevCtrlClient == NULL)
  1791. {
  1792. m_pDevCtrlClient = new DeviceControlService_ClientBase(this->m_pEntity);
  1793. ErrorCodeEnum eErr = m_pDevCtrlClient->Connect();
  1794. if (eErr != Error_Succeed) {
  1795. Dbg("DeviceControl connected failed(%d).",eErr);
  1796. m_pDevCtrlClient->SafeDelete();
  1797. m_pDevCtrlClient = NULL;
  1798. return -1;
  1799. }
  1800. }
  1801. if (m_pDevCtrlClient != NULL)
  1802. {
  1803. DeviceControlService_USB_Req req;
  1804. DeviceControlService_USB_Ans ans;
  1805. req.open = true;
  1806. eErr = m_pDevCtrlClient->USB(req,ans,5000);
  1807. if (eErr != Error_Succeed)
  1808. {
  1809. Dbg("usb control failed(%d).",eErr);
  1810. return -1;
  1811. }
  1812. else
  1813. Dbg("usb opened.");
  1814. }
  1815. }
  1816. return 0;
  1817. }
  1818. int CHealthManagerFSM::GetEntityCfgInfo(CSimpleStringA name,int &loadOpt)
  1819. {
  1820. Dbg("GetEntityCfgInfo %s",(LPCTSTR)name);
  1821. if (!name.IsNullOrEmpty() && name.Compare("IEBrowser") == 0)
  1822. {
  1823. Dbg("IEBrowser just return 2");
  1824. loadOpt = 2;
  1825. return 0;
  1826. }
  1827. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1828. for (it = m_coreBootOpt.begin(); it != m_coreBootOpt.end(); ++it)
  1829. {
  1830. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1831. {
  1832. loadOpt = it->second.loadOpt;
  1833. Dbg("GetEntityCfgInfo %d",loadOpt);
  1834. return 0;
  1835. }
  1836. }
  1837. for (it = m_safeLoadOpt.begin(); it != m_safeLoadOpt.end(); ++it)
  1838. {
  1839. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1840. {
  1841. loadOpt = it->second.loadOpt;
  1842. Dbg("GetEntityCfgInfo %d",loadOpt);
  1843. return 0;
  1844. }
  1845. }
  1846. for (it = m_operatingOpt.begin(); it != m_operatingOpt.end(); ++it)
  1847. {
  1848. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1849. {
  1850. loadOpt = it->second.loadOpt;
  1851. Dbg("GetEntityCfgInfo %d",loadOpt);
  1852. return 0;
  1853. }
  1854. }
  1855. loadOpt = 99;
  1856. return -1;
  1857. }
  1858. CSimpleStringA CHealthManagerFSM::QueryCheckCode()
  1859. {
  1860. ErrorCodeEnum eErr = Error_Unexpect;
  1861. CSimpleStringA tmpCheckCode("");
  1862. PinPadService_ClientBase *pClient = new PinPadService_ClientBase(this->m_pEntity);
  1863. if (pClient != NULL)
  1864. {
  1865. eErr = pClient->Connect();
  1866. if (eErr == Error_Succeed)
  1867. {
  1868. PinPadService_QueryFunc_Req reqQ;
  1869. PinPadService_QueryFunc_Ans ansQ;
  1870. eErr = pClient->QueryFunc(reqQ, ansQ, 5000);
  1871. if (eErr == Error_Succeed)
  1872. {
  1873. PinPadService_GetCheckCode_Req reqG;
  1874. PinPadService_GetCheckCode_Ans ansG;
  1875. if (ansQ.reserved1 == 2)//if sm only
  1876. {
  1877. reqG.mSN.Init(1);
  1878. reqG.wSN.Init(1);
  1879. reqG.mSN[0] = 1;
  1880. reqG.wSN[0] = 0;
  1881. eErr = pClient->GetCheckCode(reqG, ansG, 10000);
  1882. if (eErr == Error_Succeed)
  1883. {
  1884. tmpCheckCode = ansG.checkcode[0];
  1885. }
  1886. }
  1887. else//3des only or 3des&sm both ok
  1888. {
  1889. reqG.mSN.Init(1);
  1890. reqG.wSN.Init(1);
  1891. reqG.mSN[0] = 0;
  1892. reqG.wSN[0] = 0;
  1893. eErr = pClient->GetCheckCode(reqG, ansG, 10000);
  1894. if (eErr == Error_Succeed)
  1895. {
  1896. tmpCheckCode = ansG.checkcode[0];
  1897. }
  1898. }
  1899. }
  1900. else
  1901. Dbg("QueryFunc failed.error code:%d",eErr);
  1902. }
  1903. else
  1904. Dbg("connect to pinpad failed.error code:%d",eErr);
  1905. }
  1906. return tmpCheckCode;
  1907. }
  1908. CSimpleStringA CHealthManagerFSM::QueryPinPadSM3DesInfo()
  1909. {
  1910. ErrorCodeEnum eErr = Error_Unexpect;
  1911. CSimpleStringA sm3desInfo("support:");
  1912. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
  1913. if (pClient != NULL)
  1914. {
  1915. eErr = pClient->Connect();
  1916. if (eErr == Error_Succeed)
  1917. {
  1918. PinPadService_QueryFunc_Req reqQ;
  1919. PinPadService_QueryFunc_Ans ansQ;
  1920. eErr = pClient->QueryFunc(reqQ, ansQ, 5000);
  1921. if (eErr == Error_Succeed)
  1922. {
  1923. Dbg("support:%d,loaded:%d",ansQ.encryptkey,ansQ.reserved1);
  1924. if (ansQ.encryptkey == 3)
  1925. sm3desInfo += "sm3des";
  1926. else if((ansQ.encryptkey == 2))
  1927. sm3desInfo += "sm";
  1928. else
  1929. sm3desInfo += "3des";
  1930. sm3desInfo += ",loadkey:";
  1931. if (ansQ.reserved1 == 3)
  1932. sm3desInfo += "sm3des";
  1933. else if ((ansQ.reserved1 == 2))
  1934. sm3desInfo += "sm";
  1935. else
  1936. sm3desInfo += "3des";
  1937. }
  1938. else
  1939. Dbg("QueryFunc failed.error code:%d", eErr);
  1940. }
  1941. else
  1942. Dbg("connect to pinpad failed.error code:%d", eErr);
  1943. }
  1944. return sm3desInfo;
  1945. }
  1946. void CHealthManagerFSM::DeviceReConnect()
  1947. {
  1948. //if haven't called access auth ever or in the 1st accessauth processing,no need to call access auth
  1949. if (QueryAccessAuthStatus() == 2 || m_bFirstAccessAuth)
  1950. return;
  1951. CSimpleStringA tmpCheckCode = QueryCheckCode();
  1952. Dbg("pre check code size:%d,now:%d",m_checkCode.GetLength(),tmpCheckCode.GetLength());
  1953. SetAccessFailedFlag(false);
  1954. if (tmpCheckCode.GetLength() == 0 || m_checkCode.Compare(tmpCheckCode, true) != 0 || !GetAccessAuthFlag() || !m_bEverAuthSucWithDevice)
  1955. {
  1956. if (m_checkCode.GetLength() > 1 && tmpCheckCode.GetLength() > 1 && m_checkCode.Compare(tmpCheckCode, true) != 0)
  1957. {
  1958. AuthStatus as;
  1959. as.result = 1;
  1960. as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
  1961. SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
  1962. }
  1963. else
  1964. {
  1965. if (m_checkCode.GetLength() > 1)
  1966. ToReAccessAuth(true);
  1967. else
  1968. ToReAccessAuth();
  1969. }
  1970. }
  1971. }
  1972. int CHealthManagerFSM::QuitFrameworkAndSaveInfo(RebootTriggerEnum eTrigger, RebootWayEnum eWay)
  1973. {
  1974. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1975. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1976. Dbg("quit framework and info %d,%d.", eTrigger, eWay);
  1977. pFuncPrivilege->Reboot(eTrigger, eWay);
  1978. return 0;
  1979. }
  1980. void CHealthManagerFSM::PostProcessAfterUpgrade()
  1981. {
  1982. LOG_FUNCTION();
  1983. CSimpleStringA csRunInfoPath(""), csFileName("");
  1984. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunInfo", csRunInfoPath);
  1985. csFileName = csRunInfoPath + "/runcfg/starttime.dat";
  1986. Dbg("file:%s", (const char*)csFileName);
  1987. bool bUpgradeFileExist = false;
  1988. #ifdef RVC_OS_WIN
  1989. bUpgradeFileExist = (_access((const char*)csFileName, 0) == 0);
  1990. #else
  1991. bUpgradeFileExist = (access((const char*)csFileName, F_OK) == 0);
  1992. #endif //RVC_OS_WIN
  1993. if (bUpgradeFileExist)
  1994. {
  1995. Dbg("exist upgrade flag file,to decide if restart framework.");
  1996. //存在升级后的启动文件
  1997. CSmartPointer<IConfigInfo> spConfigRun;
  1998. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  1999. if (eErr == Error_Succeed)
  2000. {
  2001. int xTimes = 0;
  2002. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  2003. if (xTimes < 3)
  2004. {
  2005. xTimes++;
  2006. Dbg("write Run--UpgradeRestartTimes:%d", xTimes);
  2007. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  2008. if (xTimes == 3)
  2009. {
  2010. //DeleteFileA((const char*)csFileName);
  2011. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_OS);
  2012. }
  2013. else
  2014. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  2015. }
  2016. }
  2017. }
  2018. }
  2019. CSimpleStringA GetOsVersion()
  2020. {
  2021. #ifdef RVC_OS_WIN
  2022. char psBuffer[128];
  2023. FILE* pPipe;
  2024. /* Run DIR so that it writes its output to a pipe. Open this
  2025. * pipe with read text attribute so that we can read it
  2026. * like a text file.
  2027. */
  2028. if ((pPipe = _popen("ver", "rt")) == NULL)
  2029. exit(1);
  2030. /* Read pipe until end of file, or an error occurs. */
  2031. while (fgets(psBuffer, 128, pPipe))
  2032. {
  2033. //puts(psBuffer);
  2034. }
  2035. Dbg("%s", psBuffer);
  2036. /* Close pipe and print return value of pPipe. */
  2037. if (feof(pPipe))
  2038. {
  2039. printf("\nProcess returned %d\n", _pclose(pPipe));
  2040. }
  2041. else
  2042. {
  2043. printf("Error: Failed to read the pipe to the end.\n");
  2044. }
  2045. string str(psBuffer);
  2046. int start = str.find("版本");
  2047. if (start > 0)
  2048. return CSimpleStringA(str.substr(start + 5, str.length() - start - 7).c_str());
  2049. else
  2050. return "";
  2051. #else
  2052. //oiltestlinux
  2053. return "";
  2054. #endif
  2055. }
  2056. void CHealthManagerFSM::ToLogWarnTermAboutInfo()
  2057. {
  2058. LOG_FUNCTION();
  2059. CSmartPointer<IConfigInfo> spConfigRoot;
  2060. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  2061. CSimpleStringA csEnvCamera(""),csOptCamera,csOSVerion;
  2062. spConfigRoot->ReadConfigValue("Video", "EnvCamera", csEnvCamera);
  2063. spConfigRoot->ReadConfigValue("Video", "OptCamera", csOptCamera);
  2064. std::map<std::string, std::string> termInfo;
  2065. termInfo["version"] = m_sysInfo.InstallVersion.ToString();
  2066. if (!m_csErrEntity.IsNullOrEmpty())
  2067. termInfo["ErrEntity"] = m_csErrEntity;
  2068. termInfo["EnvCamera"] = csEnvCamera;
  2069. termInfo["OptCamera"] = csOptCamera;
  2070. csOSVerion = GetOsVersion();
  2071. if (!csOSVerion.IsNullOrEmpty())
  2072. termInfo["OSVersion"] = csOSVerion;
  2073. termInfo["pinpad"] = QueryPinPadSM3DesInfo();
  2074. Dbg("%s,%s", termInfo["ErrEntity"].c_str(), termInfo["pinpad"].c_str());
  2075. //oiltestlinux as publicfucn have not been moved to linux
  2076. //std::pair<bool, std::string> strResult;
  2077. //strResult = generateJsonStr(termInfo);
  2078. //strResult.second.c_str();
  2079. //Dbg("[%s]", strResult.second.c_str());
  2080. //LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  2081. }