using namespace std;
using namespace v8;
-typedef struct {\r
- char *cmd;\r
- char *arg;\r
- char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];\r
- int ack;\r
- switch_memory_pool_t *pool;\r
-} api_command_struct_t;\r
+typedef struct {
+ char *cmd;
+ char *arg;
+ char uuid_str[SWITCH_UUID_FORMATTED_LENGTH + 1];
+ int ack;
+ switch_memory_pool_t *pool;
+} api_command_struct_t;
static const char js_class_name[] = "EventHandler";
switch_mutex_lock(_mutex);
- if (_event_list[SWITCH_EVENT_ALL]) {\r
- send = 1;\r
- } else if ((_event_list[event->event_id])) {\r
- if (event->event_id != SWITCH_EVENT_CUSTOM || !event->subclass_name || (switch_core_hash_find(_event_hash, event->subclass_name))) {\r
- send = 1;\r
- }\r
- }\r
-\r
- if (send) {\r
- if (_filters && _filters->headers) {\r
- switch_event_header_t *hp;\r
- const char *hval;\r
-\r
- send = 0;\r
-\r
- for (hp = _filters->headers; hp; hp = hp->next) {\r
- if ((hval = switch_event_get_header(event, hp->name))) {\r
- const char *comp_to = hp->value;\r
- int pos = 1, cmp = 0;\r
-\r
- while (comp_to && *comp_to) {\r
- if (*comp_to == '+') {\r
- pos = 1;\r
- } else if (*comp_to == '-') {\r
- pos = 0;\r
- } else if (*comp_to != ' ') {\r
- break;\r
- }\r
- comp_to++;\r
- }\r
-\r
- if (send && pos) {\r
- continue;\r
- }\r
-\r
- if (!comp_to) {\r
- continue;\r
- }\r
-\r
- if (*hp->value == '/') {\r
- switch_regex_t *re = NULL;\r
- int ovector[30];\r
- cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));\r
- switch_regex_safe_free(re);\r
- } else {\r
- cmp = !strcasecmp(hval, comp_to);\r
- }\r
-\r
- if (cmp) {\r
- if (pos) {\r
- send = 1;\r
- } else {\r
- send = 0;\r
- break;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\r
+ if (_event_list[SWITCH_EVENT_ALL]) {
+ send = 1;
+ } else if ((_event_list[event->event_id])) {
+ if (event->event_id != SWITCH_EVENT_CUSTOM || !event->subclass_name || (switch_core_hash_find(_event_hash, event->subclass_name))) {
+ send = 1;
+ }
+ }
+
+ if (send) {
+ if (_filters && _filters->headers) {
+ switch_event_header_t *hp;
+ const char *hval;
+
+ send = 0;
+
+ for (hp = _filters->headers; hp; hp = hp->next) {
+ if ((hval = switch_event_get_header(event, hp->name))) {
+ const char *comp_to = hp->value;
+ int pos = 1, cmp = 0;
+
+ while (comp_to && *comp_to) {
+ if (*comp_to == '+') {
+ pos = 1;
+ } else if (*comp_to == '-') {
+ pos = 0;
+ } else if (*comp_to != ' ') {
+ break;
+ }
+ comp_to++;
+ }
+
+ if (send && pos) {
+ continue;
+ }
+
+ if (!comp_to) {
+ continue;
+ }
+
+ if (*hp->value == '/') {
+ switch_regex_t *re = NULL;
+ int ovector[30];
+ cmp = !!switch_regex_perform(hval, comp_to, &re, ovector, sizeof(ovector) / sizeof(ovector[0]));
+ switch_regex_safe_free(re);
+ } else {
+ cmp = !strcasecmp(hval, comp_to);
+ }
+
+ if (cmp) {
+ if (pos) {
+ send = 1;
+ } else {
+ send = 0;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
switch_mutex_unlock(_mutex);
if (send) {
if (switch_event_dup(&clone, event) == SWITCH_STATUS_SUCCESS) {
-
- if (switch_queue_trypush(_event_queue, clone) == SWITCH_STATUS_SUCCESS) {
- // TODO
- /*if (l->lost_events) {
- int le = l->lost_events;
- l->lost_events = 0;
- switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(l->session), SWITCH_LOG_CRIT, "Lost %d events!\n", le);
- }*/
- } else {
- /*if (++l->lost_events > MAX_MISSED) {
- kill_listener(l, NULL);
- }*/
+ if (switch_queue_trypush(_event_queue, clone) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Lost event to JS EventHandler, you must read the events faster!\n");
switch_event_destroy(&clone);
}
} else {
- ////switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(l->session), SWITCH_LOG_ERROR, "Memory Error!\n");
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Memory Error!\n");
}
}
}
String::Utf8Value str(info[i]);
switch_event_types_t etype;
- if (custom) {\r
- switch_mutex_lock(_mutex);\r
- switch_core_hash_insert(_event_hash, js_safe_str(*str), MARKER);\r
- switch_mutex_unlock(_mutex);\r
- } else if (switch_name_event(js_safe_str(*str), &etype) == SWITCH_STATUS_SUCCESS) {\r
- ret = true;\r
-\r
- if (etype == SWITCH_EVENT_ALL) {\r
- uint32_t x = 0;\r
- for (x = 0; x < SWITCH_EVENT_ALL; x++) {\r
- _event_list[x] = 1;\r
- }\r
- }\r
-\r
- if (etype <= SWITCH_EVENT_ALL) {\r
- _event_list[etype] = 1;\r
- }\r
-\r
- if (etype == SWITCH_EVENT_CUSTOM) {\r
- custom++;\r
- }\r
- }\r
+ if (custom) {
+ switch_mutex_lock(_mutex);
+ switch_core_hash_insert(_event_hash, js_safe_str(*str), MARKER);
+ switch_mutex_unlock(_mutex);
+ } else if (switch_name_event(js_safe_str(*str), &etype) == SWITCH_STATUS_SUCCESS) {
+ ret = true;
+
+ if (etype == SWITCH_EVENT_ALL) {
+ uint32_t x = 0;
+ for (x = 0; x < SWITCH_EVENT_ALL; x++) {
+ _event_list[x] = 1;
+ }
+ }
+
+ if (etype <= SWITCH_EVENT_ALL) {
+ _event_list[etype] = 1;
+ }
+
+ if (etype == SWITCH_EVENT_CUSTOM) {
+ custom++;
+ }
+ }
}
info.GetReturnValue().Set(ret);
String::Utf8Value str(info[i]);
switch_event_types_t etype;
- if (custom) {\r
- switch_mutex_lock(_mutex);\r
- switch_core_hash_delete(_event_hash, js_safe_str(*str));\r
- switch_mutex_unlock(_mutex);\r
- } else if (switch_name_event(js_safe_str(*str), &etype) == SWITCH_STATUS_SUCCESS) {\r
- uint32_t x = 0;\r
- ret = true;\r
-\r
- if (etype == SWITCH_EVENT_CUSTOM) {\r
- custom++;\r
- } else if (etype == SWITCH_EVENT_ALL) {\r
- for (x = 0; x <= SWITCH_EVENT_ALL; x++) {\r
- _event_list[x] = 0;\r
- }\r
- } else {\r
- if (_event_list[SWITCH_EVENT_ALL]) {\r
- _event_list[SWITCH_EVENT_ALL] = 0;\r
- for (x = 0; x < SWITCH_EVENT_ALL; x++) {\r
- _event_list[x] = 1;\r
- }\r
- }\r
- _event_list[etype] = 0;\r
- }\r
- }\r
+ if (custom) {
+ switch_mutex_lock(_mutex);
+ switch_core_hash_delete(_event_hash, js_safe_str(*str));
+ switch_mutex_unlock(_mutex);
+ } else if (switch_name_event(js_safe_str(*str), &etype) == SWITCH_STATUS_SUCCESS) {
+ uint32_t x = 0;
+ ret = true;
+
+ if (etype == SWITCH_EVENT_CUSTOM) {
+ custom++;
+ } else if (etype == SWITCH_EVENT_ALL) {
+ for (x = 0; x <= SWITCH_EVENT_ALL; x++) {
+ _event_list[x] = 0;
+ }
+ } else {
+ if (_event_list[SWITCH_EVENT_ALL]) {
+ _event_list[SWITCH_EVENT_ALL] = 0;
+ for (x = 0; x < SWITCH_EVENT_ALL; x++) {
+ _event_list[x] = 1;
+ }
+ }
+ _event_list[etype] = 0;
+ }
+ }
}
info.GetReturnValue().Set(ret);
String::Utf8Value str(info[0]);
const char *headerName = js_safe_str(*str);
- if (zstr(headerName)) {\r
- info.GetReturnValue().Set(false);\r
- return;\r
- }\r
+ if (zstr(headerName)) {
+ info.GetReturnValue().Set(false);
+ return;
+ }
switch_mutex_lock(_mutex);
- if (!_filters) {\r
- switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);\r
- }\r
-\r
- if (!strcasecmp(headerName, "all")) {\r
- switch_event_destroy(&_filters);\r
- switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);\r
- } else {\r
- switch_event_del_header(_filters, headerName);\r
- }\r
-\r
- info.GetReturnValue().Set(true);\r
-\r
- switch_mutex_unlock(_mutex);\r
+ if (!_filters) {
+ switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);
+ }
+
+ if (!strcasecmp(headerName, "all")) {
+ switch_event_destroy(&_filters);
+ switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);
+ } else {
+ switch_event_del_header(_filters, headerName);
+ }
+
+ info.GetReturnValue().Set(true);
+
+ switch_mutex_unlock(_mutex);
}
}
const char *headerName = js_safe_str(*str1);
const char *headerVal = js_safe_str(*str2);
- if (zstr(headerName) || zstr(headerVal)) {\r
- info.GetReturnValue().Set(false);\r
- return;\r
- }\r
+ if (zstr(headerName) || zstr(headerVal)) {
+ info.GetReturnValue().Set(false);
+ return;
+ }
switch_mutex_lock(_mutex);
- if (!_filters) {\r
- switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);\r
- }\r
-\r
- switch_event_add_header_string(_filters, SWITCH_STACK_BOTTOM, headerName, headerVal);\r
-\r
- info.GetReturnValue().Set(true);\r
-\r
- switch_mutex_unlock(_mutex);\r
+ if (!_filters) {
+ switch_event_create_plain(&_filters, SWITCH_EVENT_CLONE);
+ }
+
+ switch_event_add_header_string(_filters, SWITCH_STACK_BOTTOM, headerName, headerVal);
+
+ info.GetReturnValue().Set(true);
+
+ switch_mutex_unlock(_mutex);
}
}
switch_core_session_t *session;
switch_status_t status = SWITCH_STATUS_FALSE;
- if ((session = switch_core_session_locate(session_uuid.c_str()))) {\r
- if ((status = switch_core_session_queue_private_event(session, event, SWITCH_FALSE)) == SWITCH_STATUS_SUCCESS) {\r
- info.GetReturnValue().Set(true);\r
- } else {\r
- info.GetReturnValue().Set(false);\r
- }\r
- switch_core_session_rwunlock(session);\r
- } else {\r
- info.GetReturnValue().Set(false);\r
- // TODO LOGGING\r
- //switch_snprintf(reply, reply_len, "-ERR invalid session id [%s]", switch_str_nil(uuid));\r
- }\r
+ if ((session = switch_core_session_locate(session_uuid.c_str()))) {
+ if ((status = switch_core_session_queue_private_event(session, event, SWITCH_FALSE)) == SWITCH_STATUS_SUCCESS) {
+ info.GetReturnValue().Set(true);
+ } else {
+ info.GetReturnValue().Set(false);
+ }
+ switch_core_session_rwunlock(session);
+ } else {
+ info.GetReturnValue().Set(false);
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid session id [%s]\n", switch_str_nil(session_uuid.c_str()));
+ }
} else {
/* "Normal" event */
- // TODO LOGGING
switch_event_fire(event);
}
}
}
}
-static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)\r
-{\r
- api_command_struct_t *acs = (api_command_struct_t *) obj;\r
- switch_stream_handle_t stream = { 0 };\r
- char *reply, *freply = NULL;\r
- switch_status_t status;\r
- switch_event_t *event;\r
-\r
- if (!acs) {\r
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Internal error.\n");\r
- return NULL;\r
- }\r
-\r
- acs->ack = 1;\r
-\r
- SWITCH_STANDARD_STREAM(stream);\r
-\r
- status = switch_api_execute(acs->cmd, acs->arg, NULL, &stream);\r
-\r
- if (status == SWITCH_STATUS_SUCCESS) {\r
- reply = (char *)stream.data;\r
- } else {\r
- freply = switch_mprintf("-ERR %s Command not found!\n", acs->cmd);\r
- reply = freply;\r
- }\r
-\r
- if (!reply) {\r
- reply = "Command returned no output!";\r
- }\r
-\r
- if (switch_event_create(&event, SWITCH_EVENT_BACKGROUND_JOB) == SWITCH_STATUS_SUCCESS) {\r
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-UUID", acs->uuid_str);\r
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-Command", acs->cmd);\r
- if (acs->arg) {\r
- switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-Command-Arg", acs->arg);\r
- }\r
- switch_event_add_body(event, "%s", reply);\r
- switch_event_fire(&event);\r
- }\r
-\r
- switch_safe_free(stream.data);\r
- switch_safe_free(freply);\r
-\r
- switch_memory_pool_t *pool = acs->pool;\r
- if (acs->ack == -1) {\r
- int sanity = 2000;\r
- while (acs->ack == -1) {\r
- switch_cond_next();\r
- if (--sanity <= 0)\r
- break;\r
- }\r
- }\r
-\r
- acs = NULL;\r
- switch_core_destroy_memory_pool(&pool);\r
- pool = NULL;\r
-\r
- return NULL;\r
-}\r
+static void *SWITCH_THREAD_FUNC api_exec(switch_thread_t *thread, void *obj)
+{
+ api_command_struct_t *acs = (api_command_struct_t *) obj;
+ switch_stream_handle_t stream = { 0 };
+ char *reply, *freply = NULL;
+ switch_status_t status;
+ switch_event_t *event;
+
+ if (!acs) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Internal error.\n");
+ return NULL;
+ }
+
+ acs->ack = 1;
+
+ SWITCH_STANDARD_STREAM(stream);
+
+ status = switch_api_execute(acs->cmd, acs->arg, NULL, &stream);
+
+ if (status == SWITCH_STATUS_SUCCESS) {
+ reply = (char *)stream.data;
+ } else {
+ freply = switch_mprintf("-ERR %s Command not found!\n", acs->cmd);
+ reply = freply;
+ }
+
+ if (!reply) {
+ reply = "Command returned no output!";
+ }
+
+ if (switch_event_create(&event, SWITCH_EVENT_BACKGROUND_JOB) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-UUID", acs->uuid_str);
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-Command", acs->cmd);
+ if (acs->arg) {
+ switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Job-Command-Arg", acs->arg);
+ }
+ switch_event_add_body(event, "%s", reply);
+ switch_event_fire(&event);
+ }
+
+ switch_safe_free(stream.data);
+ switch_safe_free(freply);
+
+ switch_memory_pool_t *pool = acs->pool;
+ if (acs->ack == -1) {
+ int sanity = 2000;
+ while (acs->ack == -1) {
+ switch_cond_next();
+ if (--sanity <= 0)
+ break;
+ }
+ }
+
+ acs = NULL;
+ switch_core_destroy_memory_pool(&pool);
+ pool = NULL;
+
+ return NULL;
+}
JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteBgApi)
{
- string cmd;\r
- string arg;\r
- string jobuuid;\r
- api_command_struct_t *acs = NULL;\r
- switch_memory_pool_t *pool;\r
- switch_thread_t *thread;\r
- switch_threadattr_t *thd_attr = NULL;\r
- switch_uuid_t uuid;\r
- int sanity = 2000;\r
-\r
+ string cmd;
+ string arg;
+ string jobuuid;
+ api_command_struct_t *acs = NULL;
+ switch_memory_pool_t *pool;
+ switch_thread_t *thread;
+ switch_threadattr_t *thd_attr = NULL;
+ switch_uuid_t uuid;
+ int sanity = 2000;
+
if (info.Length() > 0) {
String::Utf8Value str(info[0]);
cmd = js_safe_str(*str);
info.GetReturnValue().Set(false);
return;
}
-\r
- switch_core_new_memory_pool(&pool);\r
- acs = (api_command_struct_t *)switch_core_alloc(pool, sizeof(*acs));\r
- switch_assert(acs);\r
- acs->pool = pool;\r
-\r
- acs->cmd = switch_core_strdup(acs->pool, cmd.c_str());\r
-\r
- if (arg.c_str()) {\r
- acs->arg = switch_core_strdup(acs->pool, arg.c_str());\r
- }\r
-\r
- switch_threadattr_create(&thd_attr, acs->pool);\r
- switch_threadattr_detach_set(thd_attr, 1);\r
- switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);\r
-\r
- if (jobuuid.length() > 0) {\r
- switch_copy_string(acs->uuid_str, jobuuid.c_str(), sizeof(acs->uuid_str));\r
- } else {\r
- switch_uuid_get(&uuid);\r
- switch_uuid_format(acs->uuid_str, &uuid);\r
- }\r
-\r
- info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), acs->uuid_str));\r
-\r
- switch_thread_create(&thread, thd_attr, api_exec, acs, acs->pool);\r
-\r
- while (!acs->ack) {\r
- switch_cond_next();\r
- if (--sanity <= 0)\r
- break;\r
- }\r
-\r
- if (acs->ack == -1) {\r
- acs->ack--;\r
- }\r
+
+ switch_core_new_memory_pool(&pool);
+ acs = (api_command_struct_t *)switch_core_alloc(pool, sizeof(*acs));
+ switch_assert(acs);
+ acs->pool = pool;
+
+ acs->cmd = switch_core_strdup(acs->pool, cmd.c_str());
+
+ if (arg.c_str()) {
+ acs->arg = switch_core_strdup(acs->pool, arg.c_str());
+ }
+
+ switch_threadattr_create(&thd_attr, acs->pool);
+ switch_threadattr_detach_set(thd_attr, 1);
+ switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
+
+ if (jobuuid.length() > 0) {
+ switch_copy_string(acs->uuid_str, jobuuid.c_str(), sizeof(acs->uuid_str));
+ } else {
+ switch_uuid_get(&uuid);
+ switch_uuid_format(acs->uuid_str, &uuid);
+ }
+
+ info.GetReturnValue().Set(String::NewFromUtf8(info.GetIsolate(), acs->uuid_str));
+
+ switch_thread_create(&thread, thd_attr, api_exec, acs, acs->pool);
+
+ while (!acs->ack) {
+ switch_cond_next();
+ if (--sanity <= 0)
+ break;
+ }
+
+ if (acs->ack == -1) {
+ acs->ack--;
+ }
}
JS_EVENTHANDLER_FUNCTION_IMPL_STATIC(Destroy)