]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Thu, 13 Dec 2007 23:30:16 +0000 (23:30 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Thu, 13 Dec 2007 23:30:16 +0000 (23:30 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@6773 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/sofia_glue.c
src/mod/endpoints/mod_sofia/sofia_presence.c

index 4352967ccfc87f8945b720a07b2c76a7524fa20a..0ab91f4ea58fdc7fc68909f0c05158528b523e42 100644 (file)
@@ -1736,7 +1736,7 @@ int sofia_glue_init_sql(sofia_profile_t *profile)
                        switch_odbc_handle_exec(profile->master_odbc, reg_sql, NULL);
                }
 
-               if (switch_odbc_handle_exec(profile->master_odbc, "delete from sip_subscriptions where sip_user != ''", NULL) != SWITCH_ODBC_SUCCESS) {
+               if (switch_odbc_handle_exec(profile->master_odbc, "select * from sip_subscriptions where sip_user == ''", NULL) != SWITCH_ODBC_SUCCESS) {
                        switch_odbc_handle_exec(profile->master_odbc, "DROP TABLE sip_subscriptions", NULL);
                        switch_odbc_handle_exec(profile->master_odbc, sub_sql, NULL);
                }
@@ -1754,7 +1754,7 @@ int sofia_glue_init_sql(sofia_profile_t *profile)
                }
 
                switch_core_db_test_reactive(profile->master_db, "select sip_user from sip_registrations", "DROP TABLE sip_registrations", reg_sql);
-               switch_core_db_test_reactive(profile->master_db, "delete from sip_subscriptions where sip_user != ''", "DROP TABLE sip_subscriptions", sub_sql);
+               switch_core_db_test_reactive(profile->master_db, "select * from sip_subscriptions where sip_user == ''", "DROP TABLE sip_subscriptions", sub_sql);
                switch_core_db_test_reactive(profile->master_db, "select * from sip_authentication", "DROP TABLE sip_authentication", auth_sql);
 
        }
index 2259ff80b85e90be75bc82a4e4dbfad5d22164e8..26a61bbe05d7011929295c21b955aec9fcfb3990 100644 (file)
@@ -35,6 +35,7 @@
 #include "mod_sofia.h"
 
 static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char **columnNames);
+static int sofia_presence_mwi_callback2(void *pArg, int argc, char **argv, char **columnNames);
 static int sofia_presence_sub_reg_callback(void *pArg, int argc, char **argv, char **columnNames);
 static int sofia_presence_resub_callback(void *pArg, int argc, char **argv, char **columnNames);
 static int sofia_presence_sub_callback(void *pArg, int argc, char **argv, char **columnNames);
@@ -182,7 +183,8 @@ void sofia_presence_mwi_event_handler(switch_event_t *event)
        sofia_profile_t *profile = NULL;
        switch_stream_handle_t stream = { 0 };
        switch_event_header_t *hp;
-
+       int count = 0;
+       
        switch_assert(event != NULL);
 
        if (!(account = switch_event_get_header(event, "mwi-message-account"))) {
@@ -224,7 +226,7 @@ void sofia_presence_mwi_event_handler(switch_event_t *event)
        sql = switch_mprintf("select *,'%q' from sip_subscriptions where event='message-summary' and sub_to_user='%q' and sub_to_host='%q'", 
                                                 stream.data, user, host);
        
-       switch_safe_free(stream.data);
+
 
        switch_assert (sql != NULL);
        sofia_glue_execute_sql_callback(profile,
@@ -232,9 +234,31 @@ void sofia_presence_mwi_event_handler(switch_event_t *event)
                                                                        profile->ireg_mutex,
                                                                        sql,
                                                                        sofia_presence_mwi_callback,
-                                                                       profile);
+                                                                       &count);
 
        switch_safe_free(sql);
+
+       
+       if (!count) {
+               sql = switch_mprintf("select *,'%q' from sip_registrations where sip_user='%q' and sip_host='%q'", 
+                                                        stream.data, user, host);
+       
+
+               
+               switch_assert (sql != NULL);
+               sofia_glue_execute_sql_callback(profile,
+                                                                               SWITCH_FALSE,
+                                                                               profile->ireg_mutex,
+                                                                               sql,
+                                                                               sofia_presence_mwi_callback2,
+                                                                               profile);
+               
+               switch_safe_free(sql);
+       }
+
+
+       switch_safe_free(stream.data);
+
        switch_safe_free(dup_account);
        if (profile) {
                sofia_glue_release_profile(profile);
@@ -622,6 +646,7 @@ static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char *
        char *id = NULL;
        nua_handle_t *nh;
        int expire_sec = atoi(expires);
+       int *total = (int *) pArg;
 
        if (!(profile = sofia_glue_find_profile(sub_to_host))) {
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find profile for host %s\n", sub_to_host);
@@ -643,10 +668,46 @@ static int sofia_presence_mwi_callback(void *pArg, int argc, char **argv, char *
        nua_notify(nh,
                           SIPTAG_SUBSCRIPTION_STATE_STR(exp),
                           SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR("application/simple-message-summary"), SIPTAG_PAYLOAD_STR(body), TAG_END());
-
+       
        switch_safe_free(id);
        switch_safe_free(exp);
 
+       sofia_glue_release_profile(profile);
+       *total++;
+       return 0;
+}
+
+
+
+
+static int sofia_presence_mwi_callback2(void *pArg, int argc, char **argv, char **columnNames)
+{
+       char *sub_to_user = argv[1];
+       char *sub_to_host = argv[2];
+       char *event = "message-summary";
+       char *body = argv[7];
+       sofia_profile_t *profile = NULL;
+       char *id = NULL;
+       nua_handle_t *nh;
+
+       if (!(profile = sofia_glue_find_profile(sub_to_host))) {
+               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Cannot find profile for host %s\n", sub_to_host);
+               return 0;
+       }
+
+       id = switch_mprintf("sip:%s@%s", sub_to_user, sub_to_host);
+       
+       nh = nua_handle(profile->nua, NULL,
+                                       SIPTAG_FROM_STR(id),
+                                       SIPTAG_TO_STR(id), SIPTAG_CONTACT_STR(profile->url), TAG_END());
+       
+       
+       nua_notify(nh,
+                          NUTAG_NEWSUB(1),
+                          SIPTAG_EVENT_STR(event), SIPTAG_CONTENT_TYPE_STR("application/simple-message-summary"), SIPTAG_PAYLOAD_STR(body), TAG_END());
+
+       switch_safe_free(id);
+
        sofia_glue_release_profile(profile);
 
        return 0;