diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index d7041b28e6..2044188636 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -477,6 +477,8 @@ void sofia_event_callback(nua_event_t event, sofia_presence_handle_sip_i_publish(nua, profile, nh, sofia_private, sip, tags); break; case nua_i_register: + //nua_respond(nh, SIP_200_OK, SIPTAG_CONTACT(sip->sip_contact), NUTAG_WITH_THIS(nua), TAG_END()); + //nua_handle_destroy(nh); sofia_reg_handle_sip_i_register(nua, profile, nh, sofia_private, sip, tags); break; case nua_i_state: diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 645e82db2c..456a7ff131 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -283,6 +283,8 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) switch_event_header_t *hp; struct mwi_helper h = { 0 }; char *pname = NULL; + const char *call_id; + const char *sub_call_id; switch_assert(event != NULL); @@ -296,6 +298,9 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) return; } + call_id = switch_event_get_header(event, "call-id"); + sub_call_id = switch_event_get_header(event, "sub-call-id"); + dup_account = strdup(account); switch_assert(dup_account != NULL); sofia_glue_get_user_host(dup_account, &user, &host); @@ -339,30 +344,39 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) stream.write_function(&stream, "\r\n"); - sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," - "full_via,expires,user_agent,accept,profile_name" - ",'%q','%q' from sip_subscriptions where event='message-summary' " - "and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%')", - stream.data, host, user, host, host); + sql = NULL; - switch_assert(sql != NULL); - sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback, &h); - - switch_safe_free(sql); + if (sub_call_id) { + sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," + "full_via,expires,user_agent,accept,profile_name" + ",'%q','%q' from sip_subscriptions where event='message-summary' " + "and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%' and call_id='%q')", + stream.data, host, user, host, host, sub_call_id); + } else if (!call_id) { + sql = switch_mprintf("select proto,sip_user,sip_host,sub_to_user,sub_to_host,event,contact,call_id,full_from," + "full_via,expires,user_agent,accept,profile_name" + ",'%q','%q' from sip_subscriptions where event='message-summary' " + "and sub_to_user='%q' and (sub_to_host='%q' or presence_hosts like '%%%q%%')", + stream.data, host, user, host, host); + } - sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,'%q' from sip_registrations where sip_user='%q' and sip_host='%q'", - stream.data, user, host); + if (sql) { + sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback, &h); + switch_safe_free(sql); + } else if (call_id) { + sql = switch_mprintf("select sip_user,sip_host,contact,profile_name,'%q' " + "from sip_registrations where sip_user='%q' and sip_host='%q' and call_id='%q'", + stream.data, user, host, call_id); + switch_assert(sql != NULL); + sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback2, &h); + } - switch_assert(sql != NULL); - sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback2, &h); - switch_safe_free(sql); - switch_safe_free(stream.data); - switch_safe_free(dup_account); + if (profile) { sofia_glue_release_profile(profile); } @@ -791,6 +805,7 @@ static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, ch if (switch_event_create(&event, SWITCH_EVENT_MESSAGE_QUERY) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(event, SWITCH_STACK_BOTTOM, "Message-Account", "sip:%s@%s", user, host); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-Sofia-Profile", profile->name); + switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "VM-sub-call-id", argv[7]); switch_event_fire(&event); } return 0; diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 1e3fb0422d..af18fe154b 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -1137,6 +1137,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand if (switch_event_create(&s_event, SWITCH_EVENT_MESSAGE_QUERY) == SWITCH_STATUS_SUCCESS) { switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "Message-Account", "sip:%s@%s", to_user, reg_host); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "VM-Sofia-Profile", profile->name); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "VM-Call-ID", call_id); } } else { if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_UNREGISTER) == SWITCH_STATUS_SUCCESS) {