Changeset 6687
- Timestamp:
- Sep 2, 2008, 8:59:00 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/gtk/Makefile.am
r6567 r6687 24 24 actions.h \ 25 25 add-dialog.h \ 26 blocklist.h \ 26 27 conf.h \ 27 28 details.h \ … … 55 56 actions.c \ 56 57 add-dialog.c \ 58 blocklist.c \ 57 59 conf.c \ 58 60 details.c \ -
trunk/gtk/conf.c
r6559 r6687 161 161 ***/ 162 162 163 int 163 int64_t 164 164 pref_int_get( const char * key ) 165 165 { 166 int64_t i ;166 int64_t i = 0; 167 167 tr_bencDictFindInt( getPrefs( ), key, &i ); 168 168 return i; 169 169 } 170 170 void 171 pref_int_set( const char * key, int value )171 pref_int_set( const char * key, int64_t value ) 172 172 { 173 173 tr_benc * d = getPrefs( ); … … 176 176 } 177 177 void 178 pref_int_set_default( const char * key, int value )178 pref_int_set_default( const char * key, int64_t value ) 179 179 { 180 180 if( !tr_bencDictFind( getPrefs( ), key ) ) -
trunk/gtk/conf.h
r6559 r6687 30 30 #define TG_CONF_H 31 31 32 int 33 void pref_int_set ( const char * key, int value );34 void pref_int_set_default ( const char * key, int value );32 int64_t pref_int_get ( const char * key ); 33 void pref_int_set ( const char * key, int64_t value ); 34 void pref_int_set_default ( const char * key, int64_t value ); 35 35 36 36 gboolean pref_flag_get ( const char * key ); -
trunk/gtk/main.c
r6686 r6687 48 48 #include "actions.h" 49 49 #include "add-dialog.h" 50 #include "blocklist.h" 50 51 #include "conf.h" 51 52 #include "details.h" … … 465 466 appsetup( win, argfiles, cbdata, startpaused, startminimized ); 466 467 tr_sessionSetRPCCallback( h, onRPCChanged, cbdata ); 468 gtr_blocklist_maybe_autoupdate( cbdata->core ); 467 469 468 470 gtk_main(); -
trunk/gtk/tr-core.c
r6624 r6687 93 93 94 94 static void 95 tr_core_marshal_blocklist( GClosure * closure, GValue * ret UNUSED, 96 guint count, const GValue * vals, 97 gpointer hint UNUSED, gpointer marshal ) 98 { 99 typedef void (*TRMarshalErr) 100 ( gpointer, enum tr_core_err, const char *, gpointer ); 101 TRMarshalErr callback; 102 GCClosure * cclosure = (GCClosure*) closure; 103 gboolean flag; 104 const char * str; 105 gpointer inst, gdata; 106 107 g_return_if_fail( count == 3 ); 108 109 inst = g_value_peek_pointer( vals ); 110 flag = g_value_get_boolean( vals + 1 ); 111 str = g_value_get_string( vals + 2 ); 112 gdata = closure->data; 113 114 callback = (TRMarshalErr)( marshal ? marshal : cclosure->callback ); 115 callback( inst, flag, str, gdata ); 116 } 117 118 static void 95 119 tr_core_marshal_prompt( GClosure * closure, GValue * ret UNUSED, 96 120 guint count, const GValue * vals, … … 149 173 150 174 core_class = TR_CORE_CLASS( g_class ); 175 core_class->blocksig = g_signal_new( "blocklist-status", 176 G_TYPE_FROM_CLASS( g_class ), 177 G_SIGNAL_RUN_LAST, 0, NULL, NULL, 178 tr_core_marshal_blocklist, G_TYPE_NONE, 179 2, G_TYPE_BOOLEAN, G_TYPE_STRING ); 151 180 core_class->errsig = g_signal_new( "error", G_TYPE_FROM_CLASS( g_class ), 152 181 G_SIGNAL_RUN_LAST, 0, NULL, NULL, … … 743 772 744 773 return count; 774 } 775 776 void 777 tr_core_blocksig( TrCore * core, gboolean isDone, const char * status ) 778 { 779 g_signal_emit( core, TR_CORE_GET_CLASS(core)->blocksig, 0, isDone, status ); 745 780 } 746 781 -
trunk/gtk/tr-core.h
r6559 r6687 60 60 { 61 61 GObjectClass parent; 62 63 /* "blocklist" signal: 64 void handler( TrCore *, const char *, gpointer userData ); */ 65 int blocksig; 62 66 63 67 /* "error" signal: … … 160 164 void tr_core_quit( TrCore * self ); 161 165 166 /* emit the "blocklist changed" signal */ 167 void tr_core_blocksig( TrCore * core, gboolean isDone, const char * status ); 168 162 169 /* Set a preference value, save the prefs file, and emit the 163 170 "prefs-changed" signal */ … … 171 178 "prefs-changed" signal */ 172 179 void tr_core_set_pref_int( TrCore * self, const char * key, int val ); 180 173 181 174 182 /** -
trunk/gtk/tr-prefs.c
r6686 r6687 22 22 #include <libtransmission/version.h> 23 23 #include <libtransmission/web.h> 24 #include "blocklist.h" 24 25 #include "conf.h" 25 26 #include "hig.h" … … 55 56 pref_int_set_default ( PREF_KEY_PEER_SOCKET_TOS, TR_DEFAULT_PEER_SOCKET_TOS ); 56 57 pref_flag_set_default ( PREF_KEY_ALLOW_HIBERNATION, FALSE ); 57 pref_flag_set_default ( PREF_KEY_BLOCKLIST_ENABLED, TR_DEFAULT_BLOCKLIST_ENABLED ); 58 pref_flag_set_default ( PREF_KEY_BLOCKLIST_ENABLED, TRUE ); 59 pref_flag_set_default ( PREF_KEY_BLOCKLIST_UPDATES_ENABLED, TRUE ); 58 60 59 61 pref_string_set_default ( PREF_KEY_OPEN_DIALOG_FOLDER, g_get_home_dir( ) ); … … 350 352 GtkWidget * dialog; 351 353 TrCore * core; 354 gulong id; 352 355 int abortFlag; 353 356 char secondary[256]; … … 364 367 gtk_button_set_label( GTK_BUTTON( w ), buf ); 365 368 } 366 static gboolean 367 updateBlocklistTextFromData( gpointer gdata ) 369 370 static void 371 onBlocklistDialogResponse( GtkDialog * d, int response UNUSED, gpointer gdata ) 368 372 { 369 373 struct blocklist_data * data = gdata; 370 updateBlocklistText( data->check, data->core);371 return FALSE;372 } 373 374 static gboolean375 blocklistDialogSetSecondary(gpointer gdata )374 g_signal_handler_disconnect( data->core, data->id ); 375 gtk_widget_destroy( GTK_WIDGET( d ) ); 376 } 377 378 static void 379 onBlocklistStatus( TrCore * core UNUSED, gboolean isDone, const char * status, gpointer gdata ) 376 380 { 377 381 struct blocklist_data * data = gdata; 378 GtkMessageDialog * md = GTK_MESSAGE_DIALOG( data->dialog ); 379 gtk_message_dialog_format_secondary_text( md, data->secondary ); 380 return FALSE; 381 } 382 383 static gboolean 384 blocklistDialogAllowClose( gpointer dialog ) 385 { 386 GtkDialog * d = GTK_DIALOG( dialog ); 387 gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CANCEL, FALSE ); 388 gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CLOSE, TRUE ); 389 return FALSE; 390 } 391 392 static void 393 got_blocklist( tr_handle * handle UNUSED, 394 long response_code UNUSED, 395 const void * response, 396 size_t response_len, 397 void * gdata ) 398 { 399 struct blocklist_data * data = gdata; 400 const char * text = response; 401 int size = response_len; 402 int rules = 0; 403 gchar * filename = NULL; 404 gchar * filename2 = NULL; 405 int fd = -1; 406 int ok = 1; 407 408 if( !data->abortFlag && ( !text || !size ) ) 409 { 410 ok = FALSE; 411 g_snprintf( data->secondary, sizeof( data->secondary ), 412 _( "Unable to get blocklist." ) ); 413 g_message( data->secondary ); 414 g_idle_add( blocklistDialogSetSecondary, data ); 415 } 416 417 if( ok && !data->abortFlag ) 418 { 419 GError * err = NULL; 420 fd = g_file_open_tmp( "transmission-blockfile-XXXXXX", &filename, &err ); 421 if( err ) { 422 g_snprintf( data->secondary, sizeof( data->secondary ), 423 _( "Unable to get blocklist: %s" ), err->message ); 424 g_warning( data->secondary ); 425 g_idle_add( blocklistDialogSetSecondary, data ); 426 g_clear_error( &err ); 427 ok = FALSE; 428 } else { 429 write( fd, text, size ); 430 close( fd ); 431 } 432 } 433 if( ok && !data->abortFlag ) 434 { 435 char * cmd; 436 filename2 = g_strdup_printf( "%s.txt", filename ); 437 g_snprintf( data->secondary, sizeof( data->secondary ), 438 _( "Uncompressing blocklist..." ) ); 439 g_idle_add( blocklistDialogSetSecondary, data ); 440 cmd = g_strdup_printf( "zcat %s > %s ", filename, filename2 ); 441 tr_dbg( "%s", cmd ); 442 system( cmd ); 443 g_free( cmd ); 444 } 445 if( ok && !data->abortFlag ) 446 { 447 g_snprintf( data->secondary, sizeof( data->secondary ), 448 _( "Parsing blocklist..." ) ); 449 g_idle_add( blocklistDialogSetSecondary, data ); 450 rules = tr_blocklistSetContent( tr_core_handle( data->core ), filename2 ); 451 } 452 if( ok && !data->abortFlag ) 453 { 454 g_snprintf( data->secondary, sizeof( data->secondary ), 455 _( "Blocklist updated with %'d entries" ), rules ); 456 g_idle_add( blocklistDialogSetSecondary, data ); 457 g_idle_add( blocklistDialogAllowClose, data->dialog ); 458 g_idle_add( updateBlocklistTextFromData, data ); 459 } 460 461 /* g_free( data ); */ 462 if( filename2 ) { 463 unlink( filename2 ); 464 g_free( filename2 ); 465 } 466 if( filename ) { 467 unlink( filename ); 468 g_free( filename ); 469 } 470 } 471 472 static void 473 onUpdateBlocklistResponseCB( GtkDialog * dialog, int response, gpointer vdata ) 474 { 475 struct blocklist_data * data = vdata; 476 477 if( response == GTK_RESPONSE_CANCEL ) 478 data->abortFlag = 1; 479 480 data->dialog = NULL; 481 gtk_widget_destroy( GTK_WIDGET( dialog ) ); 382 383 gdk_threads_enter( ); 384 gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( data->dialog ), status ); 385 gtk_dialog_set_response_sensitive( GTK_DIALOG( data->dialog ), GTK_RESPONSE_CANCEL, !isDone ); 386 gtk_dialog_set_response_sensitive( GTK_DIALOG( data->dialog ), GTK_RESPONSE_CLOSE, isDone ); 387 if( isDone ) 388 updateBlocklistText( data->check, core ); 389 gdk_threads_leave( ); 482 390 } 483 391 … … 487 395 GtkWidget * d; 488 396 struct blocklist_data * data = gdata; 489 tr_handle * handle = g_object_get_data( G_OBJECT( w ), "handle" );490 const char * url = "http://download.m0k.org/transmission/files/level1.gz";491 397 492 398 d = gtk_message_dialog_new( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( w ) ) ), … … 495 401 GTK_BUTTONS_NONE, 496 402 _( "Updating Blocklist" ) ); 497 gtk_message_dialog_format_secondary_text( GTK_MESSAGE_DIALOG( d ), 498 _( "Retrieving blocklist..." ) ); 403 404 data->dialog = d; 405 data->id = g_signal_connect( data->core, "blocklist-status", G_CALLBACK( onBlocklistStatus ), data ); 406 499 407 gtk_dialog_add_buttons( GTK_DIALOG( d ), 500 408 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, … … 503 411 gtk_dialog_set_response_sensitive( GTK_DIALOG( d ), GTK_RESPONSE_CLOSE, FALSE ); 504 412 505 data->dialog = d; 506 507 g_signal_connect( d, "response", G_CALLBACK(onUpdateBlocklistResponseCB), data ); 413 g_signal_connect( d, "response", G_CALLBACK(onBlocklistDialogResponse), data ); 508 414 gtk_widget_show( d ); 509 415 510 tr_webRun( handle, url, NULL, got_blocklist, data);416 gtr_blocklist_update( data->core ); 511 417 } 512 418 … … 533 439 struct blocklist_data * data; 534 440 441 data = g_new0( struct blocklist_data, 1 ); 442 data->core = TR_CORE( core ); 443 535 444 t = hig_workarea_create( ); 536 445 hig_workarea_add_section_title (t, &row, _("Options")); 446 447 s = _("_Ignore unencrypted peers"); 448 w = gtk_check_button_new_with_mnemonic( s ); 449 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(w), 450 pref_int_get(PREF_KEY_ENCRYPTION)==TR_ENCRYPTION_REQUIRED ); 451 g_signal_connect( w, "toggled", G_CALLBACK(onEncryptionToggled), core ); 452 hig_workarea_add_wide_control( t, &row, w ); 453 454 s = _("Use peer e_xchange"); 455 w = new_check_button( s, PREF_KEY_PEX, core ); 456 hig_workarea_add_wide_control( t, &row, w ); 457 458 h = gtk_hbox_new( FALSE, GUI_PAD_BIG ); 459 w2 = new_spin_button( PREF_KEY_PORT, core, 1, INT_MAX, 1 ); 460 gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 ); 461 l = gtk_label_new( NULL ); 462 gtk_misc_set_alignment( GTK_MISC(l), 0.0f, 0.5f ); 463 gtk_box_pack_start( GTK_BOX(h), l, FALSE, FALSE, 0 ); 464 hig_workarea_add_row( t, &row, _("Listening _port:"), h, w2 ); 465 466 g_object_set_data( G_OBJECT(l), "tr-port-spin", w2 ); 467 g_object_set_data( G_OBJECT(l), "alive", alive ); 468 g_object_set_data( G_OBJECT(l), "handle", tr_core_handle( TR_CORE( core ) ) ); 469 testing_port_cb( NULL, l ); 470 g_signal_connect( w2, "value-changed", G_CALLBACK(testing_port_cb), l ); 471 472 hig_workarea_add_section_divider( t, &row ); 473 hig_workarea_add_section_title( t, &row, _( "Blocklist" ) ); 537 474 538 475 w = new_check_button( "", PREF_KEY_BLOCKLIST_ENABLED, core ); … … 541 478 gtk_box_pack_start_defaults( GTK_BOX(h), w ); 542 479 b = gtk_button_new_with_mnemonic( _( "_Update Blocklist" ) ); 543 544 data = g_new0( struct blocklist_data, 1 );545 data->core = TR_CORE( core );546 480 data->check = w; 547 548 481 g_object_set_data( G_OBJECT( b ), "handle", tr_core_handle( TR_CORE( core ) ) ); 549 482 g_signal_connect( b, "clicked", G_CALLBACK(onUpdateBlocklistCB), data ); … … 553 486 hig_workarea_add_wide_control( t, &row, h ); 554 487 555 s = _("_Ignore unencrypted peers"); 556 w = gtk_check_button_new_with_mnemonic( s ); 557 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(w), 558 pref_int_get(PREF_KEY_ENCRYPTION)==TR_ENCRYPTION_REQUIRED ); 559 g_signal_connect( w, "toggled", G_CALLBACK(onEncryptionToggled), core ); 488 s = _( "_Enable automatic updates" ); 489 w = new_check_button( s, PREF_KEY_BLOCKLIST_UPDATES_ENABLED, core ); 560 490 hig_workarea_add_wide_control( t, &row, w ); 561 562 s = _("Use peer e_xchange"); 563 w = new_check_button( s, PREF_KEY_PEX, core ); 564 hig_workarea_add_wide_control( t, &row, w ); 565 566 h = gtk_hbox_new( FALSE, GUI_PAD_BIG ); 567 w2 = new_spin_button( PREF_KEY_PORT, core, 1, INT_MAX, 1 ); 568 gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 ); 569 l = gtk_label_new( NULL ); 570 gtk_misc_set_alignment( GTK_MISC(l), 0.0f, 0.5f ); 571 gtk_box_pack_start( GTK_BOX(h), l, FALSE, FALSE, 0 ); 572 hig_workarea_add_row( t, &row, _("Listening _port:"), h, w2 ); 573 574 g_object_set_data( G_OBJECT(l), "tr-port-spin", w2 ); 575 g_object_set_data( G_OBJECT(l), "alive", alive ); 576 g_object_set_data( G_OBJECT(l), "handle", tr_core_handle( TR_CORE( core ) ) ); 577 testing_port_cb( NULL, l ); 578 g_signal_connect( w2, "value-changed", G_CALLBACK(testing_port_cb), l ); 491 g_signal_connect( data->check, "toggled", G_CALLBACK(target_cb), w ); 492 target_cb( data->check, w ); 579 493 580 494 hig_workarea_add_section_divider( t, &row ); -
trunk/gtk/tr-prefs.h
r6686 r6687 57 57 #define PREF_KEY_MAX_PEERS_PER_TORRENT "max-peers-per-torrent" 58 58 #define PREF_KEY_BLOCKLIST_ENABLED "blocklist-enabled" 59 #define PREF_KEY_BLOCKLIST_UPDATES_ENABLED "blocklist-updates-enabled" 59 60 #define PREF_KEY_MAIN_WINDOW_HEIGHT "main-window-height" 60 61 #define PREF_KEY_MAIN_WINDOW_WIDTH "main-window-width" -
trunk/gtk/util.c
r6588 r6687 173 173 } 174 174 175 gboolean 175 int 176 176 mkdir_p( const char * path, mode_t mode ) 177 177 { -
trunk/gtk/util.h
r6559 r6687 41 41 42 42 /* return a human-readable string for the size given in bytes. */ 43 char* tr_strlsize( char * buf, guint64size, size_t buflen );43 char* tr_strlsize( char * buf, uint64_t size, size_t buflen ); 44 44 45 45 /* return a human-readable string for the transfer rate given in bytes. */ … … 55 55 56 56 /* create a directory and any missing parent directories */ 57 gboolean 58 mkdir_p(const char *name, mode_t mode); 57 int mkdir_p(const char *name, mode_t mode); 59 58 60 59 /* create a copy of a GSList of strings, this dups the actual strings too */ -
trunk/po/POTFILES.in
r5990 r6687 2 2 gtk/actions.c 3 3 gtk/add-dialog.c 4 gtk/blocklist.c 4 5 gtk/conf.c 5 6 gtk/details.c
Note: See TracChangeset
for help on using the changeset viewer.