From 99b14db491884cfe81b3fecd4da52348b4b7849f Mon Sep 17 00:00:00 2001 From: Giovanni Maruzzelli Date: Wed, 27 Oct 2010 08:20:03 -0500 Subject: [PATCH] skypopen: manage ERROR 36 Not online, cosmetics, put the interface DOWN when no session and when beginning to destroy --- src/mod/endpoints/mod_skypopen/mod_skypopen.c | 26 +++++++++---------- .../mod_skypopen/skypopen_protocol.c | 26 ++++++++++++++----- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/mod/endpoints/mod_skypopen/mod_skypopen.c b/src/mod/endpoints/mod_skypopen/mod_skypopen.c index 1b976d91da..03acda6744 100644 --- a/src/mod/endpoints/mod_skypopen/mod_skypopen.c +++ b/src/mod/endpoints/mod_skypopen/mod_skypopen.c @@ -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) diff --git a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c index dfe74ad753..62e77dca2d 100644 --- a/src/mod/endpoints/mod_skypopen/skypopen_protocol.c +++ b/src/mod/endpoints/mod_skypopen/skypopen_protocol.c @@ -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;