Ticket #4760: download-dir.patch

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

Fix preferences with foreign characters.

  • 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****
     
    125129***/
    126130
    127131Prefs :: Prefs( const char * configDir ):
    128     myConfigDir( configDir )
     132    myConfigDir( QString::fromUtf8( configDir ) )
    129133{
    130134    assert( sizeof(myItems) / sizeof(myItems[0]) == PREFS_COUNT );
    131135    for( int i=0; i<PREFS_COUNT; ++i )
     
    163167                break;
    164168            case QVariant::String:
    165169                if( tr_bencGetStr( b, &str ) )
    166                     myValues[i].setValue( QString::fromUtf8(str) );
     170                    myValues[i].setValue( QString::fromUtf8( str ) );
    167171                break;
    168172            case QVariant::Bool:
    169173                if( tr_bencGetBool( b, &boolVal ) )
     
    219224                tr_bencDictAddStr( &top, key, val.value<FilterMode>().name().toUtf8().constData() );
    220225                break;
    221226            case QVariant::String:
    222                 tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     227                {   const char * s = val.toByteArray().constData();
     228                    if ( Utils::isValidUtf8( s ) )
     229                        tr_bencDictAddStr( &top, key, s );
     230                    else
     231                        tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     232                }
    223233                break;
    224234            case QVariant::Bool:
    225235                tr_bencDictAddBool( &top, key, val.toBool() );
     
    253263    tr_bencDictAddBool( d, keyStr(INHIBIT_HIBERNATION), false );
    254264    tr_bencDictAddInt ( d, keyStr(BLOCKLIST_DATE), 0 );
    255265    tr_bencDictAddBool( d, keyStr(BLOCKLIST_UPDATES_ENABLED), true );
    256     tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toLatin1() );
     266    tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toUtf8() );
    257267    tr_bencDictAddInt ( d, keyStr(SHOW_TRACKER_SCRAPES), false );
    258268    tr_bencDictAddBool( d, keyStr(TOOLBAR), true );
    259269    tr_bencDictAddBool( d, keyStr(FILTERBAR), true );
     
    297310Prefs :: getString( int key ) const
    298311{
    299312    assert( myItems[key].type == QVariant::String );
    300     return myValues[key].toString( );
     313    QByteArray b = myValues[key].toByteArray();
     314    if ( Utils::isValidUtf8( b.constData() ) )
     315       myValues[key].setValue( QString::fromUtf8( b.constData() ) );
     316    return myValues[key].toString();
    301317}
    302318
    303319int
  • qt/prefs.h

     
    141144    private:
    142145        QSet<int> myTemporaryPrefs;
    143146        QString myConfigDir;
    144         QVariant myValues[PREFS_COUNT];
     147        mutable QVariant myValues[PREFS_COUNT];
    145148        void initDefaults( struct tr_benc* );
    146149
    147150    public:
  • qt/session.cc

     
    101107        case QVariant::Bool:   tr_bencDictAddBool ( args, key, value.toBool() ); break;
    102108        case QVariant::Int:    tr_bencDictAddInt  ( args, key, value.toInt() ); break;
    103109        case QVariant::Double: tr_bencDictAddReal ( args, key, value.toDouble() ); break;
    104         case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8() ); break;
     110        case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8().constData() ); break;
    105111        default: assert( "unknown type" );
    106112    }
    107113    exec( &top );
     
    245254    myBlocklistSize( -1 ),
    246255    myPrefs( prefs ),
    247256    mySession( 0 ),
    248     myConfigDir( configDir ),
     257    myConfigDir( QString::fromUtf8( configDir ) ),
    249258    myNAM( 0 )
    250259{
    251260    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}