diff --git a/gtk/add-dialog.c b/gtk/add-dialog.c index 24beea347..92582828d 100644 --- a/gtk/add-dialog.c +++ b/gtk/add-dialog.c @@ -486,7 +486,8 @@ onAddURLResponse( GtkDialog * dialog, int response, gpointer user_data ) { TrCore * core = user_data; - if( gtr_is_supported_url( url ) || gtr_is_magnet_link( url ) ) + if( gtr_is_supported_url( url ) || gtr_is_magnet_link( url ) + || gtr_is_hex_hashcode( url ) ) { tr_core_add_from_url( core, url ); } diff --git a/gtk/tr-core.c b/gtk/tr-core.c index 1afc32ae2..ce9a0417a 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -1038,10 +1038,17 @@ tr_core_add_from_url( TrCore * core, const char * url ) { tr_session * session = tr_core_session( core ); - if( gtr_is_magnet_link( url ) ) + if( gtr_is_magnet_link( url ) || gtr_is_hex_hashcode( url ) ) { + int err; + char * tmp = NULL; tr_ctor * ctor = tr_ctorNew( session ); - int err = tr_ctorSetMagnet( ctor, url ); + + if( gtr_is_hex_hashcode( url ) ) + url = tmp = g_strdup_printf( "magnet:?xt=urn:btih:%s", url ); + + err = tr_ctorSetMagnet( ctor, url ); + if( !err ) { tr_session * session = tr_core_session( core ); @@ -1064,6 +1071,8 @@ tr_core_add_from_url( TrCore * core, const char * url ) gtk_widget_show( w ); tr_ctorFree( ctor ); } + + g_free( tmp ); } else { diff --git a/gtk/util.c b/gtk/util.c index bf6bec1a9..ce2562f3b 100644 --- a/gtk/util.c +++ b/gtk/util.c @@ -337,6 +337,21 @@ gtr_is_magnet_link( const char * str ) return !strncmp( str, "magnet:?", 8 ); } +gboolean +gtr_is_hex_hashcode( const char * str ) +{ + int i; + + if( !str || ( strlen( str ) != 40 ) ) + return FALSE; + + for( i=0; i<40; ++i ) + if( !isxdigit( str[i] ) ) + return FALSE; + + return TRUE; +} + GSList * checkfilenames( int argc, char **argv ) { @@ -358,6 +373,8 @@ checkfilenames( int argc, char **argv ) if( g_file_test( filename, G_FILE_TEST_EXISTS ) ) ret = g_slist_prepend( ret, filename ); + else if( gtr_is_hex_hashcode( filename ) ) + ret = g_slist_prepend( ret, filename ); else g_free( filename ); } diff --git a/gtk/util.h b/gtk/util.h index 7a7d88464..40ecf8d91 100644 --- a/gtk/util.h +++ b/gtk/util.h @@ -47,6 +47,9 @@ gboolean gtr_is_supported_url( const char * str ); gboolean gtr_is_magnet_link( const char * str ); +gboolean gtr_is_hex_hashcode( const char * str ); + + /* create a copy of a GSList of strings, this dups the actual strings too */ GSList * dupstrlist( GSList * list );