diff --git a/src/mod/languages/mod_v8/src/fseventhandler.cpp b/src/mod/languages/mod_v8/src/fseventhandler.cpp index bef824d6ad..65b3be239b 100644 --- a/src/mod/languages/mod_v8/src/fseventhandler.cpp +++ b/src/mod/languages/mod_v8/src/fseventhandler.cpp @@ -37,13 +37,13 @@ using namespace std; using namespace v8; -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; +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"; @@ -98,87 +98,77 @@ void FSEventHandler::QueueEvent(switch_event_t *event) switch_mutex_lock(_mutex); - 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; - } - } - } - } - } - } - + 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"); } } } @@ -194,28 +184,28 @@ void FSEventHandler::DoSubscribe(const v8::FunctionCallbackInfo& info String::Utf8Value str(info[i]); switch_event_types_t etype; - 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++; - } - } + 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); @@ -242,30 +232,30 @@ JS_EVENTHANDLER_FUNCTION_IMPL(UnSubscribe) String::Utf8Value str(info[i]); switch_event_types_t etype; - 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; - } - } + 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); @@ -279,27 +269,27 @@ JS_EVENTHANDLER_FUNCTION_IMPL(DeleteFilter) String::Utf8Value str(info[0]); const char *headerName = js_safe_str(*str); - if (zstr(headerName)) { - info.GetReturnValue().Set(false); - return; - } + if (zstr(headerName)) { + info.GetReturnValue().Set(false); + return; + } switch_mutex_lock(_mutex); - 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); + 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); } } @@ -313,22 +303,22 @@ JS_EVENTHANDLER_FUNCTION_IMPL(AddFilter) const char *headerName = js_safe_str(*str1); const char *headerVal = js_safe_str(*str2); - if (zstr(headerName) || zstr(headerVal)) { - info.GetReturnValue().Set(false); - return; - } + if (zstr(headerName) || zstr(headerVal)) { + info.GetReturnValue().Set(false); + return; + } switch_mutex_lock(_mutex); - 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); + 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); } } @@ -397,21 +387,19 @@ JS_EVENTHANDLER_FUNCTION_IMPL(SendEvent) switch_core_session_t *session; switch_status_t status = SWITCH_STATUS_FALSE; - 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); - // TODO LOGGING - //switch_snprintf(reply, reply_len, "-ERR invalid session id [%s]", switch_str_nil(uuid)); - } + 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); } } @@ -448,78 +436,78 @@ JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteApi) } } -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; -} +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; - 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; - + 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); @@ -542,42 +530,42 @@ JS_EVENTHANDLER_FUNCTION_IMPL(ExecuteBgApi) info.GetReturnValue().Set(false); return; } - - 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--; - } + + 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)