From c927189fed578f2dac4faf96d0d42af9011e5748 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Fri, 25 Jun 2010 17:40:55 +0000 Subject: [PATCH] (trunk gtk) #3348 "Add URL doesn't warn upon corrupt torrents" -- fixed. --- gtk/tr-core.c | 52 ++++++++++++++++++++++++++++++------------------ gtk/tr-torrent.c | 3 ++- gtk/util.c | 20 +++++++++++++++++++ gtk/util.h | 1 + 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/gtk/tr-core.c b/gtk/tr-core.c index 8ee4704e2..6ab740128 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -1018,40 +1018,53 @@ struct url_dialog_data { TrCore * core; tr_ctor * ctor; - GtkDialog * dialog; + char * url; + char * error; + int response_code; }; static gboolean onURLDoneIdle( gpointer vdata ) { struct url_dialog_data * data = vdata; - tr_core_add_ctor( data->core, data->ctor ); + + if( data->response_code != 200 ) + { + gtr_http_failure_dialog( NULL, data->url, data->response_code ); + } + else + { + const gboolean doPrompt = pref_flag_get( PREF_KEY_OPTIONS_PROMPT ); + const gboolean doNotify = FALSE; + const int err = add_ctor( data->core, data->ctor, doPrompt, doNotify ); + + if( err == TR_PARSE_ERR ) + tr_core_errsig( data->core, TR_PARSE_ERR, data->url ); + + tr_core_torrents_added( data->core ); + } + + /* cleanup */ + g_free( data->url ); g_free( data ); return FALSE; } static void -onURLDone( tr_session * session, - long response_code UNUSED, - const void * response, - size_t response_byte_count, - void * vdata ) +onURLDone( tr_session * session, + long response_code, + const void * response, + size_t response_byte_count, + void * vdata ) { struct url_dialog_data * data = vdata; - tr_ctor * ctor = tr_ctorNew( session ); - /* FIME: error dialog */ + data->response_code = response_code; + data->ctor = tr_ctorNew( session ); + tr_core_apply_defaults( data->ctor ); + tr_ctorSetMetainfo( data->ctor, response, response_byte_count ); - if( tr_ctorSetMetainfo( ctor, response, response_byte_count ) ) - { - tr_ctorFree( ctor ); - g_free( data ); - } - else /* move the work back to the gtk thread */ - { - data->ctor = ctor; - gtr_idle_add( onURLDoneIdle, data ); - } + gtr_idle_add( onURLDoneIdle, data ); } void @@ -1084,6 +1097,7 @@ tr_core_add_from_url( TrCore * core, const char * url ) { struct url_dialog_data * data = g_new( struct url_dialog_data, 1 ); data->core = core; + data->url = g_strdup( url ); tr_webRun( session, url, NULL, onURLDone, data ); } } diff --git a/gtk/tr-torrent.c b/gtk/tr-torrent.c index 84f669265..3ac0b8915 100644 --- a/gtk/tr-torrent.c +++ b/gtk/tr-torrent.c @@ -156,9 +156,10 @@ notifyInMainThread( gpointer user_data ) static void completenessChangedCallback( tr_torrent * tor, tr_completeness completeness, + tr_bool wasRunning, void * user_data ) { - if( ( completeness != TR_LEECH ) && ( tr_torrentStat( tor )->sizeWhenDone != 0 ) ) + if( wasRunning && ( completeness != TR_LEECH ) && ( tr_torrentStat( tor )->sizeWhenDone != 0 ) ) gtr_idle_add( notifyInMainThread, user_data ); } diff --git a/gtk/util.c b/gtk/util.c index 3d0b3c3a1..ddf53a0ad 100644 --- a/gtk/util.c +++ b/gtk/util.c @@ -33,6 +33,7 @@ #include /* TR_RATIO_NA, TR_RATIO_INF */ #include /* tr_inf */ +#include /* tr_webResponseStr() */ #include /* tr_inf */ #include "conf.h" @@ -803,6 +804,25 @@ gtr_timeout_add_seconds( guint seconds, GSourceFunc function, gpointer data ) #endif } +void +gtr_http_failure_dialog( GtkWidget * parent, const char * url, long response_code ) +{ + GtkWindow * window = getWindow( parent ); + + GtkWidget * w = gtk_message_dialog_new( window, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _( "Error opening \"%s\"" ), url ); + + gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( w ), + _( "Server returned \"%1$ld %2$s\"" ), + response_code, + tr_webGetResponseStr( response_code ) ); + + g_signal_connect_swapped( w, "response", G_CALLBACK( gtk_widget_destroy ), w ); + gtk_widget_show( w ); +} + void gtr_unrecognized_url_dialog( GtkWidget * parent, const char * url ) { diff --git a/gtk/util.h b/gtk/util.h index 0456161fb..23f18638a 100644 --- a/gtk/util.h +++ b/gtk/util.h @@ -156,6 +156,7 @@ GtkWidget * gtr_priority_combo_new( void ); void gtr_unrecognized_url_dialog( GtkWidget * parent, const char * url ); +void gtr_http_failure_dialog( GtkWidget * parent, const char * url, long response_code ); void addTorrentErrorDialog( GtkWidget * window_or_child, int err,