SWITCH_DECLARE(void) switch_event_launch_dispatch_threads(uint32_t max);
SWITCH_DECLARE(switch_status_t) switch_event_channel_broadcast(const char *event_channel, cJSON **json, const char *key, switch_event_channel_id_t id);
-SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func);
-SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id);
+SWITCH_DECLARE(switch_status_t) switch_event_channel_deliver(const char *event_channel, cJSON **json, const char *key, switch_event_channel_id_t id);
+SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func, void *user_data);
+SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id, void *user_data);
typedef void (*switch_live_array_command_handler_t)(switch_live_array_t *la, const char *cmd, const char *sessid, cJSON *jla, void *user_data);
typedef struct switch_media_handle_s switch_media_handle_t;
typedef uint32_t switch_event_channel_id_t;
-typedef void (*switch_event_channel_func_t)(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
+typedef void (*switch_event_channel_func_t)(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
struct switch_live_array_s;
typedef struct switch_live_array_s switch_live_array_t;
return obj;
}
-void conference_event_mod_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id)
+
+void conference_event_mod_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data)
{
cJSON *data, *addobj = NULL;
const char *action = NULL;
}
-void conference_event_chat_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id)
+void conference_event_chat_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data)
{
cJSON *data;
cJSON *jid = 0;
switch_safe_free(conference_name);
}
-void conference_event_la_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id)
+void conference_event_la_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data)
{
switch_live_array_parse_json(json, conference_globals.event_channel_id);
}
-void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id)
+void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data)
{
char *domain = NULL, *name = NULL;
conference_obj_t *conference = NULL;
switch_console_add_complete_func("::conference::conference_list_conferences", conference_list_conferences);
- switch_event_channel_bind("conference", conference_event_channel_handler, &conference_globals.event_channel_id);
- switch_event_channel_bind("conference-liveArray", conference_event_la_channel_handler, &conference_globals.event_channel_id);
- switch_event_channel_bind("conference-mod", conference_event_mod_channel_handler, &conference_globals.event_channel_id);
- switch_event_channel_bind("conference-chat", conference_event_chat_channel_handler, &conference_globals.event_channel_id);
+ switch_event_channel_bind("conference", conference_event_channel_handler, &conference_globals.event_channel_id, NULL);
+ switch_event_channel_bind("conference-liveArray", conference_event_la_channel_handler, &conference_globals.event_channel_id, NULL);
+ switch_event_channel_bind("conference-mod", conference_event_mod_channel_handler, &conference_globals.event_channel_id, NULL);
+ switch_event_channel_bind("conference-chat", conference_event_chat_channel_handler, &conference_globals.event_channel_id, NULL);
if ( conference_api_sub_syntax(&api_syntax) != SWITCH_STATUS_SUCCESS) {
return SWITCH_STATUS_TERM;
/* signal all threads to shutdown */
conference_globals.running = 0;
- switch_event_channel_unbind(NULL, conference_event_channel_handler);
- switch_event_channel_unbind(NULL, conference_event_la_channel_handler);
- switch_event_channel_unbind(NULL, conference_event_mod_channel_handler);
- switch_event_channel_unbind(NULL, conference_event_chat_channel_handler);
+ switch_event_channel_unbind(NULL, conference_event_channel_handler, NULL);
+ switch_event_channel_unbind(NULL, conference_event_la_channel_handler, NULL);
+ switch_event_channel_unbind(NULL, conference_event_mod_channel_handler, NULL);
+ switch_event_channel_unbind(NULL, conference_event_chat_channel_handler, NULL);
switch_console_del_complete_func("::conference::conference_list_conferences");
void conference_cdr_add(conference_member_t *member);
void conference_cdr_rejected(conference_obj_t *conference, switch_channel_t *channel, cdr_reject_reason_t reason);
void conference_cdr_render(conference_obj_t *conference);
-void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
-void conference_event_la_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
-void conference_event_mod_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
-void conference_event_chat_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
+void conference_event_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
+void conference_event_la_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
+void conference_event_mod_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
+void conference_event_chat_channel_handler(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
void conference_member_itterator(conference_obj_t *conference, switch_stream_handle_t *stream, uint8_t non_mod, conference_api_member_cmd_t pfncallback, void *data);
int conference_video_flush_queue(switch_queue_t *q, int min);
}
}
-void verto_broadcast(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id);
+void verto_broadcast(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data);
static int verto_init_ssl(verto_profile_t *profile)
{
return cause;
}
-void verto_broadcast(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id)
+void verto_broadcast(const char *event_channel, cJSON *json, const char *key, switch_event_channel_id_t id, void *user_data)
{
if (verto_globals.debug > 9) {
char *json_text;
/* comment broadcasting globally and change to only within the module cos FS events are heavy */
//switch_event_channel_broadcast(event_channel, &msg, __FILE__, NO_EVENT_CHANNEL_ID);
- verto_broadcast(event_channel, msg, __FILE__, NO_EVENT_CHANNEL_ID);cJSON_Delete(msg);
+ verto_broadcast(event_channel, msg, __FILE__, NO_EVENT_CHANNEL_ID, NULL);cJSON_Delete(msg);
free(event_channel);
- switch_event_channel_bind(SWITCH_EVENT_CHANNEL_GLOBAL, verto_broadcast, &verto_globals.event_channel_id);
+ switch_event_channel_bind(SWITCH_EVENT_CHANNEL_GLOBAL, verto_broadcast, &verto_globals.event_channel_id, NULL);
r = init();
json_cleanup();
switch_core_hash_destroy(&json_GLOBALS.store_hash);
- switch_event_channel_unbind(NULL, verto_broadcast);
+ switch_event_channel_unbind(NULL, verto_broadcast, NULL);
switch_event_unbind_callback(presence_event_handler);
switch_event_unbind_callback(event_handler);
}
struct switch_event_channel_sub_node_head_s;
-
typedef struct switch_event_channel_sub_node_s {
switch_event_channel_func_t func;
+ void *user_data;
switch_event_channel_id_t id;
struct switch_event_channel_sub_node_head_s *head;
struct switch_event_channel_sub_node_s *next;
char *event_channel;
} switch_event_channel_sub_node_head_t;
-static uint32_t switch_event_channel_unsub_head(switch_event_channel_func_t func, switch_event_channel_sub_node_head_t *head)
+static uint32_t switch_event_channel_unsub_head(switch_event_channel_func_t func, switch_event_channel_sub_node_head_t *head, void *user_data)
{
uint32_t x = 0;
thisnp = np;
np = np->next;
- if (!func || thisnp->func == func) {
+ if (!(func) || (thisnp->func == func && (thisnp->user_data == user_data || user_data == NULL))) {
x++;
if (last) {
while ((hi = switch_core_hash_first_iter( event_channel_manager.hash, hi))) {
switch_core_hash_this(hi, NULL, NULL, &val);
head = (switch_event_channel_sub_node_head_t *) val;
- switch_event_channel_unsub_head(NULL, head);
+ switch_event_channel_unsub_head(NULL, head, NULL);
switch_core_hash_delete(event_channel_manager.hash, head->event_channel);
free(head->event_channel);
free(head);
switch_thread_rwlock_unlock(event_channel_manager.rwlock);
}
-static uint32_t switch_event_channel_unsub_channel(switch_event_channel_func_t func, const char *event_channel)
+static uint32_t switch_event_channel_unsub_channel(switch_event_channel_func_t func, const char *event_channel, void *user_data)
{
switch_event_channel_sub_node_head_t *head;
uint32_t x = 0;
if (val) {
head = (switch_event_channel_sub_node_head_t *) val;
- x += switch_event_channel_unsub_head(func, head);
+ x += switch_event_channel_unsub_head(func, head, user_data);
}
}
} else {
if ((head = switch_core_hash_find(event_channel_manager.hash, event_channel))) {
- x += switch_event_channel_unsub_head(func, head);
+ x += switch_event_channel_unsub_head(func, head, user_data);
}
}
return x;
}
-static switch_status_t switch_event_channel_sub_channel(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t id)
+static switch_status_t switch_event_channel_sub_channel(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t id, void *user_data)
{
switch_event_channel_sub_node_t *node, *np;
switch_zmalloc(node, sizeof(*node));
node->func = func;
+ node->user_data = user_data;
node->id = id;
node->head = head;
int exist = 0;
for (np = head->node; np; np = np->next) {
- if (np->func == func) {
+ if (np->func == func && np->user_data == user_data) {
exist = 1;
break;
}
switch_zmalloc(node, sizeof(*node));
node->func = func;
+ node->user_data = user_data;
node->id = id;
node->head = head;
continue;
}
- np->func(broadcast_channel, json, key, id);
+ np->func(broadcast_channel, json, key, id, np->user_data);
x++;
}
}
return status;
}
-SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func)
+SWITCH_DECLARE(switch_status_t) switch_event_channel_deliver(const char *event_channel, cJSON **json, const char *key, switch_event_channel_id_t id)
{
- return switch_event_channel_unsub_channel(func, event_channel);
+ event_channel_data_t *ecd = NULL;
+ switch_zmalloc(ecd, sizeof(*ecd));
+
+ ecd->event_channel = strdup(event_channel);
+ ecd->json = *json;
+ ecd->key = strdup(key);
+ ecd->id = id;
+
+ *json = NULL;
+
+ ecd_deliver(&ecd);
+
+ return SWITCH_STATUS_SUCCESS;
}
-SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id)
+SWITCH_DECLARE(uint32_t) switch_event_channel_unbind(const char *event_channel, switch_event_channel_func_t func, void *user_data)
+{
+ return switch_event_channel_unsub_channel(func, event_channel, user_data);
+}
+SWITCH_DECLARE(switch_status_t) switch_event_channel_bind(const char *event_channel, switch_event_channel_func_t func, switch_event_channel_id_t *id, void *user_data)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
switch_thread_rwlock_unlock(event_channel_manager.rwlock);
}
- status = switch_event_channel_sub_channel(event_channel, func, *id);
+ status = switch_event_channel_sub_channel(event_channel, func, *id, user_data);
return status;
}