From: David Woodhouse Date: Mon, 30 Apr 2018 09:22:44 +0000 (+0100) Subject: Fix error handling for audio/screen connection failure X-Git-Tag: v0.91~16 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=87791e8893e0ba873e7534901d68c80de9819bb9;p=pidgin-chime.git Fix error handling for audio/screen connection failure It turns out https://bitp.m1.ue1.app.chime.aws/ has an invalid SSL cert (issued from the company internal trust root, thus not trusted outside). This resulted in no error report but just a silent failure and black screen. Bad dwmw2. No biscuit. --- diff --git a/chime/chime-call-audio.c b/chime/chime-call-audio.c index 029dadf..ff463ab 100644 --- a/chime/chime-call-audio.c +++ b/chime/chime-call-audio.c @@ -228,7 +228,8 @@ static gboolean audio_receive_auth_msg(ChimeCallAudio *audio, gconstpointer pkt, if (msg->has_authorized && msg->authorized) { do_send_rt_packet(audio, NULL); chime_call_audio_set_state(audio, audio->silent ? CHIME_AUDIO_STATE_AUDIOLESS : - (audio->local_mute ? CHIME_AUDIO_STATE_AUDIO_MUTED : CHIME_AUDIO_STATE_AUDIO)); + (audio->local_mute ? CHIME_AUDIO_STATE_AUDIO_MUTED : CHIME_AUDIO_STATE_AUDIO), + NULL); if ((audio->silent || audio->local_mute) && !audio->send_rt_source) audio->send_rt_source = g_timeout_add(100, (GSourceFunc)timed_send_rt_packet, audio); @@ -504,7 +505,7 @@ void chime_call_audio_close(ChimeCallAudio *audio, gboolean hangup) gst_app_sink_set_callbacks(audio->audio_sink, &no_appsink_callbacks, NULL, NULL); chime_call_transport_disconnect(audio, hangup); - chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_HANGUP); + chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_HANGUP, NULL); g_hash_table_destroy(audio->profiles); g_free(audio); @@ -621,12 +622,12 @@ void chime_call_audio_local_mute(ChimeCallAudio *audio, gboolean muted) if (muted) { if (audio->state == CHIME_AUDIO_STATE_AUDIO) - chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO_MUTED); + chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO_MUTED, NULL); if (!audio->send_rt_source) audio->send_rt_source = g_timeout_add(100, (GSourceFunc)timed_send_rt_packet, audio); } else { if (audio->state == CHIME_AUDIO_STATE_AUDIO_MUTED) - chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO); + chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_AUDIO, NULL); if (audio->send_rt_source) { g_source_remove(audio->send_rt_source); audio->send_rt_source = 0; diff --git a/chime/chime-call-audio.h b/chime/chime-call-audio.h index 450e537..ddd5a8f 100644 --- a/chime/chime-call-audio.h +++ b/chime/chime-call-audio.h @@ -92,7 +92,7 @@ ChimeCallAudio *chime_call_audio_open(ChimeConnection *cxn, ChimeCall *call, gbo void chime_call_audio_close(ChimeCallAudio *audio, gboolean hangup); void chime_call_audio_reopen(ChimeCallAudio *audio, gboolean silent); gboolean chime_call_audio_get_silent(ChimeCallAudio *audio); -void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state); +void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state, const gchar *message); void chime_call_audio_local_mute(ChimeCallAudio *audio, gboolean muted); /* Called from audio code */ diff --git a/chime/chime-call-screen.c b/chime/chime-call-screen.c index a5a9b7d..d8e246c 100644 --- a/chime/chime-call-screen.c +++ b/chime/chime-call-screen.c @@ -159,7 +159,7 @@ static void on_screenws_message(SoupWebsocketConnection *ws, gint type, gst_app_sink_set_callbacks(screen->screen_sink, &no_appsink_callbacks, NULL, NULL); screen->screen_sink = NULL; - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL); } break; @@ -184,6 +184,7 @@ static void screen_ws_connect_cb(GObject *obj, GAsyncResult *res, gpointer _scre /* If it was cancelled, 'screen' may have been freed. */ if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) { chime_debug("screen ws error %s\n", error->message); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_FAILED, error->message); } g_clear_error(&error); g_object_unref(cxn); @@ -202,7 +203,7 @@ static void screen_ws_connect_cb(GObject *obj, GAsyncResult *res, gpointer _scre else if (screen->screen_sink) chime_call_screen_install_appsink(screen, screen->screen_sink); else - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL); g_object_unref(cxn); } @@ -232,7 +233,7 @@ ChimeCallScreen *chime_call_screen_open(ChimeConnection *cxn, ChimeCall *call) gchar *origin = g_strdup_printf("http://%s", soup_uri_get_host(uri)); soup_uri_free(uri); - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTING); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTING, NULL); chime_connection_websocket_connect_async(g_object_ref(cxn), msg, origin, protocols, screen->cancel, screen_ws_connect_cb, screen); @@ -249,7 +250,7 @@ static void on_final_screenws_close(SoupWebsocketConnection *ws, gpointer _unuse void chime_call_screen_close(ChimeCallScreen *screen) { - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_HANGUP); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_HANGUP, NULL); if (screen->cancel) { g_cancellable_cancel(screen->cancel); @@ -292,7 +293,7 @@ static void screen_appsrc_destroy(gpointer _screen) if (screen->state == CHIME_SCREEN_STATE_VIEWING) { screen_send_packet(screen, SCREEN_PKT_TYPE_VIEWER_END, NULL, 0); screen->screen_src = NULL; - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL); } } @@ -312,7 +313,7 @@ void chime_call_screen_install_appsrc(ChimeCallScreen *screen, GstAppSrc *appsrc if (screen->ws) { screen_send_packet(screen, SCREEN_PKT_TYPE_VIEWER_BEGIN, NULL, 0); - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_VIEWING); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_VIEWING, NULL); } if (screen->screen_sink) { @@ -364,7 +365,7 @@ static void screen_appsink_destroy(gpointer _screen) if (screen->state == CHIME_SCREEN_STATE_SENDING) { screen_send_packet(screen, SCREEN_PKT_TYPE_PRESENTER_END, NULL, 0); screen->screen_sink = NULL; - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_CONNECTED, NULL); } } @@ -378,7 +379,7 @@ void chime_call_screen_install_appsink(ChimeCallScreen *screen, GstAppSink *apps if (screen->ws) { screen_send_packet(screen, SCREEN_PKT_TYPE_PRESENTER_BEGIN, NULL, 0); - chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_SENDING); + chime_call_screen_set_state(screen, CHIME_SCREEN_STATE_SENDING, NULL); } if (screen->screen_src) { diff --git a/chime/chime-call-screen.h b/chime/chime-call-screen.h index b18f665..a55323b 100644 --- a/chime/chime-call-screen.h +++ b/chime/chime-call-screen.h @@ -43,7 +43,7 @@ ChimeCallScreen *chime_call_screen_open(ChimeConnection *cxn, ChimeCall *call); void chime_call_screen_close(ChimeCallScreen *screen); void chime_call_screen_view(ChimeCallScreen *screen); void chime_call_screen_unview(ChimeCallScreen *screen); -void chime_call_screen_set_state(ChimeCallScreen *audio, ChimeScreenState state); +void chime_call_screen_set_state(ChimeCallScreen *audio, ChimeScreenState state, const gchar *message); void chime_call_screen_install_appsrc(ChimeCallScreen *screen, GstAppSrc *appsrc); void chime_call_screen_install_appsink(ChimeCallScreen *screen, GstAppSink *appsink); diff --git a/chime/chime-call-transport.c b/chime/chime-call-transport.c index bffa86a..6f6ee18 100644 --- a/chime/chime-call-transport.c +++ b/chime/chime-call-transport.c @@ -563,7 +563,7 @@ void chime_call_transport_connect(ChimeCallAudio *audio, gboolean silent) audio->dtls_handshaked = FALSE; audio->recv_ssrc = g_random_int(); - chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_CONNECTING); + chime_call_audio_set_state(audio, CHIME_AUDIO_STATE_CONNECTING, NULL); GSocketConnectable *addr = g_network_address_parse(chime_call_get_media_host(audio->call), 0, NULL); diff --git a/chime/chime-call.c b/chime/chime-call.c index fae7bbb..35a26cd 100644 --- a/chime/chime-call.c +++ b/chime/chime-call.c @@ -181,12 +181,12 @@ static void chime_call_class_init(ChimeCallClass *klass) signals[AUDIO_STATE] = g_signal_new ("audio-state", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_INT); + 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); signals[SCREEN_STATE] = g_signal_new ("screen-state", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, - 0, NULL, NULL, NULL, G_TYPE_NONE, 1, G_TYPE_INT); + 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_STRING); signals[PARTICIPANTS_CHANGED] = g_signal_new ("participants-changed", @@ -587,26 +587,26 @@ void chime_call_set_local_mute(ChimeCall *call, gboolean muted) chime_call_audio_local_mute(call->audio, muted); } -void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state) +void chime_call_audio_set_state(ChimeCallAudio *audio, ChimeAudioState state, const gchar *message) { - chime_debug("Audio state %d (was %d)\n", state, audio->state); + chime_debug("Audio state %d (was %d), msg %s\n", state, audio->state, message); if (audio->state == state) return; audio->state = state; - g_signal_emit(audio->call, signals[AUDIO_STATE], 0, state); + g_signal_emit(audio->call, signals[AUDIO_STATE], 0, state, message); } -void chime_call_screen_set_state(ChimeCallScreen *screen, ChimeScreenState state) +void chime_call_screen_set_state(ChimeCallScreen *screen, ChimeScreenState state, const gchar *message) { - chime_debug("Screen state %d (was %d)\n", state, screen->state); + chime_debug("Screen state %d (was %d), msg %s\n", state, screen->state, message); if (screen->state == state) return; screen->state = state; - g_signal_emit(screen->call, signals[SCREEN_STATE], 0, state); + g_signal_emit(screen->call, signals[SCREEN_STATE], 0, state, message); } void chime_call_install_gst_app_callbacks(ChimeCall *call, GstAppSrc *appsrc, GstAppSink *appsink) diff --git a/chime/chime-websocket.c b/chime/chime-websocket.c index a1ae63e..1d43cf1 100644 --- a/chime/chime-websocket.c +++ b/chime/chime-websocket.c @@ -32,7 +32,8 @@ websocket_connect_async_complete (SoupSession *session, SoupMessage *msg, gpoint g_task_return_new_error (task, SOUP_WEBSOCKET_ERROR, SOUP_WEBSOCKET_ERROR_NOT_WEBSOCKET, - "%s", _("The server did not accept the WebSocket handshake.")); + _("WebSocket handshake failed: (%d/%s)"), + msg->status_code, msg->reason_phrase); g_object_unref (task); } diff --git a/prpl/chat.c b/prpl/chat.c index b86526c..c9c249c 100644 --- a/prpl/chat.c +++ b/prpl/chat.c @@ -401,12 +401,20 @@ static void call_media_setup(ChimeCall *call, struct chime_chat *chat) GST_DEBUG_GRAPH_SHOW_ALL, "chime conference graph"); } -static void on_audio_state(ChimeCall *call, ChimeAudioState audio_state, struct chime_chat *chat) +static void on_audio_state(ChimeCall *call, ChimeAudioState audio_state, + const gchar *message, struct chime_chat *chat) { - purple_debug(PURPLE_DEBUG_INFO, "chime", "Audio state %d\n", audio_state); + purple_debug(PURPLE_DEBUG_INFO, "chime", "Audio state %d (%s)\n", audio_state, message); const gchar *name = chime_call_get_alert_body(chat->call); - if (audio_state == CHIME_AUDIO_STATE_CONNECTING && !chat->media && + if (audio_state == CHIME_AUDIO_STATE_FAILED) { + if (chat->media) { + purple_media_error(chat->media, "Failed to connect audio transport: %s\n", + message); + purple_media_end(chat->media, NULL, NULL); + chat->media = NULL; + } + } else if (audio_state == CHIME_AUDIO_STATE_CONNECTING && !chat->media && !chime_call_get_silent(call)) { call_media_setup(call, chat); } else if (audio_state == CHIME_AUDIO_STATE_AUDIO_MUTED && chat->media) { @@ -463,15 +471,21 @@ static void on_room_membership(ChimeRoom *room, ChimeRoomMember *member, struct } } -static void on_screen_state(ChimeCall *call, ChimeScreenState screen_state, struct chime_chat *chat) +static void on_screen_state(ChimeCall *call, ChimeScreenState screen_state, + const gchar *message, struct chime_chat *chat) { - purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen state %d\n", screen_state); + purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen state %d (%s)\n", screen_state, message); if (screen_state == CHIME_SCREEN_STATE_CONNECTING) return; if (chat->share_media) { - if (screen_state == CHIME_SCREEN_STATE_SENDING) { + if (screen_state == CHIME_SCREEN_STATE_FAILED) { + purple_media_error(chat->share_media, _("Failed to connect to screen bithub: %s\n"), + message); + purple_media_end(chat->share_media, NULL, NULL); + chat->share_media = NULL; + } else if (screen_state == CHIME_SCREEN_STATE_SENDING) { purple_media_stream_info(chat->share_media, PURPLE_MEDIA_INFO_ACCEPT, "chime", _("Sharing screen"), FALSE); } else { purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen presentation ends\n"); @@ -479,7 +493,12 @@ static void on_screen_state(ChimeCall *call, ChimeScreenState screen_state, stru chat->share_media = NULL; } } else if (chat->screen_media) { - if (screen_state == CHIME_SCREEN_STATE_VIEWING) { + if (screen_state == CHIME_SCREEN_STATE_FAILED) { + purple_media_error(chat->share_media, _("Failed to connect to screen bithub: %s\n"), + message); + purple_media_end(chat->screen_media, NULL, NULL); + chat->screen_media = NULL; + } else if (screen_state == CHIME_SCREEN_STATE_VIEWING) { purple_media_stream_info(chat->screen_media, PURPLE_MEDIA_INFO_ACCEPT, "chime", chat->screen_title, FALSE); } else { purple_debug(PURPLE_DEBUG_INFO, "chime", "Screen viewing ends\n");