(gtk) #562: No error message when opening broken torrent file

This commit is contained in:
Charles Kerr 2008-07-09 16:33:00 +00:00
parent 54f3b36911
commit f5dbaca440
3 changed files with 79 additions and 58 deletions

View File

@ -114,6 +114,7 @@ struct cbdata
GtkWidget * msgwin;
GtkWidget * prefs;
GSList * errqueue;
GSList * dupqueue;
GHashTable * tor2details;
GHashTable * details2tor;
};
@ -476,6 +477,7 @@ appsetup( TrWindow * wind, GSList * torrentFiles,
cbdata->timer = 0;
cbdata->closing = FALSE;
cbdata->errqueue = NULL;
cbdata->dupqueue = NULL;
cbdata->minimized = minimized;
if( minimized )
@ -656,6 +658,10 @@ quitThreadFunc( gpointer gdata )
g_slist_foreach( cbdata->errqueue, (GFunc)g_free, NULL );
g_slist_free( cbdata->errqueue );
}
if( cbdata->dupqueue ) {
g_slist_foreach( cbdata->dupqueue, (GFunc)g_free, NULL );
g_slist_free( cbdata->dupqueue );
}
g_hash_table_destroy( cbdata->details2tor );
g_hash_table_destroy( cbdata->tor2details );
@ -821,40 +827,77 @@ setupdrag(GtkWidget *widget, struct cbdata *data) {
ALEN(targets), GDK_ACTION_COPY | GDK_ACTION_MOVE);
}
static void
flushAddTorrentErrors( GtkWindow * window, const char * primary, GSList ** files )
{
GString * s = g_string_new( NULL );
GSList * l;
GtkWidget * w;
for( l=*files; l; l=l->next )
g_string_append_printf( s, "%s\n", (const char*)l->data );
w = gtk_message_dialog_new( window,
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
primary );
gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( w ), s->str );
g_signal_connect_swapped( w, "response",
G_CALLBACK( gtk_widget_destroy ), w );
gtk_widget_show_all( w );
g_string_free( s, TRUE );
g_slist_foreach( *files, (GFunc)g_free, NULL );
g_slist_free( *files );
*files = NULL;
}
static void
showTorrentErrors( struct cbdata * cbdata )
{
if( cbdata->errqueue )
flushAddTorrentErrors( GTK_WINDOW( cbdata->wind ),
ngettext( "Couldn't add corrupt torrent",
"Couldn't add corrupt torrents",
g_slist_length( cbdata->errqueue ) ),
&cbdata->errqueue );
if( cbdata->dupqueue )
flushAddTorrentErrors( GTK_WINDOW( cbdata->wind ),
ngettext( "Couldn't add duplicate torrent",
"Couldn't add duplicate torrents",
g_slist_length( cbdata->dupqueue ) ),
&cbdata->dupqueue );
}
static void
coreerr( TrCore * core UNUSED, enum tr_core_err code, const char * msg,
gpointer gdata )
{
struct cbdata * cbdata = gdata;
char * joined;
struct cbdata * c = gdata;
switch( code )
{
case TR_CORE_ERR_ADD_TORRENT:
cbdata->errqueue = g_slist_append( cbdata->errqueue,
g_strdup( msg ) );
return;
case TR_EINVALID:
c->errqueue = g_slist_append( c->errqueue, g_path_get_basename( msg ) );
break;
case TR_EDUPLICATE:
c->dupqueue = g_slist_append( c->dupqueue, g_path_get_basename( msg ) );
break;
case TR_CORE_ERR_NO_MORE_TORRENTS:
if( cbdata->errqueue )
{
joined = joinstrlist( cbdata->errqueue, "\n" );
errmsg( cbdata->wind,
ngettext( "Failed to load torrent file: %s",
"Failed to load torrent files: %s",
g_slist_length( cbdata->errqueue ) ),
joined );
g_slist_foreach( cbdata->errqueue, (GFunc) g_free, NULL );
g_slist_free( cbdata->errqueue );
cbdata->errqueue = NULL;
g_free( joined );
}
return;
showTorrentErrors( c );
break;
case TR_CORE_ERR_SAVE_STATE:
errmsg( cbdata->wind, "%s", msg );
return;
errmsg( c->wind, "%s", msg );
break;
default:
g_assert_not_reached();
break;
}
g_assert_not_reached();
}
#if GTK_CHECK_VERSION(2,8,0)

View File

@ -740,25 +740,6 @@ tr_core_errsig( TrCore * core, enum tr_core_err type, const char * msg )
g_signal_emit( core, TR_CORE_GET_CLASS(core)->errsig, 0, type, msg );
}
void
tr_core_add_ctor( TrCore * self, tr_ctor * ctor )
{
TrTorrent * tor;
char * errstr = NULL;
tr_core_apply_defaults( ctor );
if(( tor = tr_torrent_new_ctor( tr_core_handle( self ), ctor, &errstr )))
tr_core_add_torrent( self, tor );
else{
tr_core_errsig( self, TR_CORE_ERR_ADD_TORRENT, errstr );
g_free( errstr );
}
/* cleanup */
tr_ctorFree( ctor );
}
static void
add_filename( TrCore * core,
const char * filename,
@ -774,15 +755,20 @@ add_filename( TrCore * core,
tr_core_apply_defaults( ctor );
tr_ctorSetPaused( ctor, TR_FORCE, !doStart );
if( tr_ctorSetMetainfoFromFile( ctor, filename ) ) {
addTorrentErrorDialog( NULL, TR_EINVALID, filename );
tr_core_errsig( core, TR_EINVALID, filename );
tr_ctorFree( ctor );
} else if(( err = tr_torrentParse( handle, ctor, NULL ))) {
addTorrentErrorDialog( NULL, err, filename );
tr_core_errsig( core, err, filename );
tr_ctorFree( ctor );
} else if( doPrompt )
g_signal_emit( core, TR_CORE_GET_CLASS(core)->promptsig, 0, ctor );
else
tr_core_add_ctor( core, ctor );
else {
tr_torrent * tor = tr_torrentNew( handle, ctor, &err );
if( err )
tr_core_errsig( core, err, filename );
else
tr_core_add_torrent( core, tr_torrent_new_preexisting( tor ) );
}
}
}

View File

@ -81,10 +81,10 @@ TrCoreClass;
enum tr_core_err
{
TR_CORE_ERR_ADD_TORRENT, /* adding a torrent failed */
/* no more torrents to be added, used for grouping torrent add errors */
TR_CORE_ERR_NO_MORE_TORRENTS,
TR_CORE_ERR_SAVE_STATE /* error saving state */
TR_CORE_ERR_ADD_TORRENT_ERR = TR_EINVALID,
TR_CORE_ERR_ADD_TORRENT_DUP = TR_EDUPLICATE,
TR_CORE_ERR_NO_MORE_TORRENTS, /* finished adding a batch */
TR_CORE_ERR_SAVE_STATE /* error saving state */
};
GType tr_core_get_type( void );
@ -111,14 +111,6 @@ void tr_core_get_stats( const TrCore * core,
*/
int tr_core_load( TrCore * self, gboolean forcepaused );
/**
* Add a torrent.
* This function assumes ownership of ctor
*
* May trigger an "error" signal with TR_CORE_ERR_ADD_TORRENT
*/
void tr_core_add_ctor( TrCore * self, tr_ctor * ctor );
/**
* Add a list of torrents.
* This function assumes ownership of torrentFiles