From 1a598b6db38371264158e55e9c9f3c1094b1a636 Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Tue, 25 Nov 2008 20:54:58 +0000 Subject: [PATCH] update git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@10537 d0543943-73ff-0310-b7d9-9358b9ac24b2 --- src/mod/endpoints/mod_sofia/sofia_presence.c | 56 ++++++++------------ src/mod/endpoints/mod_sofia/sofia_reg.c | 3 ++ 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/src/mod/endpoints/mod_sofia/sofia_presence.c b/src/mod/endpoints/mod_sofia/sofia_presence.c index 5a206f7368..45b053608f 100644 --- a/src/mod/endpoints/mod_sofia/sofia_presence.c +++ b/src/mod/endpoints/mod_sofia/sofia_presence.c @@ -337,32 +337,14 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) status = NULL; } - if (status && switch_stristr("CS_", status)) { - status = NULL; + if (status && switch_stristr("CS_HANGUP", status)) { + status = "Call Ended"; } if (rpid) { rpid = sofia_presence_translate_rpid(rpid, status); } - - if (!status) { - status = "Available"; - - if (rpid) { - if (!strcasecmp(rpid, "busy")) { - status = "Busy"; - } else if (!strcasecmp(rpid, "unavailable")) { - status = "Idle"; - } else if (!strcasecmp(rpid, "away")) { - status = "Idle"; - } - } - } - - if (!rpid) { - rpid = "unknown"; - } - + if (event->event_id == SWITCH_EVENT_ROSTER) { struct presence_helper helper = { 0 }; @@ -380,7 +362,8 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) "from sip_subscriptions left join sip_presence on " "(sip_subscriptions.sub_to_user=sip_presence.sip_user and sip_subscriptions.sub_to_host=sip_presence.sip_host and " "sip_subscriptions.profile_name=sip_presence.profile_name) " - "where sip_subscriptions.event='presence' and sip_subscriptions.full_from like '%%%q%%'", status, rpid, from); + "where sip_subscriptions.event='presence' and sip_subscriptions.full_from like '%%%q%%'", + switch_str_nil(status), switch_str_nil(rpid), from); } else { sql = switch_mprintf( "select sip_subscriptions.proto,sip_subscriptions.sip_user,sip_subscriptions.sip_host," @@ -392,7 +375,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) "from sip_subscriptions left join sip_presence on " "(sip_subscriptions.sub_to_user=sip_presence.sip_user and sip_subscriptions.sub_to_host=sip_presence.sip_host and " "sip_subscriptions.profile_name=sip_presence.profile_name) " - "where sip_subscriptions.event='presence'", status, rpid); + "where sip_subscriptions.event='presence'", switch_str_nil(status), switch_str_nil(rpid)); } switch_assert(sql != NULL); @@ -497,7 +480,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) "sip_subscriptions.profile_name=sip_presence.profile_name) " "where (event='%q' or event='%q') and sub_to_user='%q' " "and (sub_to_host='%q' or presence_hosts like '%%%q%%')", - status, rpid, host, event_type, alt_event_type, euser, host, host); + switch_str_nil(status), switch_str_nil(rpid), host, event_type, alt_event_type, euser, host, host); break; case SWITCH_EVENT_PRESENCE_OUT: sql = switch_mprintf( @@ -513,7 +496,7 @@ static void actual_sofia_presence_event_handler(switch_event_t *event) "sip_subscriptions.profile_name=sip_presence.profile_name) " "where (event='%q' or event='%q') and sub_to_user='%q' " "and (sub_to_host='%q' or presence_hosts like '%%%q%%')", - status, rpid, host, event_type, alt_event_type, euser, host, host); + switch_str_nil(status), switch_str_nil(rpid), host, event_type, alt_event_type, euser, host, host); break; default: break; @@ -705,7 +688,6 @@ static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, ch char *user = argv[1]; char *host = argv[2]; switch_event_t *event; - char *status = NULL; char *event_name = argv[5]; if (!strcasecmp(event_name, "message-summary")) { @@ -717,14 +699,10 @@ static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, ch return 0; } - if (switch_strlen_zero(status)) { - status = "Available"; - } if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_PROBE) == SWITCH_STATUS_SUCCESS) { switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto", SOFIA_CHAT_PROTO); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url); switch_event_add_header(event, SWITCH_STACK_BOTTOM, "from", "%s@%s", user, host); - switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "status", status); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_type", "presence"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "event_subtype", "probe"); switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "proto-specific-event-name", event_name); @@ -920,11 +898,21 @@ static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char * rpid = argv[19]; } - if (switch_strlen_zero(status)) { - status = "Available"; + if (switch_strlen_zero(rpid)) { + rpid = "unknown"; } - + if (switch_strlen_zero(status)) { + if (!strcasecmp(rpid, "busy")) { + status = "Busy"; + } else if (!strcasecmp(rpid, "unavailable")) { + status = "Idle"; + } else if (!strcasecmp(rpid, "away")) { + status = "Idle"; + } else { + status = "Available"; + } + } if (profile_name && strcasecmp(profile_name, helper->profile->name)) { if ((ext_profile = sofia_glue_find_profile(profile_name))) { @@ -1747,7 +1735,6 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n from_user, from_host, profile->name, mod_sofia_globals.hostname ))) { sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); - switch_safe_free(sql); } if ((sql = @@ -1755,7 +1742,6 @@ void sofia_presence_handle_sip_i_publish(nua_t *nua, sofia_profile_t *profile, n "values ('%q','%q','%q','%q',%ld,'%q','%q','%q')", from_user, from_host, note_txt, rpid, exp, full_agent, profile->name, mod_sofia_globals.hostname))) { sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); - switch_safe_free(sql); } event_type = sip_header_as_string(profile->home, (void *) sip->sip_event); diff --git a/src/mod/endpoints/mod_sofia/sofia_reg.c b/src/mod/endpoints/mod_sofia/sofia_reg.c index 4d7a770954..0329141677 100644 --- a/src/mod/endpoints/mod_sofia/sofia_reg.c +++ b/src/mod/endpoints/mod_sofia/sofia_reg.c @@ -943,6 +943,8 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand if (sql) { sofia_glue_execute_sql(profile, &sql, SWITCH_TRUE); } + + switch_mutex_unlock(profile->ireg_mutex); if (switch_event_create_subclass(&s_event, SWITCH_EVENT_CUSTOM, MY_EVENT_REGISTER) == SWITCH_STATUS_SUCCESS) { @@ -953,6 +955,7 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "contact", contact_str); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "call-id", call_id); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "rpid", rpid); + switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "statusd", reg_desc); switch_event_add_header(s_event, SWITCH_STACK_BOTTOM, "expires", "%ld", (long) exptime); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-user", from_user); switch_event_add_header_string(s_event, SWITCH_STACK_BOTTOM, "to-host", from_host);