mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-15 08:29:45 +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:
parent
6da4f147de
commit
c2e240d6dc
@ -189,6 +189,7 @@ struct switch_core_session {
|
|||||||
switch_buffer_t *text_buffer;
|
switch_buffer_t *text_buffer;
|
||||||
switch_buffer_t *text_line_buffer;
|
switch_buffer_t *text_line_buffer;
|
||||||
switch_mutex_t *text_mutex;
|
switch_mutex_t *text_mutex;
|
||||||
|
const char *external_id;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct switch_media_bug {
|
struct switch_media_bug {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
* 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
|
* 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_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,
|
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);
|
_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);
|
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
|
\brief Sets the log level for a session
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
* 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
|
* 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-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, "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, "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",
|
switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Call-Direction",
|
||||||
channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound");
|
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_event_t *event;
|
||||||
switch_channel_t *peer_channel = switch_core_session_get_channel(*new_session);
|
switch_channel_t *peer_channel = switch_core_session_get_channel(*new_session);
|
||||||
const char *use_uuid;
|
const char *use_uuid;
|
||||||
|
const char *use_external_id;
|
||||||
switch_core_session_t *other_session = NULL;
|
switch_core_session_t *other_session = NULL;
|
||||||
|
|
||||||
switch_assert(peer_channel);
|
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) {
|
if (!channel && var_event) {
|
||||||
const char *other_uuid;
|
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_mutex_lock(runtime.session_hash_mutex);
|
||||||
switch_core_hash_delete(session_manager.session_table, (*session)->uuid_str);
|
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) {
|
if (session_manager.session_count) {
|
||||||
session_manager.session_count--;
|
session_manager.session_count--;
|
||||||
if (session_manager.session_count == 0) {
|
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;
|
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)
|
static char *xml_find_var(switch_xml_t vars, const char *name)
|
||||||
{
|
{
|
||||||
switch_xml_t var;
|
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;
|
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)
|
SWITCH_DECLARE(uint32_t) switch_core_session_limit(uint32_t new_limit)
|
||||||
{
|
{
|
||||||
|
@ -2,7 +2,7 @@ include $(top_srcdir)/build/modmake.rulesam
|
|||||||
|
|
||||||
noinst_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core switch_console switch_vpx switch_core_file \
|
noinst_PROGRAMS = switch_event switch_hash switch_ivr_originate switch_utils switch_core switch_console switch_vpx switch_core_file \
|
||||||
switch_ivr_play_say switch_core_codec switch_rtp switch_xml
|
switch_ivr_play_say switch_core_codec switch_rtp switch_xml
|
||||||
noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_packetizer test_sofia switch_core_asr
|
noinst_PROGRAMS += switch_core_video switch_core_db switch_vad switch_packetizer test_sofia switch_core_asr switch_core_session
|
||||||
|
|
||||||
AM_LDFLAGS += -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS)
|
AM_LDFLAGS += -avoid-version -no-undefined $(SWITCH_AM_LDFLAGS) $(openssl_LIBS)
|
||||||
AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
AM_LDFLAGS += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||||
|
75
tests/unit/switch_core_session.c
Normal file
75
tests/unit/switch_core_session.c
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||||
|
* Copyright (C) 2005-2020, Anthony Minessale II <anthm@freeswitch.org>
|
||||||
|
*
|
||||||
|
* Version: MPL 1.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Anthony Minessale II <anthm@freeswitch.org>
|
||||||
|
* Portions created by the Initial Developer are Copyright (C)
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Chris Rienzo <chris@signalwire.com>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* switch_core_session.c -- tests sessions
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <switch.h>
|
||||||
|
#include <test/switch_test.h>
|
||||||
|
|
||||||
|
|
||||||
|
FST_CORE_BEGIN("./conf")
|
||||||
|
{
|
||||||
|
FST_SUITE_BEGIN(switch_core_session)
|
||||||
|
{
|
||||||
|
FST_SETUP_BEGIN()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
FST_SETUP_END()
|
||||||
|
|
||||||
|
FST_TEARDOWN_BEGIN()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
FST_TEARDOWN_END()
|
||||||
|
|
||||||
|
FST_SESSION_BEGIN(session_external_id)
|
||||||
|
{
|
||||||
|
fst_check(switch_core_session_set_external_id(fst_session, switch_core_session_get_uuid(fst_session)) != SWITCH_STATUS_SUCCESS);
|
||||||
|
fst_check(switch_core_session_set_external_id(fst_session, "foo") == SWITCH_STATUS_SUCCESS);
|
||||||
|
switch_core_session_t *session = switch_core_session_locate("foo");
|
||||||
|
fst_requires(session);
|
||||||
|
fst_check_string_equals(switch_core_session_get_uuid(session), switch_core_session_get_uuid(fst_session));
|
||||||
|
fst_check_string_equals(switch_core_session_get_external_id(session), "foo");
|
||||||
|
fst_check(switch_core_session_set_external_id(fst_session, "bar") == SWITCH_STATUS_SUCCESS);
|
||||||
|
fst_check_string_equals(switch_core_session_get_external_id(session), "bar");
|
||||||
|
fst_requires(switch_core_session_locate("foo") == NULL);
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
session = switch_core_session_locate("bar");
|
||||||
|
fst_requires(session);
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
session = switch_core_session_locate(switch_core_session_get_uuid(fst_session));
|
||||||
|
fst_requires(session);
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
switch_channel_hangup(fst_channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||||
|
session = switch_core_session_locate("bar");
|
||||||
|
fst_check(session == NULL);
|
||||||
|
}
|
||||||
|
FST_SESSION_END()
|
||||||
|
}
|
||||||
|
FST_SUITE_END()
|
||||||
|
}
|
||||||
|
FST_CORE_END()
|
@ -55,6 +55,20 @@ static switch_status_t my_on_destroy(switch_core_session_t *session)
|
|||||||
return SWITCH_STATUS_SUCCESS;
|
return SWITCH_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const char *external_id_to_match = NULL;
|
||||||
|
static int got_external_id_in_event = 0;
|
||||||
|
|
||||||
|
static void on_hangup_event(switch_event_t *event)
|
||||||
|
{
|
||||||
|
if (external_id_to_match) {
|
||||||
|
const char *external_id = switch_event_get_header(event, "Session-External-ID");
|
||||||
|
if (external_id && !strcmp(external_id_to_match, external_id)) {
|
||||||
|
got_external_id_in_event = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static switch_state_handler_table_t state_handlers = {
|
static switch_state_handler_table_t state_handlers = {
|
||||||
/*.on_init */ NULL,
|
/*.on_init */ NULL,
|
||||||
/*.on_routing */ NULL,
|
/*.on_routing */ NULL,
|
||||||
@ -89,6 +103,8 @@ FST_CORE_BEGIN("./conf")
|
|||||||
{
|
{
|
||||||
fst_requires_module("mod_loopback");
|
fst_requires_module("mod_loopback");
|
||||||
application_hit = 0;
|
application_hit = 0;
|
||||||
|
external_id_to_match = NULL;
|
||||||
|
got_external_id_in_event = 0;
|
||||||
}
|
}
|
||||||
FST_SETUP_END()
|
FST_SETUP_END()
|
||||||
|
|
||||||
@ -97,6 +113,37 @@ FST_CORE_BEGIN("./conf")
|
|||||||
}
|
}
|
||||||
FST_TEARDOWN_END()
|
FST_TEARDOWN_END()
|
||||||
|
|
||||||
|
FST_TEST_BEGIN(originate_test_external_id)
|
||||||
|
{
|
||||||
|
switch_core_session_t *session = NULL;
|
||||||
|
switch_channel_t *channel = NULL;
|
||||||
|
switch_status_t status;
|
||||||
|
switch_call_cause_t cause;
|
||||||
|
switch_event_t *ovars = NULL;
|
||||||
|
switch_event_create(&ovars, SWITCH_EVENT_CLONE);
|
||||||
|
switch_event_add_header_string(ovars, SWITCH_STACK_BOTTOM, "origination_external_id", "zzzz");
|
||||||
|
status = switch_ivr_originate(NULL, &session, &cause, "null/+15553334444", 2, NULL, NULL, NULL, NULL, ovars, SOF_NONE, NULL, NULL);
|
||||||
|
fst_requires(session);
|
||||||
|
fst_check(status == SWITCH_STATUS_SUCCESS);
|
||||||
|
switch_event_destroy(&ovars);
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
|
||||||
|
session = switch_core_session_locate("zzzz");
|
||||||
|
fst_requires(session);
|
||||||
|
|
||||||
|
channel = switch_core_session_get_channel(session);
|
||||||
|
fst_requires(channel);
|
||||||
|
|
||||||
|
external_id_to_match = "zzzz";
|
||||||
|
switch_event_bind("originate_test_external_id", SWITCH_EVENT_CHANNEL_HANGUP, SWITCH_EVENT_SUBCLASS_ANY, on_hangup_event, NULL);
|
||||||
|
switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
|
||||||
|
switch_core_session_rwunlock(session);
|
||||||
|
switch_yield(1000 * 1000);
|
||||||
|
fst_check(got_external_id_in_event == 1);
|
||||||
|
switch_event_unbind_callback(on_hangup_event);
|
||||||
|
}
|
||||||
|
FST_TEST_END()
|
||||||
|
|
||||||
FST_TEST_BEGIN(originate_test_early_state_handler)
|
FST_TEST_BEGIN(originate_test_early_state_handler)
|
||||||
{
|
{
|
||||||
switch_core_session_t *session = NULL;
|
switch_core_session_t *session = NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user