HealthManagerFSM.cpp 87 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765
  1. #include "stdafx.h"
  2. #include <fstream>
  3. #include <string>
  4. #include <algorithm>
  5. #include "CommEntityUtil.hpp"
  6. #if defined(RVC_OS_WIN)
  7. #include <TlHelp32.h>
  8. #include <iphlpapi.h>
  9. #include <ws2tcpip.h>
  10. #include <Winsock2.h>
  11. #include <io.h>
  12. #include "CSystemStatus.h"
  13. #pragma comment(lib, "IPHLPAPI.lib")
  14. #pragma comment(lib, "libpublicFun.lib")
  15. #else
  16. #include <unistd.h>
  17. #include <fcntl.h>
  18. #include <errno.h>
  19. #include "iniutil.h"
  20. #endif //RVC_OS_WIN
  21. #include "mod_healthmanager.h"
  22. #include "publicFunExport.h"
  23. using namespace std;
  24. const int MAX_AYSNC_TIMEOUT = 60000;
  25. const int MAX_IGNORE_TIMEOUT = 100;
  26. unsigned long long GetTickCountRVC() {
  27. #if defined(RVC_OS_WIN)
  28. return GetTickCount64();
  29. #else
  30. struct timespec ts;
  31. clock_gettime(CLOCK_MONOTONIC, &ts);
  32. return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
  33. #endif //RVC_OS_WIN
  34. }
  35. unsigned long long GetLastErrorRVC() {
  36. #if defined(RVC_OS_WIN)
  37. return GetLastError();
  38. #else
  39. return errno;
  40. #endif //RVC_OS_WIN
  41. }
  42. enum EntityOP
  43. {
  44. OP_STOP_ENTITY,
  45. OP_START_ENTITY,
  46. OP_PAUSE_ENTITY,
  47. OP_TERMINATE_ENTITY,
  48. OP_CONTINUE_ENTITY,
  49. };
  50. bool StrEqualNoCase(const char *s1, const char *s2,int len)
  51. {
  52. if (strlen(s1) != strlen(s2))
  53. return false;
  54. for (int i = 0; i < len; ++i)
  55. {
  56. if (toupper(s1[i]) != toupper(s2[i]))
  57. return false;
  58. }
  59. return true;
  60. }
  61. void CHealthManagerFSM::WaitALittleIfNecessary()
  62. {
  63. if (IsCoolBootThisTime()) {
  64. GetEntityBase()->GetFunction()->ShowStartupInfo("正在初始化,请稍等片刻......");
  65. int millsec = 0;
  66. SP::Module::Comm::Settings::ReadConfigFromCenterSettings(m_pEntity, "SleepColdBootMS", NULL, &millsec);
  67. if (millsec <= 0) {
  68. //need TODO:boot reform
  69. #if defined(RVC_OS_LINUX)
  70. millsec = 30000;
  71. #endif // defined(RVC_OS_LINUX)
  72. millsec = 10000;
  73. }
  74. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Sleep a little time %d", millsec);
  75. Sleep(millsec);
  76. }
  77. }
  78. ErrorCodeEnum CHealthManagerFSM::Initial()
  79. {
  80. #if defined(RVC_OS_WIN)
  81. GetEntityBase()->GetFunction()->SetSysVar("InitFWBFromStart", "N");
  82. SaveOsVersion();
  83. #endif
  84. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  85. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  86. CSmartPointer<IAsynWaitSp> spWait;
  87. ErrorCodeEnum err;
  88. CSimpleStringA cfgPath = "", strCoreBoot("CoreBoot"), strSafeLoad("SafeLoad"), strOp("Operating");
  89. GetEntityBase()->GetFunction()->GetSystemStaticInfo(m_sysInfo);
  90. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("machinetype[%s],terminalID[%s]", (LPCTSTR)m_sysInfo.strMachineType, (LPCTSTR)m_sysInfo.strTerminalID);
  91. strCoreBoot = strCoreBoot + "." + m_sysInfo.strMachineType;
  92. strSafeLoad = strSafeLoad + "." + m_sysInfo.strMachineType;
  93. strOp = strOp + "." + m_sysInfo.strMachineType;
  94. err = GetEntityBase()->GetFunction()->GetPath("cfg", cfgPath);
  95. cfgPath = cfgPath + SPLIT_SLASH_STR + "HealthManager.ini";
  96. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cfgpath[%s]", (const char*)cfgPath);
  97. ifstream is;
  98. is.open(cfgPath, ios::binary);
  99. if (!is.is_open())
  100. {
  101. DWORD dwErr = GetLastErrorRVC();
  102. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("open cfg file failed. [%d]", dwErr);
  103. return Error_IO;
  104. }
  105. string line;
  106. long curr, end;
  107. is.seekg(0, ios_base::end);
  108. end = is.tellg();
  109. is.seekg(0, ios_base::beg);
  110. LoadStage eSection = LOADSTAGE_UNKNOWN;
  111. CSmartPointer<IConfigInfo> spConfigCen;
  112. GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  113. m_AccessAuthTries = 4;
  114. do {
  115. int value(0);
  116. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "AccessAuthTries", value);
  117. if (value > 0) {
  118. m_AccessAuthTries = value;
  119. }
  120. } while (false);
  121. m_InitTries = 4;
  122. do {
  123. int value(0);
  124. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "InitTries", value);
  125. if (value > 0) {
  126. m_InitTries = value;
  127. }
  128. } while (false);
  129. m_AccessAuthTimeout = 180000;
  130. do {
  131. int value(0);
  132. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "AccessAuthTimeout", value);
  133. if (value > 0) {
  134. m_AccessAuthTimeout = value;
  135. }
  136. } while (false);
  137. m_InitializationTimeout = 180000;
  138. do {
  139. int value(0);
  140. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "InitializationTimeout", value);
  141. if (value > 0) {
  142. m_InitializationTimeout = value;
  143. }
  144. } while (false);
  145. CSmartPointer<IConfigInfo> spConfigRoot;
  146. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
  147. CSimpleStringA csGpioVendor("");
  148. spConfigRoot->ReadConfigValue("Device.Gpio", "Vendor", csGpioVendor);
  149. if (csGpioVendor.GetLength() > 1)
  150. m_hasCfgGpioInRootIni = true;
  151. CSmartPointer<IConfigInfo> spConfig;
  152. err = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
  153. if (err != Error_Succeed) {
  154. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("Initial")("open cfg file failed!");
  155. return Error_IO;
  156. }
  157. int count, cbNum, slNum, opNum;
  158. count = cbNum = slNum = opNum = 0;
  159. do
  160. {
  161. getline(is, line);
  162. if (line[0] == '[')
  163. {
  164. size_t secEnd = line.find(']', 1);
  165. if (secEnd != string::npos)
  166. {
  167. string strSec = line.substr(1, secEnd - 1);
  168. if (StrEqualNoCase(strSec.c_str(), strCoreBoot, strSec.length()))
  169. eSection = LOADSTAGE_COREBOOT;
  170. else if (StrEqualNoCase(strSec.c_str(), strSafeLoad, strSec.length()))
  171. eSection = LOADSTAGE_SAFELOAD;
  172. else if (StrEqualNoCase(strSec.c_str(), strOp, strSec.length()))
  173. eSection = LOADSTAGE_OPERATING;
  174. else
  175. eSection = LOADSTAGE_UNKNOWN;
  176. }
  177. }
  178. else if (((unsigned)(line[0] + 1) > 256) || line[0] == ';')
  179. {//Chinese and other...
  180. curr = is.tellg();
  181. continue;
  182. }
  183. else if (isalpha(line[0]))
  184. {
  185. if (eSection == LOADSTAGE_UNKNOWN)
  186. {
  187. curr = is.tellg();
  188. continue;
  189. }
  190. size_t keyPos = line.find('=', 0);
  191. if (keyPos != string::npos)
  192. {
  193. string keyName = line.substr(0, keyPos);
  194. count++;
  195. switch (eSection)
  196. {
  197. case LOADSTAGE_COREBOOT:
  198. spConfig->ReadConfigValueInt(strCoreBoot, keyName.c_str(), m_coreBootOpt[keyName.c_str()].loadOpt);
  199. m_vCoreBoot.push_back(keyName.c_str());
  200. m_vAllCfgEntity.push_back(keyName.c_str());
  201. m_coreBootOpt[keyName.c_str()].eResult = LOADING_INIT;
  202. m_coreBootOpt[keyName.c_str()].initSn = cbNum;
  203. cbNum++;
  204. break;
  205. case LOADSTAGE_SAFELOAD:
  206. spConfig->ReadConfigValueInt(strSafeLoad, keyName.c_str(), m_safeLoadOpt[keyName.c_str()].loadOpt);
  207. m_vSafeLoad.push_back(keyName.c_str());
  208. m_vAllCfgEntity.push_back(keyName.c_str());
  209. m_safeLoadOpt[keyName.c_str()].eResult = LOADING_INIT;
  210. m_safeLoadOpt[keyName.c_str()].initSn = slNum;
  211. slNum++;
  212. break;
  213. case LOADSTAGE_OPERATING:
  214. spConfig->ReadConfigValueInt(strOp, keyName.c_str(), m_operatingOpt[keyName.c_str()].loadOpt);
  215. if (keyName.compare("Gpio") == 0 && !m_hasCfgGpioInRootIni) {
  216. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("have configure gpio in HealthManager.ini,but can't find gpio in root.ini,ignore start gpio.");
  217. }
  218. else {
  219. m_vOperating.push_back(keyName.c_str());
  220. m_vAllCfgEntity.push_back(keyName.c_str());
  221. m_operatingOpt[keyName.c_str()].eResult = LOADING_INIT;
  222. m_operatingOpt[keyName.c_str()].initSn = opNum;
  223. opNum++;
  224. }
  225. break;
  226. default:
  227. break;
  228. }
  229. }
  230. }
  231. curr = is.tellg();
  232. } while (curr < end);
  233. is.close();
  234. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("opt num:[%d]c[%d]s[%d]o[%d]", count, m_coreBootOpt.size(), m_safeLoadOpt.size(), m_operatingOpt.size());
  235. #if defined(RVC_OS_LINUX)
  236. if (!m_sysInfo.strMachineType.IsNullOrEmpty() && m_sysInfo.strMachineType.Compare("RVC.Stand2S") != 0
  237. && m_sysInfo.strMachineType.Compare("RVC.Stand1SPlus") != 0) {
  238. CSimpleStringA strErrMsg = CSimpleStringA::Format("当前版本不支持此机型:%s", (LPCTSTR)m_sysInfo.strMachineType);
  239. SP::Module::Comm::LogErrorNotiyStruct notifyItem(Error_NotSupport, 0);
  240. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  241. notifyItem.Notify(notifyMsg);
  242. return Error_Succeed;
  243. }
  244. #endif //RVC_OS_LINUX
  245. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SleepEnterOpMS", m_sleepEnterOpMS);
  246. if (m_sleepEnterOpMS <= 0 || m_sleepEnterOpMS > 20000)
  247. m_sleepEnterOpMS = 8000;//default
  248. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "SleepColdBootMS", m_sleepColdBootMS);
  249. if (m_sleepColdBootMS <= 0 || m_sleepColdBootMS > 10000)
  250. m_sleepColdBootMS = 10000;//default
  251. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "WKUpdatePeriod", m_wkUpdatePeriod);
  252. if (m_wkUpdatePeriod <= 0 || m_wkUpdatePeriod > 365)
  253. m_wkUpdatePeriod = 30;//default
  254. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "DoNotUpdateWKDaily", m_iDoNotUpdateWKDaily);
  255. //oilyang@20210929
  256. GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "X");
  257. WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
  258. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  259. return Error_Succeed;
  260. }
  261. ErrorCodeEnum CHealthManagerFSM::OnInit(void)
  262. {
  263. m_hMD5OKEvt = CreateEventA(NULL, FALSE, FALSE, NULL);
  264. if (m_hMD5OKEvt == NULL)
  265. {
  266. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM)("CreateEvent failed(%d).", GetLastErrorRVC());
  267. }
  268. return Initial();
  269. }
  270. ErrorCodeEnum CHealthManagerFSM::OnExit(void)
  271. {
  272. return Error_Succeed;
  273. }
  274. void CHealthManagerFSM::s0_on_entry(void)
  275. {
  276. LOG_FUNCTION();
  277. m_fsmState = HM_FSM_INIT;
  278. m_ullElapseFromOSStart = SP::Module::Comm::RVCGetTickCount();
  279. m_elapseTimeFromOSStart = m_ullElapseFromOSStart / 1000;
  280. CSimpleStringA xMsg = CSimpleStringA::Format("{\"Decripstion\":\"Entity start\",\"version\":\"%s\",\"elapseTime\":\"%d\"}", m_sysInfo.InstallVersion.ToString().GetData(), m_elapseTimeFromOSStart);
  281. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Enter_SafeLoad_State, xMsg.GetData());
  282. }
  283. void CHealthManagerFSM::s0_on_exit(void)
  284. {
  285. }
  286. unsigned int CHealthManagerFSM::s0_on_event(FSMEvent* pEvt)
  287. {
  288. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("s0_on_event: %d, %d", pEvt->iEvt, pEvt->param1);
  289. int ret = 0;
  290. switch(pEvt->iEvt)
  291. {
  292. case USER_EVT_WAIT_DEAMON_FINISHED:
  293. ret = pEvt->param1;
  294. pEvt->SetHandled();
  295. break;
  296. default:
  297. break;
  298. }
  299. return ret;
  300. }
  301. bool CHealthManagerFSM::IsCoolBootThisTime()
  302. {
  303. //oilyang@20190924
  304. //修改为判断冷热启动,热重启不再等待10s
  305. //系统启动小于1.5分钟,认为是冷启动
  306. m_ullElapseFromOSStart = GetTickCount64();
  307. int millsec = 0;
  308. SP::Module::Comm::Settings::ReadConfigFromCenterSettings(m_pEntity, "BootMaxMillsecsSeeAsAutoRun", NULL, &millsec);
  309. if (millsec <= 0) {
  310. millsec = 90000;
  311. }
  312. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("have elapsed %d seconds from system start vs %d", m_ullElapseFromOSStart / 1000, millsec / 1000);
  313. if (m_ullElapseFromOSStart < millsec) {
  314. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10101")("start cold boot");
  315. return true;
  316. }
  317. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10102")("start warn boot");
  318. return false;
  319. }
  320. //CoreBoot
  321. void CHealthManagerFSM::s1_on_entry()
  322. {
  323. ErrorCodeEnum eErrCode;
  324. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  325. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  326. CEntityRunInfo browserInfo;
  327. eErrCode = spEntityFunction->GetEntityRunInfo("Chromium", browserInfo);
  328. if (browserInfo.eState == EntityState_Idle)
  329. {
  330. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("IE idle before healthmanager, maybe healthmanager have been losted.");
  331. m_bIEBeforeHealth = true;
  332. }
  333. m_fsmState = HM_FSM_STATE_COREBOOT;
  334. m_ullElapseFromOSStart = GetTickCount64();
  335. m_elapseTimeFromOSStart = m_ullElapseFromOSStart / 1000;
  336. WaitALittleIfNecessary();
  337. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState", "B");
  338. if (eErrCode != Error_Succeed)
  339. {
  340. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set RunState B failed (%s).", SpStrError(eErrCode));
  341. }
  342. bool bAsync = false;
  343. m_eStage = LOADSTAGE_COREBOOT;
  344. int ret = 0;
  345. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  346. //start entity
  347. vector<CSimpleStringA>::iterator vIt;
  348. if (m_coreBootOpt.size() == 0)
  349. goto COREBOOT_FINISH;
  350. char startMsg[128];
  351. for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++vIt)
  352. {
  353. CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
  354. it = m_coreBootOpt.find(*vIt);
  355. if (it == m_coreBootOpt.end())
  356. {
  357. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  358. continue;
  359. }
  360. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start,%s,%d", (LPCSTR)it->first, it->second.loadOpt);
  361. CEntityRunInfo entRunInfo;
  362. ErrorCodeEnum errCode = spEntityFunction->GetEntityRunInfo(it->first, entRunInfo);
  363. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  364. {
  365. it->second.eResult = LOADING_SUCCEED;
  366. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  367. if (ret == 0 || ret == 2)
  368. goto COREBOOT_FINISH;
  369. else
  370. continue;
  371. }
  372. ZeroMemory(startMsg, 128);
  373. //sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  374. //GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  375. switch (it->second.loadOpt)
  376. {
  377. case LOADOPT_IGNORE:
  378. {
  379. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  380. if (spWait != NULL)
  381. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
  382. it->second.eResult = LOADING_SUCCEED;
  383. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  384. if (ret == 0 || ret == 2)
  385. goto COREBOOT_FINISH;
  386. }
  387. break;
  388. case LOADOPT_ASYNC_VERIFY:
  389. errCode = AsyncStartEntity(it->first, NULL, NULL);
  390. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("AsyncStartEntity:%d", errCode);
  391. bAsync = true;
  392. break;
  393. case LOADOPT_SYNC_VERIFY:
  394. {
  395. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  396. if (spWait != NULL)
  397. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  398. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("(coreboot)sync...%d", errCode);
  399. if (errCode == Error_Succeed)
  400. it->second.eResult = LOADING_SUCCEED;
  401. else if (errCode == Error_TimeOut)
  402. it->second.eResult = LOADING_TIMEOUT;
  403. else
  404. it->second.eResult = LOADING_FAILED;
  405. if (errCode != Error_Succeed) {
  406. return;
  407. #if defined(RVC_OS_LINUX)
  408. ShowEntityBootFailedAtFront(it->first, errCode);
  409. return;
  410. #endif //RVC_OS_LINUX
  411. }
  412. else
  413. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  414. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s1 check ret %d", ret);
  415. if (ret == 0 || ret == 2)
  416. goto COREBOOT_FINISH;
  417. }
  418. break;
  419. default:
  420. break;
  421. }
  422. }
  423. COREBOOT_FINISH:
  424. if (!bAsync)
  425. {
  426. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  427. e->param1 = ret;
  428. PostEventFIFO(e);
  429. }
  430. else
  431. {
  432. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  433. if (ret == 0 || ret == 2)
  434. {
  435. FSMEvent* e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  436. e->param1 = ret;
  437. PostEventFIFO(e);
  438. }
  439. }
  440. return;
  441. }
  442. void CHealthManagerFSM::s1_on_exit()
  443. {
  444. LOG_FUNCTION();
  445. }
  446. unsigned int CHealthManagerFSM::s1_on_event(FSMEvent* pEvt)
  447. {
  448. LOG_FUNCTION();
  449. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s1 evt %d",pEvt->iEvt);
  450. switch(pEvt->iEvt)
  451. {
  452. case USER_EVT_COREBOOT_FINISHED:
  453. pEvt->SetHandled();
  454. if (pEvt->param1 == 2) {
  455. #if defined(RVC_OS_LINUX)
  456. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  457. #endif
  458. }
  459. return pEvt->param1;
  460. break;
  461. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  462. pEvt->SetHandled();
  463. break;
  464. default:
  465. break;
  466. }
  467. return 0;
  468. }
  469. //SafeLoad
  470. void CHealthManagerFSM::s2_on_entry()
  471. {
  472. LOG_FUNCTION();
  473. m_fsmState = HM_FSM_STATE_SAFELOAD;
  474. ErrorCodeEnum eErrCode;
  475. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState", "S");
  476. if (eErrCode != Error_Succeed)
  477. {
  478. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set RunState S failed (%d).", eErrCode);
  479. }
  480. bool bAsync = false;
  481. m_eStage = LOADSTAGE_SAFELOAD;
  482. int ret = 0;
  483. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  484. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  485. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  486. ErrorCodeEnum errCode;
  487. vector<CSimpleStringA>::iterator vIt;
  488. if (m_safeLoadOpt.size() == 0)
  489. goto SAFELOAD_FINISH;
  490. char startMsg[128];
  491. for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
  492. {
  493. CSmartPointer<IAsynWaitSp> spWait;
  494. it = m_safeLoadOpt.find(*vIt);
  495. if (it == m_safeLoadOpt.end())
  496. {
  497. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  498. continue;
  499. }
  500. CEntityRunInfo entRunInfo;
  501. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  502. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  503. {
  504. it->second.eResult = LOADING_SUCCEED;
  505. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  506. if (ret == 0 || ret == 2)
  507. goto SAFELOAD_FINISH;
  508. else
  509. continue;
  510. }
  511. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  512. switch (it->second.loadOpt)
  513. {
  514. case LOADOPT_IGNORE:
  515. {
  516. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  517. if (spWait != NULL)
  518. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  519. it->second.eResult = LOADING_SUCCEED;
  520. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  521. if (ret == 0 || ret == 2)
  522. goto SAFELOAD_FINISH;
  523. }
  524. break;
  525. case LOADOPT_ASYNC_VERIFY:
  526. AsyncStartEntity(it->first, NULL, NULL);
  527. bAsync = true;
  528. break;
  529. case LOADOPT_SYNC_VERIFY:
  530. {
  531. ZeroMemory(startMsg, 128);
  532. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  533. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  534. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  535. if (spWait != NULL)
  536. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  537. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sync...%d", errCode);
  538. if (errCode == Error_Succeed) {
  539. it->second.eResult = LOADING_SUCCEED;
  540. }
  541. else if (errCode == Error_TimeOut)
  542. it->second.eResult = LOADING_TIMEOUT;
  543. else
  544. it->second.eResult = LOADING_FAILED;
  545. if (it->second.eResult != Error_Succeed)
  546. {
  547. char tmp[128] = { 0 };
  548. if (it->first.Compare("SIPPhone", true) == 0) {
  549. if (LOADING_TIMEOUT == it->second.eResult) {
  550. sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
  551. }
  552. else {
  553. sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
  554. }
  555. }
  556. else {
  557. sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
  558. }
  559. #if defined(RVC_OS_WIN)
  560. GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  561. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tmp);//实体启动失败保存到错误页字段
  562. #else
  563. ShowEntityBootFailedAtFront(it->first, errCode);
  564. #endif
  565. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
  566. m_csErrEntity = m_csErrEntity + "|" + it->first;
  567. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  568. e->param1 = 2;//"SYNC START" enity started failed.
  569. PostEventFIFO(e);
  570. return;
  571. }
  572. //if (errCode != Error_Succeed)
  573. // return;
  574. //else
  575. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  576. if (ret == 0 || ret == 2)
  577. goto SAFELOAD_FINISH;
  578. }
  579. break;
  580. default:
  581. break;
  582. }
  583. }
  584. SAFELOAD_FINISH:
  585. if (!bAsync)
  586. {
  587. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  588. e->param1 = ret;
  589. PostEventFIFO(e);
  590. }
  591. else
  592. {
  593. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  594. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s2 %d", ret);
  595. if (ret == 0 || ret == 2)
  596. {
  597. FSMEvent* e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  598. e->param1 = ret;
  599. PostEventFIFO(e);
  600. }
  601. }
  602. SAFELOAD_END:
  603. return;
  604. }
  605. void CHealthManagerFSM::s2_on_exit()
  606. {
  607. LOG_FUNCTION();
  608. }
  609. unsigned int CHealthManagerFSM::s2_on_event(FSMEvent* pEvt)
  610. {
  611. LOG_FUNCTION();
  612. int ret = 0;
  613. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s2 event %d,%d",pEvt->iEvt,pEvt->param1);
  614. switch(pEvt->iEvt)
  615. {
  616. case USER_EVT_SAFELOAD_FINISHED:
  617. {
  618. pEvt->SetHandled();
  619. //oiltmp
  620. //according to the system varible TerminalState to do sth.
  621. //Configed
  622. //Breakdown
  623. //Blocking
  624. //Authentication
  625. {
  626. if(pEvt->param1 == 0)
  627. {
  628. //initializer if configured
  629. CSimpleStringA csTermStage("");
  630. ErrorCodeEnum eErrCode;
  631. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  632. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("after safeload to get termstage %s",(LPCTSTR)csTermStage);
  633. if (csTermStage == "B" || csTermStage == "N")
  634. return 1;
  635. }
  636. else if (pEvt->param1 == 2)
  637. {
  638. #if defined(RVC_OS_LINUX)
  639. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  640. #endif
  641. ret = 2;
  642. }
  643. }
  644. //Unsubscrible
  645. }
  646. break;
  647. case USER_EVT_SAFELOAD_EXMINE_FINISHED:
  648. if (pEvt->param1 == 0)
  649. ret = 0;
  650. //do something else oiltmp
  651. pEvt->SetHandled();
  652. break;
  653. case USER_EVT_ACCESSAUTH_FINISHED:
  654. pEvt->SetHandled();
  655. ret = pEvt->param1;
  656. break;
  657. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  658. pEvt->SetHandled();
  659. break;
  660. default:
  661. break;
  662. }
  663. return ret;
  664. }
  665. //Operating
  666. void CHealthManagerFSM::s3_on_entry()
  667. {
  668. m_fsmState = HM_FSM_STATE_OP;
  669. Sleep(m_sleepEnterOpMS);//oilyang@20220120 for temp change from 5000 to 8000 for accessauth
  670. if (m_custMngerState == CM_ENTER)
  671. {
  672. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("in CMS,no need to start hardware.");
  673. return;
  674. }
  675. ErrorCodeEnum eErrCode;
  676. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState", "O");
  677. if (eErrCode != Error_Succeed)
  678. {
  679. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set RunState O failed (%d).", eErrCode);
  680. }
  681. bool bAsync = false;
  682. m_eStage = LOADSTAGE_OPERATING;
  683. int ret = 0;
  684. map<CSimpleStringA, EntityLoadInfo>::iterator it;
  685. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  686. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  687. //start entity
  688. ErrorCodeEnum errCode;
  689. vector<CSimpleStringA>::iterator vIt;
  690. if (m_operatingOpt.size() == 0)
  691. goto OPERATING_FINISH;
  692. char startMsg[128];
  693. for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
  694. {
  695. CSmartPointer<IAsynWaitSp> spWait;
  696. it = m_operatingOpt.find(*vIt);
  697. if (it == m_operatingOpt.end())
  698. {
  699. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("cannot find %s", (LPCSTR)* vIt);
  700. continue;
  701. }
  702. CEntityRunInfo entRunInfo;
  703. errCode = pFunc->GetEntityRunInfo(it->first, entRunInfo);
  704. if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
  705. {
  706. it->second.eResult = LOADING_SUCCEED;
  707. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  708. if (ret == 0 || ret == 2)
  709. goto OPERATING_FINISH;
  710. else
  711. continue;
  712. }
  713. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("op start %s,%d", (LPCTSTR)it->first, it->second.loadOpt);
  714. switch (it->second.loadOpt)
  715. {
  716. case LOADOPT_IGNORE:
  717. {
  718. pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  719. if (spWait != NULL)
  720. spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
  721. it->second.eResult = LOADING_SUCCEED;
  722. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  723. if (ret == 0 || ret == 2)
  724. goto OPERATING_FINISH;
  725. }
  726. break;
  727. case LOADOPT_ASYNC_VERIFY:
  728. errCode = AsyncStartEntity(it->first, NULL, NULL);
  729. bAsync = true;
  730. break;
  731. case LOADOPT_SYNC_VERIFY:
  732. {
  733. ZeroMemory(startMsg, 128);
  734. sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
  735. GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
  736. errCode = pFuncPrivilege->StartEntity(it->first, NULL, spWait);
  737. if (errCode == Error_Succeed)
  738. {
  739. if (spWait != NULL)
  740. errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
  741. }
  742. else
  743. {
  744. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("StartEntity %s failed(%d).", (LPCSTR)it->first, errCode);
  745. break;
  746. }
  747. if (errCode == Error_Succeed)
  748. it->second.eResult = LOADING_SUCCEED;
  749. else if (errCode == Error_TimeOut)
  750. it->second.eResult = LOADING_TIMEOUT;
  751. else
  752. it->second.eResult = LOADING_FAILED;
  753. if (it->second.eResult != Error_Succeed)
  754. {
  755. char tmp[128] = { 0 };
  756. if (it->first.Compare("SIPPhone", true) == 0) {
  757. if (LOADING_TIMEOUT == it->second.eResult) {
  758. sprintf(tmp, "实体 %s 启动超时(%d),请尝试重启应用解决", it->first.GetData(), it->second.eResult);
  759. }
  760. else {
  761. sprintf(tmp, "实体 %s 启动失败(%d),识别不到声卡,请尝试重启计算机解决,多次无效后请联系厂商处理", it->first.GetData(), it->second.eResult);
  762. }
  763. }
  764. else {
  765. sprintf(tmp, "实体 %s 启动失败 %d", it->first.GetData(), it->second.eResult);
  766. }
  767. #if defined(RVC_OS_WIN)
  768. GetEntityBase()->GetFunction()->ShowFatalError(tmp);
  769. #else
  770. ShowEntityBootFailedAtFront(it->first, errCode);
  771. #endif
  772. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("启动失败:%s", tmp);
  773. m_csErrEntity = m_csErrEntity + "|" + it->first;
  774. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  775. e->param1 = 2;//"SYNC START" enity started failed.
  776. PostEventFIFO(e);
  777. return;
  778. }
  779. if (errCode != Error_Succeed)
  780. return;
  781. else
  782. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  783. if (ret == 0 || ret == 2)
  784. goto OPERATING_FINISH;
  785. }
  786. break;
  787. default:
  788. break;
  789. }
  790. }
  791. OPERATING_FINISH:
  792. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("s3 ret %d", ret);
  793. if (!bAsync)
  794. {
  795. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  796. e->param1 = ret;
  797. PostEventFIFO(e);
  798. }
  799. else
  800. {
  801. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  802. if (ret == 0 || ret == 2)
  803. {
  804. FSMEvent* e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  805. e->param1 = ret;
  806. PostEventFIFO(e);
  807. }
  808. }
  809. return;
  810. }
  811. void CHealthManagerFSM::s3_on_exit()
  812. {
  813. LOG_FUNCTION();
  814. }
  815. unsigned int CHealthManagerFSM::s3_on_event(FSMEvent* pEvt)
  816. {
  817. LOG_FUNCTION();
  818. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s3(Operating) event %d,%d",pEvt->iEvt,pEvt->param1);
  819. int ret = 0;
  820. switch(pEvt->iEvt)
  821. {
  822. case USER_EVT_OPERATING_FINISHED:
  823. ret = pEvt->param1;
  824. if (ret == 2) {
  825. #if defined(RVC_OS_LINUX)
  826. ShowEntityBootFailedAtFront(m_csErrEntity, Error_InvalidState);
  827. #endif
  828. }
  829. pEvt->SetHandled();
  830. break;
  831. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  832. pEvt->SetHandled();
  833. break;
  834. default:
  835. break;
  836. }
  837. return ret;
  838. }
  839. //Idle(Operating finished)
  840. void CHealthManagerFSM::s4_on_entry()
  841. {
  842. m_fsmState = HM_FSM_STATE_IDLE;
  843. LOG_FUNCTION();
  844. m_accessAuthCheckMD5 = 0;
  845. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  846. CSmartPointer<IConfigInfo> spConfig, spCerConfig;
  847. ErrorCodeEnum eErrCer = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  848. if (eErrCer != Error_Succeed) {
  849. DbgWithLink(LOG_LEVEL_WARN,LOG_TYPE_SYSTEM)("open central cfg file failed!");
  850. }
  851. else
  852. {
  853. spCerConfig->ReadConfigValueInt("AccessAuthorization", "CheckMD5", m_accessAuthCheckMD5);
  854. m_NewStartPage = "";
  855. spCerConfig->ReadConfigValue("NonExclusive", "NewStartPage", m_NewStartPage);
  856. }
  857. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("before access auth,read MD5 flag:%d",m_accessAuthCheckMD5);
  858. }
  859. void CHealthManagerFSM::s4_on_exit()
  860. {
  861. LOG_FUNCTION();
  862. }
  863. unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
  864. {
  865. LOG_FUNCTION();
  866. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s4 event %d,%d",pEvt->iEvt,pEvt->param1);
  867. switch(pEvt->iEvt)
  868. {
  869. case USER_EVT_ACCESSAUTH_FINISHED:
  870. {
  871. pEvt->SetHandled();
  872. CSimpleStringA csTermStage;
  873. ErrorCodeEnum eErrCode;
  874. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
  875. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("after accessauth to get termstage %s",(LPCTSTR)csTermStage);
  876. //oilyang@20220614 添加密钥更新逻辑
  877. if (csTermStage[0] == 'A')
  878. {
  879. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WKUpdatePeriodTask")("after auth suc,to call WKUpdatePeriodTask");
  880. WKUpdatePeriodTask* pTask = new WKUpdatePeriodTask(this);
  881. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  882. }
  883. //oilyang@20170316@comment
  884. //for user desktop,start iebrowser no matter what TerminalStage is.
  885. //if (csTermStage[0] != 'A')
  886. // break;
  887. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  888. if (eErrCode != Error_Succeed)
  889. {
  890. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState O failed (%d).",eErrCode);
  891. }
  892. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  893. CSmartPointer<IConfigInfo> spConfigRun,spCerConfig;
  894. ErrorCodeEnum eErrIE = spEntityFunction->OpenConfig(Config_Run, spConfigRun);
  895. if (eErrIE != Error_Succeed) {
  896. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("open cfg file(ie) failed!");
  897. //return err;
  898. }
  899. ErrorCodeEnum eErrCerUrl = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
  900. if (eErrCerUrl != Error_Succeed) {
  901. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("open central cfg file(ie) failed!");
  902. }
  903. //if load successfully,set FailTimes to 0
  904. spConfigRun->WriteConfigValueInt("Run","FailTimes",0);
  905. CSmartPointer<IAsynWaitSp> spWait;
  906. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
  907. CEntityRunInfo acInfo;
  908. eErrCode = spEntityFunction->GetEntityRunInfo("Chromium",acInfo);
  909. if (eErrCode == Error_Succeed && acInfo.eState == EntityState_NoStart)
  910. {
  911. }
  912. else if (eErrCode == Error_Succeed && acInfo.eState == EntityState_Idle)
  913. {//if IE/Chromium start before healthmanager,we suppose healthmanager is restart unexpectly,then set m_bEnterMainPageEver true
  914. //m_bIEBeforeHealth = true;
  915. }
  916. LogTermInfoTask* task = new LogTermInfoTask(this);
  917. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  918. if (m_iAccessAuth == AccessAuth_Fail)
  919. PostProcessAfterUpgrade();
  920. }
  921. break;
  922. case USER_EVT_MAITAIN:
  923. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  924. m_stateBeforeMaintain = m_fsmState;
  925. m_bIdleToMaintain = true;
  926. pEvt->SetHandled();
  927. break;
  928. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  929. pEvt->SetHandled();
  930. break;
  931. case USER_EVT_VTMLOADER_FINISHED:
  932. {
  933. pEvt->SetHandled();
  934. if (pEvt->iEvt == 1)
  935. {
  936. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("VtmLoader load entity failed, to Set TerminalStage C.");
  937. GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  938. break;
  939. }
  940. if (!m_bIdleToMaintain)//???no use anymore?
  941. {
  942. if (m_iAccessAuth == AccessAuth_Init)
  943. {
  944. WaitToCallAccessAuthTask* pTask = new WaitToCallAccessAuthTask(this);
  945. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  946. }
  947. }
  948. else
  949. m_bIdleToMaintain = false;
  950. }
  951. break;
  952. default:
  953. break;
  954. }
  955. return 0;
  956. }
  957. //Fault
  958. void CHealthManagerFSM::s5_on_entry()
  959. {
  960. LOG_FUNCTION();
  961. LogTermInfoTask* task = new LogTermInfoTask(this);
  962. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  963. m_fsmState = HM_FSM_STATE_FAULT;
  964. CSmartPointer<IConfigInfo> spConfigCen,spConfigRun;
  965. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_CenterSetting, spConfigCen);
  966. eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  967. int failTimes = 0,maxFailTimes = 2;
  968. do {
  969. int value(0);
  970. spConfigCen->ReadConfigValueInt(GetEntityBase()->GetEntityName(), "MaxFailTimes", value);
  971. if (value > 0) {
  972. maxFailTimes = value;
  973. }
  974. } while (false);
  975. spConfigRun->ReadConfigValueInt("Run","FailTimes",failTimes);
  976. failTimes++;
  977. LogWarn(Severity_High, Error_Unexpect, LOG_ERR_HEALTH_FAILED, "HealthManager failed.");
  978. //oilyang@20210930 add to call for Close Page
  979. GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  980. if (failTimes > maxFailTimes)
  981. {
  982. LogEvent(Severity_Middle,LOG_EVT_HEADLIGHT_RED_ON,"设备故障");
  983. eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","D");
  984. if (eErr != Error_Succeed){
  985. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set termstage D failed (%d).",eErr);
  986. }else{
  987. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("Set TerminalStage D.");
  988. }
  989. }
  990. else
  991. {
  992. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("have failed %d times.",failTimes);
  993. spConfigRun->WriteConfigValueInt("Run","FailTimes",failTimes);
  994. eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","F");
  995. if (eErr != Error_Succeed)
  996. {
  997. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState failed (%d).",eErr);
  998. }
  999. }
  1000. PostProcessAfterUpgrade();
  1001. }
  1002. void CHealthManagerFSM::s5_on_exit()
  1003. {
  1004. LOG_FUNCTION();
  1005. }
  1006. unsigned int CHealthManagerFSM::s5_on_event(FSMEvent* pEvt)
  1007. {
  1008. LOG_FUNCTION();
  1009. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s5(Fault) event %d,%d",pEvt->iEvt,pEvt->param1);
  1010. switch(pEvt->iEvt)
  1011. {
  1012. case USER_EVT_MAITAIN:
  1013. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1014. m_stateBeforeMaintain = m_fsmState;
  1015. pEvt->SetHandled();
  1016. break;
  1017. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1018. pEvt->SetHandled();
  1019. break;
  1020. case USER_EVT_ACCESSAUTH_FINISHED:
  1021. pEvt->SetHandled();
  1022. if (pEvt->param1 == 1)
  1023. {
  1024. return 1;
  1025. }
  1026. break;
  1027. default:
  1028. break;
  1029. }
  1030. return 0;
  1031. }
  1032. //Maintaining
  1033. void CHealthManagerFSM::s6_on_entry()
  1034. {
  1035. LOG_FUNCTION();
  1036. m_preFsmState = m_fsmState;
  1037. m_fsmState = HM_FSM_STATE_MAINTAINING;
  1038. ErrorCodeEnum eErrCode;
  1039. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","M");
  1040. if (eErrCode != Error_Succeed)
  1041. {
  1042. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState M failed (%d).",eErrCode);
  1043. }
  1044. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1045. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1046. if (pFuncPrivilege == NULL)
  1047. {
  1048. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("display screen NoPrivilege");
  1049. return;
  1050. }
  1051. ErrorCodeEnum eErr = pFuncPrivilege->DisplayBlueScreen("暂停服务");
  1052. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("display blue screen %d",eErr);
  1053. }
  1054. void CHealthManagerFSM::s6_on_exit()
  1055. {
  1056. LOG_FUNCTION();
  1057. }
  1058. unsigned int CHealthManagerFSM::s6_on_event(FSMEvent* pEvt)
  1059. {
  1060. LOG_FUNCTION();
  1061. int ret = 0;
  1062. switch(pEvt->iEvt)
  1063. {
  1064. case USER_EVT_MAITAIN_FINISHED:
  1065. pEvt->SetHandled();
  1066. {
  1067. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1068. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1069. if (pFuncPrivilege == NULL)
  1070. {
  1071. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("un-display screen NoPrivilege");
  1072. return 1;
  1073. }
  1074. ErrorCodeEnum eErr = pFuncPrivilege->UndisplayBlueScreen();
  1075. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("un-display blue screen %d",eErr);
  1076. if (m_stateBeforeMaintain == HM_FSM_STATE_IDLE)
  1077. {
  1078. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
  1079. if (eErr != Error_Succeed)
  1080. {
  1081. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState O failed (%d).",eErr);
  1082. }
  1083. }
  1084. ret = m_preFsmState;
  1085. }
  1086. break;
  1087. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1088. pEvt->SetHandled();
  1089. break;
  1090. default:
  1091. break;
  1092. }
  1093. return ret;
  1094. }
  1095. //PrepareOff
  1096. void CHealthManagerFSM::s7_on_entry()
  1097. {
  1098. LOG_FUNCTION();
  1099. m_fsmState = HM_FSM_STATE_PREPAREOFF;
  1100. ErrorCodeEnum eErrCode;
  1101. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","P");
  1102. if (eErrCode != Error_Succeed)
  1103. {
  1104. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState P failed (%d).",eErrCode);
  1105. }
  1106. }
  1107. void CHealthManagerFSM::s7_on_exit()
  1108. {
  1109. LOG_FUNCTION();
  1110. }
  1111. unsigned int CHealthManagerFSM::s7_on_event(FSMEvent* pEvt)
  1112. {
  1113. LOG_FUNCTION();
  1114. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s7(PrepareOff) event %d",pEvt->iEvt);
  1115. switch(pEvt->iEvt)
  1116. {
  1117. case USER_EVT_MAITAIN:
  1118. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1119. m_stateBeforeMaintain = m_fsmState;
  1120. pEvt->SetHandled();
  1121. break;
  1122. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1123. pEvt->SetHandled();
  1124. break;
  1125. default:
  1126. break;
  1127. }
  1128. return 0;
  1129. }
  1130. //Terminating
  1131. void CHealthManagerFSM::s8_on_entry()
  1132. {
  1133. LOG_FUNCTION();
  1134. m_fsmState = HM_FSM_STATE_TERMINATING;
  1135. ErrorCodeEnum eErrCode;
  1136. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","T");
  1137. if (eErrCode != Error_Succeed)
  1138. {
  1139. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState T failed (%d).",eErrCode);
  1140. }
  1141. }
  1142. void CHealthManagerFSM::s8_on_exit()
  1143. {
  1144. LOG_FUNCTION();
  1145. }
  1146. unsigned int CHealthManagerFSM::s8_on_event(FSMEvent* pEvt)
  1147. {
  1148. LOG_FUNCTION();
  1149. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s8(Terminating) event %d",pEvt->iEvt);
  1150. switch(pEvt->iEvt)
  1151. {
  1152. case USER_EVT_MAITAIN:
  1153. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1154. m_stateBeforeMaintain = m_fsmState;
  1155. pEvt->SetHandled();
  1156. break;
  1157. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1158. pEvt->SetHandled();
  1159. break;
  1160. default:
  1161. break;
  1162. }
  1163. return 0;
  1164. }
  1165. //Exitting
  1166. void CHealthManagerFSM::s9_on_entry()
  1167. {
  1168. LOG_FUNCTION();
  1169. m_fsmState = HM_FSM_STATE_EXITTING;
  1170. ErrorCodeEnum eErrCode;
  1171. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","E");
  1172. if (eErrCode != Error_Succeed)
  1173. {
  1174. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState E failed (%d).",eErrCode);
  1175. }
  1176. }
  1177. void CHealthManagerFSM::s9_on_exit()
  1178. {
  1179. LOG_FUNCTION();
  1180. }
  1181. unsigned int CHealthManagerFSM::s9_on_event(FSMEvent* pEvt)
  1182. {
  1183. LOG_FUNCTION();
  1184. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s9(Exitting) event %d",pEvt->iEvt);
  1185. switch(pEvt->iEvt)
  1186. {
  1187. case USER_EVT_MAITAIN:
  1188. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1189. m_stateBeforeMaintain = m_fsmState;
  1190. pEvt->SetHandled();
  1191. break;
  1192. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1193. pEvt->SetHandled();
  1194. break;
  1195. default:
  1196. break;
  1197. }
  1198. return 0;
  1199. }
  1200. //Sleep(L)
  1201. void CHealthManagerFSM::s10_on_entry()
  1202. {
  1203. LOG_FUNCTION();
  1204. m_fsmState = HM_FSM_STATE_SLEEP;
  1205. ErrorCodeEnum eErrCode;
  1206. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","L");
  1207. if (eErrCode != Error_Succeed)
  1208. {
  1209. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("set RunState L failed (%d).",eErrCode);
  1210. }
  1211. }
  1212. void CHealthManagerFSM::s10_on_exit()
  1213. {
  1214. LOG_FUNCTION();
  1215. }
  1216. unsigned int CHealthManagerFSM::s10_on_event(FSMEvent* pEvt)
  1217. {
  1218. LOG_FUNCTION();
  1219. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s10(Sleep) event %d",pEvt->iEvt);
  1220. switch(pEvt->iEvt)
  1221. {
  1222. case USER_EVT_MAITAIN:
  1223. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1224. m_stateBeforeMaintain = m_fsmState;
  1225. pEvt->SetHandled();
  1226. break;
  1227. case USER_EVT_ENTER_CUSTOMER_MANAGER:
  1228. pEvt->SetHandled();
  1229. break;
  1230. default:
  1231. break;
  1232. }
  1233. return 0;
  1234. }
  1235. //In Customer Manager System
  1236. void CHealthManagerFSM::s11_on_entry()
  1237. {
  1238. LOG_FUNCTION();
  1239. m_preFsmState = m_fsmState;
  1240. m_fsmState = HM_FSM_STATE_CMS;
  1241. }
  1242. void CHealthManagerFSM::s11_on_exit()
  1243. {
  1244. LOG_FUNCTION();
  1245. }
  1246. unsigned int CHealthManagerFSM::s11_on_event(FSMEvent* pEvt)
  1247. {
  1248. LOG_FUNCTION();
  1249. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("s11(In CMS) event %d",pEvt->iEvt);
  1250. int ret = 0;
  1251. switch (pEvt->iEvt)
  1252. {
  1253. case USER_EVT_MAITAIN:
  1254. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("to maintain...");
  1255. m_stateBeforeMaintain = m_fsmState;
  1256. pEvt->SetHandled();
  1257. break;
  1258. case USER_EVT_SWITCH_BACK_TO_RVC:
  1259. pEvt->SetHandled();
  1260. ret = m_preFsmState;
  1261. break;
  1262. default:
  1263. break;
  1264. }
  1265. return ret;
  1266. }
  1267. int CHealthManagerFSM::WaitDeamonFinish()
  1268. {
  1269. int count = 0;
  1270. while(1)//max waiting time
  1271. {
  1272. count++;
  1273. //query if update deamon process is started oiltmp
  1274. //case custody
  1275. //case needreboot
  1276. //case rollback
  1277. //case timeout
  1278. if (count > 2)
  1279. break;
  1280. //Sleep(5000);
  1281. }
  1282. /** 添加此操作以让状态机停留在s0状态 [Gifur@20211017]*/
  1283. if (mCofigMode) {
  1284. return 1;
  1285. }
  1286. return 0;
  1287. }
  1288. //0:auth suc or have already authed;1:auth failed;
  1289. int CHealthManagerFSM::AccessAuthDoWork()
  1290. {
  1291. LOG_FUNCTION();
  1292. //to check if PinPad is ok, wait for 5 seconds,then go on
  1293. //RVC.CardStore have no PinPad
  1294. int waitCount = 0;
  1295. while (waitCount < 5)
  1296. {
  1297. if (m_bPinPadOpenSuc || m_sysInfo.strMachineType.Compare("RVC.CardStore",true) == 0)
  1298. break;
  1299. else
  1300. {
  1301. Sleep(1000);
  1302. waitCount++;
  1303. }
  1304. }
  1305. m_bInAccessAuthDoWork = true;
  1306. CSimpleStringA csTermStage("");
  1307. ErrorCodeEnum eErr;
  1308. eErr = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  1309. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("oninit get termstage %s", (LPCTSTR)csTermStage);
  1310. bool bToDoInit = false;
  1311. if (eErr == Error_Succeed)
  1312. {
  1313. }
  1314. else
  1315. {
  1316. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("get TerminalStage failed(%d).", eErr);
  1317. m_bInAccessAuthDoWork = false;
  1318. return 1;
  1319. }
  1320. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("after proc initialization.");
  1321. if (bToDoInit)
  1322. {
  1323. if (m_bInitSuc)
  1324. {
  1325. }
  1326. else
  1327. {
  1328. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("initialization failed.");
  1329. m_bInAccessAuthDoWork = false;
  1330. return 1;
  1331. }
  1332. }
  1333. //to accessauth
  1334. ErrorCodeEnum eErrCode;
  1335. eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTermStage);
  1336. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("before accessauth get termstage %s", (LPCTSTR)csTermStage);
  1337. if (eErrCode == Error_Succeed)
  1338. {
  1339. //if (csTermStage[0] == 'C' || csTermStage[0] == 'A')
  1340. if (csTermStage[0] != 'U')
  1341. {
  1342. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1343. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1344. {
  1345. CEntityRunInfo acInfo;
  1346. eErrCode = pFunc->GetEntityRunInfo("AccessAuthorization", acInfo);
  1347. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("AccessAuth state return %d", eErrCode);
  1348. if (eErrCode == Error_Succeed)
  1349. {
  1350. switch (acInfo.eState)
  1351. {
  1352. case EntityState_NoStart:
  1353. {
  1354. CSmartPointer<IAsynWaitSp> spWaitAC;
  1355. eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization", NULL, spWaitAC);
  1356. eErrCode = spWaitAC->WaitAnswer(MAX_AYSNC_TIMEOUT);
  1357. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("start accessauth %d.", eErrCode);
  1358. }
  1359. break;
  1360. case EntityState_Idle:
  1361. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("AccessAuth state idle.");
  1362. break;
  1363. default:
  1364. break;
  1365. }
  1366. if (m_pACClient == NULL)
  1367. {
  1368. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  1369. eErrCode = m_pACClient->Connect();
  1370. if (eErrCode != Error_Succeed) {
  1371. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("accessauth connected failed.");
  1372. m_pACClient->SafeDelete();
  1373. m_pACClient = NULL;
  1374. m_bInAccessAuthDoWork = false;
  1375. return 1;
  1376. }
  1377. else {
  1378. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("accessauth connected.");
  1379. }
  1380. }
  1381. }
  1382. else
  1383. {
  1384. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("Get AccessAuth RunInfo failed(%d).", eErrCode);
  1385. m_bInAccessAuthDoWork = false;
  1386. return 1;
  1387. }
  1388. if (m_pACClient != NULL)
  1389. {
  1390. DWORD dwStart = GetTickCountRVC();
  1391. int registCount = 0;
  1392. #if defined(RVC_OS_WIN)
  1393. GetEntityBase()->GetFunction()->ShowStartupInfo("正在准入");
  1394. #endif
  1395. REGIST:
  1396. //存在循环刷数据的情况,暂时不记这个,只记失败
  1397. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10301")();
  1398. eErrCode = (*m_pACClient)(EntityResource::getLink().upgradeLink())->Regist();
  1399. m_bHasAuthEver = true;
  1400. registCount++;
  1401. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("accessauth regist %d", eErrCode);
  1402. if (eErrCode == Error_Succeed)
  1403. {
  1404. do {
  1405. if (m_iAccessAuth == AccessAuth_Suc || m_iAccessAuth == AccessAuth_Fail)
  1406. break;
  1407. Sleep(1000);
  1408. } while (1);
  1409. m_bFirstAccessAuth = false;
  1410. m_bInAccessAuthDoWork = false;
  1411. return 0;
  1412. }
  1413. else
  1414. {
  1415. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501Z10301").setResultCode("RTA5102")("call accessauth Regist failed:%d", eErrCode);
  1416. m_bInAccessAuthDoWork = false;
  1417. return 1;
  1418. }
  1419. }
  1420. else
  1421. {
  1422. m_bInAccessAuthDoWork = false;
  1423. return 1;
  1424. }
  1425. }
  1426. }
  1427. else
  1428. {
  1429. m_bInAccessAuthDoWork = false;
  1430. return 0;
  1431. }
  1432. }
  1433. else {
  1434. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AccessAuthDoWork")("Get termstage failed(%d).", eErrCode);
  1435. }
  1436. m_bInAccessAuthDoWork = false;
  1437. return 1;
  1438. }
  1439. //return value:
  1440. //0:all entity have started suc
  1441. //1:some entity havn't try to start
  1442. //2:all entity have tried to started,but some failed
  1443. int CHealthManagerFSM::CheckLoadResult(LoadStage eStage)
  1444. {
  1445. int ret = 0;
  1446. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1447. if (eStage == LOADSTAGE_COREBOOT)
  1448. it = m_coreBootOpt.begin();
  1449. else if (eStage == LOADSTAGE_SAFELOAD)
  1450. it = m_safeLoadOpt.begin();
  1451. else
  1452. it = m_operatingOpt.begin();
  1453. while(1)
  1454. {
  1455. switch(it->second.loadOpt)
  1456. {
  1457. case LOADOPT_IGNORE:
  1458. if (it->second.eResult == LOADING_INIT)
  1459. return 1;
  1460. break;
  1461. case LOADOPT_ASYNC_VERIFY:
  1462. case LOADOPT_SYNC_VERIFY:
  1463. default:
  1464. if (it->second.eResult == LOADING_INIT)
  1465. return 3;
  1466. else if (it->second.eResult != LOADING_SUCCEED)
  1467. {
  1468. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode("QLR0402501Z10201").setResultCode("RTA5101")("%s start failed", m_csErrEntity);
  1469. m_csErrEntity = m_csErrEntity + "|" + it->first;
  1470. ret = 2;
  1471. }
  1472. break;
  1473. }
  1474. it++;
  1475. if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
  1476. break;
  1477. else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
  1478. break;
  1479. else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
  1480. break;
  1481. }
  1482. if (ret == 0) {
  1483. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode("QLR0402501Z10201")("entity start succ");
  1484. }
  1485. return ret;
  1486. }
  1487. void CHealthManagerFSM::SetAccessAuth(int bResult)
  1488. {
  1489. m_iAccessAuth = bResult;
  1490. ErrorCodeEnum eErrCode;
  1491. if (bResult == AccessAuth_Suc)
  1492. {
  1493. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "A");
  1494. }
  1495. else if (bResult == AccessAuth_servFail) //准入服务端返回失败
  1496. {
  1497. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "S");
  1498. }
  1499. else //准入其他失败
  1500. {
  1501. eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
  1502. }
  1503. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("SetAccessAuth")("SetAccessAuth %d",bResult);
  1504. }
  1505. void CHealthManagerFSM::ToReAccessAuth(bool bEver)
  1506. {
  1507. Sleep(1500);//for function "AccessAuthDoWork" to quit while
  1508. if (m_bFirstAccessAuth)
  1509. return;
  1510. ToCallAccessAuthDoWork();
  1511. }
  1512. ErrorCodeEnum CHealthManagerFSM::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
  1513. {
  1514. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1515. ErrorCodeEnum errCode;
  1516. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1517. if (pFuncPrivilege != NULL) {
  1518. CSmartPointer<IAsynWaitSp> spWait;
  1519. errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
  1520. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("AsyncStartEntity")("start entity %s",entity_name);
  1521. if (errCode == Error_Succeed) {
  1522. callback_entry *entry = new callback_entry();
  1523. entry->pRawData = pData;
  1524. entry->EntityName = entity_name;
  1525. entry->ErrorResult = Error_Unexpect;
  1526. entry->op = OP_START_ENTITY;
  1527. if (spWait != NULL)
  1528. spWait->SetCallback(this, entry);
  1529. }
  1530. return errCode;
  1531. } else {
  1532. return Error_NoPrivilege;
  1533. }
  1534. }
  1535. ErrorCodeEnum CHealthManagerFSM::AsyncStopEntity(const char *entity_name, void *pData)
  1536. {
  1537. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1538. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1539. if (pFuncPrivilege != NULL) {
  1540. CSmartPointer<IAsynWaitSp> spWait;
  1541. ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
  1542. if (Error == Error_Succeed) {
  1543. callback_entry *entry = new callback_entry();
  1544. entry->pRawData = pData;
  1545. entry->EntityName = entity_name;
  1546. entry->ErrorResult = Error_Unexpect;
  1547. entry->op = OP_STOP_ENTITY;
  1548. if (spWait != NULL)
  1549. spWait->SetCallback(this, entry);
  1550. }
  1551. return Error;
  1552. } else {
  1553. return Error_NoPrivilege;
  1554. }
  1555. }
  1556. ErrorCodeEnum CHealthManagerFSM::AsyncPauseEntity(const char *entity_name, void *pData)
  1557. {
  1558. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1559. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1560. if (pFuncPrivilege != NULL) {
  1561. CSmartPointer<IAsynWaitSp> spWait;
  1562. ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
  1563. if (Error == Error_Succeed) {
  1564. callback_entry *entry = new callback_entry();
  1565. entry->pRawData = pData;
  1566. entry->EntityName = entity_name;
  1567. entry->ErrorResult = Error_Unexpect;
  1568. entry->op = OP_PAUSE_ENTITY;
  1569. if (spWait != NULL)
  1570. spWait->SetCallback(this, entry);
  1571. }
  1572. return Error;
  1573. } else {
  1574. return Error_NoPrivilege;
  1575. }
  1576. }
  1577. ErrorCodeEnum CHealthManagerFSM::AsyncContinueEntity(const char *entity_name, void *pData)
  1578. {
  1579. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1580. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1581. if (pFuncPrivilege != NULL) {
  1582. CSmartPointer<IAsynWaitSp> spWait;
  1583. ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
  1584. if (Error == Error_Succeed) {
  1585. callback_entry *entry = new callback_entry();
  1586. entry->pRawData = pData;
  1587. entry->EntityName = entity_name;
  1588. entry->ErrorResult = Error_Unexpect;
  1589. entry->op = OP_CONTINUE_ENTITY;
  1590. if (spWait != NULL)
  1591. spWait->SetCallback(this, entry);
  1592. }
  1593. return Error;
  1594. } else {
  1595. return Error_NoPrivilege;
  1596. }
  1597. }
  1598. ErrorCodeEnum CHealthManagerFSM::AsyncTerminateEntity(const char *entity_name, void *pData)
  1599. {
  1600. CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
  1601. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1602. if (pFuncPrivilege != NULL) {
  1603. CSmartPointer<IAsynWaitSp> spWait;
  1604. ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
  1605. if (Error == Error_Succeed) {
  1606. callback_entry *entry = new callback_entry();
  1607. entry->pRawData = pData;
  1608. entry->EntityName = entity_name;
  1609. entry->ErrorResult = Error_Unexpect;
  1610. entry->op = OP_TERMINATE_ENTITY;
  1611. if (spWait != NULL)
  1612. spWait->SetCallback(this, entry);
  1613. }
  1614. return Error;
  1615. } else {
  1616. return Error_NoPrivilege;
  1617. }
  1618. }
  1619. void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
  1620. {
  1621. CSmartPointer<ICallbackListener> spCallback;
  1622. CSmartPointer<IReleasable> pData;
  1623. pAsynWaitSp->GetCallback(spCallback, pData);
  1624. callback_entry *entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
  1625. entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
  1626. callback_entry *new_entry = new callback_entry();
  1627. new_entry->EntityName = entry->EntityName;
  1628. new_entry->ErrorResult = entry->ErrorResult;
  1629. new_entry->op = entry->op;
  1630. new_entry->state = entry->state;
  1631. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1632. int ret;
  1633. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnAnswer")("stage %d,%s,result %d",m_eStage,(LPCSTR)new_entry->EntityName,new_entry->ErrorResult);
  1634. switch(m_eStage)
  1635. {
  1636. case LOADSTAGE_COREBOOT:
  1637. it = m_coreBootOpt.find(new_entry->EntityName);
  1638. if (it != m_coreBootOpt.end())
  1639. {
  1640. if (new_entry->ErrorResult == Error_Succeed)
  1641. it->second.eResult = LOADING_SUCCEED;
  1642. else if (new_entry->ErrorResult == Error_TimeOut)
  1643. it->second.eResult = LOADING_TIMEOUT;
  1644. else
  1645. it->second.eResult = LOADING_FAILED;
  1646. if (it->second.eResult != Error_Succeed)
  1647. {
  1648. char tmp[64] = {0};
  1649. sprintf(tmp, "实体 %s 启动失败-----", it->first.GetData());
  1650. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnAnswer")("启动失败:%s -----", tmp);
  1651. }
  1652. ret = CheckLoadResult(LOADSTAGE_COREBOOT);
  1653. if (ret == 0 || ret == 2)
  1654. {
  1655. FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
  1656. e->param1 = ret;
  1657. PostEventFIFO(e);
  1658. }
  1659. }
  1660. break;
  1661. case LOADSTAGE_SAFELOAD:
  1662. it = m_safeLoadOpt.find(new_entry->EntityName);
  1663. if (it != m_safeLoadOpt.end())
  1664. {
  1665. if (new_entry->ErrorResult == Error_Succeed)
  1666. it->second.eResult = LOADING_SUCCEED;
  1667. else if (new_entry->ErrorResult == Error_TimeOut)
  1668. it->second.eResult = LOADING_TIMEOUT;
  1669. else
  1670. it->second.eResult = LOADING_FAILED;
  1671. ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
  1672. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnAnswer")("safeload answer %d",ret);
  1673. if (ret == 0 || ret == 2)
  1674. {
  1675. FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
  1676. e->param1 = ret;
  1677. PostEventFIFO(e);
  1678. }
  1679. }else{
  1680. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("OnAnswer")("cannot find %s",(LPCTSTR)new_entry->EntityName);
  1681. }
  1682. break;
  1683. case LOADSTAGE_OPERATING:
  1684. it = m_operatingOpt.find(new_entry->EntityName);
  1685. if (it != m_operatingOpt.end())
  1686. {
  1687. if (new_entry->ErrorResult == Error_Succeed)
  1688. it->second.eResult = LOADING_SUCCEED;
  1689. else if (new_entry->ErrorResult == Error_TimeOut)
  1690. it->second.eResult = LOADING_TIMEOUT;
  1691. else
  1692. it->second.eResult = LOADING_FAILED;
  1693. ret = CheckLoadResult(LOADSTAGE_OPERATING);
  1694. if (ret == 0 || ret == 2)
  1695. {
  1696. FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
  1697. e->param1 = ret;
  1698. PostEventFIFO(e);
  1699. }
  1700. }
  1701. break;
  1702. default:
  1703. break;
  1704. }
  1705. }
  1706. CSimpleStringA CHealthManagerFSM::GetEntityCfgInfo(CSimpleStringA name,int &loadOpt)
  1707. {
  1708. CSimpleStringA entityList(""),csBrowserName("IEBrowser");
  1709. if (!name.IsNullOrEmpty() && name.Compare("AllConfiguredEntity") == 0)
  1710. {
  1711. for (auto itor = m_vAllCfgEntity.cbegin(); itor != m_vAllCfgEntity.cend(); itor++)
  1712. {
  1713. entityList += (*itor) + ",";
  1714. }
  1715. return entityList;
  1716. }
  1717. csBrowserName = "Chromium";
  1718. if (!name.IsNullOrEmpty() && name.Compare(csBrowserName.GetData()) == 0)
  1719. {
  1720. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("GetEntityCfgInfo")("IE/Chromium just return 2");
  1721. loadOpt = 2;
  1722. return "";
  1723. }
  1724. map<CSimpleStringA,EntityLoadInfo>::iterator it;
  1725. for (it = m_coreBootOpt.begin(); it != m_coreBootOpt.end(); ++it)
  1726. {
  1727. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1728. {
  1729. loadOpt = it->second.loadOpt;
  1730. return "";
  1731. }
  1732. }
  1733. for (it = m_safeLoadOpt.begin(); it != m_safeLoadOpt.end(); ++it)
  1734. {
  1735. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1736. {
  1737. loadOpt = it->second.loadOpt;
  1738. return "";
  1739. }
  1740. }
  1741. for (it = m_operatingOpt.begin(); it != m_operatingOpt.end(); ++it)
  1742. {
  1743. if (_strnicmp(name,it->first,name.GetLength()) == 0)
  1744. {
  1745. loadOpt = it->second.loadOpt;
  1746. return "";
  1747. }
  1748. }
  1749. loadOpt = 99;
  1750. return "";
  1751. }
  1752. ErrorCodeEnum CHealthManagerFSM::QueryCheckCode(CSimpleStringA& csCkCode, bool bMaster)
  1753. {
  1754. ErrorCodeEnum eErr = Error_Unexpect;
  1755. CSimpleStringA tmpCheckCode("");
  1756. PinPadService_ClientBase *pClient = new PinPadService_ClientBase(this->m_pEntity);
  1757. if (pClient != NULL)
  1758. {
  1759. eErr = pClient->Connect();
  1760. if (eErr == Error_Succeed)
  1761. {
  1762. PinPadService_QueryFunc_Req reqQ;
  1763. PinPadService_QueryFunc_Ans ansQ;
  1764. eErr = (*pClient)(EntityResource::getLink().upgradeLink())->QueryFunc(reqQ, ansQ, 5000);
  1765. if (eErr == Error_Succeed)
  1766. {
  1767. PinPadService_GetCheckCode_Req reqG;
  1768. PinPadService_GetCheckCode_Ans ansG;
  1769. //oilyang@20220425 sm only,no more 3des
  1770. //if (ansQ.reserved1 == 2)//if sm only
  1771. {
  1772. reqG.mSN.Init(1);
  1773. reqG.wSN.Init(1);
  1774. reqG.mSN[0] = 1;
  1775. if (bMaster)
  1776. reqG.wSN[0] = 99;
  1777. else
  1778. reqG.wSN[0] = 0;
  1779. eErr = (*pClient)(EntityResource::getLink().upgradeLink())->GetCheckCode(reqG, ansG, 10000);
  1780. if (eErr == Error_Succeed)
  1781. {
  1782. tmpCheckCode = ansG.checkcode[0];
  1783. }
  1784. }
  1785. //else//3des only or 3des&sm both ok
  1786. //{
  1787. // reqG.mSN.Init(1);
  1788. // reqG.wSN.Init(1);
  1789. // reqG.mSN[0] = 0;
  1790. // if (bMaster)
  1791. // reqG.wSN[0] = 99;
  1792. // else
  1793. // reqG.wSN[0] = 0;
  1794. // eErr = (*pClient)(EntityResource::getLink().upgradeLink())->GetCheckCode(reqG, ansG, 10000);
  1795. // if (eErr == Error_Succeed)
  1796. // {
  1797. // tmpCheckCode = ansG.checkcode[0];
  1798. // }
  1799. //}
  1800. }else{
  1801. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("QueryCheckCode")("QueryFunc failed.error code:%d",eErr);
  1802. }
  1803. }else{
  1804. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("QueryCheckCode")("connect to pinpad failed.error code:%d",eErr);
  1805. }
  1806. }
  1807. csCkCode = tmpCheckCode;
  1808. return eErr;
  1809. }
  1810. int CHealthManagerFSM::QuitFrameworkAndSaveInfo(RebootTriggerEnum eTrigger, RebootWayEnum eWay)
  1811. {
  1812. CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
  1813. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  1814. if (pFuncPrivilege == NULL) {
  1815. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("has no privilege");
  1816. return (int)(Error_NoPrivilege);
  1817. }
  1818. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("quit framework and info %d,%d.", eTrigger, eWay);
  1819. const auto result = pFuncPrivilege->Reboot(eTrigger, eWay);
  1820. return (int)result;
  1821. }
  1822. void CHealthManagerFSM::PostProcessAfterUpgrade()
  1823. {
  1824. LOG_FUNCTION();
  1825. if (IfInUpgradeProcess())
  1826. {
  1827. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("exist upgrade flag file,to decide if restart framework.");
  1828. //存在升级后的启动文件
  1829. CSmartPointer<IConfigInfo> spConfigRun;
  1830. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  1831. if (eErr == Error_Succeed)
  1832. {
  1833. int restartOSTime = 0;
  1834. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartOSTimes", restartOSTime);
  1835. if(restartOSTime==1){
  1836. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("PostProcessAfterUpgrade")("升级切换已重启过系统");
  1837. //重启过的系统过的升级,在重试一定次数后等guardian 10分钟回退
  1838. int xTimes = 0;
  1839. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  1840. if (xTimes < 3)
  1841. {
  1842. xTimes++;
  1843. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("PostProcessAfterUpgrade")("写入: UpgradeRestartTimes:%d", xTimes);
  1844. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  1845. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  1846. }
  1847. }else{
  1848. //未重启过操作系统
  1849. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("PostProcessAfterUpgrade")("升级切换未重启过系统");
  1850. int xTimes = 0;
  1851. spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  1852. if (xTimes < 3)
  1853. {
  1854. xTimes++;
  1855. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("PostProcessAfterUpgrade")("写入: UpgradeRestartTimes:%d", xTimes);
  1856. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
  1857. //oilyang@20211130 change from 3 to 2
  1858. if (xTimes == 2)
  1859. {
  1860. //重启操作系统前把重启框架次数重置,重启OS次数置为1
  1861. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("PostProcessAfterUpgrade")("准备尝试重启系统后再切换升级");
  1862. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", 0);
  1863. spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartOSTimes", 1);
  1864. Sleep(2000);
  1865. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_OS);
  1866. }
  1867. else
  1868. QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
  1869. }
  1870. }
  1871. }
  1872. }
  1873. }
  1874. void CHealthManagerFSM::SaveOsVersion()
  1875. {
  1876. #if defined(RVC_OS_WIN)
  1877. CSimpleStringA runInfoPath;
  1878. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  1879. if (eErr != Error_Succeed) {
  1880. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("GetPath runinfo error=%d.", eErr);
  1881. return;
  1882. }
  1883. runInfoPath += "\\runcfg\\osverion";
  1884. ifstream is;
  1885. is.open(runInfoPath.GetData(), ios::binary);
  1886. if (!is.is_open())
  1887. {
  1888. DWORD dwErr = GetLastError();
  1889. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("open runcfg\\osverion file failed. [%d]", dwErr);
  1890. CSimpleStringA csCmd;
  1891. csCmd = CSimpleStringA::Format("cmd /c ver >%s", runInfoPath);
  1892. WinExec((LPCSTR)csCmd, SW_HIDE);
  1893. }
  1894. #endif
  1895. return;
  1896. }
  1897. CSimpleStringA CHealthManagerFSM::GetOsVersion()
  1898. {
  1899. #if defined(RVC_OS_WIN)
  1900. CSimpleStringA runInfoPath;
  1901. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("runinfo", runInfoPath);
  1902. if (eErr != Error_Succeed) {
  1903. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("GetOsVersion")("GetPath runinfo error=%d.", eErr);
  1904. return "";
  1905. }
  1906. runInfoPath += "\\runcfg\\osverion";
  1907. ifstream is;
  1908. is.open(runInfoPath.GetData(), ios::binary);
  1909. if (!is.is_open())
  1910. {
  1911. DWORD dwErr = GetLastError();
  1912. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("GetOsVersion")("open runcfg\\osverion file failed. [%d]", dwErr);
  1913. return "";
  1914. }
  1915. string line;
  1916. while(!is.eof()){
  1917. getline(is, line);
  1918. int start = line.find("版本");
  1919. if (start > 0)
  1920. return CSimpleStringA(line.substr(start + 5, line.length() - start - 7).c_str());
  1921. else
  1922. continue;
  1923. }
  1924. return "";
  1925. #else
  1926. const char filePath[] = "/etc/os-version";
  1927. CSimpleStringA strVersion;
  1928. char tmp[33];
  1929. memset(tmp, 0, 33);
  1930. inifile_read_str_s("Version", "MajorVersion", "unknown", tmp, 32, filePath);
  1931. strVersion = tmp;
  1932. strVersion += ".";
  1933. memset(tmp, 0, 33);
  1934. inifile_read_str_s("Version", "MinorVersion", "unknown", tmp, 32, filePath);
  1935. strVersion += tmp;
  1936. strVersion += ".";
  1937. memset(tmp, 0, 33);
  1938. inifile_read_str_s("Version", "OsBuild", "unknown", tmp, 32, filePath);
  1939. strVersion += tmp;
  1940. return strVersion;
  1941. #endif
  1942. }
  1943. CSimpleStringA CHealthManagerFSM::GetPathInfo()
  1944. {
  1945. CSimpleStringA result("");
  1946. CAutoArray<CSimpleStringA> arrSections, arrKeys;
  1947. CSmartPointer<IConfigInfo> spRootConfig;
  1948. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  1949. spEntityFunction->OpenConfig(Config_Root, spRootConfig);
  1950. ErrorCodeEnum errCode = spRootConfig->ReadAllSections(arrSections);
  1951. if(Error_Succeed != errCode){
  1952. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("GetPathInfo sections failed.");
  1953. return result;
  1954. }
  1955. if(arrSections.GetCount() == 0){
  1956. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Has no section in root.");
  1957. return result;
  1958. }
  1959. for(int i = 0; i < arrSections.GetCount(); ++i)
  1960. {
  1961. if(arrSections[i].Compare("Path") == 0){
  1962. spRootConfig->ReadAllKeys(arrSections[i].GetData(), arrKeys);
  1963. for (int j = 0; j < arrKeys.GetCount(); ++j)
  1964. {
  1965. CSimpleStringA strValue, strMsg;
  1966. spRootConfig->ReadConfigValue(arrSections[i].GetData(), arrKeys[j].GetData(), strValue);
  1967. strMsg = CSimpleStringA::Format("{\"%s\":\"%s\"}", arrKeys[j].GetData(), strValue.GetData());
  1968. result = (j == arrKeys.GetCount() - 1) ? result + strMsg : result + strMsg + ",";
  1969. }
  1970. break;
  1971. }
  1972. }
  1973. return result;
  1974. }
  1975. #if defined(RVC_OS_WIN)
  1976. const char* dmi_string(const dmi_header* dm, BYTE s)
  1977. {
  1978. char* bp = (char*)dm;
  1979. size_t i, len;
  1980. if (s == 0)
  1981. return "Not Specified";
  1982. bp += dm->length;
  1983. while (s > 1 && *bp)
  1984. {
  1985. bp += strlen(bp);
  1986. bp++;
  1987. s--;
  1988. }
  1989. if (!*bp)
  1990. return "BAD_INDEX";
  1991. /* ASCII filtering */
  1992. len = strlen(bp);
  1993. for (i = 0; i < len; i++)
  1994. if (bp[i] < 32 || bp[i] == 127)
  1995. bp[i] = '.';
  1996. return bp;
  1997. }
  1998. void CHealthManagerFSM::QueryComputerInfo()
  1999. {
  2000. int ret = 0;
  2001. RawSMBIOSData* Smbios;
  2002. dmi_header* h = NULL;
  2003. int flag = 1;
  2004. ret = GetSystemFirmwareTable('RSMB', 0, 0, 0);
  2005. if (!ret)
  2006. {
  2007. Dbg("Function failed!");
  2008. return;
  2009. }
  2010. DWORD bufsize = ret;
  2011. char* buf = new char[bufsize];
  2012. memset(buf, 0, bufsize);
  2013. ret = GetSystemFirmwareTable('RSMB', 0, buf, bufsize);
  2014. if (!ret)
  2015. {
  2016. Dbg("Function failed!");
  2017. delete[]buf;
  2018. return;
  2019. }
  2020. Smbios = (RawSMBIOSData*)buf;
  2021. BYTE* p = Smbios->SMBIOSTableData;
  2022. if (Smbios->Length != bufsize - 8)
  2023. {
  2024. Dbg("Smbios length error");
  2025. delete[]buf;
  2026. return;
  2027. }
  2028. for (int i = 0; i < Smbios->Length; i++) {
  2029. h = (dmi_header*)p;
  2030. if (h->type == 1)
  2031. {
  2032. m_computerInfo["Manufacturer"] = dmi_string(h, p[0x4]);
  2033. m_computerInfo["ComputerName"] = dmi_string(h, p[0x5]);
  2034. m_computerInfo["ComputerVersion"] = dmi_string(h, p[0x6]);
  2035. m_computerInfo["SerialNumber"] = dmi_string(h, p[0x7]);
  2036. break;
  2037. }
  2038. p += h->length;
  2039. while ((*(WORD*)p) != 0) p++;
  2040. p += 2;
  2041. }
  2042. delete[]buf;
  2043. }
  2044. #endif //RVC_OS_WIN
  2045. DWORD GetDualTime(SYSTEMTIME& t1, SYSTEMTIME& t2)
  2046. {
  2047. //assume t2 > t1...
  2048. //oiltest for simple
  2049. int s1, s2;
  2050. s1 = (t1.wMinute * 60 + t1.wSecond) * 1000 + t1.wMilliseconds;
  2051. s2 = (t2.wMinute * 60 + t2.wSecond) * 1000 + t2.wMilliseconds;
  2052. return s2 - s1;
  2053. }
  2054. void CHealthManagerFSM::ToLogWarnTermAboutInfo()
  2055. {
  2056. LOG_FUNCTION();
  2057. bool bTmpEtyNewStart = m_bEntityNewStart;
  2058. if (m_bEntityNewStart)
  2059. {
  2060. SYSTEMTIME shellStartTime;
  2061. ULONGLONG totalCost = 0;
  2062. m_bEntityNewStart = false;
  2063. CAutoArray<CSimpleStringA> strEntityNames;
  2064. CAutoArray<int> strEntityIdx;
  2065. CAutoArray<CEntityStartInfo> Infos;
  2066. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetAllEntityStartInfo(strEntityNames, strEntityIdx, Infos);
  2067. for (int i = 0; i < Infos.GetCount(); ++i)
  2068. {
  2069. if (strEntityIdx[i] == 0)
  2070. {
  2071. shellStartTime = Infos[i].startTime;
  2072. ULONGLONG dwElapseNow = GetTickCount64();
  2073. totalCost = dwElapseNow - m_ullElapseFromOSStart;
  2074. LogWarn(Severity_Low, Error_Debug, LOG_TRACE_ENTITY_START_TIME,
  2075. SP::Module::Util::generateConsumeTimeJson("total", SP::Module::Util::formatTime(shellStartTime).c_str(), totalCost).GetData());
  2076. }
  2077. LogWarn(Severity_Low, Error_Debug, LOG_TRACE_ENTITY_START_TIME,
  2078. SP::Module::Util::generateConsumeTimeJson(strEntityNames[i], SP::Module::Util::formatTime(Infos[i].startTime).c_str(), GetDualTime(Infos[i].startTime, Infos[i].startEndTime)).GetData());
  2079. }
  2080. }
  2081. CSimpleStringA csOSVerion(""), csWarnMsg("");
  2082. std::map<std::string, std::string> termInfo;
  2083. std::map<std::string, std::string> pcInfo;
  2084. termInfo["version"] = m_sysInfo.InstallVersion.ToString();
  2085. if (!m_csErrEntity.IsNullOrEmpty())
  2086. {
  2087. termInfo["ErrEntity"] = m_csErrEntity;
  2088. CSimpleStringA tErr = CSimpleStringA::Format("实体启动失败:%s", m_csErrEntity.SubString(1).GetData());
  2089. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("auth错误信息为:%s.", tErr.GetData());
  2090. CSimpleStringA tmp;
  2091. GetEntityBase()->GetFunction()->GetSysVar("AuthErrMsg", tmp);//获取当前已保存的报错信息
  2092. if (tmp.GetLength() <= 3)
  2093. {
  2094. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", tErr.GetData());//实体启动失败保存到错误页字段
  2095. }
  2096. }
  2097. termInfo["AccessAuth"] = (m_iAccessAuth == AccessAuth_Suc)?"T":"F";//oiltmp modify to init/fail/suc?
  2098. csOSVerion = GetOsVersion();
  2099. if (!csOSVerion.IsNullOrEmpty())
  2100. termInfo["OSVersion"] = csOSVerion;
  2101. pcInfo["TerminalNo"] = m_sysInfo.strTerminalID;//20220704 add by zjw
  2102. pcInfo["MachineType"] = m_sysInfo.strMachineType;
  2103. pcInfo["MachineVersion"] = CSimpleStringA::Format("%d.%d", m_sysInfo.MachineVersion.GetMajor(), m_sysInfo.MachineVersion.GetMinor());
  2104. pcInfo["Screen"] = CSimpleStringA::Format("%d", m_sysInfo.eScreen);
  2105. pcInfo["Site"] = m_sysInfo.strSite;
  2106. pcInfo["EnrolGPS"] = CSimpleStringA::Format("%.3f,%.3f", m_sysInfo.EnrolGPS.GetLongitude(), m_sysInfo.EnrolGPS.GetLatitude());
  2107. pcInfo["EnrolAddr"] = m_sysInfo.strEnrolAddr;
  2108. #if defined(RVC_OS_WIN)
  2109. termInfo["OSType"] = "Windows";
  2110. QueryComputerInfo();
  2111. pcInfo["Manufacturer"] = m_computerInfo["Manufacturer"];
  2112. pcInfo["ComputerName"] = m_computerInfo["ComputerName"];
  2113. pcInfo["ComputerVersion"] = m_computerInfo["ComputerVersion"];
  2114. pcInfo["SerialNumber"] = m_computerInfo["SerialNumber"];
  2115. std::string strOSVersionName, strOSArch;
  2116. CSystemStatus tempStatus;
  2117. tempStatus.GetOsInfo(strOSVersionName, strOSArch);
  2118. if (!strOSArch.empty()) {
  2119. pcInfo["SystemArch"] = strOSArch;
  2120. }
  2121. #else
  2122. termInfo["OSType"] = "UOS";
  2123. pcInfo["Manufacturer"] = m_sysInfo.strManufacturer.IsNullOrEmpty() ? "": m_sysInfo.strManufacturer.GetData();
  2124. pcInfo["MachineModel"] = m_sysInfo.strMachineModel.IsNullOrEmpty() ? "" : m_sysInfo.strMachineModel.GetData();
  2125. pcInfo["SN"] = m_sysInfo.strMachineSN.IsNullOrEmpty() ? "" : m_sysInfo.strMachineSN.GetData();
  2126. //???oiltmp
  2127. termInfo["Manufacturer"] = m_sysInfo.strManufacturer.IsNullOrEmpty() ? "" : m_sysInfo.strManufacturer.GetData();
  2128. termInfo["MachineMode"] = m_sysInfo.strMachineModel.IsNullOrEmpty() ? "" : m_sysInfo.strMachineModel.GetData();
  2129. termInfo["MachineSN"] = m_sysInfo.strMachineSN.IsNullOrEmpty() ? "" : m_sysInfo.strMachineSN.GetData();
  2130. #endif
  2131. //加载Path节点
  2132. CSimpleStringA pathInfo = GetPathInfo();
  2133. CSmartPointer<IConfigInfo> spConfigRun;
  2134. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2135. CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
  2136. SP::Module::Net::GetINETMacAddresses(netList);
  2137. CSimpleStringA csMac(""), csIP("");
  2138. for (int i = 0; i < netList.GetCount(); i++) {
  2139. if (!csMac.IsNullOrEmpty()) {
  2140. csMac += ";";
  2141. }
  2142. csMac += netList[i].mac.c_str();
  2143. }
  2144. for (int i = 0; i < netList.GetCount(); i++) {
  2145. if (!csIP.IsNullOrEmpty()) {
  2146. csIP += ";";
  2147. }
  2148. csIP += netList[i].ip.c_str();
  2149. }
  2150. termInfo["MACs"] = csMac;
  2151. termInfo["IPs"] = csIP;
  2152. char xOSTime[64] = {0};
  2153. char elapseTime[64] = {0};//使用机器启动时间秒数
  2154. ULONGLONG dwElapse = GetTickCountRVC();
  2155. DWORD elapseTimeTemp = dwElapse / 1000;
  2156. #if defined(RVC_OS_WIN)
  2157. termInfo["OSTime"] = itoa(m_elapseTimeFromOSStart, xOSTime, 10);
  2158. termInfo["elapseTime"] = itoa(elapseTimeTemp, elapseTime, 10);
  2159. #else
  2160. termInfo["OSTime"] = _itoa(m_elapseTimeFromOSStart, xOSTime, 10);
  2161. termInfo["elapseTime"] = _itoa(elapseTimeTemp, elapseTime, 10);
  2162. #endif
  2163. CSimpleStringA csRunPath("");
  2164. GetEntityBase()->GetFunction()->GetPath("Run", csRunPath);
  2165. termInfo["AppPath"] = csRunPath;
  2166. std::pair<bool, std::string> strResult;
  2167. std::pair<bool, std::string> strPCInfo;
  2168. strResult = generateJsonStr(termInfo);
  2169. strPCInfo = generateJsonStr(pcInfo);
  2170. spConfigRun->ReadConfigValue("Run", "WarnMsg", csWarnMsg);
  2171. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM)("ToLogWarnTermAboutInfo:[%s]", strResult.second.c_str());
  2172. //oilyang@20210323 discard the following rule of throwing LogWarn.Always throw LogWarn
  2173. //oilyang@20201201 log warn every time if content of msg has changed
  2174. if (bTmpEtyNewStart)
  2175. {
  2176. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  2177. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_First_Info_AboutTerm, strResult.second.c_str());
  2178. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_First_Info_AboutPC, strPCInfo.second.c_str());
  2179. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_Upload_PathInfo, pathInfo.GetData());
  2180. }
  2181. else
  2182. LogWarn(Severity_Low, Error_Unexpect, LOG_WARN_HEALTH_UPLOAD_INFO_ABOUT_TERM, strResult.second.c_str());
  2183. #if defined(RVC_OS_LINUX)
  2184. /** 上送安装记录信息,包括安装时间,安装耗时时长,使用的安装版本等 [Gifur@2023823]*/
  2185. CSmartPointer<IConfigInfo> pConfig;
  2186. GetEntityBase()->GetFunction()->OpenConfig(Config_Cache, pConfig);
  2187. int stepStatus(0), curStep(0), lastRecordTime(0), beginInstallRecordTime(0);
  2188. CSimpleStringA strInstallVersion(true);
  2189. CSimpleStringA strAdditonalMsg(true);
  2190. pConfig->ReadConfigValueInt("TerminalDeploy", "CurrStep", curStep);
  2191. if (curStep == DeployStep_Finished) {
  2192. pConfig->ReadConfigValueInt("TerminalDeploy", "CurrState", stepStatus);
  2193. pConfig->ReadConfigValueInt("TerminalDeploy", "TimeStamp", lastRecordTime);
  2194. pConfig->ReadConfigValue("TerminalDeploy", "InstallVersion", strInstallVersion);
  2195. pConfig->ReadConfigValue("TerminalDeploy", "LastInfo", strAdditonalMsg);
  2196. pConfig->ReadConfigValueInt("TerminalDeploy", "StartTimeStamp", beginInstallRecordTime);
  2197. const DWORD consumeTick = lastRecordTime - beginInstallRecordTime;
  2198. LogWarn(Severity_High, Error_Debug, LOG_WARN_HEALTH_INSTALL_TIMESTAMP,
  2199. CSimpleString::Format("{\"begin\":\"%s\",\"finished\":\"%s\", \"consume\":\"%s\", \"step\":%d,\"state\":%d, \"version\":\"%s\", \"msg\":\"%s\"}",
  2200. CSmallDateTime(beginInstallRecordTime).ToTimeString().GetData(),
  2201. CSmallDateTime(lastRecordTime).ToTimeString().GetData(),
  2202. CSmallDateTime(consumeTick).ToTimeString().GetData(),
  2203. curStep, stepStatus
  2204. , strInstallVersion.GetData(), strAdditonalMsg.GetData()));
  2205. pConfig->WriteConfigValueInt("TerminalDeploy", "CurrStep", DeployStep_Begin);
  2206. pConfig->WriteConfigValueInt("TerminalDeploy", "CurrState", DEPLOYSTATE_NOTINIT);
  2207. pConfig->WriteConfigValue("TerminalDeploy", "TimeStamp", CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  2208. if (!strAdditonalMsg.IsNullOrEmpty()) {
  2209. pConfig->WriteConfigValue("TerminalDeploy", "LastInfo", NULL);
  2210. }
  2211. pConfig->WriteConfigValue("TerminalDeploy", "StartTimeStamp", NULL);
  2212. do
  2213. {
  2214. CSmartPointer<IConfigInfo> spConfigRun;
  2215. GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
  2216. spConfigRun->WriteConfigValue("DeployInfo", "InstallVersion", strInstallVersion);
  2217. spConfigRun->WriteConfigValueInt("DeployInfo", "InstallTimeStamp", lastRecordTime);
  2218. } while (false);
  2219. }
  2220. #endif
  2221. }
  2222. void CHealthManagerFSM::ShowEntityBootFailedAtFront(LPCTSTR lpcszEntityName, ErrorCodeEnum bootFailedResult, bool isBlock)
  2223. {
  2224. #if defined(RVC_OS_LINUX)
  2225. CEntityLastErrorInfo errInfo = {};
  2226. ErrorCodeEnum errCode = GetEntityBase()->GetFunction()->GetEntityLastError(lpcszEntityName, errInfo);
  2227. CSimpleStringA strErrMsg(true);
  2228. if (!errInfo.strErrMsg.IsNullOrEmpty()) {
  2229. strErrMsg = CSimpleStringA::Format("%s:%s", lpcszEntityName, (LPCTSTR)errInfo.strErrMsg);
  2230. }
  2231. else {
  2232. strErrMsg = CSimpleStringA::Format("%s模块初始化失败: %s", lpcszEntityName, (LPCTSTR)SpStrError(bootFailedResult));
  2233. }
  2234. if (CSimpleStringA(lpcszEntityName).Compare("SIPPhone", true) == 0)
  2235. {
  2236. GetEntityBase()->GetFunction()->SetSysVar("AuthErrMsg", strErrMsg.GetData());//实体启动失败保存到错误页字段
  2237. }
  2238. if (isBlock) {
  2239. SP::Module::Comm::LogErrorNotiyStruct notifyItem(bootFailedResult, 0);
  2240. SP::Module::Comm::LogNotiyMessageStruct notifyMsg(strErrMsg);
  2241. notifyItem.Notify(notifyMsg);
  2242. }
  2243. else {
  2244. LogError(Severity_High, bootFailedResult, 0, strErrMsg);
  2245. }
  2246. #endif //RVC_OS_LINUX
  2247. }
  2248. void CHealthManagerFSM::ToCallAccessAuthDoWork()
  2249. {
  2250. if (!m_bInAccessAuthDoWork)
  2251. {
  2252. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("ToCallAccessAuthDoWork")("ToCallAccessAuthDoWork");
  2253. AccessAuthTask* pTask = new AccessAuthTask(this);
  2254. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2255. }
  2256. }
  2257. void CHealthManagerFSM::JudgeIfNeedInitFWB()
  2258. {
  2259. LOG_FUNCTION();
  2260. CSimpleStringA csFWBDevSN("");
  2261. GetEntityBase()->GetFunction()->GetSysVar("FWBDevSN", csFWBDevSN);
  2262. if (csFWBDevSN.GetLength() > 12 && csFWBDevSN.IndexOf("FWB") > 2)
  2263. {
  2264. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("JudgeIfNeedInitFWB")("This is fwb,we need to check if update master key.");
  2265. FWBDoInitTask* pTask = new FWBDoInitTask(this);
  2266. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2267. }
  2268. }
  2269. void CHealthManagerFSM::FWBDoInit()
  2270. {
  2271. #if defined(RVC_OS_WIN)
  2272. //准入通过则进行检查,否则等待准入通过,直到永远~
  2273. while (true)
  2274. {
  2275. Sleep(1000);
  2276. CSimpleStringA csTerminalStage("");
  2277. if (GetEntityBase()->GetFunction()->GetSysVar("TerminalStage", csTerminalStage) == Error_Succeed
  2278. && csTerminalStage.Compare("A") == 0)
  2279. break;
  2280. }
  2281. CSimpleStringA currCheckCode("");
  2282. QueryCheckCode(currCheckCode, true);
  2283. CSimpleStringA csCkCode("");
  2284. GetEntityBase()->GetFunction()->GetSysVar("ckCode", csCkCode);
  2285. if (!currCheckCode.IsNullOrEmpty() && !csCkCode.IsNullOrEmpty() && !currCheckCode.Compare(csCkCode, true))
  2286. {
  2287. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("FWBDoInit")("check code is the same.");
  2288. return;
  2289. }
  2290. else
  2291. {
  2292. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("FWBDoInit")("curr:[%s],ckCode:[%s]", currCheckCode.GetData(), csCkCode.GetData());
  2293. }
  2294. ErrorCodeEnum eErr;
  2295. if (m_pACClient == NULL || m_pACClient->QuerySessionClosed())
  2296. {
  2297. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  2298. eErr = m_pACClient->Connect();
  2299. if (eErr != Error_Succeed) {
  2300. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("FWBDoInit")("AccessAuth connected failed.");
  2301. m_pACClient->SafeDelete();
  2302. m_pACClient = NULL;
  2303. return;
  2304. }
  2305. else {
  2306. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("FWBDoInit")("AccessAuth connected.");
  2307. }
  2308. }
  2309. eErr = (*m_pACClient)(EntityResource::getLink().upgradeLink())->UpdateWK();
  2310. if (eErr == Error_Succeed)
  2311. {
  2312. GetEntityBase()->GetFunction()->SetSysVar("InitFWBFromStart", "Y");
  2313. QueryCheckCode(currCheckCode, true);
  2314. GetEntityBase()->GetFunction()->SetSysVar("ckCode", currCheckCode, true);
  2315. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_InitForFWB_Init_Suc, "Init for fwb suc.");
  2316. }
  2317. else
  2318. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_InitForFWB_Init_Fail,
  2319. CSimpleStringA::Format("Init for fwb failed:%d", eErr));
  2320. #endif
  2321. return;
  2322. }
  2323. bool CHealthManagerFSM::IfInUpgradeProcess()
  2324. {
  2325. CSimpleStringA csRunCfgPath(""), csFileName("");
  2326. ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("RunCfg", csRunCfgPath);
  2327. csFileName = csRunCfgPath + SPLIT_SLASH_STR + "starttime.dat";
  2328. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("csFileName:%s", csFileName.GetData());
  2329. #if defined(RVC_OS_WIN)
  2330. if (_access((const char*)csFileName, 0) == 0) {
  2331. #else
  2332. if (access((const char*)csFileName, F_OK) == 0) {
  2333. #endif
  2334. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("IfInUpgradeProcess")("升级切换中");
  2335. return true;
  2336. }
  2337. else
  2338. return false;
  2339. }
  2340. void CHealthManagerFSM::AutoDoInitForAll()
  2341. {
  2342. LOG_FUNCTION();
  2343. m_bDoingAutoInit = true;
  2344. ErrorCodeEnum eErr;
  2345. if (m_pACClient == NULL || m_pACClient->QuerySessionClosed())
  2346. {
  2347. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  2348. eErr = m_pACClient->Connect();
  2349. if (eErr != Error_Succeed) {
  2350. m_bDoingAutoInit = false;
  2351. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AutoDoInitForAll")("AccessAuth connected failed.");
  2352. m_pACClient->SafeDelete();
  2353. m_pACClient = NULL;
  2354. return;
  2355. }
  2356. else {
  2357. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AutoDoInitForAll")("AccessAuth connected.");
  2358. }
  2359. }
  2360. AccessAuthService_InitializeNew_Req initReq;
  2361. AccessAuthService_InitializeNew_Ans initAns;
  2362. initReq.strAuthServer = "";
  2363. initReq.strUserID = "admin";
  2364. initReq.strPassword = "";
  2365. eErr = (*m_pACClient)(EntityResource::getLink().upgradeLink())->InitializeNew(initReq, initAns, 60000);
  2366. m_autoDoInitCount++;
  2367. if (eErr == Error_Succeed)
  2368. {
  2369. //Dbg("Auto Init suc.");
  2370. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AutoDoInitForAll")("Auto Init suc.");
  2371. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_AutoDoInit_Suc, "Auto Init suc.");
  2372. m_bDoingAutoInit = false;
  2373. }
  2374. else
  2375. {
  2376. //Dbg("Auto Init failed:%d", eErr);
  2377. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("AutoDoInitForAll")("Auto Init failed:%d", eErr);
  2378. LogWarn(Severity_Low, Error_Unexpect, HealthManager_UserErrorCode_AutoDoInit_Fail, "Auto Init failed.");
  2379. }
  2380. m_bDoingAutoInit = false;
  2381. return;
  2382. }
  2383. void CHealthManagerFSM::CheckIfNeedAutoInit()
  2384. {
  2385. ErrorCodeEnum eErr = Error_Unexpect;
  2386. bool bNeedAutoInit = false;
  2387. PinPadService_ClientBase* pClient = new PinPadService_ClientBase(this->m_pEntity);
  2388. if (pClient != NULL)
  2389. {
  2390. eErr = pClient->Connect();
  2391. if (eErr == Error_Succeed)
  2392. {
  2393. PinPadService_QueryFunc_Req reqQ;
  2394. PinPadService_QueryFunc_Ans ansQ;
  2395. eErr = (*pClient)(EntityResource::getLink().upgradeLink())->QueryFunc(reqQ, ansQ, 5000);
  2396. if (eErr == Error_Succeed)
  2397. {
  2398. if ((ansQ.encryptkey == 3 || ansQ.encryptkey == 2) && ansQ.reserved1 == 1)
  2399. {
  2400. bNeedAutoInit = true;
  2401. }
  2402. }else{
  2403. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("CheckIfNeedAutoInit")("QueryFunc failed.error code:%d", eErr);
  2404. }
  2405. pClient->GetFunction()->CloseSession();
  2406. }else{
  2407. DbgWithLink(LOG_LEVEL_INFO,LOG_TYPE_SYSTEM).setAPI("CheckIfNeedAutoInit")("connect to pinpad failed.error code:%d", eErr);
  2408. pClient->SafeDelete();
  2409. }
  2410. }
  2411. if (bNeedAutoInit && !m_bDoingAutoInit && m_autoDoInitCount < 2)
  2412. {
  2413. AutoDoInitForAllTask* pTask = new AutoDoInitForAllTask(this);
  2414. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2415. }
  2416. }
  2417. void CHealthManagerFSM::WaitToCallAccessAuthDoWork()
  2418. {
  2419. //WaitForSingleObject
  2420. bool bHaveShowMsg = false;
  2421. while (1)
  2422. {
  2423. CSimpleStringA csHavePath("N");
  2424. GetEntityBase()->GetFunction()->GetSysVar("AccessHavePath", csHavePath);
  2425. if (csHavePath.Compare("Y") == 0 || csHavePath.Compare("E") == 0)
  2426. {
  2427. AccessAuthTask* pTask = new AccessAuthTask(this);
  2428. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  2429. break;
  2430. }
  2431. else
  2432. {
  2433. Sleep(5000);
  2434. if (m_NewStartPage.IndexOf(m_sysInfo.strMachineType) < 0)
  2435. {
  2436. if (!bHaveShowMsg)
  2437. {
  2438. GetEntityBase()->GetFunction()->ShowStartupInfo("等待准入灰度访问结果");
  2439. bHaveShowMsg = true;
  2440. }
  2441. }
  2442. else {
  2443. LogWarn(Severity_High, Error_Unexpect, HealthManager_UserErrorCode_WaitForAccessGrayResult, "等待准入灰度访问结果");
  2444. }
  2445. }
  2446. }
  2447. }
  2448. void CHealthManagerFSM::WKUpdatePeriod()
  2449. {
  2450. auto pEntity = ((CHealthManagerEntity*)m_pEntity);
  2451. //oilyang@20220421 if have init fwb from HealthManager start,no need to update working key
  2452. //oilyang@20220413 control update working key by CenterSetting
  2453. CSimpleStringA xInitFWBFlag("N");
  2454. GetEntityBase()->GetFunction()->GetSysVar("InitFWBFromStart", xInitFWBFlag);
  2455. if (m_iDoNotUpdateWKDaily == 1 || xInitFWBFlag.Compare("Y") == 0)
  2456. {
  2457. // 没有密码键盘 或 集中配置告知无需更新 或 蓝牙多合一正在更新,无需更新
  2458. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  2459. (CSimpleStringA::Format("DoNotUpdateWKDaily:%d or InitFWB:%s, ignore update wk"
  2460. , m_iDoNotUpdateWKDaily, xInitFWBFlag.GetData()));
  2461. return;
  2462. }
  2463. // 检查上次密钥同步时间(一天只同步一次)
  2464. CSmartPointer<IConfigInfo> pConfigRun;
  2465. m_pEntity->GetFunction()->OpenConfig(Config_Run, pConfigRun);
  2466. int nWKLastSyncTime(0);
  2467. pConfigRun->ReadConfigValueInt("Main", "WKSyncSuccTime", nWKLastSyncTime);
  2468. int nWKSyncFailCount(0);
  2469. pConfigRun->ReadConfigValueInt("Main", "WKSyncFailCount", nWKSyncFailCount);
  2470. SYSTEMTIME stSyncTime = CSmallDateTime(nWKLastSyncTime).ToSystemTime();
  2471. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  2472. ("last WK sync time: %04d-%02d-%02d %02d:%02d:%02d",
  2473. stSyncTime.wYear, stSyncTime.wMonth, stSyncTime.wDay,
  2474. stSyncTime.wHour, stSyncTime.wMinute, stSyncTime.wSecond);
  2475. SYSTEMTIME stNow = {};
  2476. GetLocalTimeRVC(stNow);
  2477. int lastUpdateDays = sumday(stSyncTime.wYear, stSyncTime.wMonth, stSyncTime.wDay);
  2478. int todayDays = sumday(stNow.wYear, stNow.wMonth, stNow.wDay);
  2479. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("lastUpdateDays:%d,todayDays:%d,x:%d", lastUpdateDays,todayDays, todayDays-lastUpdateDays);
  2480. //if ((nWKLastSyncTime > 0 && stSyncTime.wYear == stNow.wYear
  2481. // && stSyncTime.wMonth == stNow.wMonth && stSyncTime.wDay == stNow.wDay
  2482. // && nWKSyncFailCount == 0)) // 最近一次同步成功,才能跳过
  2483. if (todayDays - lastUpdateDays < m_wkUpdatePeriod)
  2484. {
  2485. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)
  2486. ("WK has been updated, last sync time: %s", (const char*)CSmallDateTime(nWKLastSyncTime).ToTimeString());
  2487. }
  2488. else
  2489. {
  2490. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("begin update WK now");
  2491. ErrorCodeEnum eErrCode = Error_Succeed;
  2492. if (m_pACClient == NULL)
  2493. {
  2494. m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
  2495. eErrCode = m_pACClient->Connect();
  2496. if (eErrCode != Error_Succeed) {
  2497. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("accessauth connected failed.");
  2498. m_pACClient->SafeDelete();
  2499. m_pACClient = NULL;
  2500. m_bInAccessAuthDoWork = false;
  2501. return;
  2502. }
  2503. else {
  2504. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("WKUpdatePeriod")("accessauth connected.");
  2505. }
  2506. }
  2507. eErrCode = (*m_pACClient)(EntityResource::getLink().upgradeLink())->UpdateWK();
  2508. if(Error_Succeed == eErrCode)
  2509. {
  2510. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z0001")("accessauth updatewk succ.");
  2511. pConfigRun->WriteConfigValue("Main", "WKSyncSuccTime",
  2512. (const char*) CSimpleStringA::Format("0x%08X", (DWORD)CSmallDateTime::GetNow()));
  2513. pConfigRun->WriteConfigValueInt("Main", "WKSyncFailCount", 0);
  2514. }
  2515. else
  2516. {
  2517. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setLogCode("QLR0402501Z0001").setResultCode("RTA5110")("accessauth updatewk failed.");
  2518. nWKSyncFailCount++;
  2519. pConfigRun->WriteConfigValueInt("Main", "WKSyncFailCount", nWKSyncFailCount);
  2520. }
  2521. }
  2522. }
  2523. int CHealthManagerFSM::sumday(int year, int month, int day)
  2524. {
  2525. int days[2][13] = { {0,31,59,90,120,151,181,212,243,273,304,334,365},{0,31,60,91,121,152,182,213,244,274,305,335,366} };
  2526. int iLeapYear = 0;
  2527. if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
  2528. iLeapYear = 1;
  2529. int yearday = year * 365 + year / 4 - year / 100 + year / 400;
  2530. int monthday = days[iLeapYear][month - 1];
  2531. return yearday + monthday + day;
  2532. }
  2533. void CHealthManagerFSM::QueryHardwareInfo(SpReqAnsContext<HealthManagerService_QueryHardwareInfo_Req, HealthManagerService_QueryHardwareInfo_Ans>::Pointer ctx)
  2534. {
  2535. CSystemStaticInfo info;
  2536. GetEntityBase()->GetFunction()->GetSystemStaticInfo(info);
  2537. CAutoArray<SP::Module::Net::NetworkAdapterItem> netList;
  2538. SP::Module::Net::GetINETMacAddresses(netList);
  2539. CAutoArray<CSimpleStringA> ipAddrs, macAddrs;
  2540. for (int i = 0; i < netList.GetCount(); i++) {
  2541. CSimpleStringA tmpip = netList[i].ip.c_str();
  2542. CSimpleStringA tmpmac = netList[i].mac.c_str();
  2543. ipAddrs.Append(&tmpip, 0, 1);
  2544. macAddrs.Append(&tmpmac, 0, 1);
  2545. }
  2546. ctx->Ans.ip = ipAddrs;
  2547. ctx->Ans.mac = macAddrs;
  2548. ctx->Ans.machineType = info.strMachineType;
  2549. ctx->Ans.site = info.strSite;
  2550. ctx->Ans.terminalNo = info.strTerminalID;
  2551. ctx->Ans.termLimit = "";
  2552. ctx->Ans.termVersion = info.InstallVersion.ToString();
  2553. #if defined(RVC_OS_WIN)
  2554. //oiltmp 备注reserved3、reserved4这是什么情况下用的?看得莫名其妙,在一个常用调用接口里面每次都取,这是不怕亚信?
  2555. //reserved3, 获取windows系统版本
  2556. DWORD dwMajorVer, dwMinorVer, dwBuildNumber;
  2557. BOOL bRet = FALSE;
  2558. HMODULE hModNtdll = NULL;
  2559. if (hModNtdll = ::LoadLibraryW(L"ntdll.dll"))
  2560. {
  2561. typedef void (WINAPI* pfRTLGETNTVERSIONNUMBERS)(DWORD*, DWORD*, DWORD*);
  2562. pfRTLGETNTVERSIONNUMBERS pfRtlGetNtVersionNumbers;
  2563. pfRtlGetNtVersionNumbers = (pfRTLGETNTVERSIONNUMBERS)::GetProcAddress(hModNtdll, "RtlGetNtVersionNumbers");
  2564. if (pfRtlGetNtVersionNumbers)
  2565. {
  2566. pfRtlGetNtVersionNumbers(&dwMajorVer, &dwMinorVer, &dwBuildNumber);
  2567. dwBuildNumber &= 0x0ffff;
  2568. bRet = TRUE;
  2569. }
  2570. ::FreeLibrary(hModNtdll);
  2571. hModNtdll = NULL;
  2572. }
  2573. //reserved4
  2574. char buffer[1024];
  2575. sprintf(buffer, "%d.%d.%d", dwMajorVer, dwMinorVer, dwBuildNumber);
  2576. string sysVer = "Windows ver[" + string(buffer) + "]";
  2577. ctx->Ans.reserved3 = CSimpleStringA(sysVer.c_str());
  2578. CSimpleStringA deviceFct("");
  2579. // pad设备厂商为Microsoft, 其他设备读取root中的pinpad字段下的vendor
  2580. if (info.strMachineType == "RVC.PAD")
  2581. {
  2582. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("This is PAD device.");
  2583. deviceFct = "Microsoft";
  2584. }
  2585. else
  2586. {
  2587. CSmartPointer<IConfigInfo> spConfig;
  2588. GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfig);
  2589. spConfig->ReadConfigValue("Device.PinPad", "Vendor", deviceFct);
  2590. }
  2591. ctx->Ans.reserved4 = deviceFct;
  2592. #endif //RVC_OS_WIN
  2593. //reserved1
  2594. #ifdef DEVOPS_ON_ST /*DevOps流水线编译,ST环境*/
  2595. ctx->Ans.reserved1 = 1;
  2596. #elif defined(DEVOPS_ON_UAT)/*DevOps流水线编译,UAT环境*/
  2597. ctx->Ans.reserved1 = 2;
  2598. #elif defined(DEVOPS_ON_PRD)/*DevOps流水线编译,PRD环境*/
  2599. ctx->Ans.reserved1 = 3;
  2600. #elif defined(DEVOPS_ON_DEV)/*DevOps流水线编译,Dev环境*/
  2601. ctx->Ans.reserved1 = 0;
  2602. #else/*本地编译等非DevOps环境编译的版本*/
  2603. ctx->Ans.reserved1 = 0;
  2604. #endif
  2605. //oilyang@20230518 用来标注支持搜狗输入法新旧模式
  2606. ctx->Ans.reserved2 = 0;
  2607. ResourceWatcherService_ClientBase* pClient = new ResourceWatcherService_ClientBase(m_pEntity);
  2608. ErrorCodeEnum ec = pClient->Connect();
  2609. if (IS_SUCCEED(ec)) {
  2610. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("to Connect ResourceWatcher...");
  2611. ResourceWatcherService_GetThirdPartyInstallState_Req req = {};
  2612. ResourceWatcherService_GetThirdPartyInstallState_Ans ans = {};
  2613. req.mode = 1;
  2614. ec = (*pClient)(EntityResource::getLink().upgradeLink())->GetThirdPartyInstallState(req, ans, 15000);
  2615. if (IS_SUCCEED(ec)) {
  2616. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Get Sogou version: %s, %d", ans.version.GetData(), ans.reserverd3);
  2617. DWORD dwUserCode(HealthManager_UserErrorCode_SogouInput_UsingSDK);
  2618. if (ans.reserverd3 == 1) {
  2619. dwUserCode = HealthManager_UserErrorCode_SogouInput_UsingSys;
  2620. ctx->Ans.reserved2 = 1;
  2621. }
  2622. LogWarn(Severity_Low, Error_Debug, dwUserCode,
  2623. CSimpleStringA::Format("{\"version\": %s,\"installTime\": %s}", ans.version.GetData(), ans.reserverd1.GetData()));
  2624. } else {
  2625. LogWarn(Severity_Low, ec, HealthManager_UserErrorCode_SogouInput_UsingSDK,
  2626. CSimpleStringA::Format("ResourceWatcher::GetThirdPartyInstallState invoked failed: %s", SpStrError(ec)));
  2627. }
  2628. pClient->GetFunction()->CloseSession();
  2629. } else {
  2630. LogWarn(Severity_Low, ec, HealthManager_UserErrorCode_SogouInput_UsingSDK,
  2631. CSimpleStringA::Format("Connet to ResourceWatcher failed: %s", SpStrError(ec)));
  2632. pClient->SafeDelete();
  2633. }
  2634. ctx->Answer(Error_Succeed);
  2635. }