#pragma once #include "SpBase.h" #include "SpFSM.h" //#include "IHttpFunc.h" #include "SpUtility.h" #include "CommEntityUtil.hpp" #include "VtmLoader_server_g.h" #include "VtmLoader_UserCode.h" using namespace VtmLoader; //集中配置更新 #define CENTERSETTING_UPDATE_CHECK_TIME 60000 * 5 //集中配置更新时间5分钟 #define TIMER_CENTERSETTING_UPDATE_CHECK 1 enum EvtType { USER_EVT_NetworkCheck_Passed = EVT_USER + 1, // 网络检查通过,包括网卡及到总行服务的连通性 USER_EVT_COREBOOT_FINISHED, USER_EVT_SAFELOAD_FINISHED, USER_EVT_SAFELOAD_EXMINE_FINISHED, USER_EVT_OPERATING_FINISHED, USER_EVT_CHECK_DEVICE_ENTITY, USER_EVT_SAVE_TERMINALNO, USER_EVT_DEALWITH_OLD_EVENT, USER_EVT_QUERY_LOCAL_INFO, }; enum LoadStage { LOADSTAGE_UNKNOWN, LOADSTAGE_COREBOOT, LOADSTAGE_SAFELOAD, LOADSTAGE_OPERATING }; enum EntityLoadFaultStage { ENTITYLOAD_SAFELOADFAULT, ENTITYLOAD_OPERATINGFAULT, }; enum LoadingOpt { LOADOPT_IGNORE, LOADOPT_ASYNC_VERIFY, LOADOPT_SYNC_VERIFY }; enum LoadingResult { LOADING_SUCCEED, LOADING_INIT, LOADING_FAILED, LOADING_TIMEOUT, }; enum HttpAddrType { HttpAddr_CenterSetting, HttpAddr_AccessAuth }; enum HttpConnResult { HttpConnResult_OK = 1, HttpConnResult_Failed }; enum DepDirInitCopyStage { DepDirInitCopy_NoNeed = 0, DepDirInitCopy_Copying, DepDirInitCopy_CopyFailed, DepDirInitCopy_CopySuc }; struct EntityLoadInfo { int initSn; int loadOpt; LoadingResult eResult; }; struct EntityLoadFault { CSimpleStringA name; int count; }; class CVtmLoaderEntity; template class TimerOutHelper : public ITimerListener { public: typedef void (T::* FuncTimer)(void* pUserdata); TimerOutHelper(T* p, FuncTimer pTimerFunc, void* pData, bool bDeleteSelf = false) : m_pObject(p), m_pUserData(pData), m_pTimer(pTimerFunc), m_bDeleteSelf(bDeleteSelf) { } virtual void OnTimeout(DWORD dwTimerID) { (m_pObject->*m_pTimer)(m_pUserData); if (m_bDeleteSelf) delete this; } private: void* m_pUserData; T* m_pObject; FuncTimer m_pTimer; bool m_bDeleteSelf; }; class CVtmLoaderFSM : public FSMImpl, public IFSMStateHooker, public ICallbackListener { public: CVtmLoaderFSM(); ~CVtmLoaderFSM(); private: virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); virtual void OnStateTrans(int iSrcState, int iDstState); enum{s0, s1, s2, s3, s4, s5}; BEGIN_FSM_STATE(CVtmLoaderFSM) FSM_STATE_ENTRY(s0, "None",s0_on_entry,s0_on_exit,s0_on_event) FSM_STATE_ENTRY(s1, "CoreBoot", s1_on_entry, s1_on_exit, s1_on_event) FSM_STATE_ENTRY(s2, "SafeLoad", s2_on_entry, s2_on_exit, s2_on_event) FSM_STATE_ENTRY(s3, "Loading", s3_on_entry, s3_on_exit, s3_on_event) FSM_STATE_ENTRY(s4, "Operating", s4_on_entry, s4_on_exit, s4_on_event) FSM_STATE_ENTRY(s5, "Fault", s5_on_entry, s5_on_exit, s5_on_event) END_FSM_STATE() BEGIN_FSM_RULE(CVtmLoaderFSM,s0) FSM_RULE_ENTRY(s0, s1, USER_EVT_NetworkCheck_Passed,0) FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 0) FSM_RULE_ENTRY(s1, s2, USER_EVT_COREBOOT_FINISHED, 1) FSM_RULE_ENTRY(s1, s5, USER_EVT_COREBOOT_FINISHED, 2) FSM_RULE_ENTRY(s2, s3, USER_EVT_SAFELOAD_FINISHED, 0) FSM_RULE_ENTRY(s2, s5, USER_EVT_SAFELOAD_FINISHED, 2) FSM_RULE_ENTRY(s3, s4, USER_EVT_OPERATING_FINISHED, 0) FSM_RULE_ENTRY(s3, s5, USER_EVT_OPERATING_FINISHED, 2) END_FSM_RULE() public: int m_refreshWaitSec, m_uploadLogInfo_waitSec; CSimpleString m_verShowMsg; int NetWorkCheckAndGetSetting(); bool GetConfig(); bool VerifyVer(); bool DetectHttpActive(); bool refreshToken(); int EntityLoad(); void NoticeEntityLoad(int evtCode); /*True: Legal; False: illegal*/ BOOL DetectNetworkLegality(CSimpleStringA& strInfo); int CheckLoadResult(LoadStage eStage); int HttpConnCheck(CSimpleStringA csHttAddr, HttpAddrType eType); SP::Toolkit::CConditionVarPlus m_hWaitTerminalNoVar,m_hWaiDeviceEntityVar,m_hSaveTerminalNoVar; void SetTerminalNo(SpReqAnsContext::Pointer ctx) { if (ctx->Req.terminalNo.IsNullOrEmpty()) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER)("Req.terminalNo is null or empty"); ctx->Answer(Error_Param); return; } LogWarn(Severity_Low, Error_Trace, VtmLoader_SetTerminalNo, CSimpleStringA::Format("SetTerminalNo:[%s]", ctx->Req.terminalNo.GetData())); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(VtmLoaderService_LogCode_SetTerminalNo)("set terminalNo to [%s]", ctx->Req.terminalNo.GetData()); m_terminalNoFromWeb = ctx->Req.terminalNo; ctx->Answer(Error_Succeed); m_hWaitTerminalNoVar.Broadcast(); } void NoticeAppReady(SpReqAnsContext::Pointer ctx) { } void CheckDeviceEntity(SpReqAnsContext::Pointer ctx); void SaveTerminalNo(SpReqAnsContext::Pointer ctx); void DealWithOldEvent(SpReqAnsContext::Pointer ctx); void QueryLocalInfo(SpReqAnsContext::Pointer ctx); bool CheckConfigInfoInTestRoom(); void SetVideoEntityOK() { m_bMediaControllerOK = true; } bool CheckIfNeedCopyDepFiles(); void CopyDepFilesToNewDepPath(); private: void s0_on_entry(); void s0_on_exit(); unsigned int s0_on_event(FSMEvent* event); void s1_on_entry(); void s1_on_exit(); unsigned int s1_on_event(FSMEvent* event); void s2_on_entry(); void s2_on_exit(); unsigned int s2_on_event(FSMEvent* event); void s3_on_entry(); void s3_on_exit(); unsigned int s3_on_event(FSMEvent* event); void s4_on_entry(); void s4_on_exit(); unsigned int s4_on_event(FSMEvent* event); void s5_on_entry(); void s5_on_exit(); unsigned int s5_on_event(FSMEvent* event); ErrorCodeEnum AsyncStartEntity(const char* entity_name, const char* cmdline, void* pData); void OnAnswer(CSmartPointer pAsynWaitSp); bool IsRootINIExist(CSimpleStringA& path); ErrorCodeEnum SubscribeEntitysEvents(); CSimpleStringA GetDns(); void ToCheckIfInstalling(); void DoSpecialJobInTestRoom(); CSimpleStringA GetOsVersion(); private: CSystemStaticInfo m_sysInfo; CSimpleStringA m_csErrEntity, m_defaultSystemId, m_terminalNoFromWeb, m_csEntityList; int m_sleepEnterOpMS, m_iCanIgnoreAddrDetect, m_iDetectInterval, m_iNoCheckMachineModel; ULLINT m_ullMaxAddrDetectTime, m_ullNetCardCost, m_ullNetDetectCost, m_ullGetConfigCost, m_ullEntityLoadStart; int m_httpCheckResult[2]; LoadStage m_eStage; vector m_vCoreBoot, m_vSafeLoad, m_vOperating; map m_coreBootOpt; map m_safeLoadOpt; map m_operatingOpt; CAutoArray m_arrExCludedList; bool m_bMediaControllerOK, m_bSIPPhoneStartFail; DepDirInitCopyStage m_eDepCopyStage; bool RefreshDeviceConfig(SpReqAnsContext::Pointer ctx); void CheckDeviceBaseEntity(SpReqAnsContext::Pointer ctx, WORD wEntityID); void CheckEntityRestartIdle(SpReqAnsContext::Pointer ctx); void CheckAudio(SpReqAnsContext::Pointer ctx); void CheckVideo(SpReqAnsContext::Pointer ctx); bool IfInExcludedLoadList(CSimpleStringA csEntityName); DWORD GetCenterCfgThread(); void OnCentersettingUpdateTimeout(void* pData); }; class CheckDeviceEntityEvent : public FSMEvent { public: CheckDeviceEntityEvent() : FSMEvent(USER_EVT_CHECK_DEVICE_ENTITY) {} ~CheckDeviceEntityEvent() {} SpReqAnsContext::Pointer ctx; virtual void OnUnhandled() { if (ctx != NULL) ctx->Answer(Error_InvalidState); } }; class SaveTerminalNoEvent : public FSMEvent { public: SaveTerminalNoEvent() : FSMEvent(USER_EVT_SAVE_TERMINALNO) {} ~SaveTerminalNoEvent() {} SpReqAnsContext::Pointer ctx; virtual void OnUnhandled() { if (ctx != NULL) ctx->Answer(Error_InvalidState); } }; class DealWithOldEvent_Event : public FSMEvent { public: DealWithOldEvent_Event() : FSMEvent(USER_EVT_DEALWITH_OLD_EVENT) {} ~DealWithOldEvent_Event() {} SpReqAnsContext::Pointer ctx; virtual void OnUnhandled() { if (ctx != NULL) ctx->Answer(Error_InvalidState); } }; class QueryLocalInfoEvent : public FSMEvent { public: QueryLocalInfoEvent() : FSMEvent(USER_EVT_QUERY_LOCAL_INFO) {} ~QueryLocalInfoEvent() {} SpReqAnsContext::Pointer ctx; virtual void OnUnhandled() { if (ctx != NULL) ctx->Answer(Error_InvalidState); } }; struct NetWorkCheckAndGetSettingTask : public ITaskSp { CVtmLoaderFSM* fsm; NetWorkCheckAndGetSettingTask(CVtmLoaderFSM* f) : fsm(f) {} void Process() { FSMEvent* pEvt = new FSMEvent(USER_EVT_NetworkCheck_Passed); pEvt->param1 = fsm->NetWorkCheckAndGetSetting(); fsm->PostEventFIFO(pEvt); } }; struct NoticeEntityLoadTask : public ITaskSp { CVtmLoaderFSM* fsm; int evtCode; NoticeEntityLoadTask(CVtmLoaderFSM* f,int evtCode) : fsm(f),evtCode(evtCode) {} void Process() { fsm->NoticeEntityLoad(evtCode); } }; struct HttpConnCheckTask : public ITaskSp { CVtmLoaderFSM* fsm; CSimpleStringA csHttAddr; HttpAddrType eType; HttpConnCheckTask(CVtmLoaderFSM* f,CSimpleStringA addr, HttpAddrType eType) : fsm(f),csHttAddr(addr),eType(eType) {} void Process() { fsm->HttpConnCheck(csHttAddr, eType); } }; struct CheckDeviceEntityTask : public ITaskSp { CVtmLoaderFSM* fsm; SpReqAnsContext::Pointer ctx; CheckDeviceEntityTask(CVtmLoaderFSM* f) : fsm(f){} void Process() { fsm->CheckDeviceEntity(ctx); } }; struct SaveTerminalNoTask : public ITaskSp { CVtmLoaderFSM* fsm; SpReqAnsContext::Pointer ctx; SaveTerminalNoTask(CVtmLoaderFSM* f) : fsm(f) {} void Process() { fsm->SaveTerminalNo(ctx); } }; struct DealWithOldEvent_Task : public ITaskSp { CVtmLoaderFSM* fsm; SpReqAnsContext::Pointer ctx; DealWithOldEvent_Task(CVtmLoaderFSM* f) : fsm(f) {} void Process() { fsm->DealWithOldEvent(ctx); } }; struct CopyDepFilesToNewDepPathTask : public ITaskSp { CVtmLoaderFSM* fsm; CopyDepFilesToNewDepPathTask(CVtmLoaderFSM* f) : fsm(f) {} void Process() { fsm->CopyDepFilesToNewDepPath(); } }; struct QueryLocalInfoTask : public ITaskSp { CVtmLoaderFSM* fsm; SpReqAnsContext::Pointer ctx; QueryLocalInfoTask(CVtmLoaderFSM* f) : fsm(f) {} void Process() { fsm->QueryLocalInfo(ctx); } };