From 2620e0aa30e5a97dd134cb112bdbd38aae43c642 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 13 Dec 2005 20:52:33 +0000 Subject: [PATCH] events git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@131 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/include/switch_event.h | 55 +++++++++++++++++++ src/switch_event.c | 109 +++++++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+) create mode 100644 src/include/switch_event.h create mode 100644 src/switch_event.c diff --git a/src/include/switch_event.h b/src/include/switch_event.h new file mode 100644 index 0000000000..29ea30588c --- /dev/null +++ b/src/include/switch_event.h @@ -0,0 +1,55 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II + * + * + * switch_event.h -- Event System + * + */ +#ifndef SWITCH_EVENT_H +#define SWITCH_EVENT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +struct switch_event_node { + char *id; + switch_event_t event; + int subclass; + switch_event_callback_t callback; + struct switch_event_node *next; +}; + +SWITCH_DECLARE(switch_status) switch_event_init(switch_memory_pool *pool); +SWITCH_DECLARE(switch_status) switch_event_fire_subclass(switch_event_t event, int subclass, char *data); +SWITCH_DECLARE(switch_status) switch_event_bind(char *id, switch_event_t event, int subclass, switch_event_callback_t callback); +SWITCH_DECLARE(char *) switch_event_name(switch_event_t event); +#define switch_event_fire(event, data) switch_event_fire_subclass(event, 0, data); + +#endif diff --git a/src/switch_event.c b/src/switch_event.c new file mode 100644 index 0000000000..8aee83af7d --- /dev/null +++ b/src/switch_event.c @@ -0,0 +1,109 @@ +/* + * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * Copyright (C) 2005/2006, Anthony Minessale II + * + * Version: MPL 1.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application + * + * The Initial Developer of the Original Code is + * Anthony Minessale II + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Anthony Minessale II + * + * + * switch_event.c -- Event System + * + */ +#include + +static switch_event_node *EVENT_NODES[SWITCH_EVENT_ALL+1] = {}; +static switch_mutex_t *ELOCK = NULL; +static switch_memory_pool *EPOOL = NULL; + +/* make sure this is synced with the switch_event_t enum in switch_types.h + also never put any new ones before EVENT_ALL +*/ +static char *EVENT_NAMES[] = { + "CUSTOM", + "INBOUND_CHAN", + "OUTBOUND_CHAN", + "ANSWER_CHAN", + "HANGUP_CHAN", + "STARTUP", + "ALL" +}; + +SWITCH_DECLARE(char *) switch_event_name(switch_event_t event) +{ + return EVENT_NAMES[event]; +} + +SWITCH_DECLARE(switch_status) switch_event_init(switch_memory_pool *pool) +{ + assert(pool != NULL); + EPOOL = pool; + switch_console_printf(SWITCH_CHANNEL_CONSOLE, "Activate Eventing Engine.\n"); + return switch_mutex_init(&ELOCK, SWITCH_MUTEX_NESTED, EPOOL); +} + +SWITCH_DECLARE(switch_status) switch_event_fire_subclass(switch_event_t event, int subclass, char *data) +{ + switch_event_node *enp; + switch_event_t e; + + assert(ELOCK != NULL); + assert(EPOOL != NULL); + + for(e = event;; e = SWITCH_EVENT_ALL) { + for(enp = EVENT_NODES[e]; enp; enp = enp->next) { + if ((enp->event == event || enp->event == SWITCH_EVENT_ALL) && (enp->subclass == subclass || enp->subclass < 0)) { + enp->callback(event, subclass, data); + } + } + + if (e == SWITCH_EVENT_ALL) { + break; + } + + } + + return SWITCH_STATUS_SUCCESS; +} + +SWITCH_DECLARE(switch_status) switch_event_bind(char *id, switch_event_t event, int subclass, switch_event_callback_t callback) +{ + switch_event_node *event_node; + + assert(ELOCK != NULL); + assert(EPOOL != NULL); + + if (event <= SWITCH_EVENT_ALL && (event_node = switch_core_alloc(EPOOL, sizeof(switch_event_node)))) { + event_node->id = switch_core_strdup(EPOOL, id); + event_node->event = event; + event_node->subclass = subclass; + event_node->callback = callback; + if (EVENT_NODES[event]) { + event_node->next = EVENT_NODES[event]; + } + EVENT_NODES[event] = event_node; + return SWITCH_STATUS_SUCCESS; + } + + return SWITCH_STATUS_MEMERR; +} +