/************************************************************************* > File Name: lua_plugin_manage.h > Author: > Created Time: 2024-07 > Encoding : UTF-8 ************************************************************************/ /************************************************************************* * version * [ v0.1 ] * ************************************************************************/ #ifndef LUA_PLUGIN_MANAGE_INCLUDE_H #define LUA_PLUGIN_MANAGE_INCLUDE_H #include "stellar.h" struct lpm_state; enum LPM_DATATYPE { LPM_DATATYPE_NULL = 0, LPM_DATATYPE_NIL, LPM_DATATYPE_BOOL, LPM_DATATYPE_NUM, LPM_DATATYPE_INT, LPM_DATATYPE_CSTRING, LPM_DATATYPE_CTABLE, LPM_DATATYPE_CUSER, LPM_DATATYPE_CONTEXT, LPM_DATATYPE_END }; struct lpm_cdata; struct lpm_ctable; struct lpm_cdata { enum LPM_DATATYPE data_type; int data_length; union { int data_bool; double data_num; int data_int; char * data_string; struct lpm_ctable * data_table; void * data_user; void * data_context; }; }; void lpm_cdata_clean(struct lpm_cdata * data); /* 创建一个lua plugin manage状态机实例 */ /* return lpm_state instance */ struct lpm_state * lpm_state_instance_create(void); /* 释放一个lua plugin manage状态机实例 */ /* 在plugin_manager使用过程中应该将所有已经加载的插件卸载后再调用此函数 */ /* return 0 - success, other - failed */ int lpm_state_instance_free(struct lpm_state * state); /* 根据一个配置文件加载所有配置需要加载的插件 */ /* return 0 - success, other - failed */ int lpm_state_instance_init(struct stellar * st, struct lpm_state * state, const char * filename); /* 可以注册至lua状态机实例中的C函数原型 */ /* return 1 - lua调用完成后需要处理返回值, 0 - lua调用完后不需要处理返回值 */ typedef int (*lpm_cbinding_function)(struct lpm_state *); /* 供注册的C函数使用 */ /* 获取传入的参数数量 */ /* return 参数数量 */ int lpm_cbinding_get_params_count(struct lpm_state * state); /* 获取传入的参数, index为参数的下标, 多个参数只能逐个获取 */ /* return 0 - success, other - failed */ int lpm_cbinding_get_params(struct lpm_state * state, int index, struct lpm_cdata * data); /* 将返回值传入lua, count为返回值数量, data为数据的数组 */ /* return 0 - success, other - failed */ int lpm_cbinding_push_return(struct lpm_state * state, int count, struct lpm_cdata * data); /* 注册一个C函数function至lua中, 调用方式为space_name.func_name格式, space_name可以为空 */ /* return 0 - success, other - failed */ int lpm_cbinding_function_register(struct lpm_state * state, lpm_cbinding_function function, const char * func_name, const char * space_name); /* 将一个已经注册的function从lua中移除 */ /* return 0 - success, other - failed */ int lpm_cbinding_function_remove(struct lpm_state * state, const char * func_name, const char * space_name); /* 将一个数据注册至lua中, 作为lua中的全局变量使用 */ /* return 0 - success, other - failed */ int lpm_cdata_register(struct lpm_state * state, struct lpm_cdata * data, const char * data_name, const char * space_name); /* 将一个全局变量从lua中移除 */ /* return 0 - success, other - failed */ int lpm_cdata_remove(struct lpm_state * state, const char * data_name, const char * space_name); /* 解决方案: 1. 在stellar或状态机中新增一个列表, 调用该函数时每次按顺序从列表中取一个进行调用, 加载完成后每次从列表中删除一个结点 2. 增加一个参数, 函数原型修改为 void * lpm_plugin_load(struct stellar * st, int id) 3. 所有的插件与C不同, 在init函数执行过程中完成session_plugin的注册, 插件不再注册至plugin manage中 */ void * lpm_plugin_load(struct stellar * st); void lpm_plugin_unload(void * plugin_env); void * lpm_ctx_new_func(struct session * sess, void * plugin_env); void lpm_ctx_free_func(struct session * sess, void * sess_ctx, void * plugin_env); void lpm_on_session_msg_func(struct session * sess, int topic_id, const void * msg, void * sess_ctx, void * plugin_env); /* 将lua栈顶的一个数据转为一个lpm_cdata结构的数据 */ int lpm_trans_data_luatoc(struct lpm_state * state, struct lpm_cdata * data); /* 将一个lpm_cdata结构的数据转为一个lua数据并入栈至栈顶 */ int lpm_trans_data_ctolua(struct lpm_state * state, struct lpm_cdata * data); #endif