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