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
|
#include "stellar/utils.h"
#include "stellar/plugin.h"
struct example_plugin_env
{
struct stellar *st;
int plugin_id;
int tcp_sub_id;
int tcp_topic_id;
int appid_topic_id;
};
struct appid_msg
{
int app_id;
};
struct example_plugin_per_session_ctx
{
int appid;
};
void appid_msg_free_cb_func(void *msg, void *msg_free_arg)
{
if(msg)
{
FREE(msg);
}
return;
}
void on_tcp_msg_cb_func(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env)
{
struct example_plugin_per_session_ctx *p_ctx = (struct example_plugin_per_session_ctx *)per_session_ctx;
struct example_plugin_env *p_env = (struct example_plugin_env *)plugin_env;
struct packet *pkt=(struct packet *)msg;
//do something
p_ctx->appid = 12345;
struct appid_msg *appmsg=CALLOC(struct appid_msg, 1);
stellar_per_session_mq_publish_message(sess, p_env->appid_topic_id, appmsg);
return;
}
void *example_plugin_per_session_ctx_new_func(struct session *sess, void *plugin_env)
{
struct example_plugin_per_session_ctx *p_ctx = CALLOC(struct example_plugin_per_session_ctx, 1);
return p_ctx;
}
void example_plugin_per_session_ctx_free_func(struct session *sess, void *per_session_ctx, void *plugin_env)
{
if(per_session_ctx)
{
FREE(per_session_ctx);
}
return;
}
void *plugin_env_init(struct stellar *st)
{
struct example_plugin_env *plugin_env = CALLOC(struct example_plugin_env, 1);
plugin_env->st=st;
plugin_env->plugin_id=stellar_register_session_plugin(st,
example_plugin_per_session_ctx_new_func,
example_plugin_per_session_ctx_free_func,
plugin_env);
plugin_env->appid_topic_id=stellar_per_session_mq_create_topic(st, "APPID", appid_msg_free_cb_func, 0);
plugin_env->tcp_topic_id=stellar_per_session_mq_get_topic_id(st, "TCP");
plugin_env->tcp_sub_id=stellar_per_session_mq_subscribe(st,
plugin_env->tcp_topic_id,
on_tcp_msg_cb_func,
plugin_env->plugin_id);
return plugin_env;
}
void plugin_env_exit(void *plugin_env)
{
struct example_plugin_env *p_env=(struct example_plugin_env *)plugin_env;
if(p_env)
{
stellar_per_session_mq_destroy_topic(p_env->st, p_env->appid_topic_id);
FREE(p_env);
}
return;
}
|