12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036 |
- #include "stdafx.h"
- #include <fstream>
- #include <string>
- #include <algorithm>
- #include <io.h>
- #include "mod_healthmanager.h"
- using namespace std;
- const int MAX_AYSNC_TIMEOUT = 60000;
- const int MAX_IGNORE_TIMEOUT = 100;
- enum EntityOP
- {
- OP_STOP_ENTITY,
- OP_START_ENTITY,
- OP_PAUSE_ENTITY,
- OP_TERMINATE_ENTITY,
- OP_CONTINUE_ENTITY,
- };
- bool StrEqualNoCase(const char *s1, const char *s2,int len)
- {
- if (strlen(s1) != strlen(s2))
- return false;
- for (int i = 0; i < len; ++i)
- {
- if (toupper(s1[i]) != toupper(s2[i]))
- return false;
- }
- return true;
- }
- ErrorCodeEnum CHealthManagerFSM::OnInit(void)
- {
- m_hMD5OKEvt = CreateEventA(NULL, FALSE, FALSE, NULL);
- if (m_hMD5OKEvt == NULL)
- {
- Dbg("CreateEvent failed(%d).", GetLastError());
- }
- return Initial();
- }
- ErrorCodeEnum CHealthManagerFSM::OnExit(void)
- {
- return Error_Succeed;
- }
- void CHealthManagerFSM::s0_on_entry(void)
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_INIT;
- }
- void CHealthManagerFSM::s0_on_exit(void)
- {
- }
- unsigned int CHealthManagerFSM::s0_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- int ret = 0;
- switch(pEvt->iEvt)
- {
- case USER_EVT_WAIT_DEAMON_FINISHED:
- ret = pEvt->param1;
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return ret;
- }
- //CoreBoot
- void CHealthManagerFSM::s1_on_entry()
- {
- m_fsmState = HM_FSM_STATE_COREBOOT;
- //oilyang@20190924
- //修改为判断冷热启动,热重启不再等待10s
- //系统启动小于3分钟,认为是冷启动
- ULONGLONG dwElapse = GetTickCount64();
- Dbg("have elapsed %d seconds from system start",dwElapse/1000);
- if (dwElapse < 1000*60*3)
- Sleep(10000);
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","B");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState B failed (%d).",eErrCode);
- }
- //CoreBootTask* pTask = new CoreBootTask(this);
- //GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
- LOG_FUNCTION();
- bool bWatchDog = false,bAsync = false;
- m_eStage = LOADSTAGE_COREBOOT;
- int ret = 0;
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- //start entity
-
-
- vector<CSimpleStringA>::iterator vIt;
- if (m_coreBootOpt.size() == 0)
- goto COREBOOT_FINISH;
- char startMsg[128];
- for (vIt = m_vCoreBoot.begin(); vIt != m_vCoreBoot.end(); ++ vIt)
- //for (it = m_coreBootOpt.begin();it != m_coreBootOpt.end(); ++it)
- {
- CSmartPointer<IAsynWaitSp> spWait;//oilyang 20160325 see the following comment
- it = m_coreBootOpt.find(*vIt);
- if (it == m_coreBootOpt.end())
- {
- Dbg("cannot find %s",(LPCSTR)*vIt);
- continue;
- }
- Dbg("start,%s,%d",(LPCSTR)it->first,it->second.loadOpt);
- CEntityRunInfo entRunInfo;
- ErrorCodeEnum errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
- if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
- {
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_COREBOOT);
- if (ret == 0 || ret == 2)
- goto COREBOOT_FINISH;
- else
- continue;
- }
- ZeroMemory(startMsg, 128);
- sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
- GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
- switch(it->second.loadOpt)
- {
- case LOADOPT_IGNORE:
- {
- pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (spWait != NULL)
- spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);//oilyang 20160325 the null pointer
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_COREBOOT);
- if (ret == 0 || ret == 2)
- goto COREBOOT_FINISH;
- }
- break;
- case LOADOPT_ASYNC_VERIFY:
- errCode = AsyncStartEntity(it->first,NULL,NULL);
- Dbg("%d",errCode);
- bAsync = true;
- break;
- case LOADOPT_SYNC_VERIFY:
- {
- pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (spWait != NULL)
- errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- Dbg("(coreboot)sync...%d",errCode);
- if (errCode == Error_Succeed)
- it->second.eResult = LOADING_SUCCEED;
- else if (errCode == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- if (_strnicmp(it->first,"WatchDog",strlen("WatchDog")) == 0
- && it->second.eResult == LOADING_SUCCEED)
- bWatchDog = true;
- if (errCode != Error_Succeed)
- return;
- else
- ret = CheckLoadResult(LOADSTAGE_COREBOOT);
- Dbg("s1 check ret %d",ret);
- if (ret == 0 || ret == 2)
- goto COREBOOT_FINISH;
- }
- break;
- default:
- break;
- }
- }
- COREBOOT_FINISH:
- //start watchdog if have load it sucessfully
- if (bWatchDog)
- {
- }
- if (!bAsync)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- else
- {
- ret = CheckLoadResult(LOADSTAGE_COREBOOT);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- return;
- }
- void CHealthManagerFSM::s1_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s1_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s1 evt %d",pEvt->iEvt);
- switch(pEvt->iEvt)
- {
- case USER_EVT_COREBOOT_FINISHED:
- pEvt->SetHandled();
- return pEvt->param1;
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //SafeLoad
- void CHealthManagerFSM::s2_on_entry()
- {
- m_fsmState = HM_FSM_STATE_SAFELOAD;
- Sleep(1000);
- USBControl();//open usb port oilyang 20150526
-
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","S");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState S failed (%d).",eErrCode);
- }
- // SafeLoadTask *pTask = new SafeLoadTask(this);
- // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
- LOG_FUNCTION();
- //MessageBoxA(0,0,0,0);
- bool bAsync = false;
- m_eStage = LOADSTAGE_SAFELOAD;
- int ret = 0;
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
-
-
- ErrorCodeEnum errCode;
- vector<CSimpleStringA>::iterator vIt;
- if (m_safeLoadOpt.size() == 0)
- goto SAFELOAD_FINISH;
- char startMsg[128];
- for (vIt = m_vSafeLoad.begin(); vIt != m_vSafeLoad.end(); ++vIt)
- //for (it = m_safeLoadOpt.begin();it != m_safeLoadOpt.end(); ++it)
- {
- CSmartPointer<IAsynWaitSp> spWait;
- it = m_safeLoadOpt.find(*vIt);
- //Dbg("s %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
- if (it == m_safeLoadOpt.end())
- {
- Dbg("cannot find %s",(LPCSTR)*vIt);
- continue;
- }
- CEntityRunInfo entRunInfo;
- errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
- if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
- {
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
- if (ret == 0 || ret == 2)
- goto SAFELOAD_FINISH;
- else
- continue;
- }
- Dbg("start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
- ZeroMemory(startMsg, 128);
- sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
- GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
- switch(it->second.loadOpt)
- {
- case LOADOPT_IGNORE:
- {
- pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (spWait != NULL)
- spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
- if (ret == 0 || ret == 2)
- goto SAFELOAD_FINISH;
- }
- break;
- case LOADOPT_ASYNC_VERIFY:
- AsyncStartEntity(it->first,NULL,NULL);
- bAsync = true;
- break;
- case LOADOPT_SYNC_VERIFY:
- {
- pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (spWait != NULL)
- errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- Dbg("sync...%d",eErrCode);
- if (errCode == Error_Succeed) {
- it->second.eResult = LOADING_SUCCEED;
- if (StrEqualNoCase("MaintainWatcher",it->first,strlen("MaintainWatcher")))
- {
- Sleep(10000);
- if (m_custMngerState == CM_ENTER)
- {
- Dbg("enter CMS...");
- FSMEvent *pEvt = new FSMEvent(USER_EVT_ENTER_CUSTOMER_MANAGER);
- PostEventFIFO(pEvt);
- goto SAFELOAD_END;
- }
- }
- }
- else if (errCode == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- if (it->second.eResult != Error_Succeed)
- {
- char tmp[64] = {0};
- sprintf(tmp,"实体 %s 启动失败",it->first.GetData());
- //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
- Dbg("%s",tmp);
- }
- if (errCode != Error_Succeed)
- return;
- else
- ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
- if (ret == 0 || ret == 2)
- goto SAFELOAD_FINISH;
- }
- break;
- default:
- break;
- }
- }
- SAFELOAD_FINISH:
- if (!bAsync)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- else
- {
- ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
- Dbg("s2 %d",ret);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- SAFELOAD_END:
- return ;
- }
- void CHealthManagerFSM::s2_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s2_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- int ret = 0;
- Dbg("s2 event %d,%d",pEvt->iEvt,pEvt->param1);
- switch(pEvt->iEvt)
- {
- case USER_EVT_SAFELOAD_FINISHED:
- {
- pEvt->SetHandled();
- ToCheckUPS();
- //oiltmp
- //according to the system varible TerminalState to do sth.
- //Configed
- //Breakdown
- //Blocking
- //Authentication
- {
- if(pEvt->param1 == 0)
- {
- //initializer if configured
- CSimpleStringA csTermStage("");
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
- Dbg("after safeload to get termstage %s",(LPCTSTR)csTermStage);
- //comment this by oilyang 20141018
- //if (csTermStage == "B" || csTermStage == "D" || csTermStage == "N")
- if (csTermStage == "B" || csTermStage == "N")
- return 1;
- }
- else if (pEvt->param1 == 2)
- {
- ret = 2;
- }
- }
- //Unsubscrible
- }
- break;
- case USER_EVT_SAFELOAD_EXMINE_FINISHED:
- if (pEvt->param1 == 0)
- ret = 0;
- //do something else oiltmp
- pEvt->SetHandled();
- break;
- case USER_EVT_ACCESSAUTH_FINISHED:
- pEvt->SetHandled();
- ret = pEvt->param1;
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return ret;
- }
- //Operating
- void CHealthManagerFSM::s3_on_entry()
- {
- m_fsmState = HM_FSM_STATE_OP;
- Sleep(5000);//oilyang for nantian pinpad 20150703
- if (m_custMngerState == CM_ENTER)
- {
- Dbg("in CMS,no need to start hardware.");
- return;
- }
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState O failed (%d).",eErrCode);
- }
- // OpLoadTask *pTask = new OpLoadTask(this);
- // GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
- LOG_FUNCTION();
- bool bAsync = false;
- m_eStage = LOADSTAGE_OPERATING;
- int ret = 0;
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- //start entity
-
-
- ErrorCodeEnum errCode;
- vector<CSimpleStringA>::iterator vIt;
- if (m_operatingOpt.size() == 0)
- goto OPERATING_FINISH;
- char startMsg[128];
- for (vIt = m_vOperating.begin(); vIt != m_vOperating.end(); ++vIt)
- //for (it = m_operatingOpt.begin();it != m_operatingOpt.end(); ++it)
- {
- CSmartPointer<IAsynWaitSp> spWait;
- it = m_operatingOpt.find(*vIt);
- if (it == m_operatingOpt.end())
- {
- Dbg("cannot find %s",(LPCSTR)*vIt);
- continue;
- }
- if (it->first.Compare("Gpio", true) == 0)
- {
- if (!m_hasCfgGpioInRootIni)
- {
- Dbg("have configure gpio in HealthManager.ini,but can't find gpio in root.ini,ignore start gpio.");
- continue;
- }
- }
- CEntityRunInfo entRunInfo;
- errCode = pFunc->GetEntityRunInfo(it->first,entRunInfo);
- if (errCode == Error_Succeed && entRunInfo.eState == EntityState_Idle)
- {
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_OPERATING);
- if (ret == 0 || ret == 2)
- goto OPERATING_FINISH;
- else
- continue;
- }
- Dbg("op start %s,%d",(LPCTSTR)it->first,it->second.loadOpt);
- ZeroMemory(startMsg, 128);
- sprintf(startMsg, "正在启动实体%s...", it->first.GetData());
- GetEntityBase()->GetFunction()->ShowStartupInfo(startMsg);
- switch(it->second.loadOpt)
- {
- case LOADOPT_IGNORE:
- {
- pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (spWait != NULL)
- spWait->WaitAnswer(MAX_IGNORE_TIMEOUT);
- it->second.eResult = LOADING_SUCCEED;
- ret = CheckLoadResult(LOADSTAGE_OPERATING);
- if (ret == 0 || ret == 2)
- goto OPERATING_FINISH;
- }
- break;
- case LOADOPT_ASYNC_VERIFY:
- errCode = AsyncStartEntity(it->first,NULL,NULL);
- bAsync = true;
- break;
- case LOADOPT_SYNC_VERIFY:
- {
- errCode = pFuncPrivilege->StartEntity(it->first,NULL,spWait);
- if (errCode == Error_Succeed)
- {
- if (spWait != NULL)
- errCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- }
- else
- {
- Dbg("StartEntity %s failed(%d).",(LPCSTR)it->first,errCode);
- break;
- }
- if (errCode == Error_Succeed)
- it->second.eResult = LOADING_SUCCEED;
- else if (errCode == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- if (it->second.eResult != Error_Succeed)
- {
- char tmp[64] = {0};
- sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
- //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
- Dbg("%s", tmp);
- }
- if (errCode != Error_Succeed)
- return;
- else
- ret = CheckLoadResult(LOADSTAGE_OPERATING);
- if (ret == 0 || ret == 2)
- goto OPERATING_FINISH;
- }
- break;
- default:
- break;
- }
- }
- OPERATING_FINISH:
- Dbg("s3 ret %d",ret);
- if (!bAsync)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- else
- {
- ret = CheckLoadResult(LOADSTAGE_OPERATING);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- return ;
- }
- void CHealthManagerFSM::s3_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s3_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s3(Operating) event %d,%d",pEvt->iEvt,pEvt->param1);
- int ret = 0;
- switch(pEvt->iEvt)
- {
- case USER_EVT_OPERATING_FINISHED:
- ret = pEvt->param1;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return ret;
- }
- //Idle(Operating finished)
- void CHealthManagerFSM::s4_on_entry()
- {
- m_fsmState = HM_FSM_STATE_IDLE;
- LOG_FUNCTION();
- m_accessAuthCheckMD5 = 0;
- CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
- CSmartPointer<IConfigInfo> spConfig, spCerConfig;
- ErrorCodeEnum eErrCer = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
- if (eErrCer != Error_Succeed) {
- Dbg("open central cfg file failed!");
- }
- else
- spCerConfig->ReadConfigValueInt("AccessAuthorization", "CheckMD5", m_accessAuthCheckMD5);
- Dbg("before access auth,read MD5 flag:%d",m_accessAuthCheckMD5);
- if (!m_bIdleToMaintain)
- {
- AccessAuthTask *pTask = new AccessAuthTask(this);
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
- }
- else
- m_bIdleToMaintain = false;
- }
- void CHealthManagerFSM::s4_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s4_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s4 event %d,%d",pEvt->iEvt,pEvt->param1);
- switch(pEvt->iEvt)
- {
- case USER_EVT_ACCESSAUTH_FINISHED:
- {
- pEvt->SetHandled();
- if (pEvt->param1 == 1)
- {
- //why to do this???
- //LogEvent(Severity_Middle,EVENT_CONSOLE_REQ_RESTART_SHELL,"AccessAuth failed,to restart spshell.");
- return 1;
- }
- CSimpleStringA csTermStage;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
- Dbg("after accessauth to get termstage %s",(LPCTSTR)csTermStage);
- //oilyang@20170316@comment
- //for user desktop,start iebrowser no matter what TerminalStage is.
- //if (csTermStage[0] != 'A')
- // break;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState O failed (%d).",eErrCode);
- }
- CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
- CSmartPointer<IConfigInfo> spConfigRun,spCerConfig;
- ErrorCodeEnum eErrIE = spEntityFunction->OpenConfig(Config_Run, spConfigRun);
- if (eErrIE != Error_Succeed) {
- Dbg("open cfg file(ie) failed!");
- //return err;
- }
- ErrorCodeEnum eErrCerUrl = spEntityFunction->OpenConfig(Config_CenterSetting, spCerConfig);
- if (eErrCerUrl != Error_Succeed) {
- Dbg("open central cfg file(ie) failed!");
- }
- //if load successfully,set FailTimes to 0
- spConfigRun->WriteConfigValueInt("Run","FailTimes",0);
- if (m_bAccessAuth)
- {
- m_checkCode = QueryCheckCode();
- if (m_checkCode.GetLength() > 1)
- m_bEverAuthSucWithDevice = true;
- else
- m_bEverAuthSucWithDevice = false;
- }
- else
- {
- AuthStatus as;
- if (m_bEverAuthSucWithDevice)
- {
- as.result = 1;
- as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
- }
- else
- {
- as.result = 11;
- as.msg = "请检查设备是否正常初始化或是否对应绑定设备";
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
- }
- }
- m_strURLValue = "";
- eErrCerUrl = spCerConfig->ReadConfigValue(GetEntityBase()->GetEntityName(), m_strURL, m_strURLValue);
- if (eErrIE == Error_Succeed)
- {
- Dbg("write ie url.sys [%s]", (const char*)m_strURLValue);
- GetEntityBase()->GetFunction()->SetSysVar("IEUrl", m_strURLValue);
- }
- CSmartPointer<IAsynWaitSp> spWait;
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = spEntityFunction.ConvertCase<IEntityFunctionPrivilege>();
- CEntityRunInfo acInfo;
- eErrCode = spEntityFunction->GetEntityRunInfo("IEBrowser",acInfo);
- if (eErrCode == Error_Succeed && acInfo.eState == EntityState_NoStart)
- {
- GetEntityBase()->GetFunction()->ShowStartupInfo("正在启动实体IEBrowser...");
- eErrIE = pFuncPrivilege->StartEntity("IEBrowser", m_strURLValue, spWait);
- if (eErrIE == Error_Succeed)
- {
- if (spWait != NULL)
- eErrIE = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- }
- else
- {
- Dbg("Start IEBrowser failed(%d).",eErrIE);
- }
- }
- else if (eErrCode == Error_Succeed && acInfo.eState == EntityState_Idle)
- {//if IEBrowser start before healthmanager,we suppose healthmanager is restart unexpectly,then set m_bEnterMainPageEver true
- m_bIEBeforeHealth = true;
- }
- if (!m_bAccessAuth)
- PostProcessAfterUpgrade();
- }
- break;
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- m_bIdleToMaintain = true;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //Fault
- void CHealthManagerFSM::s5_on_entry()
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_STATE_FAULT;
- CSmartPointer<IConfigInfo> spConfig,spConfigRun;
- ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
- eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
- int failTimes = 0,maxFailTimes = 3;
- spConfig->ReadConfigValueInt("Run","MaxFailTimes",maxFailTimes);
- spConfigRun->ReadConfigValueInt("Run","FailTimes",failTimes);
- failTimes++;
- if (failTimes > maxFailTimes)
- {
- LogEvent(Severity_Middle,LOG_EVT_HEADLIGHT_RED_ON,"设备故障");
- LogWarn(Severity_High,Error_Unexpect,LOG_ERR_HEALTH_FAILED,"HealthManager failed.");
- eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","D");
- if (eErr != Error_Succeed)
- Dbg("set termstage D failed (%d).",eErr);
- else
- Dbg("Set TerminalStage D.");
- }
- else
- {
- Dbg("have failed %d times.",failTimes);
- spConfigRun->WriteConfigValueInt("Run","FailTimes",failTimes);
- eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","F");
- if (eErr != Error_Succeed)
- {
- Dbg("set RunState failed (%d).",eErr);
- }
- }
- PostProcessAfterUpgrade();
- }
- void CHealthManagerFSM::s5_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s5_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s5(Fault) event %d,%d",pEvt->iEvt,pEvt->param1);
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //Maintaining
- void CHealthManagerFSM::s6_on_entry()
- {
- LOG_FUNCTION();
- m_preFsmState = m_fsmState;
- m_fsmState = HM_FSM_STATE_MAINTAINING;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","M");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState M failed (%d).",eErrCode);
- }
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege == NULL)
- {
- Dbg("display screen NoPrivilege");
- return;
- }
- ErrorCodeEnum eErr = pFuncPrivilege->DisplayBlueScreen("暂停服务");
- Dbg("display blue screen %d",eErr);
- }
- void CHealthManagerFSM::s6_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s6_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- int ret = 0;
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN_FINISHED:
- pEvt->SetHandled();
- {
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege == NULL)
- {
- Dbg("un-display screen NoPrivilege");
- return 1;
- }
- ErrorCodeEnum eErr = pFuncPrivilege->UndisplayBlueScreen();
- Dbg("un-display blue screen %d",eErr);
- if (m_stateBeforeMaintain == HM_FSM_STATE_IDLE)
- {
- ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->SetSysVar("RunState","O");
- if (eErr != Error_Succeed)
- {
- Dbg("set RunState O failed (%d).",eErr);
- }
- }
- ret = m_preFsmState;
- }
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return ret;
- }
- //PrepareOff
- void CHealthManagerFSM::s7_on_entry()
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_STATE_PREPAREOFF;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","P");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState P failed (%d).",eErrCode);
- }
- }
- void CHealthManagerFSM::s7_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s7_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s7(PrepareOff) event %d",pEvt->iEvt);
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //Terminating
- void CHealthManagerFSM::s8_on_entry()
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_STATE_TERMINATING;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","T");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState T failed (%d).",eErrCode);
- }
- }
- void CHealthManagerFSM::s8_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s8_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s8(Terminating) event %d",pEvt->iEvt);
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //Exitting
- void CHealthManagerFSM::s9_on_entry()
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_STATE_EXITTING;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","E");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState E failed (%d).",eErrCode);
- }
- }
- void CHealthManagerFSM::s9_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s9_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s9(Exitting) event %d",pEvt->iEvt);
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //Sleep(L)
- void CHealthManagerFSM::s10_on_entry()
- {
- LOG_FUNCTION();
- m_fsmState = HM_FSM_STATE_SLEEP;
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("RunState","L");
- if (eErrCode != Error_Succeed)
- {
- Dbg("set RunState L failed (%d).",eErrCode);
- }
- }
- void CHealthManagerFSM::s10_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s10_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s10(Sleep) event %d",pEvt->iEvt);
- switch(pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_ENTER_CUSTOMER_MANAGER:
- pEvt->SetHandled();
- break;
- default:
- break;
- }
- return 0;
- }
- //In Customer Manager System
- void CHealthManagerFSM::s11_on_entry()
- {
- LOG_FUNCTION();
- m_preFsmState = m_fsmState;
- m_fsmState = HM_FSM_STATE_CMS;
- }
- void CHealthManagerFSM::s11_on_exit()
- {
- LOG_FUNCTION();
- }
- unsigned int CHealthManagerFSM::s11_on_event(FSMEvent* pEvt)
- {
- LOG_FUNCTION();
- Dbg("s11(In CMS) event %d",pEvt->iEvt);
- int ret = 0;
- switch (pEvt->iEvt)
- {
- case USER_EVT_MAITAIN:
- Dbg("to maintain...");
- m_stateBeforeMaintain = m_fsmState;
- pEvt->SetHandled();
- break;
- case USER_EVT_SWITCH_BACK_TO_RVC:
- pEvt->SetHandled();
- ret = m_preFsmState;
- break;
- default:
- break;
- }
- return ret;
- }
- ErrorCodeEnum CHealthManagerFSM::Initial()
- {
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- //start entity
- CSmartPointer<IAsynWaitSp> spWait;
- //close all entity if any? oiltmp
- ifstream is;
- ErrorCodeEnum err;
- CSimpleStringA cfgPath = "",strCoreBoot("CoreBoot"),strSafeLoad("SafeLoad"),strOp("Operating"),strIEBrower("IEBrowser");
- err = GetEntityBase()->GetFunction()->GetPath("cfg",cfgPath);
- CSystemStaticInfo sysInfo;
- GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
- Dbg("machinetype[%s],terminalID[%s]", (LPCTSTR)sysInfo.strMachineType,(LPCTSTR)sysInfo.strTerminalID);
- strCoreBoot = strCoreBoot + "." + sysInfo.strMachineType;
- strSafeLoad = strSafeLoad + "." + sysInfo.strMachineType;
- strOp = strOp + "." + sysInfo.strMachineType;
- m_strURL = strIEBrower + "." + sysInfo.strMachineType + ".Url";
- cfgPath = cfgPath + "\\HealthManager.ini";
- Dbg("cfgpath[%s]",(const char*)cfgPath);
- is.open (cfgPath, ios::binary);
- if (!is.is_open())
- {
- DWORD dwErr = GetLastError();
- Dbg("open cfg file failed. [%d]",dwErr);
- return Error_IO;
- }
- string line;
- //line = new char[MAX_KEY_VALUE_SIZE];
- long curr,end;
- is.seekg(0,ios_base::end);
- end = is.tellg();
- is.seekg(0,ios_base::beg);
- LoadStage eSection = LOADSTAGE_UNKNOWN;
- CSmartPointer<IConfigInfo> spConfig;
- err = GetEntityBase()->GetFunction()->OpenConfig(Config_Software, spConfig);
- if (err != Error_Succeed) {
- Dbg("open cfg file failed!");
- return Error_IO;
- }
- m_AccessAuthTries = 4;
- m_InitTries = 4;
- m_AccessAuthTimeout = 180000;
- m_InitializationTimeout = 180000;
- int tmpAATries,tmpInitTries,tmpAATimeout,tmpInitTimout;
- if (spConfig->ReadConfigValueInt("init","AccessAuthTries",tmpAATries) == Error_Succeed)
- m_AccessAuthTries = tmpAATries;
- if (spConfig->ReadConfigValueInt("init","InitTries",tmpInitTries) == Error_Succeed)
- m_InitTries = tmpInitTries;
- if (spConfig->ReadConfigValueInt("init","AccessAuthTimeout",tmpAATimeout) == Error_Succeed)
- m_AccessAuthTimeout = tmpAATimeout;
- if (spConfig->ReadConfigValueInt("init","InitializationTimeout",tmpInitTimout) == Error_Succeed)
- m_InitializationTimeout = tmpInitTimout;
- int count,cbNum,slNum,opNum;
- count = cbNum = slNum = opNum = 0;
- do
- {
- //memset(line,0,MAX_KEY_VALUE_SIZE);
- getline(is,line);
- if (line[0] == '[')
- {
- size_t secEnd = line.find(']',1);
- if (secEnd != string::npos)
- {
- string strSec = line.substr(1,secEnd-1);
- if (StrEqualNoCase(strSec.c_str(),strCoreBoot,strSec.length()))
- eSection = LOADSTAGE_COREBOOT;
- else if (StrEqualNoCase(strSec.c_str(),strSafeLoad,strSec.length()))
- eSection = LOADSTAGE_SAFELOAD;
- else if (StrEqualNoCase(strSec.c_str(),strOp,strSec.length()))
- eSection = LOADSTAGE_OPERATING;
- else
- eSection = LOADSTAGE_UNKNOWN;
- }
- }
- else if (((unsigned)(line[0]+1) > 256) || line[0] == ';')
- {//Chinese and other...
- curr = is.tellg();
- continue;
- }
- else if (isalpha(line[0]))
- {
- if (eSection == LOADSTAGE_UNKNOWN)
- {
- curr = is.tellg();
- continue;
- }
- size_t keyPos = line.find('=',0);
- if (keyPos != string::npos)
- {
- string keyName = line.substr(0,keyPos);
- count++;
- switch(eSection)
- {
- case LOADSTAGE_COREBOOT:
- spConfig->ReadConfigValueInt(strCoreBoot,keyName.c_str(),m_coreBootOpt[keyName.c_str()].loadOpt);
- m_vCoreBoot.push_back(keyName.c_str());
- m_coreBootOpt[keyName.c_str()].eResult = LOADING_INIT;
- m_coreBootOpt[keyName.c_str()].initSn = cbNum;
- cbNum++;
- break;
- case LOADSTAGE_SAFELOAD:
- spConfig->ReadConfigValueInt(strSafeLoad,keyName.c_str(),m_safeLoadOpt[keyName.c_str()].loadOpt);
- m_vSafeLoad.push_back(keyName.c_str());
- m_safeLoadOpt[keyName.c_str()].eResult = LOADING_INIT;
- m_safeLoadOpt[keyName.c_str()].initSn = slNum;
- slNum++;
- break;
- case LOADSTAGE_OPERATING:
- spConfig->ReadConfigValueInt(strOp,keyName.c_str(),m_operatingOpt[keyName.c_str()].loadOpt);
- m_vOperating.push_back(keyName.c_str());
- m_operatingOpt[keyName.c_str()].eResult = LOADING_INIT;
- m_operatingOpt[keyName.c_str()].initSn = opNum;
- opNum++;
- break;
- default:
- break;
- }
- }
- }
- curr = is.tellg();
- }while(curr < end);
- is.close();
- Dbg("opt num:[%d]c[%d]s[%d]o[%d]",count,m_coreBootOpt.size(),m_safeLoadOpt.size(),m_operatingOpt.size());
- //read entity loading history record
- CSimpleStringA sysinfoPath = "";
- err = GetEntityBase()->GetFunction()->GetPath("cfg",sysinfoPath);
- sysinfoPath += "\\EntityLoadHis.ini";
- is.open (sysinfoPath, ios::binary);
- if (!is.is_open())
- {
- DWORD dwErr = GetLastError();
- Dbg("open entityloadhis file failed. [%d]",dwErr);
- return Error_IO;
- }
- is.seekg(0,ios_base::end);
- end = is.tellg();
- is.seekg(0,ios_base::beg);
- EntityLoadFaultStage eLoadSection = ENTITYLOAD_SAFELOADFAULT;
- count = 0;
- do
- {
- getline(is,line);
- if (line[0] == '[')
- {
- size_t secEnd = line.find(']',1);
- if (secEnd != string::npos)
- {
- string strSec = line.substr(1,secEnd-1);
- if (StrEqualNoCase(strSec.c_str(),"SafeLoadFault",strSec.length()))
- eLoadSection = ENTITYLOAD_SAFELOADFAULT;
- else if (StrEqualNoCase(strSec.c_str(),"OperatingFault",strSec.length()))
- eLoadSection = ENTITYLOAD_SAFELOADFAULT;
- }
- }
- else if (((unsigned)(line[0]+1) > 256) || line[0] == ';')
- {//Chinese and other...
- curr = is.tellg();
- continue;
- }
- else if (isalpha(line[0]))
- {
- size_t keyPos = line.find('=',0);
- if (keyPos != string::npos)
- {
- string keyName = line.substr(0,keyPos);
- count++;
- switch(eSection)
- {
- case ENTITYLOAD_SAFELOADFAULT:
- spConfig->ReadConfigValueInt("SafeLoadFault",keyName.c_str(),m_safeLoadFault[keyName.c_str()].count);
- break;
- case ENTITYLOAD_OPERATINGFAULT:
- spConfig->ReadConfigValueInt("OperatingFault",keyName.c_str(),m_operatingFault[keyName.c_str()].count);
- break;
- default:
- break;
- }
- }
- }
- curr = is.tellg();
- }while(curr < end);
- //MessageBoxA(0,0,0,0);
- is.close();
-
- CSmartPointer<IConfigInfo> spConfigRoot;
- GetEntityBase()->GetFunction()->OpenConfig(Config_Root, spConfigRoot);
- CSimpleStringA csGpioVendor("");
- spConfigRoot->ReadConfigValue("Device.Gpio", "Vendor", csGpioVendor);
- if (csGpioVendor.GetLength() > 1)
- m_hasCfgGpioInRootIni = true;
- WaitDeamonFinishTask* task = new WaitDeamonFinishTask(this);
- GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
- return Error_Succeed;
- }
- int CHealthManagerFSM::WaitDeamonFinish()
- {
- int count = 0;
- while(1)//max waiting time
- {
- count++;
- //query if update deamon process is started oiltmp
- //case custody
- //case needreboot
- //case rollback
- //case timeout
- if (count > 2)
- break;
- //Sleep(5000);
- }
- return 0;
- }
- int CHealthManagerFSM::DoInitialization()
- {
- ErrorCodeEnum eErr;
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- CEntityRunInfo acInfo;
- eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
- Dbg("Initializer state return %d",eErr);
- if (eErr == Error_Succeed && (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Idle))
- {
- if (acInfo.eState == EntityState_NoStart)
- {
- CSmartPointer<IAsynWaitSp> spWaitInit;
- eErr = pFuncPrivilege->StartEntity("Initializer",NULL,spWaitInit);
- if (eErr == Error_Succeed)
- eErr = spWaitInit->WaitAnswer(MAX_AYSNC_TIMEOUT);
- eErr = pFunc->GetEntityRunInfo("Initializer",acInfo);
- if (eErr != Error_Succeed || acInfo.eState != EntityState_Idle)
- {
- Dbg("start Initializer failed(%d,%d).",eErr,acInfo.eState);
- return 1;
- }
- }
- if (m_pInitClient == NULL)
- {
- m_pInitClient = new InitializerService_ClientBase(this->GetEntityBase());
- eErr = m_pInitClient->Connect();
- if (eErr != Error_Succeed) {
- Dbg("Initializer connected failed.");
- m_pInitClient->SafeDelete();
- m_pInitClient = NULL;
- return 2;
- }
- else
- Dbg("Initializer connected.");
- }
- InitializerService_Initialize_Info initInfo;
- m_pInitClient->Initialize(initInfo);
- //no need to wait,just go
- return 0;
- }
- else
- {
- Dbg("Get Initializer RunInfo failed(%d).",eErr);
- return 3;
- }
- }
- int CHealthManagerFSM::CoreBootDoWork()
- {
- return 0;
- }
- int CHealthManagerFSM::SafeLoadDoWork()
- {
- return 0;
- }
- int CHealthManagerFSM::OpLoadDoWork()
- {
- return 0;
- }
- //0:auth suc or have already authed;1:auth failed;
- int CHealthManagerFSM::AccessAuthDoWork()
- {
- //oilyang@20190924 comment the following Sleep(5000);
- //Sleep(5000);//oilyang wait for a few seconds
- if (m_bFirstAccessAuth && m_accessAuthCheckMD5 == 1 && m_havReceiveMD5OK == 0)
- {
- Dbg("wait md5 ok.");
- WaitForSingleObject(m_hMD5OKEvt, INFINITE);
- m_bFirstAccessAuth = false;
- Dbg("have received md5 ok event.");
- }
- CSimpleStringA csTermStage("");
- ErrorCodeEnum eErr;
- eErr = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
- Dbg("oninit get termstage %s",(LPCTSTR)csTermStage);
- bool bToDoInit = false;
- if (eErr == Error_Succeed)
- {
- if (csTermStage[0] == 'U')
- {
- bToDoInit = true;
- int initTime = 0;
- INITIALIZATION:
- int rc = DoInitialization();
- Dbg("the %d init",initTime);
- initTime++;
- DWORD dwStart = GetTickCount();
- while(1)
- {
- if (!m_bInitSuc && !m_bInitFail)
- {
- Sleep(1000);
- continue;
- }
- else if (m_bInitSuc || m_bInitFail)
- {
- Dbg("init result %d,%d",m_bInitSuc,m_bInitFail);
- //if (m_bInitFail && initTime < m_InitTries)
- if (m_bInitFail)
- {
- Sleep(5000);
- m_bInitFail = false;
- goto INITIALIZATION;
- }
- if (m_bInitSuc)
- break;
- }
- //20130826 oilyang according to xkm,wait forever
- //DWORD dwEnd,dwElapse;
- //dwEnd = GetTickCount();
- //dwElapse = dwEnd - dwStart;
- //if (dwElapse > m_InitializationTimeout)
- //{
- // Dbg("wait init timeout");
- // break;
- //}
- }
- }
- }
- else
- {
- Dbg("get TerminalStage failed(%d).",eErr);
- return 1;
- }
- Dbg("after proc initialization.");
- if (bToDoInit)
- {
- if (m_bInitSuc)
- {
- eErr = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
- Dbg("set TerminalStage C");
- if (eErr != Error_Succeed)
- Dbg("set TerminalStage C failed(%d).",eErr);
- }
- else
- {
- Dbg("initialization failed.");
- return 1;
- }
- }
- //to accessauth
- ErrorCodeEnum eErrCode;
- eErrCode = GetEntityBase()->GetFunction()->GetSysVar("TerminalStage",csTermStage);
- Dbg("before accessauth get termstage %s",(LPCTSTR)csTermStage);
- if (eErrCode == Error_Succeed)
- {
- //if (csTermStage[0] == 'C' || csTermStage[0] == 'A')
- if (csTermStage[0] != 'U')
- {
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- //terminate pinpad
- //CSmartPointer<IAsynWaitSp> spWait;
- //eErrCode = pFuncPrivilege->CloseEntity("PinPad",spWait);
- //Dbg("close pinpad %d.",eErrCode);
- //eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- //if (eErrCode != Error_Succeed)
- //{
- // //terminate pinpad
- // CSmartPointer<IAsynWaitSp> spWait;
- // pFuncPrivilege->TerminateEntity("PinPad",spWait);
- // spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- //}
- //if (eErrCode == Error_Succeed)
- {
- CEntityRunInfo acInfo;
- eErrCode = pFunc->GetEntityRunInfo("AccessAuthorization",acInfo);
- Dbg("AccessAuth state return %d",eErrCode);
- if (eErrCode == Error_Succeed)
- {
- switch(acInfo.eState)
- {
- case EntityState_NoStart:
- {
- CSmartPointer<IAsynWaitSp> spWaitAC;
- eErrCode = pFuncPrivilege->StartEntity("AccessAuthorization",NULL,spWaitAC);
- eErrCode = spWaitAC->WaitAnswer(MAX_AYSNC_TIMEOUT);
- Dbg("start accessauth %d.",eErrCode);
- }
- break;
- case EntityState_Idle:
- Dbg("AccessAuth state idle.");
- break;
- default:
- break;
- }
-
- if (m_pACClient == NULL)
- {
- m_pACClient = new AccessAuthService_ClientBase(this->GetEntityBase());
- eErrCode = m_pACClient->Connect();
- if (eErrCode != Error_Succeed) {
- Dbg("accessauth connected failed.");
- m_pACClient->SafeDelete();
- m_pACClient = NULL;
- StartPinPadEntity();
- return 1;
- }
- else
- Dbg("accessauth connected.");
- }
- }
- else
- {
- Dbg("Get AccessAuth RunInfo failed(%d).",eErrCode);
- StartPinPadEntity();
- return 1;
- }
- if (m_pACClient != NULL)
- {
- DWORD dwStart = GetTickCount();
- int registCount = 0;
- REGIST: eErrCode = m_pACClient->Regist();
- m_bHasAuthEver = true;
- registCount++;
- Dbg("accessauth regist %d",eErrCode);
- if (eErrCode == Error_Succeed)
- {
- while(1)
- {
- DWORD dwEnd = GetTickCount();
- DWORD dwElapse = dwEnd-dwStart;
- if (dwElapse > m_AccessAuthTimeout)
- {
- Dbg("after x minute");
- StartPinPadEntity();
- //auth failed,rollback to C
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
- Dbg("auth fail,set TerminalStage C 1");
- if (eErr != Error_Succeed)
- Dbg("set TerminalStage C failed(%d).",eErr);
- m_bFirstAccessAuth = false;
- return 1;
- }
- Sleep(1000);
- if (!m_bAccessAuth && !m_bACFailed)
- continue;
- if (m_bACFailed && registCount < m_AccessAuthTries)
- {
- LogWarn(Severity_Low,Error_Unexpect,LOG_WARN_HEALTH_ACCESSAUTH_FAILED,"AccessAuth failed.");
- m_bACFailed = false;
- Sleep(5000);
- goto REGIST;
- }
- Dbg("regist try %d times",registCount);
- StartPinPadEntity();
- if (!m_bAccessAuth)
- {
- //auth failed,rollback to C
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
- Dbg("auth fail,set TerminalStage C 2");
- if (eErr != Error_Succeed)
- Dbg("set TerminalStage C failed(%d).",eErr);
- }
- break;
- //}
- }
- m_bFirstAccessAuth = false;
- return 0;
- }
- else
- {
- Dbg("accessauth regist failed(%d).",eErrCode);
- StartPinPadEntity();
- //auth failed,rollback to C
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
- Dbg("auth fail,set TerminalStage C 3");
- if (eErr != Error_Succeed)
- Dbg("set TerminalStage C failed(%d).",eErr);
- return 1;
- }
- }
- else
- {
- Dbg("Start accessauth failed(%d).",eErrCode);
- StartPinPadEntity();
- //auth failed,rollback to C
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","C");
- Dbg("auth fail,set TerminalStage C 4");
- if (eErr != Error_Succeed)
- Dbg("set TerminalStage C failed(%d).",eErr);
- return 1;
- }
- }
- }
- else
- {
- StartPinPadEntity();
- return 0;
- }
- }
- else
- Dbg("Get termstage failed(%d).",eErrCode);
- return 1;
- }
- //return value:
- //0:all entity have started suc
- //1:some entity havn't try to start
- //2:all entity have tried to started,but some failed
- int CHealthManagerFSM::CheckLoadResult(LoadStage eStage)
- {
- int ret = 0;
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- if (eStage == LOADSTAGE_COREBOOT)
- it = m_coreBootOpt.begin();
- else if (eStage == LOADSTAGE_SAFELOAD)
- it = m_safeLoadOpt.begin();
- else
- it = m_operatingOpt.begin();
- while(1)
- {
- switch(it->second.loadOpt)
- {
- case LOADOPT_IGNORE:
- if (it->second.eResult == LOADING_INIT)
- return 1;
- break;
- case LOADOPT_ASYNC_VERIFY:
- case LOADOPT_SYNC_VERIFY:
- default:
- if (it->second.eResult == LOADING_INIT)
- return 3;
- else if (it->second.eResult != LOADING_SUCCEED)
- ret = 2;
- break;
- }
- it++;
- if (eStage == LOADSTAGE_COREBOOT && it == m_coreBootOpt.end())
- break;
- else if (eStage == LOADSTAGE_SAFELOAD && it == m_safeLoadOpt.end())
- break;
- else if (eStage == LOADSTAGE_OPERATING && it == m_operatingOpt.end())
- break;
- }
- return ret;
- }
- void CHealthManagerFSM::SetAccessAuth(bool bResult)
- {
- m_bAccessAuth = bResult;
- ErrorCodeEnum eErrCode;
- if (bResult)
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage","A");
- else
- eErrCode = GetEntityBase()->GetFunction()->SetSysVar("TerminalStage", "C");
- Dbg("SetAccessAuth %d",bResult);
- if (m_pACClient != NULL)
- {
- }
- }
- int CHealthManagerFSM::StartPinPadEntity()
- {
- if (m_coreBootOpt.find("PinPad") == m_coreBootOpt.end() && m_safeLoadOpt.find("PinPad") == m_safeLoadOpt.end()
- && m_operatingOpt.find("PinPad") == m_operatingOpt.end())
- {
- Dbg("not configure pinpad.");
- return 0;
- }
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- CEntityRunInfo acInfo;
- ErrorCodeEnum eErrCode;
- eErrCode = pFunc->GetEntityRunInfo("PinPad",acInfo);
- Dbg("pinpad state %d,%d",eErrCode,acInfo.eState);
- if (acInfo.eState == EntityState_NoStart || acInfo.eState == EntityState_Close || acInfo.eState == EntityState_Killed)
- {
- CSmartPointer<IAsynWaitSp> spWait;
- eErrCode = pFuncPrivilege->StartEntity("PinPad",NULL,spWait);
- Dbg("start pinpad %d.",eErrCode);
- if (spWait != NULL)
- eErrCode = spWait->WaitAnswer(MAX_AYSNC_TIMEOUT);
- Dbg("start pinpad wait %d",eErrCode);
- }
- return eErrCode;
- }
- void CHealthManagerFSM::ToReAccessAuth(bool bEver)
- {
- if (m_bFirstAccessAuth)
- return;
- SetAccessAuth(false);
- AccessAuthTask *pTask = new AccessAuthTask(this);
- GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
- }
- ErrorCodeEnum CHealthManagerFSM::AsyncStartEntity(const char *entity_name, const char *cmdline, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- ErrorCodeEnum errCode;
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- CSmartPointer<IAsynWaitSp> spWait;
- errCode = pFuncPrivilege->StartEntity(entity_name, cmdline, spWait);
- Dbg("start entity %s",entity_name);
- if (errCode == Error_Succeed) {
- callback_entry *entry = new callback_entry();
- entry->pRawData = pData;
- entry->EntityName = entity_name;
- entry->ErrorResult = Error_Unexpect;
- entry->op = OP_START_ENTITY;
- if (spWait != NULL)
- spWait->SetCallback(this, entry);
- }
- return errCode;
- } else {
- return Error_NoPrivilege;
- }
- }
- ErrorCodeEnum CHealthManagerFSM::AsyncStopEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- CSmartPointer<IAsynWaitSp> spWait;
- ErrorCodeEnum Error = pFuncPrivilege->StopEntity(entity_name, spWait);
- if (Error == Error_Succeed) {
- callback_entry *entry = new callback_entry();
- entry->pRawData = pData;
- entry->EntityName = entity_name;
- entry->ErrorResult = Error_Unexpect;
- entry->op = OP_STOP_ENTITY;
- if (spWait != NULL)
- spWait->SetCallback(this, entry);
- }
- return Error;
- } else {
- return Error_NoPrivilege;
- }
- }
- ErrorCodeEnum CHealthManagerFSM::AsyncPauseEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- CSmartPointer<IAsynWaitSp> spWait;
- ErrorCodeEnum Error = pFuncPrivilege->PauseEntity(entity_name, spWait);
- if (Error == Error_Succeed) {
- callback_entry *entry = new callback_entry();
- entry->pRawData = pData;
- entry->EntityName = entity_name;
- entry->ErrorResult = Error_Unexpect;
- entry->op = OP_PAUSE_ENTITY;
- if (spWait != NULL)
- spWait->SetCallback(this, entry);
- }
- return Error;
- } else {
- return Error_NoPrivilege;
- }
- }
- ErrorCodeEnum CHealthManagerFSM::AsyncContinueEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- CSmartPointer<IAsynWaitSp> spWait;
- ErrorCodeEnum Error = pFuncPrivilege->ContinueEntity(entity_name, spWait);
- if (Error == Error_Succeed) {
- callback_entry *entry = new callback_entry();
- entry->pRawData = pData;
- entry->EntityName = entity_name;
- entry->ErrorResult = Error_Unexpect;
- entry->op = OP_CONTINUE_ENTITY;
- if (spWait != NULL)
- spWait->SetCallback(this, entry);
- }
- return Error;
- } else {
- return Error_NoPrivilege;
- }
- }
- ErrorCodeEnum CHealthManagerFSM::AsyncTerminateEntity(const char *entity_name, void *pData)
- {
- CSmartPointer<IEntityFunction> pFunc = m_pEntity->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- if (pFuncPrivilege != NULL) {
- CSmartPointer<IAsynWaitSp> spWait;
- ErrorCodeEnum Error = pFuncPrivilege->TerminateEntity(entity_name, spWait);
- if (Error == Error_Succeed) {
- callback_entry *entry = new callback_entry();
- entry->pRawData = pData;
- entry->EntityName = entity_name;
- entry->ErrorResult = Error_Unexpect;
- entry->op = OP_TERMINATE_ENTITY;
- if (spWait != NULL)
- spWait->SetCallback(this, entry);
- }
- return Error;
- } else {
- return Error_NoPrivilege;
- }
- }
- void CHealthManagerFSM::OnAnswer(CSmartPointer<IAsynWaitSp> pAsynWaitSp)
- {
- CSmartPointer<ICallbackListener> spCallback;
- CSmartPointer<IReleasable> pData;
- pAsynWaitSp->GetCallback(spCallback, pData);
- //LOG_ASSERT(pData);
- callback_entry *entry = dynamic_cast<callback_entry*>((IReleasable*)(pData.GetRawPointer()));
- entry->ErrorResult = pAsynWaitSp->AsyncGetAnswer();
- callback_entry *new_entry = new callback_entry();
- new_entry->EntityName = entry->EntityName;
- new_entry->ErrorResult = entry->ErrorResult;
- new_entry->op = entry->op;
- new_entry->state = entry->state;
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- int ret;
- Dbg("stage %d,%s,result %d",m_eStage,(LPCSTR)new_entry->EntityName,new_entry->ErrorResult);
- switch(m_eStage)
- {
- case LOADSTAGE_COREBOOT:
- it = m_coreBootOpt.find(new_entry->EntityName);
- if (it != m_coreBootOpt.end())
- {
- if (new_entry->ErrorResult == Error_Succeed)
- it->second.eResult = LOADING_SUCCEED;
- else if (new_entry->ErrorResult == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- if (it->second.eResult != Error_Succeed)
- {
- char tmp[64] = {0};
- sprintf(tmp, "实体 %s 启动失败", it->first.GetData());
- //GetEntityBase()->GetFunction()->ShowFatalError(tmp);
- Dbg("%s", tmp);
- }
- ret = CheckLoadResult(LOADSTAGE_COREBOOT);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_COREBOOT_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- break;
- case LOADSTAGE_SAFELOAD:
- it = m_safeLoadOpt.find(new_entry->EntityName);
- if (it != m_safeLoadOpt.end())
- {
- if (new_entry->ErrorResult == Error_Succeed)
- it->second.eResult = LOADING_SUCCEED;
- else if (new_entry->ErrorResult == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- ret = CheckLoadResult(LOADSTAGE_SAFELOAD);
- Dbg("safeload answer %d",ret);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_SAFELOAD_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- else
- Dbg("cannot find %s",(LPCTSTR)new_entry->EntityName);
- break;
- case LOADSTAGE_OPERATING:
- it = m_operatingOpt.find(new_entry->EntityName);
- if (it != m_operatingOpt.end())
- {
- if (new_entry->ErrorResult == Error_Succeed)
- it->second.eResult = LOADING_SUCCEED;
- else if (new_entry->ErrorResult == Error_TimeOut)
- it->second.eResult = LOADING_TIMEOUT;
- else
- it->second.eResult = LOADING_FAILED;
- ret = CheckLoadResult(LOADSTAGE_OPERATING);
- if (ret == 0 || ret == 2)
- {
- FSMEvent *e = new FSMEvent(USER_EVT_OPERATING_FINISHED);
- e->param1 = ret;
- PostEventFIFO(e);
- }
- }
- break;
- default:
- break;
- }
- }
- void CHealthManagerFSM::ToCheckUPS()
- {
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- CEntityRunInfo acInfo;
- ErrorCodeEnum eErrCode;
- eErrCode = pFunc->GetEntityRunInfo("Ups",acInfo);
- Dbg("ups state %d,%d",eErrCode,acInfo.eState);
- if (acInfo.eState != EntityState_NoStart)
- {
- CSmartPointer<IAsynWaitSp> spWait;
- eErrCode = pFuncPrivilege->TerminateEntity("Ups",spWait);
- Sleep(2000);
- eErrCode = pFuncPrivilege->StartEntity("Ups",NULL,spWait);
- if (spWait != NULL)
- eErrCode = spWait->WaitAnswer(5000);
- Dbg("restart ups wait %d",eErrCode);
- }
- }
- int CHealthManagerFSM::USBControl()
- {
- CSystemStaticInfo sysInfo;
- ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetSystemStaticInfo(sysInfo);
- if (eErr != Error_Succeed)
- {
- Dbg("Get system static info failed(%d).",eErr);
- return -1;
- }
- Dbg("machinetype[%s]",(LPCTSTR)sysInfo.strMachineType);
- if (sysInfo.strMachineType.Compare("RVC.PAD") == 0)
- {
- if (m_pDevCtrlClient == NULL)
- {
- m_pDevCtrlClient = new DeviceControlService_ClientBase(this->m_pEntity);
- ErrorCodeEnum eErr = m_pDevCtrlClient->Connect();
- if (eErr != Error_Succeed) {
- Dbg("DeviceControl connected failed(%d).",eErr);
- m_pDevCtrlClient->SafeDelete();
- m_pDevCtrlClient = NULL;
- return -1;
- }
- }
- if (m_pDevCtrlClient != NULL)
- {
- DeviceControlService_USB_Req req;
- DeviceControlService_USB_Ans ans;
- req.open = true;
- eErr = m_pDevCtrlClient->USB(req,ans,5000);
- if (eErr != Error_Succeed)
- {
- Dbg("usb control failed(%d).",eErr);
- return -1;
- }
- else
- Dbg("usb opened.");
- }
- }
- return 0;
- }
- int CHealthManagerFSM::GetEntityCfgInfo(CSimpleStringA name,int &loadOpt)
- {
- Dbg("GetEntityCfgInfo %s",(LPCTSTR)name);
- if (name != NULL && name.Compare("IEBrowser") == 0)
- {
- Dbg("IEBrowser just return 2");
- loadOpt = 2;
- return 0;
- }
- map<CSimpleStringA,EntityLoadInfo>::iterator it;
- for (it = m_coreBootOpt.begin(); it != m_coreBootOpt.end(); ++it)
- {
- if (_strnicmp(name,it->first,name.GetLength()) == 0)
- {
- loadOpt = it->second.loadOpt;
- Dbg("GetEntityCfgInfo %d",loadOpt);
- return 0;
- }
- }
- for (it = m_safeLoadOpt.begin(); it != m_safeLoadOpt.end(); ++it)
- {
- if (_strnicmp(name,it->first,name.GetLength()) == 0)
- {
- loadOpt = it->second.loadOpt;
- Dbg("GetEntityCfgInfo %d",loadOpt);
- return 0;
- }
- }
- for (it = m_operatingOpt.begin(); it != m_operatingOpt.end(); ++it)
- {
- if (_strnicmp(name,it->first,name.GetLength()) == 0)
- {
- loadOpt = it->second.loadOpt;
- Dbg("GetEntityCfgInfo %d",loadOpt);
- return 0;
- }
- }
- loadOpt = 99;
- return -1;
- }
- CSimpleStringA CHealthManagerFSM::QueryCheckCode()
- {
- ErrorCodeEnum eErr = Error_Unexpect;
- CSimpleStringA tmpCheckCode("");
- PinPadService_ClientBase *pClient = new PinPadService_ClientBase(this->m_pEntity);
- if (pClient != NULL)
- {
- eErr = pClient->Connect();
- if (eErr == Error_Succeed)
- {
- PinPadService_QueryFunc_Req reqQ;
- PinPadService_QueryFunc_Ans ansQ;
- eErr = pClient->QueryFunc(reqQ, ansQ, 5000);
- if (eErr == Error_Succeed)
- {
- PinPadService_GetCheckCode_Req reqG;
- PinPadService_GetCheckCode_Ans ansG;
- if (ansQ.reserved1 == 2)//if sm only
- {
- reqG.mSN.Init(1);
- reqG.wSN.Init(1);
- reqG.mSN[0] = 1;
- reqG.wSN[0] = 0;
- eErr = pClient->GetCheckCode(reqG, ansG, 10000);
- if (eErr == Error_Succeed)
- {
- tmpCheckCode = ansG.checkcode[0];
- }
- }
- else//3des only or 3des&sm both ok
- {
- reqG.mSN.Init(1);
- reqG.wSN.Init(1);
- reqG.mSN[0] = 0;
- reqG.wSN[0] = 0;
- eErr = pClient->GetCheckCode(reqG, ansG, 10000);
- if (eErr == Error_Succeed)
- {
- tmpCheckCode = ansG.checkcode[0];
- }
- }
- }
- else
- Dbg("QueryFunc failed.error code:%d",eErr);
- }
- else
- Dbg("connect to pinpad failed.error code:%d",eErr);
- }
- return tmpCheckCode;
- }
- void CHealthManagerFSM::DeviceReConnect()
- {
- //if haven't called access auth ever or in the 1st accessauth processing,no need to call access auth
- if (QueryAccessAuthStatus() == 2 || m_bFirstAccessAuth)
- return;
- CSimpleStringA tmpCheckCode = QueryCheckCode();
- Dbg("pre check code size:%d,now:%d",m_checkCode.GetLength(),tmpCheckCode.GetLength());
- SetAccessFailedFlag(false);
- if (tmpCheckCode.GetLength() == 0 || m_checkCode.Compare(tmpCheckCode, true) != 0 || !GetAccessAuthFlag() || !m_bEverAuthSucWithDevice)
- {
- if (m_checkCode.GetLength() > 1 && tmpCheckCode.GetLength() > 1 && m_checkCode.Compare(tmpCheckCode, true) != 0)
- {
- AuthStatus as;
- as.result = 1;
- as.msg = "设备混用,请接入对应设备或后台重新绑定当前设备";
- SpSendBroadcast(GetEntityBase()->GetFunction(), SP_MSG_OF(AuthStatus), SP_MSG_SIG_OF(AuthStatus), as);
- }
- else
- {
- if (m_checkCode.GetLength() > 1)
- ToReAccessAuth(true);
- else
- ToReAccessAuth();
- }
- }
- }
- int CHealthManagerFSM::QuitFrameworkAndSaveInfo(RebootTriggerEnum eTrigger, RebootWayEnum eWay)
- {
- CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
- CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
- Dbg("quit framework and info %d,%d.", eTrigger, eWay);
- pFuncPrivilege->Reboot(eTrigger, eWay);
- return 0;
- }
- void CHealthManagerFSM::PostProcessAfterUpgrade()
- {
- LOG_FUNCTION();
- CSimpleStringA csCfgPath(""), csDisk("D"), csFileName("");
- ErrorCodeEnum eErr = GetEntityBase()->GetFunction()->GetPath("cfg", csCfgPath);
- if (eErr == Error_Succeed)
- csDisk = csCfgPath.SubString(0, 1);
- csFileName = csDisk + ":\\Run\\runinfo\\runcfg\\starttime.dat";
- Dbg("file:%s", (const char*)csFileName);
- if (_access((const char*)csFileName, 0) == 0)
- {
- Dbg("exist upgrade flag file,to decide if restart framework.");
- //存在升级后的启动文件
- CSmartPointer<IConfigInfo> spConfigRun;
- eErr = GetEntityBase()->GetFunction()->OpenConfig(Config_Run, spConfigRun);
- if (eErr == Error_Succeed)
- {
- int xTimes = 0;
- spConfigRun->ReadConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
- if (xTimes < 3)
- {
- xTimes++;
- Dbg("write Run--UpgradeRestartTimes:%d", xTimes);
- spConfigRun->WriteConfigValueInt("Run", "UpgradeRestartTimes", xTimes);
- if (xTimes == 3)
- {
- //DeleteFileA((const char*)csFileName);
- QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_OS);
- }
- else
- QuitFrameworkAndSaveInfo(RebootTrigger_Resource, RebootWay_Framework);
- }
- }
- }
- }
|