mod_vtmloader.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #include "stdafx.h"
  2. #include "mod_vtmloader.h"
  3. #include "EventCode.h"
  4. #include "VtmLoader_UserCode.h"
  5. #include "publicFunExport.h"
  6. //#pragma comment(lib, "libpublicFun.lib")
  7. #include "tokenDefine.h"
  8. #include <thread>
  9. #include <SpIni.h>
  10. void VtmLoaderServerSession::Handle_SetTerminalNo(SpReqAnsContext<VtmLoaderService_SetTerminalNo_Req, VtmLoaderService_SetTerminalNo_Ans>::Pointer ctx)
  11. {
  12. m_pEntity->SetTerminalNo(ctx);
  13. }
  14. void VtmLoaderServerSession::Handle_NoticeAppReady(SpReqAnsContext<VtmLoaderService_NoticeAppReady_Req, VtmLoaderService_NoticeAppReady_Ans>::Pointer ctx)
  15. {
  16. //m_pEntity->NoticeAppReady(ctx);
  17. }
  18. void VtmLoaderServerSession::Handle_CheckDeviceEntity(SpReqAnsContext<VtmLoaderService_CheckDeviceEntity_Req, VtmLoaderService_CheckDeviceEntity_Ans>::Pointer ctx)
  19. {
  20. m_pEntity->CheckDeviceEntity(ctx);
  21. }
  22. void VtmLoaderServerSession::Handle_SaveTerminalNo(SpReqAnsContext<VtmLoaderService_SaveTerminalNo_Req, VtmLoaderService_SaveTerminalNo_Ans>::Pointer ctx)
  23. {
  24. m_pEntity->SaveTerminalNo(ctx);
  25. }
  26. void VtmLoaderServerSession::Handle_DealWithOldEvent(SpReqAnsContext<VtmLoaderService_DealWithOldEvent_Req, VtmLoaderService_DealWithOldEvent_Ans>::Pointer ctx)
  27. {
  28. m_pEntity->DealWithOldEvent(ctx);
  29. }
  30. void CVtmLoaderEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  31. {
  32. m_FSM.Init(this);
  33. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  34. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  35. ErrorCodeEnum eErrCode = pFuncPrivilege->RegistEntityStateEvent(NULL, this);//only for "HealthManager"
  36. if (eErrCode != Error_Succeed)
  37. {
  38. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("RegistEntityState failed(%d).", eErrCode);
  39. pTransactionContext->SendAnswer(eErrCode);
  40. return;
  41. }
  42. pTransactionContext->SendAnswer(Error_Succeed) ;
  43. }
  44. void CVtmLoaderEntity::OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  45. {
  46. //m_task.Close();
  47. m_FSM.PostExitEvent();
  48. UnsubscribeEntitysEvents();
  49. pTransactionContext->SendAnswer(Error_Succeed);
  50. }
  51. void CVtmLoaderEntity::OnLog(const CAutoArray<CUUID>& SubIDs, const CUUID nLogID, const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  52. const DWORD dwSysError, const DWORD dwUserCode, const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  53. const CAutoArray<DWORD>& Param, const char* pszEntityName, const char* pszModuleName, const char* pszMessage, const linkContext& pLinkInfo)
  54. {
  55. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("dwUserCode:%x", dwUserCode);
  56. switch (dwUserCode) {
  57. case LOG_EVT_MOD_MEDIACONTROLLER_STARTED_SUCCESS:
  58. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("set MediaController entity have checked setting");
  59. m_FSM.SetVideoEntityOK();
  60. break;
  61. default:
  62. break;
  63. }
  64. }
  65. //only process healthmanager lost
  66. void CVtmLoaderEntity::OnEntityStateHook(const char* pszEntityName, const char* pszTriggerEntity, EntityStateEnum eState, EntityStateEnum eLastState)
  67. {
  68. if (_strnicmp("HealthManager", pszEntityName, strlen("HealthManager")) != 0 || eState != EntityState_Lost)
  69. return;
  70. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("%s,eState:%d", pszEntityName, eState);
  71. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  72. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  73. if (pFuncPrivilege == NULL)
  74. {
  75. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("NoPrivilege");
  76. return;
  77. }
  78. switch (eState)
  79. {
  80. case EntityState_Lost:
  81. {
  82. CSimpleStringA tmpWarnMsg = CSimpleStringA::Format("%s lost. trig entity:%s,lastState:%s", pszEntityName, pszTriggerEntity, SpStrEntityState(eLastState));
  83. CEntityStaticInfo esi = { 0 };
  84. ErrorCodeEnum ec = GetFunction()->GetEntityStaticInfo(pszEntityName, esi);
  85. //0x101 0x21D
  86. int iByteHigh, iByteLow;
  87. iByteHigh = (esi.wEntityDevelopID & 0xF00) >> 8;
  88. iByteLow = esi.wEntityDevelopID & 0xFF;
  89. if (iByteHigh < 1 || iByteHigh > 9)
  90. {
  91. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("Unexpected entity id:%x", esi.wEntityDevelopID);
  92. break;
  93. }
  94. CSimpleStringA csResultCode(true);
  95. //实体lost的RTAxxxx的后两位xx,规则同RTAxxxx的前两位xx(实体标识码),由实体编号自动生成。健康实体本身的自定义RTAxxxx应该避开这些自定义
  96. //'0':0x30 'A':0x41
  97. if (iByteLow > 0 && iByteLow < 10)
  98. csResultCode = CSimpleStringA::Format("RTA51%c%c", iByteHigh + 0x30, iByteLow + 0x30);
  99. else
  100. csResultCode = CSimpleStringA::Format("RTA51%c%c", iByteHigh + 0x30, iByteLow - 10 + 0x41);
  101. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("resultcode:%s", csResultCode.GetData());
  102. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode(csResultCode.GetData())(tmpWarnMsg.GetData());
  103. EntityLostProcTask* task = new EntityLostProcTask(this, pszEntityName);
  104. GetFunction()->PostThreadPoolTask(task);
  105. }
  106. break;
  107. default:
  108. break;
  109. }
  110. }
  111. void CVtmLoaderEntity::EntityLostProc(CSimpleStringA entityName)
  112. {
  113. CSmartPointer<IEntityFunction> pFunc = GetFunction();
  114. CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege = pFunc.ConvertCase<IEntityFunctionPrivilege>();
  115. CSmartPointer<IAsynWaitSp> spWait;
  116. ErrorCodeEnum eErrCode = pFuncPrivilege->TerminateEntity(entityName, spWait);
  117. if (eErrCode == Error_Succeed)
  118. {
  119. eErrCode = spWait->WaitAnswer(10000);
  120. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost kill wait %d", eErrCode);
  121. }
  122. else
  123. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost kill %d", eErrCode);
  124. Sleep(5000);
  125. eErrCode = pFuncPrivilege->StartEntity(entityName, NULL, spWait);
  126. if (eErrCode == Error_Succeed)
  127. {
  128. eErrCode = spWait->WaitAnswer(10000);
  129. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost start wait %d", eErrCode);
  130. }
  131. else
  132. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("on lost start %d", eErrCode);
  133. }
  134. ErrorCodeEnum CVtmLoaderEntity::UnsubscribeEntitysEvents()
  135. {
  136. auto pFunc = GetFunction();
  137. if ((__int64)m_SubLogID2 != 0)
  138. pFunc->UnsubscribeLog(m_SubLogID2);
  139. if ((__int64)m_SubLogID3 != 0)
  140. pFunc->UnsubscribeLog(m_SubLogID3);
  141. return Error_Succeed;
  142. }
  143. void CVtmLoaderEntity::DealWithOldEvent(SpReqAnsContext<VtmLoaderService_DealWithOldEvent_Req, VtmLoaderService_DealWithOldEvent_Ans>::Pointer ctx)
  144. {
  145. /*
  146. DealWithOldEvent_Event* pEvt = new DealWithOldEvent_Event();
  147. pEvt->ctx = ctx;
  148. m_FSM.PostEventFIFO(pEvt);
  149. */
  150. static SpReqAnsContext<VtmLoaderService_DealWithOldEvent_Req, VtmLoaderService_DealWithOldEvent_Ans>::Pointer s_ctx;
  151. s_ctx = ctx;
  152. auto dealOldEventThread = [&] {
  153. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setLogCode(VtmLoaderService_LogCode_DealWithOldEvent)("DealWithOldEvent called eventId, %d", s_ctx->Req.eventId);
  154. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqStrRev1, %s", s_ctx->Req.reqStrRev1);
  155. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqStrRev2, %s", s_ctx->Req.reqStrRev2);
  156. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqIntRev1, %d", s_ctx->Req.reqIntRev1);
  157. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("DealWithOldEvent called reqIntRev2, %d", s_ctx->Req.reqIntRev2);
  158. ErrorCodeEnum eErr = ErrorCodeEnum::Error_Succeed;
  159. switch (s_ctx->Req.eventId)
  160. {
  161. case EVENT_CONSOLE_REQ_SHUTDOWN_SHELL:
  162. LogWarn(Severity_Low, Error_Unexpect, 0x50100215, CSimpleStringA::Format("%x, reason:%s", EVENT_CONSOLE_REQ_SHUTDOWN_SHELL, s_ctx->Req.reqStrRev1.GetData()));
  163. GetFunction()->GetPrivilegeFunction()->Reboot(RebootTrigger_DeadForever , RebootWayEnum::RebootWay_Framework);
  164. break;
  165. case LOG_EVT_IEBROWSER_RESET_SITE_RESTART:
  166. GetFunction()->GetPrivilegeFunction()->Reboot(RebootTrigger_ManualLocal, RebootWayEnum::RebootWay_Framework);
  167. break;
  168. default:
  169. break;
  170. }
  171. s_ctx->Answer(eErr);
  172. };
  173. std::thread(dealOldEventThread).detach();
  174. }
  175. SP_BEGIN_ENTITY_MAP()
  176. SP_ENTITY(CVtmLoaderEntity)
  177. SP_END_ENTITY_MAP()