1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2025-03-03 18:25:35 +00:00

(gtk) first cut at adding the blocklist in the preferences dialog

This commit is contained in:
Charles Kerr 2008-03-30 00:21:46 +00:00
parent c8241d597e
commit 19211bf431
3 changed files with 164 additions and 1 deletions

View file

@ -463,7 +463,8 @@ tr_core_init( GTypeInstance * instance, gpointer g_class UNUSED )
pref_int_get( PREF_KEY_DL_LIMIT ),
pref_int_get( PREF_KEY_MAX_PEERS_GLOBAL ),
pref_int_get( PREF_KEY_MSGLEVEL ),
TRUE /* message queueing */ );
TRUE, /* message queueing */
pref_flag_get( PREF_KEY_BLOCKLIST_ENABLED ) );
/* create the model used to store torrent data */
g_assert( ALEN( types ) == MC_ROW_COUNT );

View file

@ -11,6 +11,7 @@
*/
#include <stdlib.h> /* free() */
#include <unistd.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <third-party/miniupnp/miniwget.h>
@ -40,6 +41,8 @@ tr_prefs_init_global( void )
pref_flag_set_default ( PREF_KEY_DIR_WATCH_ENABLED, FALSE );
#endif
pref_flag_set_default ( PREF_KEY_BLOCKLIST_ENABLED, FALSE );
pref_string_set_default ( PREF_KEY_OPEN_DIALOG_FOLDER, g_get_home_dir( ) );
pref_int_set_default ( PREF_KEY_MAX_PEERS_GLOBAL, 200 );
@ -267,6 +270,147 @@ torrentPage( GObject * core )
return t;
}
/***
****
***/
struct blocklist_data
{
GtkWidget * dialog;
TrCore * core;
int abortFlag;
char secondary[512];
};
static gboolean
blocklistDialogSetSecondary( gpointer vdata )
{
struct blocklist_data * data = vdata;
GtkMessageDialog * md = GTK_MESSAGE_DIALOG( data->dialog );
gtk_message_dialog_format_secondary_text( md, data->secondary );
return FALSE;
}
static gboolean
blocklistDialogAllowClose( gpointer dialog )
{
GtkDialog * d = GTK_DIALOG( dialog );
gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CANCEL, FALSE );
gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CLOSE, TRUE );
return FALSE;
}
static gpointer
updateBlocklist( gpointer vdata )
{
struct blocklist_data * data = vdata;
int size = 0;
int rules = 0;
const char * url;
char * text = NULL;
gchar * filename = NULL;
GError * err = NULL;
int fd = -1;
int ok = 1;
url = "http://download.m0k.org/transmission/files/level1.gz";
if( ok && !data->abortFlag )
{
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Retrieving blocklist..." ) );
g_idle_add( blocklistDialogSetSecondary, data );
text = miniwget( url, &size );
if( !data->abortFlag && ( !text || !size ) ) {
ok = FALSE;
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Unable to get blocklist." ) );
g_idle_add( blocklistDialogSetSecondary, data );
}
}
if( ok && !data->abortFlag )
{
fd = g_file_open_tmp( "transmission-blockfile-XXXXXX.gz", &filename, &err );
if( err ) {
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Unable to get blocklist: %s" ), err->message );
g_idle_add( blocklistDialogSetSecondary, data );
g_clear_error( &err );
} else {
write( fd, text, size );
close( fd );
}
}
if( ok && !data->abortFlag )
{
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Uncompressing blocklist..." ) );
g_idle_add( blocklistDialogSetSecondary, data );
char * cmd = g_strdup_printf( "gunzip %s", filename );
system( cmd );
g_free( cmd );
}
if( ok && !data->abortFlag )
{
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Parsing blocklist..." ) );
g_idle_add( blocklistDialogSetSecondary, data );
filename[ strlen(filename) - 3 ] = '\0';
rules = tr_blocklistSetContent( tr_core_handle( data->core ), filename );
}
if( ok && !data->abortFlag )
{
g_snprintf( data->secondary, sizeof( data->secondary ),
_( "Blocklist now has %'d rules" ), rules );
g_idle_add( blocklistDialogSetSecondary, data );
g_idle_add( blocklistDialogAllowClose, data->dialog );
}
free( text );
/* g_free( data ); */
unlink( filename );
return NULL;
}
static void
onUpdateBlocklistResponseCB( GtkDialog * dialog, int response, gpointer vdata )
{
struct blocklist_data * data = vdata;
if( response == GTK_RESPONSE_CANCEL )
data->abortFlag = 1;
data->dialog = NULL;
gtk_widget_destroy( GTK_WIDGET( dialog ) );
}
static void
onUpdateBlocklistCB( GtkButton * w, gpointer core )
{
GtkWidget * d;
struct blocklist_data * data;
d = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( w ) ) ),
GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_INFO,
GTK_BUTTONS_NONE,
_( "Updating Blocklist" ) );
gtk_dialog_add_buttons( GTK_DIALOG( d ),
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL );
gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CLOSE, FALSE );
data = g_new0( struct blocklist_data, 1 );
data->dialog = d;
data->core = core;
g_signal_connect( d, "response", G_CALLBACK(onUpdateBlocklistResponseCB), data );
gtk_widget_show( d );
g_thread_create( updateBlocklist, data, FALSE, NULL );
}
static GtkWidget*
peerPage( GObject * core )
{
@ -274,6 +418,8 @@ peerPage( GObject * core )
const char * s;
GtkWidget * t;
GtkWidget * w;
GtkWidget * b;
GtkWidget * h;
t = hig_workarea_create( );
hig_workarea_add_section_title (t, &row, _("Options"));
@ -295,6 +441,21 @@ peerPage( GObject * core )
w = new_spin_button( PREF_KEY_MAX_PEERS_PER_TORRENT, core, 1, 300, 5 );
hig_workarea_add_row( t, &row, _( "Maximum peers per _torrent:" ), w, NULL );
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Blocklist" ) );
s = _("Use IP _blocklist from bluetack.co.uk" );
w = new_check_button( s, PREF_KEY_BLOCKLIST_ENABLED, core );
hig_workarea_add_wide_control( t, &row, w );
b = gtk_button_new_with_mnemonic( _( "_Update Blocklist" ) );
g_signal_connect( b, "clicked", G_CALLBACK(onUpdateBlocklistCB), core );
gtk_widget_set_sensitive( GTK_WIDGET(b), pref_flag_get( PREF_KEY_BLOCKLIST_ENABLED ) );
g_signal_connect( w, "toggled", G_CALLBACK(target_cb), b );
h = gtk_hbox_new( FALSE, GUI_PAD_BIG );
gtk_box_pack_start( GTK_BOX(h), b, FALSE, FALSE, 0 );
hig_workarea_add_wide_control( t, &row, h );
hig_workarea_finish( t, &row );
return t;
}

View file

@ -47,6 +47,7 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent );
#define PREF_KEY_TOOLBAR "show-toolbar"
#define PREF_KEY_MAX_PEERS_GLOBAL "max-peers-global"
#define PREF_KEY_MAX_PEERS_PER_TORRENT "max-peers-per-torrent"
#define PREF_KEY_BLOCKLIST_ENABLED "blocklist-enabled"
void tr_prefs_init_global( void );