From effb78d67426e10cf4e3bda43476533919de2f0a Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Thu, 12 Jun 2008 16:25:36 +0000 Subject: [PATCH] unify the daemon and gtk client's config files so that you can easily swap back and forth between clients and keep the same torrents and preferences. --- daemon/daemon.c | 215 ++++++++++++++++----------------- gtk/actions.c | 3 +- gtk/add-dialog.c | 6 +- gtk/conf.c | 244 ++++++++++++++++++++++++++------------ gtk/conf.h | 22 ++-- gtk/main.c | 34 ++---- gtk/tr-core.c | 13 +- gtk/tr-prefs.c | 31 +++-- gtk/tr-prefs.h | 8 +- gtk/tr-window.c | 6 +- libtransmission/bencode.h | 2 - libtransmission/stats.c | 21 +++- libtransmission/torrent.c | 2 +- 13 files changed, 348 insertions(+), 259 deletions(-) diff --git a/daemon/daemon.c b/daemon/daemon.c index 9e31e2b23..4c76aee45 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -36,50 +36,98 @@ static char myConfigFilename[MAX_PATH_LENGTH]; #define KEY_BLOCKLIST "blocklist-enabled" #define KEY_DOWNLOAD_DIR "download-dir" #define KEY_ENCRYPTION "encryption" -#define KEY_PEER_LIMIT "peer-limit" +#define KEY_PEER_LIMIT "max-peers-global" #define KEY_PEER_PORT "peer-port" #define KEY_PORT_FORWARDING "port-forwarding-enabled" #define KEY_PEX_ENABLED "pex-enabled" -#define KEY_AUTH_REQUIRED "rpc-auth-required" +#define KEY_AUTH_REQUIRED "rpc-authentication-required" #define KEY_USERNAME "rpc-username" #define KEY_PASSWORD "rpc-password" -#define KEY_ACL "rpc-acl" +#define KEY_ACL "rpc-access-control-list" #define KEY_RPC_PORT "rpc-port" -#define KEY_DSPEED "speed-limit-down" -#define KEY_DSPEED_ENABLED "speed-limit-down-enabled" -#define KEY_USPEED "speed-limit-up" -#define KEY_USPEED_ENABLED "speed-limit-up-enabled" +#define KEY_DSPEED "download-limit" +#define KEY_DSPEED_ENABLED "download-limit-enabled" +#define KEY_USPEED "upload-limit" +#define KEY_USPEED_ENABLED "upload-limit-enabled" -#define CONFIG_FILE "session.json" +#define CONFIG_FILE "settings.json" -const char * encryption_str[3] = { "tolerated", "preferred", "required" }; +/*** +**** Config File +***/ +static void +replaceInt( tr_benc * dict, const char * key, int64_t value ) +{ + tr_bencDictRemove( dict, key ); + tr_bencDictAddInt( dict, key, value ); +} +static void +replaceStr( tr_benc * dict, const char * key, const char* value ) +{ + tr_bencDictRemove( dict, key ); + tr_bencDictAddStr( dict, key, value ); +} static void saveState( tr_session * s ) { tr_benc d; - tr_bencInitDict( &d, 16 ); - tr_bencDictAddInt( &d, KEY_BLOCKLIST, tr_blocklistIsEnabled( s ) ); - tr_bencDictAddStr( &d, KEY_DOWNLOAD_DIR, tr_sessionGetDownloadDir( s ) ); - tr_bencDictAddInt( &d, KEY_PEER_LIMIT, tr_sessionGetPeerLimit( s ) ); - tr_bencDictAddInt( &d, KEY_PEER_PORT, tr_sessionGetPeerPort( s ) ); - tr_bencDictAddInt( &d, KEY_PORT_FORWARDING, tr_sessionIsPortForwardingEnabled( s ) ); - tr_bencDictAddInt( &d, KEY_PEX_ENABLED, tr_sessionIsPexEnabled( s ) ); - tr_bencDictAddStr( &d, KEY_USERNAME, tr_sessionGetRPCUsername( s ) ); - tr_bencDictAddStr( &d, KEY_PASSWORD, tr_sessionGetRPCPassword( s ) ); - tr_bencDictAddStr( &d, KEY_ACL, tr_sessionGetRPCACL( s ) ); - tr_bencDictAddInt( &d, KEY_RPC_PORT, tr_sessionGetRPCPort( s ) ); - tr_bencDictAddInt( &d, KEY_AUTH_REQUIRED, tr_sessionIsRPCPasswordEnabled( s ) ); - tr_bencDictAddInt( &d, KEY_DSPEED, tr_sessionGetSpeedLimit( s, TR_DOWN ) ); - tr_bencDictAddInt( &d, KEY_DSPEED_ENABLED, tr_sessionIsSpeedLimitEnabled( s, TR_DOWN ) ); - tr_bencDictAddInt( &d, KEY_USPEED, tr_sessionGetSpeedLimit( s, TR_UP ) ); - tr_bencDictAddInt( &d, KEY_USPEED_ENABLED, tr_sessionIsSpeedLimitEnabled( s, TR_UP ) ); - tr_bencDictAddStr( &d, KEY_ENCRYPTION, encryption_str[tr_sessionGetEncryption( s )] ); + if( tr_bencLoadJSONFile( myConfigFilename, &d ) ) + tr_bencInitDict( &d, 16 ); + + replaceInt( &d, KEY_BLOCKLIST, tr_blocklistIsEnabled( s ) ); + replaceStr( &d, KEY_DOWNLOAD_DIR, tr_sessionGetDownloadDir( s ) ); + replaceInt( &d, KEY_PEER_LIMIT, tr_sessionGetPeerLimit( s ) ); + replaceInt( &d, KEY_PEER_PORT, tr_sessionGetPeerPort( s ) ); + replaceInt( &d, KEY_PORT_FORWARDING, tr_sessionIsPortForwardingEnabled( s ) ); + replaceInt( &d, KEY_PEX_ENABLED, tr_sessionIsPexEnabled( s ) ); + replaceStr( &d, KEY_USERNAME, tr_sessionGetRPCUsername( s ) ); + replaceStr( &d, KEY_PASSWORD, tr_sessionGetRPCPassword( s ) ); + replaceStr( &d, KEY_ACL, tr_sessionGetRPCACL( s ) ); + replaceInt( &d, KEY_RPC_PORT, tr_sessionGetRPCPort( s ) ); + replaceInt( &d, KEY_AUTH_REQUIRED, tr_sessionIsRPCPasswordEnabled( s ) ); + replaceInt( &d, KEY_DSPEED, tr_sessionGetSpeedLimit( s, TR_DOWN ) ); + replaceInt( &d, KEY_DSPEED_ENABLED, tr_sessionIsSpeedLimitEnabled( s, TR_DOWN ) ); + replaceInt( &d, KEY_USPEED, tr_sessionGetSpeedLimit( s, TR_UP ) ); +fprintf( stderr, "session says its speed upload speed limit is %d\n", tr_sessionGetSpeedLimit( s, TR_UP ) ); + replaceInt( &d, KEY_USPEED_ENABLED, tr_sessionIsSpeedLimitEnabled( s, TR_UP ) ); + replaceInt( &d, KEY_ENCRYPTION, tr_sessionGetEncryption( s ) ); + tr_bencSaveJSONFile( myConfigFilename, &d ); tr_bencFree( &d ); tr_ninf( MY_NAME, "saved \"%s\"", myConfigFilename ); } +static void +getConfigInt( tr_benc * dict, + const char * key, + int * setme, + int defaultVal ) +{ + if( *setme < 0 ) { + int64_t i; + if( tr_bencDictFindInt( dict, key, &i ) ) + *setme = i; + else + *setme = defaultVal; + } +} + +static void +getConfigStr( tr_benc * dict, + const char * key, + const char ** setme, + const char * defaultVal ) +{ + if( !*setme ) { + const char * s; + if( tr_bencDictFindStr( dict, key, &s ) ) + *setme = s; + else + *setme = defaultVal; + } +} + /** * @param port port number, or -1 if not set in the command line * @param auth TRUE, FALSE, or -1 if not set on the command line @@ -92,41 +140,17 @@ session_init( const char * configDir, const char * downloadDir, int blocklistEnabled ) { char mycwd[MAX_PATH_LENGTH]; - tr_benc state; - int have_state; - int64_t i; - int64_t peer_port = TR_DEFAULT_PORT; - int64_t peers = TR_DEFAULT_GLOBAL_PEER_LIMIT; - int64_t pex_enabled = TR_DEFAULT_PEX_ENABLED; - int64_t fwd_enabled = TR_DEFAULT_PORT_FORWARDING_ENABLED; - int64_t up_limit = 100; - int64_t up_limited = FALSE; - int64_t down_limit = 100; - int64_t down_limited = FALSE; - int encryption = TR_ENCRYPTION_PREFERRED; + tr_benc state, *dict = NULL; + int peerPort=-1, peers=-1; + int pexEnabled = -1; + int fwdEnabled = -1; + int upLimit=-1, upLimited=-1, downLimit=-1, downLimited=-1; + int encryption = -1; tr_ctor * ctor; tr_torrent ** torrents; - if(( have_state = !tr_bencLoadJSONFile( myConfigFilename, &state ))) - { - const char * str; - tr_ninf( MY_NAME, "loading settings from \"%s\"", myConfigFilename ); - - tr_bencDictFindInt( &state, KEY_PEER_LIMIT, &peers ); - tr_bencDictFindInt( &state, KEY_PEX_ENABLED, &pex_enabled ); - tr_bencDictFindInt( &state, KEY_PEER_PORT, &peer_port ); - tr_bencDictFindInt( &state, KEY_PORT_FORWARDING, &fwd_enabled ); - tr_bencDictFindInt( &state, KEY_DSPEED, &down_limit ); - tr_bencDictFindInt( &state, KEY_DSPEED_ENABLED, &down_limited ); - tr_bencDictFindInt( &state, KEY_USPEED, &up_limit ); - tr_bencDictFindInt( &state, KEY_USPEED_ENABLED, &up_limited ); - if( tr_bencDictFindStr( &state, KEY_ENCRYPTION, &str ) ) { - if( !strcmp( str, "required" ) ) - encryption = TR_ENCRYPTION_REQUIRED; - else if( !strcmp( str, "tolerated" ) ) - encryption = TR_PLAINTEXT_PREFERRED; - } - } + if( !tr_bencLoadJSONFile( myConfigFilename, &state ) ) + dict = &state; /*** **** Decide on which values to pass into tr_sessionInitFull(). @@ -135,56 +159,23 @@ session_init( const char * configDir, const char * downloadDir, **** If neither of those can be found, the TR_DEFAULT fields are used . ***/ - /* authorization */ - if( authRequired < 0 ) { - if( have_state && tr_bencDictFindInt( &state, KEY_AUTH_REQUIRED, &i ) ) - authRequired = i; - if( authRequired < 0 ) - authRequired = FALSE; - } - - /* username */ - if( !username ) - tr_bencDictFindStr( &state, KEY_USERNAME, &username ); - - /* password */ - if( !password ) - tr_bencDictFindStr( &state, KEY_PASSWORD, &password ); - - /* acl */ - if( !acl ) { - if( have_state ) - tr_bencDictFindStr( &state, KEY_ACL, &acl ); - if( !acl ) - acl = TR_DEFAULT_RPC_ACL; - } - - /* rpc port */ - if( rpcPort < 0 ) { - if( have_state && tr_bencDictFindInt( &state, KEY_RPC_PORT, &i ) ) - rpcPort = i; - if( rpcPort < 0 ) - rpcPort = TR_DEFAULT_RPC_PORT; - } - - - /* blocklist */ - if( blocklistEnabled < 0 ) { - if( have_state && tr_bencDictFindInt( &state, KEY_BLOCKLIST, &i ) ) - blocklistEnabled = i; - if( blocklistEnabled < 0 ) - blocklistEnabled = TR_DEFAULT_BLOCKLIST_ENABLED; - } - - /* download dir */ - if( !downloadDir ) { - if( have_state ) - tr_bencDictFindStr( &state, KEY_DOWNLOAD_DIR, &downloadDir ); - if( !downloadDir ) { - getcwd( mycwd, sizeof( mycwd ) ); - downloadDir = mycwd; - } - } + getcwd( mycwd, sizeof( mycwd ) ); + getConfigStr( dict, KEY_DOWNLOAD_DIR, &downloadDir, mycwd ); + getConfigInt( dict, KEY_PEX_ENABLED, &pexEnabled, TR_DEFAULT_PEX_ENABLED ); + getConfigInt( dict, KEY_PORT_FORWARDING, &fwdEnabled, TR_DEFAULT_PORT_FORWARDING_ENABLED ); + getConfigInt( dict, KEY_PEER_PORT, &peerPort, TR_DEFAULT_PORT ); + getConfigInt( dict, KEY_DSPEED, &downLimit, 100 ); + getConfigInt( dict, KEY_DSPEED_ENABLED, &downLimited, FALSE ); + getConfigInt( dict, KEY_USPEED, &upLimit, 100 ); + getConfigInt( dict, KEY_USPEED_ENABLED, &upLimited, FALSE ); + getConfigInt( dict, KEY_PEER_LIMIT, &peers, TR_DEFAULT_GLOBAL_PEER_LIMIT ); + getConfigInt( dict, KEY_BLOCKLIST, &blocklistEnabled, TR_DEFAULT_BLOCKLIST_ENABLED ); + getConfigInt( dict, KEY_RPC_PORT, &rpcPort, TR_DEFAULT_RPC_PORT ); + getConfigStr( dict, KEY_ACL, &acl, TR_DEFAULT_RPC_ACL ); + getConfigInt( dict, KEY_AUTH_REQUIRED, &authRequired, FALSE ); + getConfigStr( dict, KEY_USERNAME, &username, NULL ); + getConfigStr( dict, KEY_PASSWORD, &password, NULL ); + getConfigInt( dict, KEY_ENCRYPTION, &encryption, TR_ENCRYPTION_PREFERRED ); /*** **** @@ -192,10 +183,10 @@ session_init( const char * configDir, const char * downloadDir, /* start the session */ mySession = tr_sessionInitFull( configDir, "daemon", downloadDir, - pex_enabled, fwd_enabled, peer_port, + pexEnabled, fwdEnabled, peerPort, encryption, - up_limit, up_limited, - down_limit, down_limited, + upLimited, upLimit, + downLimited, downLimit, peers, TR_MSG_INF, 0, blocklistEnabled, @@ -218,7 +209,7 @@ session_init( const char * configDir, const char * downloadDir, tr_free( torrents ); tr_ctorFree( ctor ); - if( have_state ) + if( dict ) tr_bencFree( &state ); } diff --git a/gtk/actions.c b/gtk/actions.c index e5862deeb..4a0c78555 100644 --- a/gtk/actions.c +++ b/gtk/actions.c @@ -207,7 +207,7 @@ actions_init( GtkUIManager * ui_manager, gpointer callback_user_data ) { int i, n; int active; - char * match; + const char * match; const int n_entries = G_N_ELEMENTS( entries ); GtkActionGroup * action_group; @@ -254,7 +254,6 @@ actions_init( GtkUIManager * ui_manager, gpointer callback_user_data ) gtk_ui_manager_insert_action_group( ui_manager, action_group, 0 ); g_object_unref (G_OBJECT(action_group)); - g_free( match ); } /**** diff --git a/gtk/add-dialog.c b/gtk/add-dialog.c index 3a50f33d4..7301a5893 100644 --- a/gtk/add-dialog.c +++ b/gtk/add-dialog.c @@ -290,7 +290,7 @@ addDialog( GtkWindow * parent, { GtkWidget * w; GtkWidget * c; - char * folder; + const char * folder; w = gtk_file_chooser_dialog_new( _( "Add a Torrent" ), parent, GTK_FILE_CHOOSER_ACTION_OPEN, @@ -305,10 +305,8 @@ addDialog( GtkWindow * parent, addTorrentFilters( GTK_FILE_CHOOSER( w ) ); g_signal_connect( w, "response", G_CALLBACK(onAddDialogResponse), core ); - if(( folder = pref_string_get( PREF_KEY_OPEN_DIALOG_FOLDER ))) { + if(( folder = pref_string_get( PREF_KEY_OPEN_DIALOG_FOLDER ))) gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( w ), folder ); - g_free( folder ); - } c = gtk_check_button_new_with_mnemonic( _( "Display _options dialog" ) ); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( c ), pref_flag_get( PREF_KEY_OPTIONS_PROMPT ) ); diff --git a/gtk/conf.c b/gtk/conf.c index 322c0fa8e..473370f61 100644 --- a/gtk/conf.c +++ b/gtk/conf.c @@ -51,9 +51,9 @@ cf_init(const char *dir, char **errstr) if( errstr != NULL ) *errstr = NULL; - gl_confdir = g_build_filename( dir, "gtk", NULL ); + gl_confdir = g_strdup( dir ); - if( mkdir_p(gl_confdir, 0755 ) ) + if( mkdir_p( gl_confdir, 0755 ) ) return TRUE; if( errstr != NULL ) @@ -122,64 +122,76 @@ cf_lock( char ** errstr ) return didLock; } -char* -cf_sockname( void ) -{ - assert( gl_confdir != NULL ); - return g_build_filename( gl_confdir, "socket", NULL ); -} - /*** **** **** Preferences **** ***/ -#define GROUP "general" - static char* getPrefsFilename( void ) { assert( gl_confdir != NULL ); - return g_build_filename( gl_confdir, "prefs.ini", NULL ); + return g_build_filename( gl_confdir, "settings.json", NULL ); } -static GKeyFile* -getPrefsKeyFile( void ) +static tr_benc* +getPrefs( void ) { - static GKeyFile * myKeyFile = NULL; + static tr_benc dict; + static gboolean loaded = FALSE; - if( myKeyFile == NULL ) + if( !loaded ) { char * filename = getPrefsFilename( ); - myKeyFile = g_key_file_new( ); - g_key_file_load_from_file( myKeyFile, filename, 0, NULL ); + if( tr_bencLoadJSONFile( filename, &dict ) ) + tr_bencInitDict( &dict, 100 ); g_free( filename ); + loaded = TRUE; } - return myKeyFile; + return &dict; } +/*** +**** +***/ + int -pref_int_get( const char * key ) { - return g_key_file_get_integer( getPrefsKeyFile( ), GROUP, key, NULL ); +pref_int_get( const char * key ) +{ + int64_t i; + tr_bencDictFindInt( getPrefs( ), key, &i ); + return i; } void -pref_int_set( const char * key, int value ) { - g_key_file_set_integer( getPrefsKeyFile( ), GROUP, key, value ); +pref_int_set( const char * key, int value ) +{ + tr_benc * d = getPrefs( ); + tr_bencDictRemove( d, key ); + tr_bencDictAddInt( d, key, value ); } void -pref_int_set_default( const char * key, int value ) { - if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) ) +pref_int_set_default( const char * key, int value ) +{ + if( !tr_bencDictFind( getPrefs( ), key ) ) pref_int_set( key, value ); } +/*** +**** +***/ + gboolean -pref_flag_get ( const char * key ) { - return g_key_file_get_boolean( getPrefsKeyFile( ), GROUP, key, NULL ); +pref_flag_get ( const char * key ) +{ + int64_t i; + tr_bencDictFindInt( getPrefs( ), key, &i ); + return i != 0; } gboolean -pref_flag_eval( pref_flag_t val, const char * key ) { +pref_flag_eval( pref_flag_t val, const char * key ) +{ switch( val ) { case PREF_FLAG_TRUE: return TRUE; case PREF_FLAG_FALSE: return FALSE; @@ -187,54 +199,56 @@ pref_flag_eval( pref_flag_t val, const char * key ) { } } void -pref_flag_set( const char * key, gboolean value ) { - g_key_file_set_boolean( getPrefsKeyFile( ), GROUP, key, value ); +pref_flag_set( const char * key, gboolean value ) +{ + pref_int_set( key, value!=0 ); } void -pref_flag_set_default( const char * key, gboolean value ) { - if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) ) - pref_flag_set( key, value ); +pref_flag_set_default( const char * key, gboolean value ) +{ + pref_int_set_default( key, value!=0 ); } -char* -pref_string_get( const char * key ) { - return g_key_file_get_string( getPrefsKeyFile( ), GROUP, key, NULL ); +/*** +**** +***/ + +const char* +pref_string_get( const char * key ) +{ + const char * str = NULL; + tr_bencDictFindStr( getPrefs( ), key, &str ); + return str; } + void -pref_string_set( const char * key, const char * value ) { - g_key_file_set_string( getPrefsKeyFile( ), GROUP, key, value ); +pref_string_set( const char * key, const char * value ) +{ + tr_benc * d = getPrefs( ); + tr_bencDictRemove( d, key ); + tr_bencDictAddStr( d, key, value ); } + void -pref_string_set_default( const char * key, const char * value ) { - if( !g_key_file_has_key( getPrefsKeyFile( ), GROUP, key, NULL ) ) +pref_string_set_default( const char * key, const char * value ) +{ + if( !tr_bencDictFind( getPrefs( ), key ) ) pref_string_set( key, value ); } +/*** +**** +***/ + void -pref_save(char **errstr) +pref_save( void ) { - gsize datalen; - GError * err = NULL; - char * data; - char * filename; - char * path; - - filename = getPrefsFilename( ); - path = g_path_get_dirname( filename ); - mkdir_p( path, 0755 ); - - data = g_key_file_to_data( getPrefsKeyFile(), &datalen, &err ); - if( !err ) { - GIOChannel * out = g_io_channel_new_file( filename, "w+", &err ); - g_io_channel_write_chars( out, data, datalen, NULL, &err ); - g_io_channel_unref( out ); - } + char * filename = getPrefsFilename( ); + char * path = g_path_get_dirname( filename ); - if( errstr != NULL ) - *errstr = err ? g_strdup( err->message ) : NULL; + mkdir_p( path, 0755 ); + tr_bencSaveJSONFile( filename, getPrefs( ) ); - g_clear_error( &err ); - g_free( data ); g_free( path ); g_free( filename ); } @@ -257,19 +271,26 @@ tr_file_set_contents( const char * filename, const void * out, size_t len, GErro #endif static char* -getCompat08PrefsFilename( void ) +getCompat080PrefsFilename( void ) { assert( gl_confdir != NULL ); return g_build_filename( g_get_home_dir(), ".transmission", "gtk", "prefs", NULL ); } static char* -getCompat09PrefsFilename( void ) +getCompat090PrefsFilename( void ) { assert( gl_confdir != NULL ); return g_build_filename( g_get_home_dir(), ".transmission", "gtk", "prefs.ini", NULL ); } +static char* +getCompat121PrefsFilename( void ) +{ + assert( gl_confdir != NULL ); + return g_build_filename( gl_confdir, "prefs.ini", NULL ); +} + static void translate_08_to_09( const char* oldfile, const char* newfile ) { @@ -321,22 +342,95 @@ translate_08_to_09( const char* oldfile, const char* newfile ) g_free( contents ); } +static void +translate_keyfile_to_json( const char * old_file, const char * new_file ) +{ + tr_benc dict; + GKeyFile * keyfile; + gchar ** keys; + gsize i; + gsize length; + + static struct pref_entry { + const char* oldkey; + const char* newkey; + } renamed[] = { + { "default-download-directory", "download-dir" }, + { "listening-port", "peer-port" }, + { "nat-traversal-enabled", "port-forwarding-enabled" }, + { "encrypted-connections-only", "encryption" } + }; + + keyfile = g_key_file_new( ); + g_key_file_load_from_file( keyfile, old_file, 0, NULL ); + length = 0; + keys = g_key_file_get_keys( keyfile, "general", &length, NULL ); + + tr_bencInitDict( &dict, length ); + for( i=0; icore ); - if( !strcmp( key, PREF_KEY_ENCRYPTED_ONLY ) ) + if( !strcmp( key, PREF_KEY_ENCRYPTION ) ) { - const gboolean crypto_only = pref_flag_get( key ); - tr_sessionSetEncryption( tr, crypto_only ? TR_ENCRYPTION_REQUIRED - : TR_ENCRYPTION_PREFERRED ); + const int encryption = pref_int_get( key ); +g_message( "setting encryption to %d", encryption ); + tr_sessionSetEncryption( tr, encryption ); } else if( !strcmp( key, PREF_KEY_PORT ) ) { @@ -928,7 +926,7 @@ prefschanged( TrCore * core UNUSED, const char * key, gpointer data ) const int limit = pref_int_get( key ); tr_sessionSetSpeedLimit( tr, TR_UP, limit ); } - else if( !strcmp( key, PREF_KEY_NAT ) ) + else if( !strcmp( key, PREF_KEY_PORT_FORWARDING ) ) { const gboolean enabled = pref_flag_get( key ); tr_sessionSetPortForwardingEnabled( tr, enabled ); @@ -953,21 +951,18 @@ prefschanged( TrCore * core UNUSED, const char * key, gpointer data ) else if( !strcmp( key, PREF_KEY_RPC_ACL ) ) { char * err = NULL; - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetRPCACL( tr, s, &err ); - g_free( s ); } else if( !strcmp( key, PREF_KEY_RPC_USERNAME ) ) { - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetRPCUsername( tr, s ); - g_free( s ); } else if( !strcmp( key, PREF_KEY_RPC_PASSWORD ) ) { - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetRPCPassword( tr, s ); - g_free( s ); } else if( !strcmp( key, PREF_KEY_RPC_AUTH_ENABLED ) ) { @@ -976,9 +971,8 @@ prefschanged( TrCore * core UNUSED, const char * key, gpointer data ) } else if( !strcmp( key, PREF_KEY_PROXY_SERVER ) ) { - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetProxy( tr, s ); - g_free( s ); } else if( !strcmp( key, PREF_KEY_PROXY_TYPE ) ) { @@ -997,15 +991,13 @@ prefschanged( TrCore * core UNUSED, const char * key, gpointer data ) } else if( !strcmp( key, PREF_KEY_PROXY_USERNAME ) ) { - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetProxyUsername( tr, s ); - g_free( s ); } else if( !strcmp( key, PREF_KEY_PROXY_PASSWORD ) ) { - char * s = pref_string_get( key ); + const char * s = pref_string_get( key ); tr_sessionSetProxyPassword( tr, s ); - g_free( s ); } } diff --git a/gtk/tr-core.c b/gtk/tr-core.c index 967b4f60f..14b465266 100644 --- a/gtk/tr-core.c +++ b/gtk/tr-core.c @@ -125,7 +125,7 @@ tr_core_dispose( GObject * obj ) { GObjectClass * parent; - pref_save( NULL ); + pref_save( ); core->priv = NULL; parent = g_type_class_peek( g_type_parent( TR_CORE_TYPE ) ); @@ -386,9 +386,8 @@ tr_core_apply_defaults( tr_ctor * ctor ) pref_int_get( PREF_KEY_MAX_PEERS_PER_TORRENT ) ); if( tr_ctorGetDownloadDir( ctor, TR_FORCE, NULL ) ) { - char * path = pref_string_get( PREF_KEY_DOWNLOAD_DIR ); + const char * path = pref_string_get( PREF_KEY_DOWNLOAD_DIR ); tr_ctorSetDownloadDir( ctor, TR_FORCE, path ); - g_free( path ); } } @@ -493,10 +492,9 @@ prefsChanged( TrCore * core, const char * key, gpointer data UNUSED ) if( !strcmp( key, PREF_KEY_SORT_MODE ) || !strcmp( key, PREF_KEY_SORT_REVERSED ) ) { - char * mode = pref_string_get( PREF_KEY_SORT_MODE ); + const 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 ) ) { @@ -1027,20 +1025,19 @@ tr_core_set_hibernation_allowed( TrCore * core, gboolean allowed ) static void commitPrefsChange( TrCore * core, const char * key ) { - pref_save( NULL ); + pref_save( ); g_signal_emit( core, TR_CORE_GET_CLASS(core)->prefsig, 0, key ); } void tr_core_set_pref( TrCore * self, const char * key, const char * newval ) { - char * oldval = pref_string_get( key ); + const char * oldval = pref_string_get( key ); if( tr_strcmp( oldval, newval ) ) { pref_string_set( key, newval ); commitPrefsChange( self, key ); } - g_free( oldval ); } void diff --git a/gtk/tr-prefs.c b/gtk/tr-prefs.c index f61a69a15..0919efc7e 100644 --- a/gtk/tr-prefs.c +++ b/gtk/tr-prefs.c @@ -93,10 +93,10 @@ tr_prefs_init_global( void ) pref_int_set_default ( PREF_KEY_PORT, TR_DEFAULT_PORT ); - pref_flag_set_default ( PREF_KEY_NAT, TRUE ); + pref_flag_set_default ( PREF_KEY_PORT_FORWARDING, TRUE ); pref_flag_set_default ( PREF_KEY_PEX, TR_DEFAULT_PEX_ENABLED ); pref_flag_set_default ( PREF_KEY_ASKQUIT, TRUE ); - pref_flag_set_default ( PREF_KEY_ENCRYPTED_ONLY, FALSE ); + pref_flag_set_default ( PREF_KEY_ENCRYPTION, TR_ENCRYPTION_PREFERRED ); pref_int_set_default ( PREF_KEY_MSGLEVEL, TR_MSG_INF ); @@ -118,7 +118,7 @@ tr_prefs_init_global( void ) pref_string_set_default( PREF_KEY_RPC_PASSWORD, pw ); pref_flag_set_default ( PREF_KEY_RPC_AUTH_ENABLED, FALSE ); - pref_save( NULL ); + pref_save( ); } /** @@ -191,12 +191,11 @@ static GtkWidget* new_entry( const char * key, gpointer core ) { GtkWidget * w = gtk_entry_new( ); - char * value = pref_string_get( key ); + const char * value = pref_string_get( key ); if( value ) gtk_entry_set_text( GTK_ENTRY( w ), value ); g_object_set_data_full( G_OBJECT(w), PREF_KEY, g_strdup(key), g_free ); g_signal_connect( w, "changed", G_CALLBACK(entry_changed_cb), core ); - g_free( value ); return w; } @@ -214,11 +213,10 @@ new_path_chooser_button( const char * key, gpointer core ) { GtkWidget * w = gtk_file_chooser_button_new( NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ); - char * path = pref_string_get( key ); + const char * path = pref_string_get( key ); g_object_set_data_full( G_OBJECT(w), PREF_KEY, g_strdup(key), g_free ); g_signal_connect( w, "selection-changed", G_CALLBACK(chosen_cb), core ); gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(w), path ); - g_free( path ); return w; } @@ -496,6 +494,15 @@ onUpdateBlocklistCB( GtkButton * w, gpointer gdata ) tr_webRun( handle, url, NULL, got_blocklist, data ); } +static void +onEncryptionToggled( GtkToggleButton * w, gpointer core ) +{ + const int val = gtk_toggle_button_get_active( w ) + ? TR_ENCRYPTION_REQUIRED + : TR_ENCRYPTION_PREFERRED; + tr_core_set_pref_int( TR_CORE( core ), PREF_KEY_ENCRYPTION, val ); +} + static GtkWidget* peerPage( GObject * core, gboolean * alive ) { @@ -530,7 +537,10 @@ peerPage( GObject * core, gboolean * alive ) hig_workarea_add_wide_control( t, &row, h ); s = _("_Ignore unencrypted peers"); - w = new_check_button( s, PREF_KEY_ENCRYPTED_ONLY, core ); + w = gtk_check_button_new_with_mnemonic( s ); + gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(w), + pref_int_get(PREF_KEY_ENCRYPTION)==TR_ENCRYPTION_REQUIRED ); + g_signal_connect( w, "toggled", G_CALLBACK(onEncryptionToggled), core ); hig_workarea_add_wide_control( t, &row, w ); s = _("Use peer e_xchange"); @@ -810,7 +820,7 @@ remotePage( GObject * core ) /* access control list */ { - char * val = pref_string_get( PREF_KEY_RPC_ACL ); + const char * val = pref_string_get( PREF_KEY_RPC_ACL ); GtkTreeModel * m = acl_tree_model_new( val ); GtkTreeViewColumn * c; GtkCellRenderer * r; @@ -852,7 +862,6 @@ remotePage( GObject * core ) w = hig_workarea_add_row( t, &row, s, w, NULL ); gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.1f ); page->widgets = g_slist_append( page->widgets, w ); - g_free( val ); /* permission column */ m = allow_deny_model_new( ); @@ -971,7 +980,7 @@ networkPage( GObject * core ) hig_workarea_add_section_title (t, &row, _( "Router" ) ); s = _("Use port _forwarding from my router" ); - w = new_check_button( s, PREF_KEY_NAT, core ); + w = new_check_button( s, PREF_KEY_PORT_FORWARDING, core ); hig_workarea_add_wide_control( t, &row, w ); hig_workarea_add_section_divider( t, &row ); diff --git a/gtk/tr-prefs.h b/gtk/tr-prefs.h index 9bb6a6895..e480ed013 100644 --- a/gtk/tr-prefs.h +++ b/gtk/tr-prefs.h @@ -25,7 +25,7 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent ); #define PREF_KEY_UL_LIMIT_ENABLED "upload-limit-enabled" #define PREF_KEY_UL_LIMIT "upload-limit" #define PREF_KEY_OPTIONS_PROMPT "show-options-window" -#define PREF_KEY_DOWNLOAD_DIR "default-download-directory" +#define PREF_KEY_DOWNLOAD_DIR "download-dir" #define PREF_KEY_OPEN_DIALOG_FOLDER "open-dialog-folder" #define PREF_KEY_ALLOW_HIBERNATION "allow-hibernation" #define PREF_KEY_DIR_WATCH "watch-folder" @@ -34,11 +34,11 @@ GtkWidget * tr_prefs_dialog_new( GObject * core, GtkWindow * parent ); #define PREF_KEY_START "start-added-torrents" #define PREF_KEY_TRASH_ORIGINAL "trash-original-torrent-files" #define PREF_KEY_PEER_SOCKET_TOS "peer-socket-tos" -#define PREF_KEY_PORT "listening-port" -#define PREF_KEY_NAT "nat-traversal-enabled" +#define PREF_KEY_PORT "peer-port" +#define PREF_KEY_PORT_FORWARDING "port-forwarding-enabled" #define PREF_KEY_PEX "pex-enabled" #define PREF_KEY_ASKQUIT "prompt-before-exit" -#define PREF_KEY_ENCRYPTED_ONLY "encrypted-connections-only" +#define PREF_KEY_ENCRYPTION "encryption" #define PREF_KEY_MSGLEVEL "debug-message-level" #define PREF_KEY_SORT_MODE "sort-mode" #define PREF_KEY_SORT_REVERSED "sort-reversed" diff --git a/gtk/tr-window.c b/gtk/tr-window.c index a24516e9b..df2978425 100644 --- a/gtk/tr-window.c +++ b/gtk/tr-window.c @@ -413,7 +413,7 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) { int i, n; int status_stats_mode; - char * pch; + const char * pch; PrivateData * p; GtkWidget *vbox, *w, *self, *h, *c, *s, *image, *menu; GtkWindow *win; @@ -510,7 +510,6 @@ tr_window_new( GtkUIManager * ui_manager, TrCore * core ) gtk_menu_shell_append( GTK_MENU_SHELL(menu), w ); gtk_widget_show( w ); } - g_free( pch ); /* status */ h = p->status = gtk_hbox_new( FALSE, GUI_PAD ); @@ -606,7 +605,7 @@ updateTorrentCount( PrivateData * p ) static void updateStats( PrivateData * p ) { - char * pch; + const char * pch; char up[32], down[32], ratio[32], buf[128]; struct tr_session_stats stats; tr_handle * handle = tr_core_handle( p->core ); @@ -638,7 +637,6 @@ updateStats( PrivateData * p ) tr_strlratio( ratio, stats.ratio, sizeof( ratio ) ); g_snprintf( buf, sizeof(buf), _("Ratio: %s"), ratio ); } - g_free( pch ); gtk_label_set_text( GTK_LABEL( p->stats_lb ), buf ); } diff --git a/libtransmission/bencode.h b/libtransmission/bencode.h index 45453482d..32baa112d 100644 --- a/libtransmission/bencode.h +++ b/libtransmission/bencode.h @@ -53,8 +53,6 @@ typedef struct tr_benc } val; } tr_benc; -const tr_benc BENC_INIT; - /* backwards compatability */ typedef tr_benc benc_val_t; diff --git a/libtransmission/stats.c b/libtransmission/stats.c index 7945fc331..058032eac 100644 --- a/libtransmission/stats.c +++ b/libtransmission/stats.c @@ -29,7 +29,7 @@ struct tr_stats_handle }; static char* -getFilename( const tr_handle * handle, char * buf, size_t buflen ) +getOldFilename( const tr_handle * handle, char * buf, size_t buflen ) { tr_buildPath( buf, buflen, tr_sessionGetConfigDir(handle), "stats.benc", @@ -37,14 +37,29 @@ getFilename( const tr_handle * handle, char * buf, size_t buflen ) return buf; } +static char* +getFilename( const tr_handle * handle, char * buf, size_t buflen ) +{ + tr_buildPath( buf, buflen, tr_sessionGetConfigDir(handle), + "stats.json", + NULL ); + return buf; +} + static void loadCumulativeStats( const tr_handle * handle, tr_session_stats * setme ) { + int loaded = FALSE; char filename[MAX_PATH_LENGTH]; tr_benc top; getFilename( handle, filename, sizeof(filename) ); - if( !tr_bencLoadFile( filename, &top ) ) + loaded = !tr_bencLoadJSONFile( filename, &top ); + if( !loaded ) { + getOldFilename( handle, filename, sizeof(filename) ); + loaded = !tr_bencLoadFile( filename, &top ); + } + if( loaded ) { int64_t i; @@ -78,7 +93,7 @@ saveCumulativeStats( const tr_handle * handle, const tr_session_stats * s ) getFilename( handle, filename, sizeof(filename) ); tr_deepLog( __FILE__, __LINE__, NULL, "Saving stats to \"%s\"", filename ); - tr_bencSaveFile( filename, &top ); + tr_bencSaveJSONFile( filename, &top ); tr_bencFree( &top ); } diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index 2c3b29988..eacf92a5c 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -1554,7 +1554,7 @@ tr_torrentSetAnnounceList( tr_torrent * tor, const tr_tracker_info * trackers, int trackerCount ) { - tr_benc metainfo = BENC_INIT; + tr_benc metainfo; /* save to the .torrent file */ if( !tr_bencLoadFile( tor->info.torrent, &metainfo ) ) -- 2.40.0