diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 456a7ff131..1a8dcf26dd 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -285,6 +285,7 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) char *pname = NULL; const char *call_id; const char *sub_call_id; + int for_everyone = 0; switch_assert(event != NULL); @@ -301,6 +302,11 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) call_id = switch_event_get_header(event, "call-id"); sub_call_id = switch_event_get_header(event, "sub-call-id"); + if (!call_id && !sub_call_id) { + for_everyone = 1; + } + + dup_account = strdup(account); switch_assert(dup_account != NULL); sofia_glue_get_user_host(dup_account, &user, &host); @@ -346,34 +352,45 @@ static void actual_sofia_presence_mwi_event_handler(switch_event_t *event) sql = NULL; - 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) { + if (for_everyone) { 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); + } else 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); } + if (sql) { sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback, &h); - switch_safe_free(sql); + free(sql); + sql = NULL; + + } + if (for_everyone) { + 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); } 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); } + if (sql) { + switch_assert(sql != NULL); + sofia_glue_execute_sql_callback(profile, SWITCH_FALSE, profile->ireg_mutex, sql, sofia_presence_mwi_callback2, &h); + free(sql); + sql = NULL; + } - switch_safe_free(sql); switch_safe_free(stream.data); switch_safe_free(dup_account);