summaryrefslogtreecommitdiff
path: root/example/plugin_example.c
blob: 7ce6a729927e8f5d0bb27fdea7250b4695e60409 (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
#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;
}