]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
presence.... again....
authorAnthony Minessale <anthm@freeswitch.org>
Mon, 3 Jan 2011 22:40:49 +0000 (16:40 -0600)
committerAnthony Minessale <anthm@freeswitch.org>
Mon, 3 Jan 2011 22:40:49 +0000 (16:40 -0600)
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia_reg.c

index 5fd6cd79632d3adc453c4439e812ce7760698de8..8c6b1e08300f5dfbf0180e25de57e044ea03bf40 100644 (file)
@@ -1035,6 +1035,7 @@ void sofia_profile_destroy(sofia_profile_t *profile);
 switch_status_t sip_dig_function(_In_opt_z_ const char *cmd, _In_opt_ switch_core_session_t *session, _In_ switch_stream_handle_t *stream);
 const char *sofia_gateway_status_name(sofia_gateway_status_t status);
 void sofia_reg_fire_custom_gateway_state_event(sofia_gateway_t *gateway, int status, const char *phrase);
+uint32_t sofia_reg_reg_count(sofia_profile_t *profile, const char *user, const char *host);
 void sofia_glue_copy_t38_options(switch_t38_options_t *t38_options, switch_core_session_t *session);
 switch_t38_options_t *sofia_glue_extract_t38_options(switch_core_session_t *session, const char *r_sdp);
 char *sofia_glue_get_multipart(switch_core_session_t *session, const char *prefix, const char *sdp, char **mp_type);
index 961eaa3ea006177af3a82903345e6e56c772250e..1589eeb8e1339a0c006609c3a67689a959b72dbf 100644 (file)
@@ -817,6 +817,19 @@ void sofia_reg_auth_challenge(nua_t *nua, sofia_profile_t *profile, nua_handle_t
        switch_safe_free(auth_str);
 }
 
+uint32_t sofia_reg_reg_count(sofia_profile_t *profile, const char *user, const char *host)
+{
+       char buf[32] = "";
+       char *sql;
+       
+       sql = switch_mprintf("select count(*) from sip_registrations where profile_name='%q' and "
+                                                "sip_user='%q' and (sip_host='%q' or presence_hosts like '%%%q%%')", profile->name, user, host, host);
+       
+       sofia_glue_execute_sql2str(profile, profile->ireg_mutex, sql, buf, sizeof(buf));
+       switch_safe_free(sql);
+       return atoi(buf);                                                                                                       
+}
+
 uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_handle_t *nh, sip_t const *sip, sofia_regtype_t regtype, char *key,
                                                                  uint32_t keylen, switch_event_t **v_event, const char *is_nat)
 {
@@ -1298,6 +1311,12 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand
                        sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
                }
 
+               if (sofia_reg_reg_count(profile, to_user, reg_host) == 1) {
+                       sql = switch_mprintf("delete from sip_presence where sip_user='%q' and sip_host='%q' and profile_name='%q' and open_closed='closed'", 
+                                                                to_user, reg_host, profile->name);
+                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "DELETE PRESENCE SQL: %s\n", sql);
+                       sofia_glue_execute_sql_now(profile, &sql, SWITCH_TRUE);
+               }
 
                switch_mutex_unlock(profile->ireg_mutex);
 
@@ -1361,8 +1380,16 @@ uint8_t sofia_reg_handle_register(nua_t *nua, sofia_profile_t *profile, nua_hand
 
 
        } else {
+               int send = 1;
 
-               if (switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == SWITCH_STATUS_SUCCESS) {
+               if (multi_reg) {
+                       if (sofia_reg_reg_count(profile, to_user, sub_host) > 0) {
+                               send = 0;
+                       }
+               }
+
+               
+               if (send && switch_event_create(&event, SWITCH_EVENT_PRESENCE_IN) == 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, "rpid", rpid);
                        switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "login", profile->url);