#include "stdafx.h" #include "mod_vtmloader.h" #include "EventCode.h" #include "VtmLoader_UserCode.h" #include "publicFunExport.h" #include "tokenDefine.h" #include #include void VtmLoaderServerSession::Handle_SetTerminalNo(SpReqAnsContext::Pointer ctx) { m_pEntity->SetTerminalNo(ctx); } void VtmLoaderServerSession::Handle_NoticeAppReady(SpReqAnsContext::Pointer ctx) { //m_pEntity->NoticeAppReady(ctx); } void VtmLoaderServerSession::Handle_CheckDeviceEntity(SpReqAnsContext::Pointer ctx) { m_pEntity->CheckDeviceEntity(ctx); } void VtmLoaderServerSession::Handle_SaveTerminalNo(SpReqAnsContext::Pointer ctx) { m_pEntity->SaveTerminalNo(ctx); } void VtmLoaderServerSession::Handle_DealWithOldEvent(SpReqAnsContext::Pointer ctx) { m_pEntity->DealWithOldEvent(ctx); } void VtmLoaderServerSession::Handle_QueryLocalInfo(SpReqAnsContext::Pointer ctx) { m_pEntity->QueryLocalInfo(ctx); } void CVtmLoaderEntity::OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { m_FSM.Init(this); CSmartPointer pFunc = GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); ErrorCodeEnum eErrCode = pFuncPrivilege->RegistEntityStateEvent(NULL, this);//only for "HealthManager" if (eErrCode != Error_Succeed) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RegistEntityState failed(%d).", eErrCode); pTransactionContext->SendAnswer(eErrCode); return; } pTransactionContext->SendAnswer(Error_Succeed) ; } void CVtmLoaderEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { //m_task.Close(); m_FSM.PostExitEvent(); pTransactionContext->SendAnswer(Error_Succeed); } void CVtmLoaderEntity::OnLog(const CAutoArray& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo) { DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("dwUserCode:%x", dwUserCode); switch (dwUserCode) { case LOG_EVT_MOD_MEDIACONTROLLER_STARTED_SUCCESS: DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set MediaController entity have checked setting"); m_FSM.SetVideoEntityOK(); break; default: break; } } //only process healthmanager lost void CVtmLoaderEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState) { if (_strnicmp("HealthManager", pszEntityName, strlen("HealthManager")) != 0 || eState != EntityState_Lost) return; DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s,eState:%d", pszEntityName, eState); CSmartPointer pFunc = GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); if (pFuncPrivilege == NULL) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("NoPrivilege"); return; } switch (eState) { case EntityState_Lost: { CSimpleStringA tmpWarnMsg = CSimpleStringA::Format("%s lost. trig entity:%s,lastState:%s", pszEntityName, pszTriggerEntity, SpStrEntityState(eLastState)); CEntityStaticInfo esi = { 0 }; GetFunction()->GetEntityStaticInfo(pszEntityName, esi); //0x101 0x21D int iByteHigh, iByteLow; iByteHigh = (esi.wEntityDevelopID & 0xF00) >> 8; iByteLow = esi.wEntityDevelopID & 0xFF; if (iByteHigh < 1 || iByteHigh > 9) { DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Unexpected entity id:%x", esi.wEntityDevelopID); break; } CSimpleStringA csResultCode(true); //实体lost的RTAxxxx的后两位xx,规则同RTAxxxx的前两位xx(实体标识码),由实体编号自动生成。健康实体本身的自定义RTAxxxx应该避开这些自定义 //'0':0x30 'A':0x41 if (iByteLow > 0 && iByteLow < 10) csResultCode = CSimpleStringA::Format("RTA51%c%c", iByteHigh + 0x30, iByteLow + 0x30); else csResultCode = CSimpleStringA::Format("RTA51%c%c", iByteHigh + 0x30, iByteLow - 10 + 0x41); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("resultcode:%s", csResultCode.GetData()); DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(csResultCode.GetData())(tmpWarnMsg.GetData()); EntityLostProcTask* task = new EntityLostProcTask(this, pszEntityName); GetFunction()->PostThreadPoolTask(task); } break; default: break; } } void CVtmLoaderEntity::EntityLostProc(CSimpleStringA entityName) { CSmartPointer pFunc = GetFunction(); CSmartPointer pFuncPrivilege = pFunc.ConvertCase(); CSmartPointer spWait; ErrorCodeEnum eErrCode = pFuncPrivilege->TerminateEntity(entityName, spWait); if (eErrCode == Error_Succeed) { eErrCode = spWait->WaitAnswer(10000); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost kill wait %d", eErrCode); } else DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost kill %d", eErrCode); Sleep(5000); eErrCode = pFuncPrivilege->StartEntity(entityName, NULL, spWait); if (eErrCode == Error_Succeed) { eErrCode = spWait->WaitAnswer(10000); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost start wait %d", eErrCode); } else DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost start %d", eErrCode); } void CVtmLoaderEntity::DealWithOldEvent(SpReqAnsContext::Pointer ctx) { /* DealWithOldEvent_Event* pEvt = new DealWithOldEvent_Event(); pEvt->ctx = ctx; m_FSM.PostEventFIFO(pEvt); */ static SpReqAnsContext::Pointer s_ctx; s_ctx = ctx; auto dealOldEventThread = [&] { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_DealWithOldEvent)("DealWithOldEvent called eventId, %d", s_ctx->Req.eventId); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqStrRev1, %s", s_ctx->Req.reqStrRev1); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqStrRev2, %s", s_ctx->Req.reqStrRev2); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqIntRev1, %d", s_ctx->Req.reqIntRev1); DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqIntRev2, %d", s_ctx->Req.reqIntRev2); ErrorCodeEnum eErr = ErrorCodeEnum::Error_Succeed; switch (s_ctx->Req.eventId) { case EVENT_CONSOLE_REQ_SHUTDOWN_SHELL: LogWarn(Severity_Low, Error_Unexpect, 0x50100215, CSimpleStringA::Format("%x, reason:%s", EVENT_CONSOLE_REQ_SHUTDOWN_SHELL, s_ctx->Req.reqStrRev1.GetData())); GetFunction()->GetPrivilegeFunction()->Reboot(RebootTrigger_DeadForever , RebootWayEnum::RebootWay_Framework); break; case LOG_EVT_IEBROWSER_RESET_SITE_RESTART: GetFunction()->GetPrivilegeFunction()->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_Framework); break; default: break; } s_ctx->Answer(eErr); }; std::thread(dealOldEventThread).detach(); } SP_BEGIN_ENTITY_MAP() SP_ENTITY(CVtmLoaderEntity) SP_END_ENTITY_MAP()