Ticket #4760: 00-download-dir.patch

File 00-download-dir.patch, 5.5 KB (added by rb07, 9 years ago)

Same patch for r13447

  • qt/prefs.h

     
    141145    private:
    142146        QSet<int> myTemporaryPrefs;
    143147        QString myConfigDir;
    144         QVariant myValues[PREFS_COUNT];
     148        mutable QVariant myValues[PREFS_COUNT];
    145149        void initDefaults( struct tr_benc* );
    146150
    147151    public:
  • qt/prefs.cc

     
    1212
    1313#include <cassert>
    1414#include <iostream>
    15 #include <cstdlib> // strtod
    1615
    1716#include <QDir>
    1817#include <QFile>
     
    2120#include <libtransmission/bencode.h>
    2221#include <libtransmission/json.h>
    2322#include <libtransmission/utils.h>
     23#include <stdlib.h>
    2424#include "prefs.h"
    2525#include "types.h"
     26#include "utils.h"
    2627
    2728/***
    2829****
     
    125130***/
    126131
    127132Prefs :: Prefs( const char * configDir ):
    128     myConfigDir( configDir )
     133    myConfigDir( QString::fromUtf8( configDir ) )
    129134{
    130135    assert( sizeof(myItems) / sizeof(myItems[0]) == PREFS_COUNT );
    131136    for( int i=0; i<PREFS_COUNT; ++i )
     
    163168                break;
    164169            case QVariant::String:
    165170                if( tr_bencGetStr( b, &str ) )
    166                     myValues[i].setValue( QString::fromUtf8(str) );
     171                    myValues[i].setValue( QString::fromUtf8( str ) );
    167172                break;
    168173            case QVariant::Bool:
    169174                if( tr_bencGetBool( b, &boolVal ) )
     
    219225                tr_bencDictAddStr( &top, key, val.value<FilterMode>().name().toUtf8().constData() );
    220226                break;
    221227            case QVariant::String:
    222                 tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     228                {   const char * s = val.toByteArray().constData();
     229                    if ( Utils::isValidUtf8( s ) )
     230                        tr_bencDictAddStr( &top, key, s );
     231                    else
     232                        tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     233                }
    223234                break;
    224235            case QVariant::Bool:
    225236                tr_bencDictAddBool( &top, key, val.toBool() );
     
    253264    tr_bencDictAddBool( d, keyStr(INHIBIT_HIBERNATION), false );
    254265    tr_bencDictAddInt ( d, keyStr(BLOCKLIST_DATE), 0 );
    255266    tr_bencDictAddBool( d, keyStr(BLOCKLIST_UPDATES_ENABLED), true );
    256     tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toLatin1() );
     267    tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toUtf8() );
    257268    tr_bencDictAddInt ( d, keyStr(SHOW_TRACKER_SCRAPES), false );
    258269    tr_bencDictAddBool( d, keyStr(TOOLBAR), true );
    259270    tr_bencDictAddBool( d, keyStr(FILTERBAR), true );
     
    297311Prefs :: getString( int key ) const
    298312{
    299313    assert( myItems[key].type == QVariant::String );
    300     return myValues[key].toString( );
     314    QByteArray b = myValues[key].toByteArray();
     315    if ( Utils::isValidUtf8( b.constData() ) )
     316       myValues[key].setValue( QString::fromUtf8( b.constData() ) );
     317    return myValues[key].toString();
    301318}
    302319
    303320int
  • qt/session.cc

     
    101108        case QVariant::Bool:   tr_bencDictAddBool ( args, key, value.toBool() ); break;
    102109        case QVariant::Int:    tr_bencDictAddInt  ( args, key, value.toInt() ); break;
    103110        case QVariant::Double: tr_bencDictAddReal ( args, key, value.toDouble() ); break;
    104         case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8() ); break;
     111        case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8().constData() ); break;
    105112        default: assert( "unknown type" );
    106113    }
    107114    exec( &top );
     
    245261    myBlocklistSize( -1 ),
    246262    myPrefs( prefs ),
    247263    mySession( 0 ),
    248     myConfigDir( configDir ),
     264    myConfigDir( QString::fromUtf8( configDir ) ),
    249265    myNAM( 0 )
    250266{
    251267    myStats.ratio = TR_RATIO_NA;
  • qt/utils.h

     
    3232    public:
    3333        static QString remoteFileChooser( QWidget * parent, const QString& title, const QString& myPath, bool dir, bool local );
    3434        static const QIcon& guessMimeIcon( const QString& filename );
     35        // Test if string is UTF-8 or not
     36        static bool isValidUtf8 ( const char *s );
    3537
    3638        // meh
    3739        static void toStderr( const QString& qstr );
  • qt/utils.cc

     
    117122
    118123    return fallback;
    119124}
     125
     126bool
     127Utils :: isValidUtf8 ( const char *s )
     128{
     129    int n;  // number of bytes in a UTF-8 sequence
     130
     131    for ( const char *c = s;  *c;  c += n )
     132    {
     133        if ( (*c & 0x80) == 0x00 )    n = 1;        // ASCII
     134        else if ((*c & 0xc0) == 0x80) return false; // not valid
     135        else if ((*c & 0xe0) == 0xc0) n = 2;
     136        else if ((*c & 0xf0) == 0xe0) n = 3;
     137        else if ((*c & 0xf8) == 0xf0) n = 4;
     138        else if ((*c & 0xfc) == 0xf8) n = 5;
     139        else if ((*c & 0xfe) == 0xfc) n = 6;
     140        else return false;
     141        for ( int m = 1; m < n; m++ )
     142            if ( (c[m] & 0xc0) != 0x80 )
     143                return false;
     144    }
     145    return true;
     146}