Changeset 13448


Ignore:
Timestamp:
Aug 19, 2012, 4:12:20 PM (9 years ago)
Author:
jordan
Message:

(trunk, qt) #4760 'transmission-qt breaks unicode characters in the default target dir' -- fixed with patch from rb07

Location:
trunk/qt
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/qt/prefs.cc

    r12607 r13448  
    1313#include <cassert>
    1414#include <iostream>
    15 #include <cstdlib> // strtod
    1615
    1716#include <QDir>
     
    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/***
     
    126127
    127128Prefs :: Prefs( const char * configDir ):
    128     myConfigDir( configDir )
     129    myConfigDir( QString::fromUtf8( configDir ) )
    129130{
    130131    assert( sizeof(myItems) / sizeof(myItems[0]) == PREFS_COUNT );
     
    164165            case QVariant::String:
    165166                if( tr_bencGetStr( b, &str ) )
    166                     myValues[i].setValue( QString::fromUtf8(str) );
     167                    myValues[i].setValue( QString::fromUtf8( str ) );
    167168                break;
    168169            case QVariant::Bool:
     
    220221                break;
    221222            case QVariant::String:
    222                 tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     223                {   const char * s = val.toByteArray().constData();
     224                    if ( Utils::isValidUtf8( s ) )
     225                        tr_bencDictAddStr( &top, key, s );
     226                    else
     227                        tr_bencDictAddStr( &top, key, val.toString().toUtf8().constData() );
     228                }
    223229                break;
    224230            case QVariant::Bool:
     
    254260    tr_bencDictAddInt ( d, keyStr(BLOCKLIST_DATE), 0 );
    255261    tr_bencDictAddBool( d, keyStr(BLOCKLIST_UPDATES_ENABLED), true );
    256     tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toLatin1() );
     262    tr_bencDictAddStr ( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toUtf8() );
    257263    tr_bencDictAddInt ( d, keyStr(SHOW_TRACKER_SCRAPES), false );
    258264    tr_bencDictAddBool( d, keyStr(TOOLBAR), true );
     
    298304{
    299305    assert( myItems[key].type == QVariant::String );
    300     return myValues[key].toString( );
     306    QByteArray b = myValues[key].toByteArray();
     307    if ( Utils::isValidUtf8( b.constData() ) )
     308       myValues[key].setValue( QString::fromUtf8( b.constData() ) );
     309    return myValues[key].toString();
    301310}
    302311
  • trunk/qt/prefs.h

    r12607 r13448  
    142142        QSet<int> myTemporaryPrefs;
    143143        QString myConfigDir;
    144         QVariant myValues[PREFS_COUNT];
     144        mutable QVariant myValues[PREFS_COUNT];
    145145        void initDefaults( struct tr_benc* );
    146146
  • trunk/qt/session.cc

    r13393 r13448  
    102102        case QVariant::Int:    tr_bencDictAddInt  ( args, key, value.toInt() ); break;
    103103        case QVariant::Double: tr_bencDictAddReal ( args, key, value.toDouble() ); break;
    104         case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8() ); break;
     104        case QVariant::String: tr_bencDictAddStr  ( args, key, value.toString().toUtf8().constData() ); break;
    105105        default: assert( "unknown type" );
    106106    }
     
    246246    myPrefs( prefs ),
    247247    mySession( 0 ),
    248     myConfigDir( configDir ),
     248    myConfigDir( QString::fromUtf8( configDir ) ),
    249249    myNAM( 0 )
    250250{
  • trunk/qt/utils.cc

    r12697 r13448  
    118118    return fallback;
    119119}
     120
     121bool
     122Utils :: isValidUtf8 ( const char *s )
     123{
     124    int n;  // number of bytes in a UTF-8 sequence
     125
     126    for ( const char *c = s;  *c;  c += n )
     127    {
     128        if ( (*c & 0x80) == 0x00 )    n = 1;        // ASCII
     129        else if ((*c & 0xc0) == 0x80) return false; // not valid
     130        else if ((*c & 0xe0) == 0xc0) n = 2;
     131        else if ((*c & 0xf0) == 0xe0) n = 3;
     132        else if ((*c & 0xf8) == 0xf0) n = 4;
     133        else if ((*c & 0xfc) == 0xf8) n = 5;
     134        else if ((*c & 0xfe) == 0xfc) n = 6;
     135        else return false;
     136        for ( int m = 1; m < n; m++ )
     137            if ( (c[m] & 0xc0) != 0x80 )
     138                return false;
     139    }
     140    return true;
     141}
  • trunk/qt/utils.h

    r12697 r13448  
    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
Note: See TracChangeset for help on using the changeset viewer.