#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; }