]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
skypopen: manage ERROR 36 Not online, cosmetics, put the interface DOWN when no sessi...
authorGiovanni Maruzzelli <gmaruzz@gmail.com>
Wed, 27 Oct 2010 13:20:03 +0000 (08:20 -0500)
committerGiovanni Maruzzelli <gmaruzz@gmail.com>
Wed, 27 Oct 2010 14:44:52 +0000 (09:44 -0500)
src/mod/endpoints/mod_skypopen/mod_skypopen.c
src/mod/endpoints/mod_skypopen/skypopen_protocol.c

index 1b976d91daa56e5394f8cf40455f6b24ad43ea48..03acda67448251443e4a33b38044c2c9c001f32c 100644 (file)
@@ -471,6 +471,7 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
        if (tech_pvt) {
                DEBUGA_SKYPE("%s CHANNEL DESTROY %s\n", SKYPOPEN_P_LOG, tech_pvt->name, switch_core_session_get_uuid(session));
 
+               tech_pvt->interface_state = SKYPOPEN_STATE_DOWN;
 
                switch_mutex_lock(tech_pvt->flag_mutex);
 #if 1
@@ -510,8 +511,8 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
                while(tech_pvt->tcp_srv_thread){
                        switch_sleep(5000);
                        conta++;
-                       if(conta==100){
-                               ERRORA("tcp_srv_thread is NOT dead\n", SKYPOPEN_P_LOG);
+                       if(conta==200){
+                               ERRORA("tcp_srv_thread is NOT dead, this can LEAK MEMORY\n", SKYPOPEN_P_LOG);
                                break;
                        }
                }
@@ -520,8 +521,8 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
                while(tech_pvt->tcp_cli_thread){
                        switch_sleep(5000);
                        conta++;
-                       if(conta==100){
-                               ERRORA("tcp_cli_thread is NOT dead\n", SKYPOPEN_P_LOG);
+                       if(conta==200){
+                               ERRORA("tcp_cli_thread is NOT dead, this can LEAK MEMORY\n", SKYPOPEN_P_LOG);
                                break;
                        }
                }
@@ -1450,13 +1451,14 @@ static void *SWITCH_THREAD_FUNC skypopen_signaling_thread_func(switch_thread_t *
                                } else {
                                        DEBUGA_SKYPE("no session\n", SKYPOPEN_P_LOG);
 
+                                       tech_pvt->interface_state = SKYPOPEN_STATE_DOWN;
                                        DEBUGA_SKYPE("audio tcp threads to DIE\n", SKYPOPEN_P_LOG);
                                        conta=0;
                                        while(tech_pvt->tcp_srv_thread){
                                                switch_sleep(5000);
                                                conta++;
-                                               if(conta==100){
-                                                       ERRORA("tcp_srv_thread is NOT dead\n", SKYPOPEN_P_LOG);
+                                               if(conta==200){
+                                                       ERRORA("tcp_srv_thread is NOT dead, this can LEAK MEMORY\n", SKYPOPEN_P_LOG);
                                                        break;
                                                }
                                        }
@@ -1465,8 +1467,8 @@ static void *SWITCH_THREAD_FUNC skypopen_signaling_thread_func(switch_thread_t *
                                        while(tech_pvt->tcp_cli_thread){
                                                switch_sleep(5000);
                                                conta++;
-                                               if(conta==100){
-                                                       ERRORA("tcp_cli_thread is NOT dead\n", SKYPOPEN_P_LOG);
+                                               if(conta==200){
+                                                       ERRORA("tcp_cli_thread is NOT dead, this can LEAK MEMORY\n", SKYPOPEN_P_LOG);
                                                        break;
                                                }
                                        }
@@ -2312,13 +2314,13 @@ int remote_party_is_ringing(private_t *tech_pvt)
                session = switch_core_session_locate(tech_pvt->session_uuid_str);
        } else {
                ERRORA("No session_uuid_str???\n", SKYPOPEN_P_LOG);
-               goto bad;
+               return SWITCH_STATUS_FALSE;
        }
        if (session) {
                channel = switch_core_session_get_channel(session);
        } else {
                ERRORA("No session???\n", SKYPOPEN_P_LOG);
-               goto bad;
+               return SWITCH_STATUS_FALSE;
        }
        if (channel) {
                switch_channel_mark_ring_ready(channel);
@@ -2329,9 +2331,7 @@ int remote_party_is_ringing(private_t *tech_pvt)
 
        switch_core_session_rwunlock(session);
 
-       return 1;
-  bad:
-       return 0;
+       return SWITCH_STATUS_SUCCESS;
 }
 
 int remote_party_is_early_media(private_t *tech_pvt)
index dfe74ad753530303d880b63781b30f184253bb4f..62e77dca2d520e62196086599203cf1daa23ea54 100644 (file)
@@ -235,9 +235,22 @@ int skypopen_signaling_read(private_t *tech_pvt)
                                                DEBUGA_SKYPE("Skype got ERROR about a failed action (probably TRYING to HANGUP A CALL), no problem: |||%s|||\n", SKYPOPEN_P_LOG,
                                                                         message);
                                        }
+                               } else if (!strncasecmp(message, "ERROR 36 Not online", 18)) {
+                                       char msg_to_skype[256];
+                                       ERRORA("Skype client is not online, eg: not connected to Skype network, probably got a temporary net outage: |||%s|||\n", SKYPOPEN_P_LOG, message);
+                                       if(strlen(tech_pvt->skype_call_id)){
+                                       sprintf(msg_to_skype, "ALTER CALL %s HANGUP", tech_pvt->skype_call_id);
+                                       skypopen_signaling_write(tech_pvt, msg_to_skype);
+                                       }
+                                       if(strlen(tech_pvt->ring_id)){
+                                       sprintf(msg_to_skype, "ALTER CALL %s END HANGUP", tech_pvt->ring_id);
+                                       skypopen_signaling_write(tech_pvt, msg_to_skype);
+                                       }
+                                       tech_pvt->interface_state = SKYPOPEN_STATE_DOWN;
+                                       return CALLFLOW_INCOMING_HANGUP;
                                } else if (!strncasecmp(message, "ERROR 589 ALTER CALL", 19)) {
                                        char msg_to_skype[256];
-                                       ERRORA("Skype client was not able to correctly manage tcp audio sockets: |||%s|||\n", SKYPOPEN_P_LOG, message);
+                                       ERRORA("Skype client was not able to correctly manage tcp audio sockets, probably got a local or remote hangup: |||%s|||\n", SKYPOPEN_P_LOG, message);
                                        if(strlen(tech_pvt->skype_call_id)){
                                        sprintf(msg_to_skype, "ALTER CALL %s HANGUP", tech_pvt->skype_call_id);
                                        skypopen_signaling_write(tech_pvt, msg_to_skype);
@@ -605,9 +618,8 @@ int skypopen_signaling_read(private_t *tech_pvt)
                                                                tech_pvt->interface_state = SKYPOPEN_STATE_RINGING;
                                                                skypopen_strncpy(tech_pvt->skype_call_id, id, sizeof(tech_pvt->skype_call_id) - 1);
                                                                DEBUGA_SKYPE("Our remote party in skype_call %s is RINGING\n", SKYPOPEN_P_LOG, id);
-                                                               if (!remote_party_is_ringing(tech_pvt)) {
-
-                                                                       WARNINGA("We are getting the RINGING from a call we canceled, trying to get out hanging up call id: %s.\n",
+                                                               if (remote_party_is_ringing(tech_pvt) != SWITCH_STATUS_SUCCESS) {
+                                                                       WARNINGA("We are getting the RINGING from a call we probably canceled, trying to get out hanging up call id: %s.\n",
                                                                                         SKYPOPEN_P_LOG, id);
                                                                        sprintf(msg_to_skype, "ALTER CALL %s END HANGUP", id);
                                                                        skypopen_signaling_write(tech_pvt, msg_to_skype);
@@ -757,7 +769,7 @@ int skypopen_signaling_read(private_t *tech_pvt)
 
                                        } else if (!strcasecmp(value, "LOCALHOLD")) {
                                                char msg_to_skype[256];
-                                               WARNINGA("skype_call: %s is now LOCALHOLD\n", SKYPOPEN_P_LOG, id);
+                                               WARNINGA("skype_call: %s is now LOCALHOLD, let's hangup\n", SKYPOPEN_P_LOG, id);
                                                sprintf(msg_to_skype, "ALTER CALL %s HANGUP", id);
                                                skypopen_signaling_write(tech_pvt, msg_to_skype);
                                        } else if (!strcasecmp(value, "REMOTEHOLD")) {
@@ -1972,11 +1984,11 @@ int skypopen_answered(private_t *tech_pvt)
                }
                switch_core_session_rwunlock(session);
        } else {
-               ERRORA("no session\n", SKYPOPEN_P_LOG);
+               ERRORA("no session after INPROGRESS, let's hangup\n", SKYPOPEN_P_LOG);
                return SWITCH_STATUS_FALSE;
        }
        } else {
-               ERRORA("no tech_pvt->session_uuid_str\n", SKYPOPEN_P_LOG);
+               ERRORA("no tech_pvt->session_uuid_str after INPROGRESS, let's hangup\n", SKYPOPEN_P_LOG);
                return SWITCH_STATUS_FALSE;
        }
        return res;