diff --git a/src/include/switch_channel.h b/src/include/switch_channel.h index a983121ba3..cffab0245f 100644 --- a/src/include/switch_channel.h +++ b/src/include/switch_channel.h @@ -162,8 +162,9 @@ SWITCH_DECLARE(switch_status_t) switch_channel_init(switch_channel_t *channel, s \param status the status message \param id presence id */ -SWITCH_DECLARE(void) switch_channel_presence(switch_channel_t *channel, const char *rpid, const char *status, const char *id); - +SWITCH_DECLARE(void) switch_channel_perform_presence(switch_channel_t *channel, const char *rpid, const char *status, const char *id, + const char *file, const char *func, int line); +#define switch_channel_presence(_a, _b, _c, _d) switch_channel_perform_presence(_a, _b, _c, _d, __FILE__, __SWITCH_FUNC__, __LINE__) /*! \brief Uninitalize a channel \param channel the channel to uninit diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index aa8516b016..fb206cf030 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -3857,8 +3857,28 @@ static switch_call_cause_t sofia_outgoing_channel(switch_core_session_t *session } #endif - caller_profile = switch_caller_profile_clone(nsession, outbound_profile); + if (profile->pres_type) { + char *sql; + const char *presence_id = switch_channel_get_variable(nchannel, "presence_id"); + const char *presence_data = switch_channel_get_variable(nchannel, "presence_data"); + if (zstr(presence_id)) { + presence_id = switch_event_get_header(var_event, "presence_id"); + } + + if (zstr(presence_data)) { + presence_data = switch_event_get_header(var_event, "presence_data"); + } + + sql = switch_mprintf("insert into sip_dialogs (uuid,presence_id,presence_data,profile_name,hostname) " + "values ('%q', '%q', '%q', '%q', '%q')", switch_core_session_get_uuid(nsession), + switch_str_nil(presence_id), switch_str_nil(presence_data), profile->name, mod_sofia_globals.hostname); + sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex); + switch_safe_free(sql); + } + + caller_profile = switch_caller_profile_clone(nsession, outbound_profile); + caller_profile->destination_number = switch_sanitize_number(caller_profile->destination_number); not_const = (char *) caller_profile->caller_id_name; diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 22f8fc23ad..a2291b4698 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -3859,7 +3859,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status switch_channel_t *a_channel; const char *sip_redirect_profile, *sip_redirect_context, *sip_redirect_dialplan, *sip_redirect_fork; - + if ((a_session = switch_core_session_locate(br)) && (a_channel = switch_core_session_get_channel(a_session))) { switch_stream_handle_t stream = { 0 }; char separator[2] = "|"; @@ -4090,7 +4090,7 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status if (profile->pres_type) { const char *presence_data = switch_channel_get_variable(channel, "presence_data"); - const char *presence_id = switch_channel_get_variable(channel, "presence_id"); + //const char *presence_id = switch_channel_get_variable(channel, "presence_id"); char *full_contact = ""; char *p = NULL; @@ -4101,18 +4101,26 @@ static void sofia_handle_sip_r_invite(switch_core_session_t *session, int status if (call_info && (p = strchr(call_info, ';'))) { p++; } - sql = switch_mprintf("insert into sip_dialogs " - "(call_id,uuid,sip_to_user,sip_to_host,sip_from_user,sip_from_host,contact_user," - "contact_host,state,direction,user_agent,profile_name,hostname,contact,presence_id,presence_data,call_info) " - "values('%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q')", - call_id, - switch_core_session_get_uuid(session), - to_user, to_host, from_user, from_host, contact_user, - contact_host, astate, "outbound", user_agent, - profile->name, mod_sofia_globals.hostname, switch_str_nil(full_contact), - switch_str_nil(presence_id), switch_str_nil(presence_data), switch_str_nil(p)); - switch_assert(sql); + sql = switch_mprintf("update sip_dialogs set " + "call_id='%q', " + "sip_to_user='%q', " + "sip_to_host='%q', " + "sip_from_user='%q', " + "sip_from_host='%q', " + "contact_user='%q', " + "contact_host='%q', " + "state='%q', " + "user_agent='%q', " + "contact='%q', " + "presence_data='%q', " + "call_info='%q' where uuid='%q'", + + call_id, + to_user, to_host, from_user, from_host, contact_user, + contact_host, astate, user_agent, + switch_str_nil(full_contact), + switch_str_nil(presence_data), switch_str_nil(p), switch_core_session_get_uuid(session)); sofia_glue_actually_execute_sql(profile, sql, profile->ireg_mutex); switch_safe_free(sql); diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index daacf9efa6..87294c1e62 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -583,6 +583,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) if (!mod_sofia_globals.profile_hash) goto done; + switch_mutex_lock(mod_sofia_globals.hash_mutex); for (hi = switch_hash_first(NULL, mod_sofia_globals.profile_hash); hi; hi = switch_hash_next(hi)) { switch_hash_this(hi, &var, NULL, &val); @@ -602,10 +603,10 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) continue; } + if (call_info) { const char *uuid = switch_event_get_header(event, "unique-id"); - #if 0 if (mod_sofia_globals.debug_sla > 1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "SLA EVENT:\n"); @@ -635,9 +636,24 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) } sync_sla(profile, euser, host, SWITCH_TRUE, SWITCH_TRUE); + } else { + char count_buf[128] = ""; + int count = 0; + const char *state = switch_event_get_header(event, "channel-state"); + + sql = switch_mprintf("select count(*) from sip_dialogs " + "where hostname='%q' and presence_id='%q@%q'", mod_sofia_globals.hostname, euser, host); + sofia_glue_execute_sql2str(profile, profile->ireg_mutex, sql, count_buf, sizeof(count_buf)); + + count = atoi(count_buf); + + switch_safe_free(sql); + + if (count > 1 || (count > 0 && switch_stristr("hangup", state))) { + continue; + } } - - + if ((sql = switch_mprintf("select sip_subscriptions.proto,sip_subscriptions.sip_user,sip_subscriptions.sip_host," "sip_subscriptions.sub_to_user,sip_subscriptions.sub_to_host,sip_subscriptions.event," "sip_subscriptions.contact,sip_subscriptions.call_id,sip_subscriptions.full_from," diff --git a/src/switch_channel.c b/src/switch_channel.c index 36a4989a0a..df7601199e 100644 --- a/src/switch_channel.c +++ b/src/switch_channel.c @@ -552,7 +552,8 @@ SWITCH_DECLARE(switch_status_t) switch_channel_init(switch_channel_t *channel, s return SWITCH_STATUS_SUCCESS; } -SWITCH_DECLARE(void) switch_channel_presence(switch_channel_t *channel, const char *rpid, const char *status, const char *id) +SWITCH_DECLARE(void) switch_channel_perform_presence(switch_channel_t *channel, const char *rpid, const char *status, const char *id, + const char *file, const char *func, int line) { switch_event_t *event; switch_event_types_t type = SWITCH_EVENT_PRESENCE_IN; @@ -611,8 +612,11 @@ SWITCH_DECLARE(void) switch_channel_presence(switch_channel_t *channel, const ch switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "presence-call-direction", channel->direction == SWITCH_CALL_DIRECTION_OUTBOUND ? "outbound" : "inbound"); - + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "event_count", "%d", channel->event_count++); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Presence-Calling-File", file); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "Presence-Calling-Function", func); + switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Presence-Calling-Line", "%d", line); switch_event_fire(&event); } }