#pragma once #include "modVer.h" #include "SpTest.h" #include "ResourceWatcherFSM.h" #include "UOSTools.hpp" class ResourceWatcherEntity; #define ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE 1 #define ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_INSTALLED_STATE 60 * 1000 #define ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE 3 #define ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE 30 * 1000 class ResourceWatcherServiceSession : public ResourceWatcherService_ServerSessionBase { public: ResourceWatcherServiceSession(ResourceWatcherEntity* pEntity) : m_pEntity(pEntity) {} virtual ~ResourceWatcherServiceSession() {} virtual void Handle_Fetch(SpReqAnsContext::Pointer ctx); virtual void Handle_GetDevInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_GetCardSwiper(SpReqAnsContext::Pointer ctx); virtual void Handle_GetCpuType(SpReqAnsContext::Pointer ctx); virtual void Handle_OperateFile(SpReqAnsContext::Pointer ctx); virtual void Handle_ExtractEventLog(SpReqAnsContext::Pointer ctx); virtual void Handle_UpdateDNS(SpReqAnsContext::Pointer ctx); virtual void Handle_GetNetworkInfo(SpReqAnsContext::Pointer ctx); virtual void Handle_GetThirdPartyInstallState(SpReqAnsContext::Pointer ctx); virtual void Handle_InstallThirdPartyProgram(SpReqAnsContext::Pointer ctx); private: ResourceWatcherEntity* m_pEntity; }; class ResourceWatcherEntity : public CEntityBase, public IBroadcastListener, public ITimerListener { public: ResourceWatcherEntity():m_bInitMode(FALSE) {} virtual ~ResourceWatcherEntity() {} virtual const char* GetEntityName() const { return "ResourceWatcher"; } const char* GetEntityVersion() const { return MODULE_VERSION_FULL; } ON_ENTITYT_TEST() virtual CServerSessionBase* OnNewSession(const char* , const char * ) { LOG_FUNCTION(); return new ResourceWatcherServiceSession(this); } virtual void OnPreStart(CAutoArray strArgs, CSmartPointer pTransactionContext) { LOG_FUNCTION(); ErrorCodeEnum errorCode = Error_Succeed; CSimpleStringA strtermState; GetFunction()->GetSysVar("TerminalStage", strtermState); if (strtermState.IsStartWith("Z=")) { Dbg("aaa in config mode"); m_bInitMode = TRUE; } errorCode = m_fsm.Init(this); if (errorCode == Error_Succeed) { CSmartPointer spEntityFunction = GetFunction(); CSystemStaticInfo staticInfo; spEntityFunction->GetSystemStaticInfo(staticInfo); if (!staticInfo.strMachineType.IsNullOrEmpty() && !staticInfo.strMachineType.Compare("RVC.Pad", true)) { errorCode = spEntityFunction->SubscribeBroadcast("CardSwiper", NULL, this, m_uiCardSwiperStatusListener); if (errorCode != Error_Succeed) { LOG_TRACE("Subscribe CardSwiper evt failed 0x%x", errorCode); pTransactionContext->SendAnswer(errorCode); return; } Dbg("SubScribe CardSwiper status broadcast suc."); } } pTransactionContext->SendAnswer(errorCode); } void OnStarted() { m_fsm.AfterInit(); ///**TODO(Gifur@10/21/2021): ´Ë½Ó¿ÚÓÐÎÊÌ⣬´ý²é£¡£¡£¡ */ //m_bInitMode = m_fsm.IsInitMode(); //Dbg("%s: %u", __FUNCTION__, m_bInitMode); if (!m_bInitMode) { CSmartPointer spEntityFunction = GetFunction(); spEntityFunction->SetTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE, this, ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_INSTALLED_STATE); } } /*ignore*/ virtual void OnPrePause(CSmartPointer pTransactionContext) { UOS::MonitorInfo info; info.name = "VGA-0"; info.nResolutionX = 1280; info.nResolutionY = 1024; info.isPrimary = true; ConfigMonitorSetting(info); pTransactionContext->SendAnswer(Error_Succeed); } /*ignore*/ virtual void OnPreContinue(CSmartPointer pTransactionContext) { UOS::MonitorInfo info; info.name = "HDMI-A-0"; info.nResolutionX = 1024; info.nResolutionY = 768; info.isPrimary = false; info.other = "VGA-0"; info.posDirecttion = 2; ConfigMonitorSetting(info); pTransactionContext->SendAnswer(Error_Succeed); } /*invoke fsm.onExit(), invoked when entity will be closed*/ virtual void OnPreClose(EntityCloseCauseEnum eCloseCause, CSmartPointerpTransactionContext) { ErrorCodeEnum errorCode = m_fsm.OnExit(); pTransactionContext->SendAnswer(errorCode); } virtual void OnSelfTest(EntityTestEnum eTestType, CSmartPointerpTransactionContext) { m_fsm.SelfTest(eTestType, pTransactionContext); } virtual bool IsService() const { return true; } virtual bool IsMultiThread() const { return false; } void Fetch(SpReqAnsContext::Pointer ctx) { FetchEvent* evt = new FetchEvent(); evt->ctx = ctx; m_fsm.PostEventFIFO(evt); } void GetDevInfo(SpReqAnsContext::Pointer ctx) { ctx->Answer(Error_NotImpl); } void GetCSwiperStatus(SpReqAnsContext::Pointer ctx) { ctx->Ans.status = m_fsm.GetCardSwiperVal(); ctx->Answer(Error_Succeed); } void GetCPUType(SpReqAnsContext::Pointer ctx) { m_fsm.GetCpuType(ctx); } void OperateFile( SpReqAnsContext::Pointer ctx) { OperateFileEvent* evt = new OperateFileEvent(); evt->m_ctx = ctx; m_fsm.PostEventFIFO(evt); } void RetrieveEventLog(SpReqAnsContext::Pointer ctx) { LOG_FUNCTION(); #if defined(RVC_OS_WIN) m_fsm.PostEventFIFO(new GetEventLogEvent(ctx)); #else ctx->Answer(Error_NotSupport); #endif //RVC_OS_WIN } void UpdateDNS(SpReqAnsContext::Pointer ctx); void GetNetworkInfo(SpReqAnsContext::Pointer ctx); void GetThirdPartyInstallState(SpReqAnsContext::Pointer ctx); void InstallThirdPartyProgram(SpReqAnsContext::Pointer ctx); #if defined(_MSC_VER) SP_BEGIN_MSG_DISPATCH_MAP(ResourceWatcherEntity) SP_BEGIN_ENTITY_MSG("CardSwiper") SP_MSG_HANDLE_NS(CardSwiper, ConnectStatus, OnCardSwiperConnectStatus) SP_END_ENTITY_MSG() SP_END_MSG_DISPATCH_MAP() #else virtual void OnBroadcastEvent(CUUID SubID, const char* pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CAutoBuffer Buffer) { } #endif //_MSC_VER private: void OnCardSwiperConnectStatus(const char *pszEntityName, DWORD dwMessageId, DWORD dwMessageSignature, CardSwiper::ConnectStatus &evt) { Dbg("OnCardSwiperConnectStatus %d", evt.status); QueryCardSwiper cardswiperStatus; cardswiperStatus.status = evt.status; m_fsm.m_cardswiperStatus = evt.status; SpSendBroadcast(GetFunction(), SP_MSG_OF(QueryCardSwiper), SP_MSG_SIG_OF(QueryCardSwiper), cardswiperStatus); } ErrorCodeEnum DoCheckInstallStateJob(); void DoCheckSogouProcessStatus(); void OnTimeout(DWORD dwTimerID) { if(dwTimerID == ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE) { CSimpleStringA strState; auto err = GetFunction()->GetSysVar("UIState",strState); /** 让进入首页之后才获取输入法信息 [Gifur@20211212]*/ if(/*TRUE || */err == Error_Succeed && strState == "M") { Dbg("to check Sogou input install state..."); if(Error_Succeed == DoCheckInstallStateJob()) { GetFunction()->KillTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_INSTALLED_STATE); GetFunction()->SetTimer(ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE, this, ENT_TIMERINTERVAL_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE); } } else { Dbg("Get UIState result: %s, %s", SpStrError(err), strState.GetData()); } } else if (dwTimerID == ENT_TIMERID_CHECK_SOGOU_INPUT_PROCESS_STATUS_CHANGE) { DoCheckSogouProcessStatus(); } else { Dbg("Unkonwn timer id: %u", dwTimerID); } } ErrorCodeEnum ConfigMonitorSetting(const UOS::MonitorInfo& config); private: ResourceWatcherFSM m_fsm; CUUID m_uiCardSwiperStatusListener; BOOL m_bInitMode; };