mirror of
https://github.com/signalwire/freeswitch.git
synced 2026-07-19 02:31:53 +00:00
[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:
committed by
Andrey Volk
parent
6da4f147de
commit
c2e240d6dc
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user