diff options
Diffstat (limited to 'src/lua_binding_function.c')
| -rw-r--r-- | src/lua_binding_function.c | 576 |
1 files changed, 576 insertions, 0 deletions
diff --git a/src/lua_binding_function.c b/src/lua_binding_function.c new file mode 100644 index 0000000..620a49c --- /dev/null +++ b/src/lua_binding_function.c @@ -0,0 +1,576 @@ +#include <stdlib.h> +#include <string.h> + +#include <lua.h> +#include <lauxlib.h> +#include <utlist.h> + +#include "lua_binding_function.h" + +/* ***** ***** ***** ***** ***** ***** */ +int lua_get_worker_thread_num(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 1) + { + lua_settop(L, 0); + return 0; + } + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + int thread_num = stellar_get_worker_thread_num(st); + lua_pushinteger(L, thread_num); + return 1; +} + +int lua_get_current_thread_id(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 1) + { + lua_settop(L, 0); + return 0; + } + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + int thread_id = stellar_get_current_thread_id(st); + lua_pushinteger(L, thread_id); + return 1; +} + +int lua_get_stellar_pointer(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + lua_settop(L, 0); + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + struct stellar *st = plugin_manage->st; + lua_pushlightuserdata(L, (void *)st); + return 1; +} + +/* +int lua_get_plugin_manage_pointer(struct lua_state *state) +{ + lua_settop((lua_State *)state, 0); + struct lua_plugin_manage * plugin_manage = lua_state_get_plugin_manage(state); + lua_pushlightuserdata((lua_State *)state, (void *)plugin_manage); + return 1; +} +*/ + +/* ***** ***** ***** ***** ***** ***** */ +int lua_session_plugin_regist(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4 || lua_type(L, -4) != LUA_TLIGHTUSERDATA) + { + lua_settop(L, 0); + return 0; + } + + /* stack -1 */ + int plugin_env_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + if (plugin_env_ref_id == LUA_REFNIL) + plugin_env_ref_id = 0; + + /* stack -2 */ + int ctx_free_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + ctx_free_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + else + lua_pop(L, 1); + + /* stack -3 */ + int ctx_new_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + ctx_new_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + else + lua_pop(L, 1); + + /* stack -4 */ + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + struct lua_session_plugin_env *new_plugin_env = (struct lua_session_plugin_env *)calloc(1, sizeof(struct lua_session_plugin_env)); + memset(new_plugin_env, 0, sizeof(struct lua_session_plugin_env)); + new_plugin_env->lua_ctx_new_fn_ref_id = ctx_new_fn_ref_id; + new_plugin_env->lua_ctx_free_fn_ref_id = ctx_free_fn_ref_id; + new_plugin_env->lua_plug_env_ref_id = plugin_env_ref_id; + + int plugin_id = stellar_session_plugin_register(st, lpm_ctx_new_func, lpm_ctx_free_func, (void *)new_plugin_env); + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + LL_APPEND(plugin_manage->session_plugin_env_list, new_plugin_env); + new_plugin_env->plugin_manage = plugin_manage; + + lua_settop(L, 0); + lua_pushinteger(L, plugin_id); + + return 1; +} + +int lua_packet_plugin_regist(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4 || lua_type(L, -4) != LUA_TLIGHTUSERDATA) + { + lua_settop(L, 0); + return 0; + } + + /* stack -1 */ + int plugin_env_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + if (plugin_env_ref_id == LUA_REFNIL) + plugin_env_ref_id = 0; + + /* stack -2 */ + int on_packet_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + on_packet_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + else + lua_pop(L, 1); + + /* stack -3 */ + int ip_protocol = lua_tointeger(L, -1); + lua_pop(L, 1); + + /* stack -4 */ + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + struct lua_packet_plugin_env *new_plugin_env = (struct lua_packet_plugin_env *)calloc(1, sizeof(struct lua_packet_plugin_env)); + memset(new_plugin_env, 0, sizeof(struct lua_packet_plugin_env)); + new_plugin_env->lua_plug_env_ref_id = plugin_env_ref_id; + new_plugin_env->lua_on_packet_fn_ref_id = on_packet_fn_ref_id; + + int plugin_id = stellar_packet_plugin_register(st, (unsigned char)ip_protocol, lpm_on_packet_func, (void *)new_plugin_env); + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + LL_APPEND(plugin_manage->packet_plugin_env_list, new_plugin_env); + new_plugin_env->plugin_manage = plugin_manage; + + lua_settop(L, 0); + lua_pushinteger(L, plugin_id); + + return 1; +} + +/* ***** ***** ***** ***** ***** ***** */ +int lua_session_get_type(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 1 || lua_type(L, -1) != LUA_TLIGHTUSERDATA) + { + lua_settop(L, 0); + return 0; + } + + struct session *sess = (struct session *)lua_topointer(L, -1); + lua_settop(L, 0); + if (!sess) + return 0; + + lua_pushinteger(L, (int)session_get_type(sess)); + return 1; +} + +/* ***** ***** ***** ***** ***** ***** */ +#define MQ_TYPE_PACKET 1 +#define MQ_TYPE_SESSION 2 +static int lua_plugin_manage_msg_mq_create_topic(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4 || lua_type(L, -3) != LUA_TSTRING || lua_type(L, -4) != LUA_TLIGHTUSERDATA) + { + lua_settop(L, 0); + return 0; + } + + /* stack -1 */ + int free_arg_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + if (free_arg_ref_id == LUA_REFNIL) + free_arg_ref_id = 0; + + /* stack -2 */ + int free_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + free_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + else + lua_pop(L, 1); + + /* stack -3 */ + char *topic_name = strdup((char *)lua_tostring(L, -1)); + lua_pop(L, 1); + + /* stack -4 */ + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + struct lua_message_free_arg *new_message_free_arg = (struct lua_message_free_arg *)calloc(1, sizeof(struct lua_message_free_arg)); + memset(new_message_free_arg, 0, sizeof(struct lua_message_free_arg)); + new_message_free_arg->lua_msg_free_fn_ref_id = free_fn_ref_id; + new_message_free_arg->lua_msg_free_arg_ref_id = free_arg_ref_id; + int topic_id = -1; + if (type == MQ_TYPE_PACKET) + stellar_packet_mq_create_topic(st, (const char *)topic_name, lpm_packet_message_free_func, new_message_free_arg); + else if (type == MQ_TYPE_SESSION) + stellar_session_mq_create_topic(st, (const char *)topic_name, lpm_session_message_free_func, new_message_free_arg); + if (topic_id >= 0) + { + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + LL_APPEND(plugin_manage->message_free_arg_list, new_message_free_arg); + new_message_free_arg->topic_id = topic_id; + new_message_free_arg->plugin_manage = plugin_manage; + lua_pop(L, 1); + } + else + { + if (new_message_free_arg) + free(new_message_free_arg); + return 0; + } + + lua_pushinteger(L, topic_id); + return 1; +} + +static int lua_plugin_manage_msg_mq_get_topic_id(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 2 || lua_type(L, -1) != LUA_TSTRING || lua_type(L, -2) != LUA_TLIGHTUSERDATA) + { + lua_settop(L, 0); + return 0; + } + + char *topic_name = strdup(lua_tostring(L, -1)); + lua_pop(L, 1); + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + int topic_id = -1; + if (type == MQ_TYPE_PACKET) + stellar_packet_mq_get_topic_id(st, (const char *)topic_name); + else if (type == MQ_TYPE_SESSION) + stellar_session_mq_get_topic_id(st, (const char *)topic_name); + if (topic_name) + free(topic_name); + + lua_pushinteger(L, topic_id); + return 1; +} + +static int lua_plugin_manage_msg_mq_update_topic(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4 || lua_type(L, -3) != LUA_TNUMBER || lua_type(L, -4) != LUA_TLIGHTUSERDATA) + goto err; + + /* stack -1 */ + int free_arg_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + if (free_arg_ref_id == LUA_REFNIL) + free_arg_ref_id = 0; + + /* stack -2 */ + int free_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + free_fn_ref_id = luaL_ref(L, LUA_REGISTRYINDEX); + else + lua_pop(L, 1); + + /* stack -3 */ + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + /* stack -4 */ + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + struct lua_message_free_arg *new_message_free_arg = (struct lua_message_free_arg *)calloc(1, sizeof(struct lua_message_free_arg)); + memset(new_message_free_arg, 0, sizeof(struct lua_message_free_arg)); + new_message_free_arg->topic_id = topic_id; + new_message_free_arg->lua_msg_free_fn_ref_id = free_fn_ref_id; + new_message_free_arg->lua_msg_free_arg_ref_id = free_arg_ref_id; + int update_result = -1; + if (type == MQ_TYPE_PACKET) + update_result = stellar_packet_mq_update_topic(st, topic_id, lpm_packet_message_free_func, new_message_free_arg); + else if (type == MQ_TYPE_SESSION) + update_result = stellar_session_mq_update_topic(st, topic_id, lpm_session_message_free_func, new_message_free_arg); + if (update_result) + { + if (new_message_free_arg) + free(new_message_free_arg); + goto err; + } + + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + new_message_free_arg->plugin_manage = plugin_manage; + LL_APPEND(plugin_manage->message_free_arg_list, new_message_free_arg); + lua_settop(L, 0); + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +} + +static int lua_plugin_manage_msg_mq_destory_topic(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 2) + goto err; + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + int destory_result = -1; + if (type == MQ_TYPE_PACKET) + destory_result = stellar_packet_mq_destroy_topic(st, topic_id); + else if (type == MQ_TYPE_SESSION) + destory_result = stellar_session_mq_destroy_topic(st, topic_id); + if (destory_result < 0) + goto err; + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +} + +static int lua_plugin_manage_msg_mq_subscribe_topic(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4 || lua_type(L, -4) != LUA_TLIGHTUSERDATA) + goto err; + + int plugin_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + int on_message_fn_ref_id = 0; + if (lua_type(L, -1) == LUA_TFUNCTION) + on_message_fn_ref_id = luaL_ref(L, -1); + else + lua_pop(L, 1); + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + struct stellar *st = (struct stellar *)lua_topointer(L, -1); + lua_settop(L, 0); + + int subscribe_result = -1; + if (type == MQ_TYPE_PACKET) + subscribe_result = stellar_packet_mq_subscribe(st, topic_id, lpm_on_packet_msg_func, plugin_id); + else if (type == MQ_TYPE_SESSION) + subscribe_result = stellar_session_mq_subscribe(st, topic_id, lpm_on_session_msg_func, plugin_id); + if (subscribe_result) + goto err; + + struct lua_on_message_fn *on_message = NULL; + struct lua_plugin_manage *plugin_manage = lua_state_get_plugin_manage(state); + if (type == MQ_TYPE_PACKET) + on_message = hash_find_on_msg_fn(plugin_manage->on_packet_message_hashlist, topic_id, plugin_id); + else if (type == MQ_TYPE_SESSION) + on_message = hash_find_on_msg_fn(plugin_manage->on_session_message_hashlist, topic_id, plugin_id); + if (on_message) + { + on_message->lua_on_msg_fn_ref_id = on_message_fn_ref_id; + } + else + { + if (type == MQ_TYPE_PACKET) + on_message = hash_on_msg_fn_insert(plugin_manage->on_packet_message_hashlist, topic_id, plugin_id); + else if (type == MQ_TYPE_SESSION) + on_message = hash_on_msg_fn_insert(plugin_manage->on_session_message_hashlist, topic_id, plugin_id); + if (!on_message) + goto err; + else + on_message->lua_on_msg_fn_ref_id = on_message_fn_ref_id; + } + + lua_settop(L, 0); + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +} + +static int lua_plugin_manage_msg_mq_publish_message(struct lua_state *state, int type) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 3) + goto err; + + int msg_ref_id = luaL_ref(L, -1); + if (msg_ref_id == LUA_REFNIL) + msg_ref_id = 0; + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + void *p = (void *)lua_topointer(L, -1); + lua_settop(L, 0); + + struct lua_context *new_context = (struct lua_context *)calloc(1, sizeof(struct lua_context)); + new_context->lua_context_ref_id = msg_ref_id; + + int publish_result = -1; + if (type == MQ_TYPE_PACKET) + publish_result = packet_mq_publish_message((struct packet *)p, topic_id, new_context); + else if (type == MQ_TYPE_SESSION) + publish_result = session_mq_publish_message((struct session *)p, topic_id, new_context); + if (publish_result) + { + luaL_unref(L, LUA_REGISTRYINDEX, new_context->lua_context_ref_id); + free(new_context); + goto err; + } + + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +} + +/* ***** ***** ***** ***** ***** ***** */ +int lua_packet_mq_create_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_create_topic(state, MQ_TYPE_PACKET); +} + +int lua_packet_mq_get_topic_id(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_get_topic_id(state, MQ_TYPE_PACKET); +} + +int lua_packet_mq_update_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_update_topic(state, MQ_TYPE_PACKET); +} + +int lua_packet_mq_destory_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_destory_topic(state, MQ_TYPE_PACKET); +} + +int lua_packet_mq_subscribe_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_subscribe_topic(state, MQ_TYPE_PACKET); +} + +int lua_packet_mq_publish_message(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_publish_message(state, MQ_TYPE_PACKET); +} + +/* ***** ***** ***** ***** ***** ***** */ +int lua_session_mq_create_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_create_topic(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_get_topic_id(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_get_topic_id(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_update_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_update_topic(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_destory_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_destory_topic(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_subscribe_topic(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_subscribe_topic(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_publish_message(struct lua_state *state) +{ + return lua_plugin_manage_msg_mq_publish_message(state, MQ_TYPE_SESSION); +} + +int lua_session_mq_ignore_message(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 3) + goto err; + + int plugin_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + struct session *sess = (struct session *)lua_topointer(L, -1); + lua_settop(L, 0); + + if (session_mq_ignore_message(sess, topic_id, plugin_id)) + goto err; + + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +} + +int lua_session_mq_unignore_message(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 4) + goto err; + + int plugin_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + struct session *sess = (struct session *)lua_topointer(L, -1); + lua_settop(L, 0); + + if (session_mq_unignore_message(sess, topic_id, plugin_id)) + goto err; + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + + return 1; +} + +int lua_session_mq_topic_is_active(struct lua_state *state) +{ + lua_State *L = (lua_State *)state; + if (lua_gettop(L) != 2) + goto err; + + int topic_id = lua_tointeger(L, -1); + lua_pop(L, 1); + + struct session *sess = (struct session *)lua_topointer(L, -1); + lua_settop(L, 0); + + /* 1 means active */ + if (session_mq_topic_is_active(sess, topic_id) != 1) + goto err; + lua_pushboolean(L, 1); + return 1; +err: + lua_settop(L, 0); + lua_pushboolean(L, 0); + return 1; +}
\ No newline at end of file |
