mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-25 20:19:36 +00:00
update
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@2849 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
074e9d2de5
commit
e561fa1c25
@ -30,6 +30,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
static char *MARKER = "1";
|
||||||
|
|
||||||
static const char modname[] = "mod_event_multicast";
|
static const char modname[] = "mod_event_multicast";
|
||||||
|
|
||||||
@ -37,13 +38,17 @@ static switch_memory_pool_t *module_pool = NULL;
|
|||||||
|
|
||||||
static struct {
|
static struct {
|
||||||
char *address;
|
char *address;
|
||||||
|
char *bindings;
|
||||||
switch_port_t port;
|
switch_port_t port;
|
||||||
switch_sockaddr_t *addr;
|
switch_sockaddr_t *addr;
|
||||||
switch_socket_t *udp_socket;
|
switch_socket_t *udp_socket;
|
||||||
|
switch_hash_t *event_hash;
|
||||||
|
uint8_t event_list[SWITCH_EVENT_ALL+1];
|
||||||
int running;
|
int running;
|
||||||
} globals;
|
} globals;
|
||||||
|
|
||||||
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_address, globals.address)
|
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_address, globals.address)
|
||||||
|
SWITCH_DECLARE_GLOBAL_STRING_FUNC(set_global_bindings, globals.bindings)
|
||||||
|
|
||||||
#define MULTICAST_EVENT "multicast::event"
|
#define MULTICAST_EVENT "multicast::event"
|
||||||
|
|
||||||
@ -53,6 +58,9 @@ static switch_status_t load_config(void)
|
|||||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||||
char *cf = "event_multicast.conf";
|
char *cf = "event_multicast.conf";
|
||||||
switch_xml_t cfg, xml, settings, param;
|
switch_xml_t cfg, xml, settings, param;
|
||||||
|
char *next, *cur;
|
||||||
|
uint32_t count = 0, key_count = 0;
|
||||||
|
uint8_t custom = 0;
|
||||||
|
|
||||||
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
|
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf);
|
||||||
@ -71,6 +79,8 @@ static switch_status_t load_config(void)
|
|||||||
|
|
||||||
if (!strcasecmp(var, "address")) {
|
if (!strcasecmp(var, "address")) {
|
||||||
set_global_address(val);
|
set_global_address(val);
|
||||||
|
} else if (!strcasecmp(var, "bindings")) {
|
||||||
|
set_global_bindings(val);
|
||||||
} else if (!strcasecmp(var, "port")) {
|
} else if (!strcasecmp(var, "port")) {
|
||||||
globals.port = (switch_port_t)atoi(val);
|
globals.port = (switch_port_t)atoi(val);
|
||||||
}
|
}
|
||||||
@ -79,20 +89,63 @@ static switch_status_t load_config(void)
|
|||||||
|
|
||||||
switch_xml_free(xml);
|
switch_xml_free(xml);
|
||||||
|
|
||||||
|
|
||||||
|
if (globals.bindings) {
|
||||||
|
for(cur = globals.bindings; cur; count++) {
|
||||||
|
switch_event_types_t type;
|
||||||
|
|
||||||
|
if ((next = strchr(cur, ' '))) {
|
||||||
|
*next++ = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (custom) {
|
||||||
|
switch_core_hash_insert_dup(globals.event_hash, cur, MARKER);
|
||||||
|
} else if (switch_name_event(cur, &type) == SWITCH_STATUS_SUCCESS) {
|
||||||
|
key_count++;
|
||||||
|
if (type == SWITCH_EVENT_ALL) {
|
||||||
|
uint32_t x = 0;
|
||||||
|
for (x = 0; x < SWITCH_EVENT_ALL; x++) {
|
||||||
|
globals.event_list[x] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
globals.event_list[type] = 1;
|
||||||
|
if (type == SWITCH_EVENT_CUSTOM) {
|
||||||
|
custom++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cur = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!key_count) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No Bindings Assuming ALL!\n");
|
||||||
|
globals.event_list[SWITCH_EVENT_ALL] = 1;
|
||||||
|
}
|
||||||
return status;
|
return status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void event_handler(switch_event_t *event)
|
static void event_handler(switch_event_t *event)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[65536];
|
||||||
size_t len;
|
size_t len;
|
||||||
|
uint8_t send = 0;
|
||||||
|
|
||||||
|
|
||||||
if (event->subclass && !strcmp(event->subclass->name, MULTICAST_EVENT)) {
|
if (event->subclass && !strcmp(event->subclass->name, MULTICAST_EVENT)) {
|
||||||
/* ignore our own events to avoid ping pong*/
|
/* ignore our own events to avoid ping pong*/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (globals.event_list[(uint8_t)SWITCH_EVENT_ALL]) {
|
||||||
|
send = 1;
|
||||||
|
} else if ((globals.event_list[(uint8_t)event->event_id])) {
|
||||||
|
if (event->event_id != SWITCH_EVENT_CUSTOM ||
|
||||||
|
(event->subclass && switch_core_hash_find(globals.event_hash, event->subclass->name))) {
|
||||||
|
send = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (event->event_id) {
|
switch (event->event_id) {
|
||||||
case SWITCH_EVENT_LOG:
|
case SWITCH_EVENT_LOG:
|
||||||
@ -159,6 +212,7 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_load(const switch_loadable_mod
|
|||||||
return SWITCH_STATUS_TERM;
|
return SWITCH_STATUS_TERM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_core_hash_init(&globals.event_hash, module_pool);
|
||||||
|
|
||||||
/* connect my internal structure to the blank pointer passed to me */
|
/* connect my internal structure to the blank pointer passed to me */
|
||||||
*module_interface = &event_test_module_interface;
|
*module_interface = &event_test_module_interface;
|
||||||
@ -192,13 +246,15 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_shutdown(void)
|
|||||||
SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void)
|
SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void)
|
||||||
{
|
{
|
||||||
switch_event_t *local_event;
|
switch_event_t *local_event;
|
||||||
char buf[1024];
|
char buf[65536];
|
||||||
|
|
||||||
|
|
||||||
globals.running = 1;
|
globals.running = 1;
|
||||||
while(globals.running == 1) {
|
while(globals.running == 1) {
|
||||||
switch_sockaddr_t addr = {0};
|
switch_sockaddr_t addr = {0};
|
||||||
size_t len = sizeof(buf);
|
size_t len = sizeof(buf);
|
||||||
memset(buf, 0, len);
|
memset(buf, 0, len);
|
||||||
|
|
||||||
if (switch_socket_recvfrom(&addr, globals.udp_socket, 0, buf, &len) == SWITCH_STATUS_SUCCESS) {
|
if (switch_socket_recvfrom(&addr, globals.udp_socket, 0, buf, &len) == SWITCH_STATUS_SUCCESS) {
|
||||||
if (switch_event_create_subclass(&local_event, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT) == SWITCH_STATUS_SUCCESS) {
|
if (switch_event_create_subclass(&local_event, SWITCH_EVENT_CUSTOM, MULTICAST_EVENT) == SWITCH_STATUS_SUCCESS) {
|
||||||
char *var, *val, *term = NULL;
|
char *var, *val, *term = NULL;
|
||||||
@ -206,7 +262,6 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void)
|
|||||||
var = buf;
|
var = buf;
|
||||||
while(*var) {
|
while(*var) {
|
||||||
if ((val = strchr(var, ':')) != 0) {
|
if ((val = strchr(var, ':')) != 0) {
|
||||||
char varname[512];
|
|
||||||
*val++ = '\0';
|
*val++ = '\0';
|
||||||
while(*val == ' ') {
|
while(*val == ' ') {
|
||||||
val++;
|
val++;
|
||||||
@ -217,15 +272,20 @@ SWITCH_MOD_DECLARE(switch_status_t) switch_module_runtime(void)
|
|||||||
term++;
|
term++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
snprintf(varname, sizeof(varname), "Remote-%s", var);
|
|
||||||
switch_event_add_header(local_event, SWITCH_STACK_BOTTOM, varname, val);
|
switch_event_add_header(local_event, SWITCH_STACK_BOTTOM, var, val);
|
||||||
var = term + 1;
|
var = term + 1;
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!switch_strlen_zero(var)) {
|
||||||
|
switch_event_add_body(local_event, var);
|
||||||
|
}
|
||||||
|
|
||||||
switch_event_fire(&local_event);
|
switch_event_fire(&local_event);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user