#include "lua_binding_function.h" void *lpm_ctx_new_func(struct session *sess, void *plugin_env) { if (!plugin_env) return NULL; struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env; struct lua_plugin_manage *plugin_manage = env->plugin_manage; struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = (struct lua_state *)plugin_manage->state_array[thread_id]; struct lua_context *new_context = lua_context_new(state); struct lua_cdata param[3] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = sess; param[1].type = DATATYPE_TABLE; param[1].table = env->lua_plug_env_ref_id; param[2].type = DATATYPE_CONTEXT; param[2].context = new_context; if (lua_chunk_execute(state, env->lua_ctx_new_fn_ref_id, param, 3, NULL, 0, NULL, 0)) { lua_context_free(new_context); return NULL; } return (void *)new_context; } void lpm_ctx_free_func(struct session *sess, void *sess_ctx, void *plugin_env) { if (!plugin_env) return; struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env; struct lua_plugin_manage *plugin_manage = env->plugin_manage; struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[3] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = sess; param[1].type = DATATYPE_CONTEXT; param[1].context = (struct lua_context *)sess_ctx; param[2].type = DATATYPE_TABLE; param[2].table = env->lua_plug_env_ref_id; lua_chunk_execute(state, env->lua_ctx_free_fn_ref_id, param, 3, NULL, 0, NULL, 0); lua_context_free((struct lua_context *)sess_ctx); return; } void lpm_session_message_free_func(struct session *sess, void *msg, void *msg_free_arg) { if (!msg_free_arg) return; struct lua_message_free_arg *free_arg = (struct lua_message_free_arg *)msg_free_arg; struct lua_plugin_manage *plugin_manage = free_arg->plugin_manage; struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[3] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = sess; param[1].type = DATATYPE_CONTEXT; param[1].context = (struct lua_context *)msg; param[2].type = DATATYPE_TABLE; param[2].table = free_arg->lua_msg_free_arg_ref_id; lua_chunk_execute(state, free_arg->lua_msg_free_fn_ref_id, param, 3, NULL, 0, NULL, 0); lua_context_free((struct lua_context *)msg); return; } void lpm_on_session_msg_func(struct session *sess, int topic_id, const void *msg, void *sess_ctx, void *plugin_env) { if (!plugin_env) return; struct lua_session_plugin_env *env = (struct lua_session_plugin_env *)plugin_env; struct lua_plugin_manage *plugin_manage = env->plugin_manage; struct lua_on_message_fn *on_message = hash_find_on_msg_fn(plugin_manage->on_session_message_hashlist, topic_id, env->session_plugin_id); struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[5] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = sess; param[1].type = DATATYPE_INT; param[1].integer = topic_id; /* 这里是不是有更好的办法 */ struct lua_context *context = (struct lua_context *)msg; if (context && context->magic_code == context_magic_code) { param[2].type = DATATYPE_CONTEXT; param[2].context = context; } else { param[2].type = DATATYPE_POINTER; param[2].pointer = (void *)msg; } param[3].type = DATATYPE_CONTEXT; param[3].context = (struct lua_context *)sess_ctx; param[4].type = DATATYPE_TABLE; param[4].table = env->lua_plug_env_ref_id; lua_chunk_execute(state, on_message->lua_on_msg_fn_ref_id, param, 5, NULL, 0, NULL, 0); return; } void lpm_on_packet_func(struct packet *pkt, unsigned char ip_protocol, void *plugin_env) { if (!plugin_env) return; struct lua_packet_plugin_env *env = (struct lua_packet_plugin_env *)plugin_env; struct lua_plugin_manage *plugin_manage = env->plugin_manage; struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[3] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = pkt; param[1].type = DATATYPE_INT; param[1].integer = (int)ip_protocol; param[2].type = DATATYPE_TABLE; param[2].table = env->lua_plug_env_ref_id; lua_chunk_execute(state, env->lua_on_packet_fn_ref_id, param, 3, NULL, 0, NULL, 0); return; } void lpm_packet_message_free_func(struct packet *pkt, void *msg, void *msg_free_arg) { if (!msg_free_arg) return; struct lua_message_free_arg *free_arg = (struct lua_message_free_arg *)msg_free_arg; struct lua_plugin_manage *plugin_manage = free_arg->plugin_manage; struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[3] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = pkt; param[1].type = DATATYPE_CONTEXT; param[1].context = (struct lua_context *)msg; param[2].type = DATATYPE_TABLE; param[2].table = free_arg->lua_msg_free_arg_ref_id; lua_chunk_execute(state, free_arg->lua_msg_free_fn_ref_id, param, 3, NULL, 0, NULL, 0); lua_context_free((struct lua_context *)msg); return; } void lpm_on_packet_msg_func(struct packet *pkt, int topic_id, const void *msg, void *plugin_env) { if (!plugin_env) return; struct lua_packet_plugin_env *env = (struct lua_packet_plugin_env *)plugin_env; struct lua_plugin_manage *plugin_manage = env->plugin_manage; struct lua_on_message_fn *on_message = hash_find_on_msg_fn(plugin_manage->on_packet_message_hashlist, topic_id, env->packet_plugin_id); struct stellar *st = plugin_manage->st; int thread_id = stellar_get_current_thread_id(st); struct lua_state *state = plugin_manage->state_array[thread_id]; struct lua_cdata param[4] = {0}; param[0].type = DATATYPE_POINTER; param[0].pointer = pkt; param[1].type = DATATYPE_INT; param[1].integer = topic_id; /* 这里是不是有更好的办法 */ struct lua_context *context = (struct lua_context *)msg; if (context && context->magic_code == context_magic_code) { param[2].type = DATATYPE_CONTEXT; param[2].context = (struct lua_context *)msg; } else { param[2].type = DATATYPE_POINTER; param[2].pointer = (void *)msg; } param[3].type = DATATYPE_TABLE; param[3].table = env->lua_plug_env_ref_id; lua_chunk_execute(state, on_message->lua_on_msg_fn_ref_id, param, 5, NULL, 0, NULL, 0); return; }