#ifndef SP_MOD_H #define SP_MOD_H #pragma once #ifdef __cplusplus extern "C" { #endif #include "toolkit.h" #include "list.h" // #include "sp_cfg.h" #include "sp_uid.h" #include "sp_bcm.h" // // stub // typedef struct sp_mod_stub_t sp_mod_stub_t; typedef struct sp_mod_entity_stub_t sp_mod_entity_stub_t; typedef struct sp_iom_t sp_iom_t; typedef struct sp_svc_t sp_svc_t; typedef struct sp_mod_stub_cb { int (*on_module_init)(sp_mod_stub_t *, void *user_data); int (*on_module_term)(sp_mod_stub_t *, void *user_data); void *user_data; }sp_mod_stub_cb; typedef struct sp_mod_entity_stub_cb { void (*on_entity_prestart)(sp_mod_entity_stub_t *, int trigger_entity_id, int argc, char *argv[], void *user_data); void (*on_entity_stop)(sp_mod_entity_stub_t *, int trigger_entity_id, int cause_code, void *user_data); void (*on_entity_prepause)(sp_mod_entity_stub_t *, int trigger_entity_id, void *user_data); void (*on_entity_precontinue)(sp_mod_entity_stub_t *, int trigger_entity_id, void *user_data); void (*on_entity_test)(sp_mod_entity_stub_t *, int trigger_entity_id, int test_type, void *user_data); void (*on_entity_redirect_subscribe)(sp_mod_entity_stub_t *, sp_uid_t *uid, int from_entity_id, const char *param, void *user_data); void *user_data; }sp_mod_entity_stub_cb; int sp_mod_stub_create(const sp_mod_stub_cb *cb, sp_iom_t *iom, sp_mod_stub_t **p_stub); void sp_mod_stub_destroy(sp_mod_stub_t *stub); int sp_mod_entity_stub_create(const sp_mod_entity_stub_cb *cb, sp_svc_t *svc, sp_mod_entity_stub_t **p_stub); /*no use at current time ??*/ void sp_mod_entity_stub_destroy(sp_mod_entity_stub_t *stub); /*no use at current time*/ int sp_mod_entity_stub_report_create_connection(sp_mod_entity_stub_t *stub, int remote_entity); /*no use at current time*/ int sp_mod_entity_stub_report_close_connection(sp_mod_entity_stub_t *stub, int remote_entity); /*no use at current time*/ int sp_mod_entity_stub_report_exception(sp_mod_entity_stub_t *stub, int win32_exception_code, int eip, int in_func); /*no use at current time*/ int sp_mod_entity_stub_switch_running_state(sp_mod_entity_stub_t *stub, int state); int sp_mod_entity_stub_finish_start(sp_mod_entity_stub_t *stub, int result); int sp_mod_entity_stub_finish_stop(sp_mod_entity_stub_t *stub, int result); int sp_mod_entity_stub_finish_pause(sp_mod_entity_stub_t *stub, int result); int sp_mod_entity_stub_finish_continue(sp_mod_entity_stub_t *stub, int result); int sp_mod_entity_stub_finish_exam(sp_mod_entity_stub_t* stub, int result, int statistic); int sp_mod_entity_stub_finish_test(sp_mod_entity_stub_t *stub, int result); int sp_mod_entity_stub_finish_redirect_subscribe(sp_mod_entity_stub_t *stub, sp_uid_t *uid, int suggest_entity_id); int sp_mod_entity_stub_report_user_state_change(sp_mod_entity_stub_t *stub, int last_state, int curr_state); // // entity event listener // typedef struct sp_mod_entity_state_listener_t sp_mod_entity_state_listener_t; typedef struct sp_mod_entity_event_cb { void (*on_user_state)(sp_mod_entity_state_listener_t *listener, int entity_id, int last_state, int curr_state, void *user_data); void (*on_entity_state)(sp_mod_entity_state_listener_t *listener, int entity_id, int trigger_entity_id, int last_state, int curr_state, void *user_data); void (*on_create_connection)(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id, void *user_data); void (*on_close_connection)(sp_mod_entity_state_listener_t *listener, int src_entity_id, int dst_entity_id, void *user_data); void *user_data; }sp_mod_entity_event_cb; int sp_mod_entity_listener_create(int target_entity_id, const sp_mod_entity_event_cb *cb, sp_svc_t *svc, void *tag, sp_mod_entity_state_listener_t **p_listener); void sp_mod_entity_listener_destroy(sp_mod_entity_state_listener_t *listener); void sp_mod_entity_listener_set_tag(sp_mod_entity_state_listener_t *listener, void *data); void *sp_mod_entity_listener_get_tag(sp_mod_entity_state_listener_t *listener); // // entity life listener // typedef struct sp_mod_entity_life_listener_t sp_mod_entity_life_listener_t; typedef struct sp_mod_entity_life_cb { void (*on_entity_create)(sp_mod_entity_life_listener_t *listener, int entity_id, int trigger_entity_id, void *user_data); void (*on_entity_close)(sp_mod_entity_life_listener_t *listener, int entity_id, int trigger_entity_id, int cause_code, void *user_data); void (*on_entity_exception)(sp_mod_entity_life_listener_t *listener, int entity_id, int error, int entity_state, void *user_data); void *user_data; }sp_mod_entity_life_cb; int sp_mod_entity_life_listener_create(const sp_mod_entity_life_cb *cb, sp_svc_t *svc, void *tag, sp_mod_entity_life_listener_t **p_listener); void sp_mod_entity_life_listener_destroy(sp_mod_entity_life_listener_t *listener); void sp_mod_entity_life_listener_set_tag(sp_mod_entity_life_listener_t *listener, void *data); void *sp_mod_entity_life_listener_get_tag(sp_mod_entity_life_listener_t *listener); #define SP_MODULE_STATE_UNLOAD 0 #define SP_MODULE_STATE_LOAD 1 typedef struct sp_mod_mgr_t sp_mod_mgr_t; typedef struct sp_mod_t sp_mod_t; typedef struct sp_entity_t sp_entity_t; typedef struct sp_entity_last_err_s sp_entity_last_err_t; struct sp_mod_t { struct list_head entry; // element of mgr->mod_list sp_cfg_shell_module_t *cfg; int doing; int loaded; // 0 unload; 1 load int closing; y2k_time_t start_time; int wait_result; tk_process_t process; //int process_id; HANDLE evt_wait_handle; HANDLE evt_app_exit; // set when app exit //HANDLE process_handle; struct list_head entity_list; // list of sp_entity_t* sp_mod_mgr_t *mgr; }; #define SP_ENTITY_ERRMSG_MAX_LEN 1024 struct sp_entity_last_err_s { uint32_t sys_code; uint32_t usr_code; char msg[SP_ENTITY_ERRMSG_MAX_LEN+1]; }; struct sp_entity_t { struct list_head entry; // element of mod->entity_list int service_flag; int state; // EntityStateEnum y2k_time_t first_start_time; y2k_time_t last_start_time; y2k_time_t state_start_time; sp_cfg_shell_entity_t *cfg; int instance_id; int wait_result; param_size_t result_param1; param_size_t result_param2; HANDLE evt_wait_handle; //manually sp_mod_t *mod; int user_state; sp_entity_last_err_t last_err; }; sp_mod_mgr_t *sp_mod_mgr_get_instance(); void sp_mod_mgr_set_instance(sp_mod_mgr_t *); SPBASE_API int sp_mod_mgr_create(sp_mod_mgr_t **p_mgr); SPBASE_API void sp_mod_mgr_destroy(sp_mod_mgr_t *mgr); /*bind svc to mgr, just set the value.*/ SPBASE_API void sp_mod_mgr_bind_shell_svc(sp_mod_mgr_t *mgr, sp_svc_t *svc); int sp_mod_mgr_add_module(sp_mod_mgr_t *mgr, sp_cfg_shell_module_t *mod); int sp_mod_mgr_add_entity(sp_mod_mgr_t *mgr, sp_cfg_shell_entity_t *ent); int sp_mod_mgr_remove_module(sp_mod_mgr_t *mgr, const char *mod_name); int sp_mod_mgr_remove_entity(sp_mod_mgr_t *mgr, const char *entity_name); SPBASE_API int sp_mod_mgr_init(sp_mod_mgr_t *mgr); SPBASE_API void sp_mod_mgr_term(sp_mod_mgr_t *mgr); SPBASE_API void sp_mod_mgr_bind_bcm_daemon(sp_mod_mgr_t *mgr, sp_bcm_daemon_t *daemon); void sp_mod_mgr_lock(sp_mod_mgr_t *mgr); void sp_mod_mgr_unlock(sp_mod_mgr_t *mgr); sp_mod_t *sp_mod_mgr_find_module_by_name(sp_mod_mgr_t *mgr, const char *mod_name); sp_mod_t *sp_mod_mgr_find_module_by_idx(sp_mod_mgr_t *mgr, int mod_idx); sp_entity_t *sp_mod_find_entity_by_name(sp_mod_t *mod, const char *entity_name); sp_entity_t *sp_mod_find_entity_by_idx(sp_mod_t *mod, int entity_idx); sp_entity_t *sp_mod_find_entity_by_devel_id(sp_mod_t *mod, int devel_id); sp_entity_t *sp_mod_find_entity_by_inst_id(sp_mod_t *mod, int inst_id); void sp_mod_supress_last_err_for_all_entity(sp_mod_t* mod, const char* err_msg); SPBASE_API sp_entity_t *sp_mod_mgr_find_entity_by_name(sp_mod_mgr_t *mgr, const char *entity_name); SPBASE_API sp_entity_t *sp_mod_mgr_find_entity_by_idx(sp_mod_mgr_t *mgr, int entity_id); sp_entity_t *sp_mod_mgr_find_entity_by_devel_id(sp_mod_mgr_t *mgr, int devel_id); sp_entity_t *sp_mod_mgr_find_entity_by_inst_id(sp_mod_mgr_t *mgr, int inst_id); SPBASE_API struct list_head* sp_mod_mgr_get_module_list_head(sp_mod_mgr_t *mgr); int sp_mod_mgr_get_entity_array_nelts(sp_mod_mgr_t *mgr); SPBASE_API int sp_mod_mgr_terminate_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id); SPBASE_API int sp_mod_mgr_start_entity(sp_mod_mgr_t *mgr, int entity_id, const char *cmdline, int trigger_entity_id); SPBASE_API int sp_mod_mgr_stop_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int cause_code); SPBASE_API int sp_mod_mgr_pause_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id); SPBASE_API int sp_mod_mgr_continue_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id); SPBASE_API int sp_mod_mgr_test_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id, int test_type, int* cause); SPBASE_API int sp_mod_mgr_lost_entity(sp_mod_mgr_t *mgr, int entity_id, int trigger_entity_id); SPBASE_API int sp_mod_mgr_terminate_all_entity(sp_mod_mgr_t* mgr, int trigger_entity_id); int sp_mod_mgr_terminate_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id); int sp_mod_mgr_start_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, const char *cmdline, int trigger_entity_id, int entity_id); int sp_mod_mgr_stop_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id, int cause_code); int sp_mod_mgr_pause_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id); int sp_mod_mgr_continue_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id); int sp_mod_mgr_test_entity2(sp_mod_mgr_t *mgr, sp_entity_t *entity, int trigger_entity_id, int test_type, int* result); int sp_mod_mgr_notify_redirect_subscribe(sp_mod_mgr_t *mgr, sp_entity_t *entity, sp_uid_t *uid, int from_entity_id, const char *param); static __inline sp_cfg_shell_module_t *sp_mod_get_cfg(sp_cfg_t *cfg, sp_mod_t *mod) { return ARRAY_IDX(cfg->shell_ini->arr_module, mod->cfg->idx, sp_cfg_shell_module_t*); } static __inline sp_cfg_shell_entity_t *sp_ent_get_cfg(sp_cfg_t *cfg, sp_entity_t *ent) { return ARRAY_IDX(cfg->shell_ini->arr_entity, ent->cfg->idx, sp_cfg_shell_entity_t*); } #ifdef __cplusplus } // extern "C" { #endif #endif // SP_MOD_H