[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_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)
|
||||
{
|
||||
|
|
|
@ -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 \
|
||||
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 += $(FREESWITCH_LIBS) $(switch_builddir)/libfreeswitch.la $(CORE_LIBS) $(APR_LIBS)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
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 = {
|
||||
/*.on_init */ NULL,
|
||||
/*.on_routing */ NULL,
|
||||
|
@ -89,6 +103,8 @@ FST_CORE_BEGIN("./conf")
|
|||
{
|
||||
fst_requires_module("mod_loopback");
|
||||
application_hit = 0;
|
||||
external_id_to_match = NULL;
|
||||
got_external_id_in_event = 0;
|
||||
}
|
||||
FST_SETUP_END()
|
||||
|
||||
|
@ -97,6 +113,37 @@ FST_CORE_BEGIN("./conf")
|
|||
}
|
||||
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)
|
||||
{
|
||||
switch_core_session_t *session = NULL;
|
||||
|
|
Loading…
Reference in New Issue