(gtk) #562: No error message when opening broken torrent file
This commit is contained in:
parent
54f3b36911
commit
f5dbaca440
89
gtk/main.c
89
gtk/main.c
|
@ -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)
|
||||
|
|
|
@ -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 ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue