浏览代码

Z991239-385 #comment 修复arr_module类型的一个缺陷

gifur 5 年之前
父节点
当前提交
b116928b11
共有 25 个文件被更改,包括 74 次插入16 次删除
  1. 0 0
      docs/designs/component_and_struture/component_IO_manager.md
  2. 0 0
      docs/designs/component_and_struture/component_RPC.md
  3. 0 0
      docs/designs/component_and_struture/component_broadcast.md
  4. 0 0
      docs/designs/component_and_struture/component_bus_daemon.md
  5. 0 0
      docs/designs/component_and_struture/component_configuration.md
  6. 0 0
      docs/designs/component_and_struture/component_entity_module.md
  7. 0 0
      docs/designs/component_and_struture/component_entity_privilege.md
  8. 0 0
      docs/designs/component_and_struture/component_message_listener.md
  9. 0 0
      docs/designs/component_and_struture/component_multi-thread.md
  10. 0 0
      docs/designs/component_and_struture/component_remote_control.md
  11. 0 0
      docs/designs/component_and_struture/component_services.md
  12. 0 0
      docs/designs/component_and_struture/component_session.md
  13. 0 0
      docs/designs/component_and_struture/component_system_log.md
  14. 0 0
      docs/designs/component_and_struture/component_system_variables.md
  15. 0 0
      docs/designs/component_and_struture/component_upper_module.md
  16. 0 0
      docs/designs/component_and_struture/instruct_run_serial_no.md
  17. 0 0
      docs/designs/component_and_struture/instruct_send_package.md
  18. 0 0
      docs/designs/starup_routine.md
  19. 0 0
      docs/designs/视频柜台架构设计-黄广秦.doc
  20. 0 0
      docs/test_case/test_entity.md
  21. 0 0
      docs/tutorials/entity_dev.md
  22. 48 0
      docs/tutorials/hook_and_listener.md
  23. 21 13
      spbase/SpEntity.cpp
  24. 3 2
      spbase/SpModule.cpp
  25. 2 1
      spbase/sp_cfg.cpp

+ 0 - 0
doc/designs/component_and_struture/component_IO_manager.md → docs/designs/component_and_struture/component_IO_manager.md


+ 0 - 0
doc/designs/component_and_struture/component_RPC.md → docs/designs/component_and_struture/component_RPC.md


+ 0 - 0
doc/designs/component_and_struture/component_broadcast.md → docs/designs/component_and_struture/component_broadcast.md


+ 0 - 0
doc/designs/component_and_struture/component_bus_daemon.md → docs/designs/component_and_struture/component_bus_daemon.md


+ 0 - 0
doc/designs/component_and_struture/component_configuration.md → docs/designs/component_and_struture/component_configuration.md


+ 0 - 0
doc/designs/component_and_struture/component_entity_module.md → docs/designs/component_and_struture/component_entity_module.md


+ 0 - 0
doc/designs/component_and_struture/component_entity_privilege.md → docs/designs/component_and_struture/component_entity_privilege.md


+ 0 - 0
doc/designs/component_and_struture/component_message_listener.md → docs/designs/component_and_struture/component_message_listener.md


+ 0 - 0
doc/designs/component_and_struture/component_multi-thread.md → docs/designs/component_and_struture/component_multi-thread.md


+ 0 - 0
doc/designs/component_and_struture/component_remote_control.md → docs/designs/component_and_struture/component_remote_control.md


+ 0 - 0
doc/designs/component_and_struture/component_services.md → docs/designs/component_and_struture/component_services.md


+ 0 - 0
doc/designs/component_and_struture/component_session.md → docs/designs/component_and_struture/component_session.md


+ 0 - 0
doc/designs/component_and_struture/component_system_log.md → docs/designs/component_and_struture/component_system_log.md


+ 0 - 0
doc/designs/component_and_struture/component_system_variables.md → docs/designs/component_and_struture/component_system_variables.md


+ 0 - 0
doc/designs/component_and_struture/component_upper_module.md → docs/designs/component_and_struture/component_upper_module.md


+ 0 - 0
doc/designs/component_and_struture/instruct_run_serial_no.md → docs/designs/component_and_struture/instruct_run_serial_no.md


+ 0 - 0
doc/designs/component_and_struture/instruct_send_package.md → docs/designs/component_and_struture/instruct_send_package.md


+ 0 - 0
doc/designs/starup_routine.md → docs/designs/starup_routine.md


+ 0 - 0
doc/designs/视频柜台架构设计-黄广秦.doc → docs/designs/视频柜台架构设计-黄广秦.doc


+ 0 - 0
doc/test_case/test_entity.md → docs/test_case/test_entity.md


+ 0 - 0
doc/tutorials/entity_dev.md → docs/tutorials/entity_dev.md


+ 48 - 0
docs/tutorials/hook_and_listener.md

@@ -0,0 +1,48 @@
+# 常用的订阅机制
+
+框架提供一些订阅机制用于实体间的通信交互。
+
+## 实体状态
+
+**监听端**:继承`IEntityStateListener`并实现其接口
+
+**发送端**:
+
+* `SetUserDefineState`触发`OnUserStateHook`
+* `OnEntityStateHook`
+* `OnCeateConnection`
+* `OnCloseConnection`
+
+## 日志事件
+
+**监听端**:继承`ILogListener`并实现其接口
+
+**发送端**:
+
+## 计时器
+
+**监听端**:继承`ITimerListener`并实现其接口
+
+**发送端**:
+
+## 系统变量
+
+**监听端**:继承`ISysVarListener`并实现其接口
+
+**发送端**:`SetSysVar`触发
+
+**订阅与取消订阅**:`RegistSysVarEvent`/`UnregistSysVarEvent`
+
+## 广播事件
+
+**监听端**:继承`IBroadcastListener`并实现其接口
+
+**发送端**:`SendBroadcast`
+
+**订阅与取消订阅**:`SubscribeBroadcast`/`UnsubscribeBroadcast`
+
+## 实体生命周期
+
+**监听端**:继承`IEntityLifeListener`并实现其接口
+
+**发送端**:

+ 21 - 13
spbase/SpEntity.cpp

@@ -200,8 +200,8 @@ SpEntity::SpEntity(SpModule *pModule, sp_entity_t *ent, sp_cfg_shell_entity_t *c
 
 SpEntity::~SpEntity()
 {
-#ifdef _WIN32
 	Dbg("run ~SpEntity()");
+#ifdef _WIN32
 	getEntityResource()->m_Entity = NULL;
 #endif //_WIN32
 }
@@ -386,8 +386,8 @@ void SpEntity::__on_entity_prestart(sp_mod_entity_stub_t *, int trigger_entity_i
 
 void SpEntity::__on_entity_stop(sp_mod_entity_stub_t *, int trigger_entity_id, int cause_code, void *user_data)
 {
-	SpEntity *pThis = static_cast<SpEntity*>(user_data);
 	Dbg("stop Entity");
+	SpEntity *pThis = static_cast<SpEntity*>(user_data);
 	pThis->on_entity_stop(trigger_entity_id, cause_code);
 }
 
@@ -426,13 +426,17 @@ int SpEntity::on_accept(int epid, int svc_id, int conn_id, iobuffer_t **conn_pkt
 	sp_env_t *env = sp_get_env();
 	ErrorCodeEnum Error = Error_Succeed;
 
-	if (!m_pEntityBase->IsService())
+	if (!m_pEntityBase->IsService()) {
+		sp_dbg_warn("current entity is no registed as service type, please confirm it at code scope.");
 		return Error_Bug;
+	}
 
 	sp_entity_t *remote_ent = sp_mod_mgr_find_entity_by_idx(env->mod_mgr, svc_id);
-	if (!remote_ent)
+	if (!remote_ent) {
+		sp_dbg_error("cannot recognize the customer entity: %d!", svc_id);
 		return Error_Bug;
-
+	}
+		
 	char *pszParam = NULL;
 	CServerSessionBase *pServerSessionBase = NULL;
 	iobuffer_format_read(*conn_pkt, "s", &pszParam);
@@ -523,7 +527,7 @@ ErrorCodeEnum SpEntity::SetTimer(DWORD nTimerID, ITimerListener *pListener, DWOR
 			if (Error) {
 				SpTimerListRemove(m_pTimerList, pTimer);
 				SpTimerDestroy(pTimer);
-				sp_dbg_warn("start timer %d failed!", nTimerID);
+				sp_dbg_warn("start timer %d failed: %d!", nTimerID, Error);
 			} else {
 				sp_dbg_info("timer %d added! interval = %d", nTimerID, dwInterval);
 			}
@@ -728,6 +732,7 @@ ErrorCodeEnum SpEntity::EnumKeyOfPersistObject(const char *pszClass,CSimpleStrin
 			return Error_NotExist;
 		}
 		pIterator->Current = 0;
+		//TODO: x64 environment, depend on how to use the out-param
 		handle = (uintptr_t)(static_cast<void*>(pIterator));
 		//Handle = (DWORD)pIterator;
 	} else {
@@ -763,7 +768,7 @@ ErrorCodeEnum SpEntity::SubscribeLog(CUUID &SubscribeID, ILogListener *pListener
 	if (pszEntityName) {
 		ent = sp_mod_mgr_find_entity_by_name(sp_get_env()->mod_mgr, pszEntityName);
 		if (!ent) {
-			sp_dbg_debug("SubscribeLog failed! Entity %s not exist!", pszEntityName);
+			sp_dbg_error("SubscribeLog failed! Entity %s not exist!", pszEntityName);
 			return Error_NotExist;
 		}
 	}
@@ -1006,7 +1011,7 @@ ErrorCodeEnum SpEntity::UnsubscribeBroadcast(const char *pszRemoteEntity)
 
 ErrorCodeEnum SpEntity::LogMessage( const LogTypeEnum LogType, const SeverityLevelEnum Level, DWORD dwSysErrorCode, DWORD dwUserErrorCode, const char *pMessage )
 {	
-	// xkm@20160726: У��dwUserErrorCode�Ƿ�Ϸ�
+	// xkm@20160726: 校验 dwUserErrorCode 是否合法
 	int nDevID = m_ent->cfg->devel_id;
 	if (dwUserErrorCode!=0 && ((dwUserErrorCode >> 20) & nDevID) != nDevID)
 	{
@@ -1157,14 +1162,14 @@ ErrorCodeEnum SpEntity::GetInstallInfo(CVersion Version,CInstallInfo &Info)
 
 bool SpEntity::IsPackInstalled(const char *pPackName)
 {
-	if (pPackName) 
+	if (pPackName && strlen(pPackName) > 0) 
 	{
 		sp_env_t *env = sp_get_env();
 		sp_cfg_t *cfg = env->cfg;
 		sp_cfg_root_ini_t *root_ini = cfg->root_ini;
 		sp_cfg_install_ini_t *install_ini = cfg->install_ini;
 
-		// �Ȳ�ѯ��ǰ�汾��������װ��ʷ
+		// 先查询当前版本的轻量安装历史
 		if (strstr(install_ini->light_packs, pPackName) != NULL)
 		{
 			for(int i=0; i<install_ini->arr_light_pack->nelts; i++)
@@ -1175,7 +1180,7 @@ bool SpEntity::IsPackInstalled(const char *pPackName)
 			}
 		}
 
-		// ��ѯ��ʷ�汾��װ��
+		// 查询历史版本安装包
 		for(int i=0; i<install_ini->arr_version->nelts; i++)
 		{
 			sp_cfg_version_info_t *ver_info = ARRAY_IDX(cfg->install_ini->arr_version, i, sp_cfg_version_info_t*);
@@ -1272,7 +1277,7 @@ ErrorCodeEnum SpEntity::GetPath(const char *pszKey,CSimpleStringA &strPath)
 	} else if (_stricmp(pszKey, "CenterSetting") == 0) {
 		// return centersetting name by current site
 		strPath = CSimpleStringA(env->dir->cfg_path);
-		strPath += "\\";
+		strPath += SPLIT_SLASH_STR;
 		strPath += GetCenterSettingNameBySite();
 	}
 	else {
@@ -1381,7 +1386,10 @@ ErrorCodeEnum SpEntity::GetAllRegistSpFile(CAutoArray<CSimpleStringA> &Names)
 
 	Names.Init(arr_module->nelts);
 	for (int i = 0; i < arr_module->nelts; ++i) {
-		Names[i] = ARRAY_IDX(arr_module, i, char*);
+		sp_cfg_shell_module_t* mod = ARRAY_IDX(arr_module, i, sp_cfg_shell_module_t*);
+		Names[i] = mod->name;
+		// BugFix [Gifur@2020422]
+		//Names[i] = ARRAY_IDX(arr_module, i, char*);
 	}
 
 	return Error_Succeed;

+ 3 - 2
spbase/SpModule.cpp

@@ -135,9 +135,9 @@ int SpModule::on_module_init()
 
 int SpModule::on_module_term()
 {
+	Dbg("on_module_term");
 #ifdef _WIN32
 	EntryRoutine curPfExit = (EntryRoutine)getEntityResource()->m_pfExit;
-	Dbg("on_module_term");
 #endif //_WIN32
 	if (SpModule::s_pfExit)
 		return SpModule::s_pfExit();
@@ -165,8 +165,9 @@ ErrorCodeEnum SpModule::AddEntityBase(CEntityBase *pEntity)
 	sp_env_t *env = sp_get_env();
 	const char *lpEntityName = pEntity->GetEntityName();
 	SpEntity *pSpEntity = FindEntity(lpEntityName);
-	if (pSpEntity) 
+	if (pSpEntity) {
 		return Error_AlreadyExist;
+	}
 	sp_entity_t *ent = sp_mod_mgr_find_entity_by_name(env->mod_mgr, lpEntityName);
 	if (!ent || ent->mod->cfg->idx != m_mod->cfg->idx) {
 		sp_dbg_warn("entity %s does not exist in current module!", lpEntityName);

+ 2 - 1
spbase/sp_cfg.cpp

@@ -570,7 +570,8 @@ static int load_shell_ini(sp_dir_t *dir, sp_cfg_shell_ini_t *shell, sp_cfg_root_
 	}
 
 	shell->arr_entity = shm_array_make(0, sizeof(sp_cfg_shell_entity_t*));
-	shell->arr_module = shm_array_make(0, sizeof(char*));
+	// BugFix: replace char* with sp_cfg_shell_module_t* [Gifur@2020422]
+	shell->arr_module = shm_array_make(0, sizeof(sp_cfg_shell_module_t*));
 
 	// add intrinsic spshell module
 	{