(gtk) add options to set global & per-torrent peer connection limits

This commit is contained in:
Charles Kerr 2007-12-22 00:06:38 +00:00
parent ccc804e06a
commit 93f69d2b5c
7 changed files with 129 additions and 73 deletions

View File

@ -1534,12 +1534,14 @@ dl_speed_toggled_cb (GtkToggleButton *tb, gpointer gtor)
}
#if 0
static void
seeding_cap_toggled_cb (GtkToggleButton *tb, gpointer gtor)
{
tr_torrent_set_seeding_cap_enabled (TR_TORRENT(gtor),
gtk_toggle_button_get_active(tb));
}
#endif
static void
sensitize_from_check_cb (GtkToggleButton *toggle, gpointer w)
@ -1566,16 +1568,27 @@ dl_speed_spun_cb (GtkSpinButton *spin, gpointer gtor)
setSpeedLimit( spin, gtor, TR_DOWN );
}
#if 0
static void
seeding_ratio_spun_cb (GtkSpinButton *spin, gpointer gtor)
{
tr_torrent_set_seeding_cap_ratio (TR_TORRENT(gtor),
gtk_spin_button_get_value(spin));
}
#endif
static void
max_peers_spun_cb( GtkSpinButton * spin, gpointer gtor )
{
const uint16_t maxConnectedPeers = gtk_spin_button_get_value( spin );
tr_torrentSetPeerLimits( tr_torrent_handle( gtor ), maxConnectedPeers, 0 );
}
GtkWidget*
options_page_new ( TrTorrent * gtor )
{
uint8_t maxUnchokedPeers;
uint16_t maxConnectedPeers;
int i, row;
gboolean b;
GtkAdjustment *a;
@ -1614,9 +1627,16 @@ options_page_new ( TrTorrent * gtor )
hig_workarea_add_row_w (t, &row, tb, w, NULL);
hig_workarea_add_section_divider (t, &row);
hig_workarea_add_section_title (t, &row, _("Seeding"));
hig_workarea_add_section_title (t, &row, _("Peer Connections"));
hig_workarea_add_section_spacer (t, row, 1);
tr_torrentGetPeerLimits( tor, &maxConnectedPeers, &maxUnchokedPeers );
w = gtk_spin_button_new_with_range( 1, 3000, 5 );
gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), maxConnectedPeers );
hig_workarea_add_row( t, &row, _( "Maximum connected peers:" ), w, NULL );
g_signal_connect( w, "value-changed", G_CALLBACK( max_peers_spun_cb ), gtor );
#if 0
tb = gtk_check_button_new_with_mnemonic (_("_Stop Seeding at Ratio:"));
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(tb), gtor->seeding_cap_enabled);
g_signal_connect (tb, "toggled", G_CALLBACK(seeding_cap_toggled_cb), gtor);
@ -1626,6 +1646,7 @@ options_page_new ( TrTorrent * gtor )
g_signal_connect (tb, "toggled", G_CALLBACK(sensitize_from_check_cb), w);
sensitize_from_check_cb (GTK_TOGGLE_BUTTON(tb), w);
hig_workarea_add_row_w (t, &row, tb, w, NULL);
#endif
hig_workarea_finish (t, &row);
return t;

View File

@ -306,14 +306,18 @@ setSort( TrCore * core, const char * mode, gboolean isReversed )
static void
prefsChanged( TrCore * core, const char * key, gpointer data UNUSED )
{
if( !strcmp( key, PREF_KEY_SORT_MODE )
|| !strcmp( key, PREF_KEY_SORT_REVERSED ) )
if( !strcmp( key, PREF_KEY_SORT_MODE ) || !strcmp( key, PREF_KEY_SORT_REVERSED ) )
{
char * mode = pref_string_get( PREF_KEY_SORT_MODE );
gboolean isReversed = pref_flag_get( PREF_KEY_SORT_REVERSED );
setSort( core, mode, isReversed );
g_free( mode );
}
else if( !strcmp( key, PREF_KEY_MAX_PEERS_GLOBAL ) )
{
const uint16_t val = pref_int_get( key );
tr_setGlobalPeerLimit( core->handle, val );
}
}
static void
@ -383,6 +387,7 @@ tr_core_new( void )
g_signal_connect( core, "prefs-changed", G_CALLBACK(prefsChanged), NULL );
prefsChanged( core, PREF_KEY_SORT_MODE, NULL );
prefsChanged( core, PREF_KEY_SORT_REVERSED, NULL );
prefsChanged( core, PREF_KEY_MAX_PEERS_GLOBAL, NULL );
return core;
}
@ -462,6 +467,7 @@ tr_core_load( TrCore * self, gboolean paused )
ctor = tr_ctorNew( self->handle );
tr_ctorSetPaused( ctor, TR_FORCE, paused );
tr_ctorSetDestination( ctor, TR_FALLBACK, path );
tr_ctorSetMaxConnectedPeers( ctor, TR_FALLBACK, pref_int_get( PREF_KEY_MAX_PEERS_PER_TORRENT ) );
torrents = tr_loadTorrents ( self->handle, ctor, &count );
for( i=0; i<count; ++i )

View File

@ -29,6 +29,9 @@ tr_prefs_init_global( void )
{
cf_check_older_configs( );
pref_int_set_default ( PREF_KEY_MAX_PEERS_GLOBAL, 400 );
pref_int_set_default ( PREF_KEY_MAX_PEERS_PER_TORRENT, 60 );
pref_string_set_default ( PREF_KEY_STATUS_BAR_STATS, "total-ratio" );
pref_flag_set_default ( PREF_KEY_STATUS_BAR, TRUE );
pref_flag_set_default ( PREF_KEY_TOOLBAR, TRUE );
@ -299,6 +302,15 @@ tr_prefs_dialog_new( GObject * core, GtkWindow * parent )
s = _("For torrents added from _command-line:");
l = hig_workarea_add_row( t, &row, s, w, NULL );
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Peer Connections" ) );
hig_workarea_add_section_spacer(t , row, 2 );
w = new_spin_button( PREF_KEY_MAX_PEERS_GLOBAL, core, 1, 3000 );
hig_workarea_add_row( t, &row, _( "Global maximum connected peers:" ), w, NULL );
w = new_spin_button( PREF_KEY_MAX_PEERS_PER_TORRENT, core, 1, 300 );
hig_workarea_add_row( t, &row, _( "Maximum connected peers for new torrents:" ), w, NULL );
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title (t, &row, _("Network"));
hig_workarea_add_section_spacer (t, row, 2);

View File

@ -20,27 +20,30 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent );
/* if you add a key here, you /must/ add its
* default in tr_prefs_init_global( void ) */
#define PREF_KEY_DL_LIMIT_ENABLED "download-limit-enabled"
#define PREF_KEY_DL_LIMIT "download-limit"
#define PREF_KEY_UL_LIMIT_ENABLED "upload-limit-enabled"
#define PREF_KEY_UL_LIMIT "upload-limit"
#define PREF_KEY_DIR_ASK "prompt-for-download-directory"
#define PREF_KEY_DIR_DEFAULT "default-download-directory"
#define PREF_KEY_ADDSTD "add-behavior-standard"
#define PREF_KEY_ADDIPC "add-behavior-ipc"
#define PREF_KEY_PORT "listening-port"
#define PREF_KEY_NAT "nat-traversal-enabled"
#define PREF_KEY_PEX "pex-enabled"
#define PREF_KEY_SYSTRAY "system-tray-icon-enabled"
#define PREF_KEY_ASKQUIT "prompt-before-exit"
#define PREF_KEY_ENCRYPTED_ONLY "encrypted-connections-only"
#define PREF_KEY_MSGLEVEL "debug-message-level"
#define PREF_KEY_SORT_MODE "sort-mode"
#define PREF_KEY_SORT_REVERSED "sort-reversed"
#define PREF_KEY_MINIMAL_VIEW "minimal-view"
#define PREF_KEY_STATUS_BAR "show-status-bar"
#define PREF_KEY_STATUS_BAR_STATS "status-bar-stats"
#define PREF_KEY_TOOLBAR "show-toolbar"
#define PREF_KEY_DL_LIMIT_ENABLED "download-limit-enabled"
#define PREF_KEY_DL_LIMIT "download-limit"
#define PREF_KEY_UL_LIMIT_ENABLED "upload-limit-enabled"
#define PREF_KEY_UL_LIMIT "upload-limit"
#define PREF_KEY_DIR_ASK "prompt-for-download-directory"
#define PREF_KEY_DIR_DEFAULT "default-download-directory"
#define PREF_KEY_ADDSTD "add-behavior-standard"
#define PREF_KEY_ADDIPC "add-behavior-ipc"
#define PREF_KEY_PORT "listening-port"
#define PREF_KEY_NAT "nat-traversal-enabled"
#define PREF_KEY_PEX "pex-enabled"
#define PREF_KEY_SYSTRAY "system-tray-icon-enabled"
#define PREF_KEY_ASKQUIT "prompt-before-exit"
#define PREF_KEY_ENCRYPTED_ONLY "encrypted-connections-only"
#define PREF_KEY_MSGLEVEL "debug-message-level"
#define PREF_KEY_SORT_MODE "sort-mode"
#define PREF_KEY_SORT_REVERSED "sort-reversed"
#define PREF_KEY_MINIMAL_VIEW "minimal-view"
#define PREF_KEY_STATUS_BAR "show-status-bar"
#define PREF_KEY_STATUS_BAR_STATS "status-bar-stats"
#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"
void tr_prefs_init_global( void );

View File

@ -175,78 +175,91 @@ tr_torrent_new_preexisting( tr_torrent * tor )
return maketorrent( tor );
}
TrTorrent *
tr_torrent_new( tr_handle * back, const char *torrent, const char *dir,
enum tr_torrent_action act, gboolean paused, char **err )
tr_torrent_new( tr_handle * handle,
const char * metainfo_filename,
const char * destination,
enum tr_torrent_action act,
gboolean paused,
char ** err )
{
TrTorrent *ret;
tr_torrent *handle;
int errcode;
TrTorrent * ret;
tr_torrent * tor;
tr_ctor * ctor;
int errcode = -1;
g_assert(NULL != dir);
g_assert( destination );
*err = NULL;
errcode = -1;
handle = tr_torrentInit( back, torrent, dir, paused, &errcode );
if(NULL == handle) {
switch(errcode) {
ctor = tr_ctorNew( handle );
tr_ctorSetMetainfoFromFile( ctor, metainfo_filename );
tr_ctorSetDestination( ctor, TR_FORCE, destination );
tr_ctorSetPaused( ctor, TR_FORCE, paused );
tr_ctorSetMaxConnectedPeers( ctor, TR_FORCE, pref_int_get( PREF_KEY_MAX_PEERS_PER_TORRENT ) );
tor = tr_torrentNew( handle, ctor, &errcode );
tr_ctorFree( ctor );
if( tor == NULL ) {
switch( errcode ) {
case TR_EINVALID:
*err = g_strdup_printf(_("%s: not a valid torrent file"), torrent);
*err = g_strdup_printf(_("%s: not a valid torrent file"), metainfo_filename );
break;
case TR_EDUPLICATE:
*err = g_strdup_printf(_("%s: torrent is already open"), torrent);
*err = g_strdup_printf(_("%s: torrent is already open"), metainfo_filename );
break;
default:
*err = g_strdup(torrent);
*err = g_strdup( metainfo_filename );
break;
}
return NULL;
}
ret = maketorrent( handle );
ret = maketorrent( tor );
if( TR_TOR_MOVE == act )
ret->delfile = g_strdup(torrent);
ret->delfile = g_strdup( metainfo_filename );
return ret;
}
TrTorrent *
tr_torrent_new_with_data( tr_handle * back, uint8_t * data, size_t size,
const char * dir, gboolean paused, char ** err )
tr_torrent_new_with_data( tr_handle * handle,
uint8_t * metainfo,
size_t size,
const char * destination,
gboolean paused,
char ** err )
{
tr_torrent * handle;
int errcode;
tr_torrent * tor;
tr_ctor * ctor;
int errcode = -1;
g_assert( NULL != dir );
g_assert( destination );
*err = NULL;
*err = NULL;
errcode = -1;
handle = tr_torrentInitData( back, data, size, dir, paused, &errcode );
if( NULL == handle )
{
switch( errcode )
{
case TR_EINVALID:
*err = g_strdup( _("not a valid torrent file") );
break;
case TR_EDUPLICATE:
*err = g_strdup( _("torrent is already open") );
break;
default:
*err = g_strdup( "" );
break;
}
return NULL;
ctor = tr_ctorNew( handle );
tr_ctorSetMetainfo( ctor, metainfo, size );
tr_ctorSetDestination( ctor, TR_FORCE, destination );
tr_ctorSetPaused( ctor, TR_FORCE, paused );
tr_ctorSetMaxConnectedPeers( ctor, TR_FORCE, pref_int_get( PREF_KEY_MAX_PEERS_PER_TORRENT ) );
tor = tr_torrentNew( handle, ctor, &errcode );
if( tor == NULL ) {
switch( errcode ) {
case TR_EINVALID:
*err = g_strdup( _("not a valid torrent file") );
break;
case TR_EDUPLICATE:
*err = g_strdup( _("torrent is already open") );
break;
default:
*err = g_strdup( "" );
break;
}
return NULL;
}
return maketorrent( handle );
return maketorrent( tor );
}
void

View File

@ -1304,7 +1304,7 @@ tr_torrentSetFileDLs ( tr_torrent * tor,
void
tr_torrentSetPeerLimits( tr_torrent * tor,
uint16_t maxConnectedPeers,
uint16_t maxUnchokedPeers )
uint8_t maxUnchokedPeers )
{
if( maxConnectedPeers )
tor->maxConnectedPeers = maxConnectedPeers;
@ -1315,7 +1315,7 @@ tr_torrentSetPeerLimits( tr_torrent * tor,
void
tr_torrentGetPeerLimits( const tr_torrent * tor,
uint16_t * maxConnectedPeers,
uint16_t * maxUnchokedPeers )
uint8_t * maxUnchokedPeers )
{
if( maxConnectedPeers )
*maxConnectedPeers = tor->maxConnectedPeers;

View File

@ -278,13 +278,14 @@ void tr_getGlobalSpeedLimit( tr_handle * handle,
*** Peer Limits
**/
/* pass `0' to a field here to leave it unchanged */
void tr_torrentSetPeerLimits( tr_torrent * tor,
uint16_t maxConnectedPeers,
uint16_t maxUnchokedPeers );
uint8_t maxUnchokedPeers );
void tr_torrentGetPeerLimits( const tr_torrent * tor,
uint16_t * maxConnectedPeers,
uint16_t * maxUnchokedPeers );
uint8_t * maxUnchokedPeers );
void tr_setGlobalPeerLimit( tr_handle * handle,
uint16_t maxGlobalPeers );