[core] Add switch_core_session_set_external_id() which lets you define an additional identifier that you can use in switch_core_session_locate().

This commit is contained in:
Chris Rienzo
2020-06-23 17:50:18 -04:00
committed by Andrey Volk
parent 6da4f147de
commit c2e240d6dc
7 changed files with 184 additions and 3 deletions
+1
View File
@@ -189,6 +189,7 @@ struct switch_core_session {
switch_buffer_t *text_buffer;
switch_buffer_t *text_line_buffer;
switch_mutex_t *text_mutex;
const char *external_id;
};
struct switch_media_bug {
+10 -1
View File
@@ -1,6 +1,6 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
* Copyright (C) 2005-2020, Anthony Minessale II <anthm@freeswitch.org>
*
* Version: MPL 1.1
*
@@ -804,6 +804,8 @@ SWITCH_DECLARE(switch_core_session_t *) switch_core_session_request_uuid(_In_ sw
SWITCH_DECLARE(switch_status_t) switch_core_session_set_uuid(_In_ switch_core_session_t *session, _In_z_ const char *use_uuid);
SWITCH_DECLARE(switch_status_t) switch_core_session_set_external_id(_In_ switch_core_session_t *session, _In_z_ const char *use_external_id);
SWITCH_DECLARE(void) switch_core_session_perform_destroy(_Inout_ switch_core_session_t **session,
_In_z_ const char *file, _In_z_ const char *func, _In_ int line);
@@ -875,6 +877,13 @@ SWITCH_DECLARE(void) switch_core_session_signal_state_change(_In_ switch_core_se
*/
SWITCH_DECLARE(char *) switch_core_session_get_uuid(_In_ switch_core_session_t *session);
/*!
\brief Retrieve the unique external identifier from a session
\param session the session to retrieve the uuid from
\return a string representing the uuid
*/
SWITCH_DECLARE(const char *) switch_core_session_get_external_id(_In_ switch_core_session_t *session);
/*!
\brief Sets the log level for a session
+2 -1
View File
@@ -1,6 +1,6 @@
/*
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
* Copyright (C) 2005-2014, Anthony Minessale II <anthm@freeswitch.org>
* Copyright (C) 2005-2020, Anthony Minessale II <anthm@freeswitch.org>
*
* Version: MPL 1.1
*
@@ -2655,6 +2655,7 @@ SWITCH_DECLARE(void) switch_channel_event_set_basic_data(switch_channel_t *chann
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-State-Number", state_num);
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Channel-Name", switch_channel_get_name(channel));
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Unique-ID", switch_core_session_get_uuid(channel->session));
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Session-External-ID", switch_core_session_get_external_id(channel->session));
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Call-Direction",
channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound");
+48
View File
@@ -625,6 +625,7 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
switch_event_t *event;
switch_channel_t *peer_channel = switch_core_session_get_channel(*new_session);
const char *use_uuid;
const char *use_external_id;
switch_core_session_t *other_session = NULL;
switch_assert(peer_channel);
@@ -646,6 +647,17 @@ SWITCH_DECLARE(switch_call_cause_t) switch_core_session_outgoing_channel(switch_
}
}
if ((use_external_id = switch_event_get_header(var_event, "origination_external_id"))) {
if (switch_core_session_set_external_id(*new_session, use_external_id) == SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(*new_session), SWITCH_LOG_DEBUG, "%s set external_id=%s\n", switch_channel_get_name(peer_channel),
use_external_id);
switch_event_del_header(var_event, "origination_external_id");
} else {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(*new_session), SWITCH_LOG_CRIT, "%s set external_id=%s FAILED\n",
switch_channel_get_name(peer_channel), use_external_id);
}
}
if (!channel && var_event) {
const char *other_uuid;
@@ -1558,6 +1570,9 @@ SWITCH_DECLARE(void) switch_core_session_perform_destroy(switch_core_session_t *
switch_mutex_lock(runtime.session_hash_mutex);
switch_core_hash_delete(session_manager.session_table, (*session)->uuid_str);
if ((*session)->external_id) {
switch_core_hash_delete(session_manager.session_table, (*session)->external_id);
}
if (session_manager.session_count) {
session_manager.session_count--;
if (session_manager.session_count == 0) {
@@ -2055,6 +2070,34 @@ SWITCH_DECLARE(switch_status_t) switch_core_session_set_uuid(switch_core_session
return SWITCH_STATUS_SUCCESS;
}
SWITCH_DECLARE(switch_status_t) switch_core_session_set_external_id(switch_core_session_t *session, const char *use_external_id)
{
switch_assert(use_external_id);
if (session->external_id && !strcmp(use_external_id, session->external_id)) {
return SWITCH_STATUS_SUCCESS;
}
switch_mutex_lock(runtime.session_hash_mutex);
if (switch_core_hash_find(session_manager.session_table, use_external_id)) {
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Duplicate External ID!\n");
switch_mutex_unlock(runtime.session_hash_mutex);
return SWITCH_STATUS_FALSE;
}
switch_channel_set_variable(session->channel, "session_external_id", use_external_id);
if (session->external_id) {
switch_core_hash_delete(session_manager.session_table, session->external_id);
}
session->external_id = switch_core_session_strdup(session, use_external_id);
switch_core_hash_insert(session_manager.session_table, session->external_id, session);
switch_mutex_unlock(runtime.session_hash_mutex);
return SWITCH_STATUS_SUCCESS;
}
static char *xml_find_var(switch_xml_t vars, const char *name)
{
switch_xml_t var;
@@ -2540,6 +2583,11 @@ SWITCH_DECLARE(char *) switch_core_session_get_uuid(switch_core_session_t *sessi
return session->uuid_str;
}
SWITCH_DECLARE(const char *) switch_core_session_get_external_id(switch_core_session_t *session)
{
if (!session) return NULL;
return session->external_id;
}
SWITCH_DECLARE(uint32_t) switch_core_session_limit(uint32_t new_limit)
{