sofia_clear_flag(tech_pvt, TFLAG_IO);
if (tech_pvt->sofia_private) {
- *tech_pvt->sofia_private->uuid = '\0';
+ /* set to NULL so that switch_core_session_locate no longer succeeds, but don't lose the UUID in uuid_str so we
+ * can fire events with session UUID */
+ tech_pvt->sofia_private->uuid = NULL;
}
switch_mutex_unlock(tech_pvt->sofia_mutex);
switch_goto_status(SWITCH_STATUS_TERM, err);
}
+ if (switch_event_reserve_subclass(MY_EVENT_BYE_RESPONSE) != SWITCH_STATUS_SUCCESS) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Couldn't register subclass %s!\n", MY_EVENT_BYE_RESPONSE);
+ switch_goto_status(SWITCH_STATUS_TERM, err);
+ }
+
switch_find_local_ip(mod_sofia_globals.guess_ip, sizeof(mod_sofia_globals.guess_ip), &mod_sofia_globals.guess_mask, AF_INET);
in.s_addr = mod_sofia_globals.guess_mask;
switch_set_string(mod_sofia_globals.guess_mask_str, inet_ntoa(in));
}
+/*
+ * This will fire an event containing X-headers from the BYE response
+ */
+void sofia_handle_sip_r_bye(switch_core_session_t *session, int status,
+ char const *phrase,
+ nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip,
+ sofia_dispatch_event_t *de, tagi_t tags[])
+{
+ if (profile && sofia_test_pflag(profile, PFLAG_FIRE_BYE_RESPONSE_EVENTS) && sip && sip->sip_call_id && !zstr(sip->sip_call_id->i_id) && sofia_private && !zstr_buf(sofia_private->uuid_str)) {
+ switch_event_t *bye_response_event = NULL;
+ sip_unknown_t *un;
+ if (switch_event_create_subclass(&bye_response_event, SWITCH_EVENT_CUSTOM, MY_EVENT_BYE_RESPONSE) == SWITCH_STATUS_SUCCESS) {
+ switch_event_add_header(bye_response_event, SWITCH_STACK_BOTTOM, "call-id", "%s", sip->sip_call_id->i_id);
+ switch_event_add_header(bye_response_event, SWITCH_STACK_BOTTOM, "Unique-ID", "%s", sofia_private->uuid_str);
+ for (un = sip->sip_unknown; un; un = un->un_next) {
+ if (!zstr(un->un_value)) {
+ switch_event_add_header(bye_response_event, SWITCH_STACK_BOTTOM, un->un_name, "%s", un->un_value);
+ }
+ }
+ switch_event_fire(&bye_response_event);
+ }
+ }
+}
+
void sofia_handle_sip_i_bye(switch_core_session_t *session, int status,
char const *phrase,
nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sofia_private_t *sofia_private, sip_t const *sip,
if (sofia_private && sofia_private != &mod_sofia_globals.destroy_private && sofia_private != &mod_sofia_globals.keep_private) {
-
if (!zstr(sofia_private->gateway_name)) {
if (!(gateway = sofia_reg_find_gateway(sofia_private->gateway_name))) {
return;
case nua_i_fork:
case nua_r_info:
break;
- case nua_r_bye:
case nua_r_unregister:
case nua_r_unsubscribe:
case nua_i_terminated:
case nua_i_bye:
sofia_handle_sip_i_bye(session, status, phrase, nua, profile, nh, sofia_private, sip, de, tags);
break;
+ case nua_r_bye:
+ sofia_handle_sip_r_bye(session, status, phrase, nua, profile, nh, sofia_private, sip, de, tags);
+ break;
case nua_r_notify:
if (session) {
sofia_handle_sip_r_notify(session, status, phrase, nua, profile, nh, sofia_private, sip, de, tags);
if (uuid) {
if ((session = switch_core_session_locate(uuid))) {
tech_pvt = switch_core_session_get_private(session);
- switch_copy_string(sofia_private->uuid, switch_core_session_get_uuid(session), sizeof(sofia_private->uuid));
+ switch_copy_string(sofia_private->uuid_str, switch_core_session_get_uuid(session), sizeof(sofia_private->uuid_str));
+ sofia_private->uuid = sofia_private->uuid_str;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Re-attaching to session %s\n", sofia_private->uuid);
de->init_session = session;
sofia_clear_flag(tech_pvt, TFLAG_BYE);
goto end;
}
- switch_copy_string(sofia_private->uuid, switch_core_session_get_uuid(session), sizeof(sofia_private->uuid));
+ switch_copy_string(sofia_private->uuid_str, switch_core_session_get_uuid(session), sizeof(sofia_private->uuid_str));
+ sofia_private->uuid = sofia_private->uuid_str;
de->init_session = session;
switch_core_session_queue_signal_data(session, de);
} else {
sofia_clear_pflag(profile, PFLAG_ENABLE_CHAT);
}
+ } else if (!strcasecmp(var, "fire-bye-response-events")) {
+ if (switch_true(val)) {
+ sofia_set_pflag(profile, PFLAG_FIRE_BYE_RESPONSE_EVENTS);
+ } else {
+ sofia_clear_pflag(profile, PFLAG_FIRE_BYE_RESPONSE_EVENTS);
+ }
} else if (!strcasecmp(var, "fire-message-events")) {
if (switch_true(val)) {
sofia_set_pflag(profile, PFLAG_FIRE_MESSAGE_EVENTS);
ss_state = nua_callstate_terminated;
}
-
if (ss_state == nua_callstate_terminated) {
if (tech_pvt->sofia_private) {
tech_pvt->sofia_private = NULL;