60 lines
1.4 KiB
C++
60 lines
1.4 KiB
C++
|
|
#include "plugin.h"
|
||
|
|
#include "session_manager.h"
|
||
|
|
|
||
|
|
#include "utils.h"
|
||
|
|
|
||
|
|
struct session_event_callback
|
||
|
|
{
|
||
|
|
const char *session_name;
|
||
|
|
fn_session_event_callback callback;
|
||
|
|
TAILQ_ENTRY(session_event_callback) session_event_cb_tq_entries;
|
||
|
|
UT_hash_handle hh;
|
||
|
|
};
|
||
|
|
|
||
|
|
TAILQ_HEAD(session_event_callback_list, session_event_callback);
|
||
|
|
|
||
|
|
struct session_event_callback_map
|
||
|
|
{
|
||
|
|
struct session_event_callback_list session_ev_cb_list;
|
||
|
|
UT_hash_handle hh;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct plugin_manager
|
||
|
|
{
|
||
|
|
struct session_event_callback_list fixed_event_cbs[SESSION_TYPE_MAX];
|
||
|
|
struct session_event_callback_map *session_ev_cb_map;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct plugin_manager g_plug_mgr;
|
||
|
|
|
||
|
|
void plugin_manager_dispatch(struct session_event *event)
|
||
|
|
{
|
||
|
|
struct session *s = container_of(event, struct session, cur_ev);
|
||
|
|
struct session_event_callback_map *t_map;
|
||
|
|
struct session_event_callback *session_ev_cb;
|
||
|
|
HASH_FIND(hh, g_plug_mgr.session_ev_cb_map, s->name, strlen(s->name), t_map);
|
||
|
|
if(!t_map) return;
|
||
|
|
switch (s->state)
|
||
|
|
{
|
||
|
|
case SESSION_EVENT_OPENING:
|
||
|
|
TAILQ_FOREACH(session_ev_cb, &t_map->session_ev_cb_list, session_event_cb_tq_entries)
|
||
|
|
{
|
||
|
|
struct session_event *ev = ALLOC(struct session_event, 1);
|
||
|
|
ev->callback = session_ev_cb->callback;
|
||
|
|
ev->callback(s, SESSION_EVENT_OPENING, NULL, NULL, 0, &ev->cb_pme);
|
||
|
|
if(ev->state == 1)
|
||
|
|
{
|
||
|
|
TAILQ_INSERT_TAIL(&s->ev_list, ev, session_event_tq_entries);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
FREE(&ev);// TODO;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|