]> www.infradead.org Git - pidgin-chime.git/commitdiff
Fix error handling for audio/screen connection failure
authorDavid Woodhouse <dwmw2@infradead.org>
Mon, 30 Apr 2018 09:22:44 +0000 (10:22 +0100)
committerDavid Woodhouse <dwmw2@infradead.org>
Mon, 30 Apr 2018 09:23:06 +0000 (10:23 +0100)
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.

chime/chime-call-audio.c
chime/chime-call-audio.h
chime/chime-call-screen.c
chime/chime-call-screen.h
chime/chime-call-transport.c
chime/chime-call.c
chime/chime-websocket.c
prpl/chat.c

index 029dadf81dd0a03b4a77632070b62f6296e13b3b..ff463abc84aea5fc4900653fd2d3c61658d4cd20 100644 (file)
@@ -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;
index 450e537750a9f2c0ea785507174e791b67c9c700..ddd5a8ffc87188946ad774c6058425e71cd2be95 100644 (file)
@@ -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 */
index a5a9b7d683556967edc6f62e3f310c876c8d3eee..d8e246c20e4d8f5955a5c7d79f619a23e8d89e61 100644 (file)
@@ -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) {
index b18f6658ec0e99f99fb5ebff66f979eca581246e..a55323bf12ed49932b0af3f9ee837d85ee2dff9d 100644 (file)
@@ -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);
index bffa86a8ad22b4cbb4ac2a07cb124be6111e0434..6f6ee181f7a68c0e9d1b9e93d2d09989f6f1b665 100644 (file)
@@ -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);
index fae7bbb26a68d8f7511b21b91bc55db04ecdf5d3..35a26cdbd7551341c9111dbaa45933d369b9af38 100644 (file)
@@ -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)
index a1ae63e7870826cd9d45f3b70dae1b5a894919d1..1d43cf1be5a9084c6fbfb10ae192c2b710cd25e8 100644 (file)
@@ -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);
 }
 
index b86526c15b2bca70f613746100e108150c70e222..c9c249c6b4c0368d08ad277cb992736eaf488937 100644 (file)
@@ -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");