summaryrefslogtreecommitdiff
path: root/include/lua_plugin_manage.h
blob: f38b7d5f7c5dd074dc40583e80395b1a15961b87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*************************************************************************
    > File Name: lua_plugin_manage.h
    > Author: 
    > Created Time: 2024-07
    > Encoding : UTF-8
 ************************************************************************/

/*************************************************************************
 * version
 * [ v0.1 ]
 * 07-31
 * 1. 新增数据结构
 *    enum LPM_DATATYPE
 *    struct lpm_cdata
 *    struct lpm_ctable
 *    typedef int (*lpm_cbinding_function)(struct lpm_state *)
 * 2. 新增接口函数
 *    lpm_cdata_clean
 *    lpm_state_instance_create
 *    lpm_state_instance_free
 *    lpm_state_instance_init
 *    lpm_cbinding_get_params_count
 *    lpm_cbinding_get_params
 *    lpm_cbinding_push_return
 *    lpm_cbinding_function_register
 *    lpm_cbinding_function_remove
 *    lpm_cdata_register
 *    lpm_cdata_remove
 *    lpm_plugin_load
 *    lpm_plugin_unload
 *    lpm_ctx_new_func
 *    lpm_ctx_free_func
 *    lpm_on_session_msg_func
 *    lpm_trans_data_luatoc
 *    lpm_trans_data_ctolua
 ************************************************************************/
#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)
*/
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