Treat command-line arguments as UTF-8-encoded; hide char* Prefs setter, require explicit conversion

This commit is contained in:
Mike Gelfand 2015-01-28 22:57:46 +00:00
parent fb3500242f
commit e707e8d4c5
10 changed files with 64 additions and 64 deletions

View File

@ -36,7 +36,6 @@
#include "session.h"
#include "session-dialog.h"
#include "torrent-model.h"
#include "utils.h"
#include "watchdir.h"
namespace
@ -66,13 +65,6 @@ namespace
" transmission [OPTIONS...] [torrent files]";
}
void
showUsage ()
{
tr_getopt_usage (MY_READABLE_NAME, getUsage (), opts);
exit (0);
}
enum
{
STATS_REFRESH_INTERVAL_MSEC = 3000,
@ -151,25 +143,34 @@ MyApp::MyApp (int& argc, char ** argv):
int c;
bool minimized = false;
const char * optarg;
const char * host = 0;
const char * port = 0;
const char * username = 0;
const char * password = 0;
const char * configDir = 0;
QString host;
QString port;
QString username;
QString password;
QString configDir;
QStringList filenames;
while ((c = tr_getopt (getUsage(), argc, const_cast<const char**> (argv), opts, &optarg)))
{
switch (c)
{
case 'g': configDir = optarg; break;
case 'p': port = optarg; break;
case 'r': host = optarg; break;
case 'u': username = optarg; break;
case 'w': password = optarg; break;
case 'g': configDir = QString::fromUtf8 (optarg); break;
case 'p': port = QString::fromUtf8 (optarg); break;
case 'r': host = QString::fromUtf8 (optarg); break;
case 'u': username = QString::fromUtf8 (optarg); break;
case 'w': password = QString::fromUtf8 (optarg); break;
case 'm': minimized = true; break;
case 'v': std::cerr << MY_READABLE_NAME << ' ' << LONG_VERSION_STRING << std::endl; ::exit (0); break;
case TR_OPT_ERR: Utils::toStderr (QObject::tr ("Invalid option")); showUsage (); break;
default: filenames.append (optarg); break;
case 'v':
std::cerr << MY_READABLE_NAME << ' ' << LONG_VERSION_STRING << std::endl;
quitLater ();
return;
case TR_OPT_ERR:
std::cerr << qPrintable(QObject::tr ("Invalid option")) << std::endl;
tr_getopt_usage (MY_READABLE_NAME, getUsage (), opts);
quitLater ();
return;
default:
filenames.append (QString::fromUtf8 (optarg));
break;
}
}
@ -206,14 +207,14 @@ MyApp::MyApp (int& argc, char ** argv):
if (delegated)
{
QTimer::singleShot (0, this, SLOT (quit ()));
quitLater ();
return;
}
}
// set the fallback config dir
if (configDir == 0)
configDir = tr_getDefaultConfigDir ("transmission");
if (configDir.isNull ())
configDir = QString::fromUtf8 (tr_getDefaultConfigDir ("transmission"));
// ensure our config directory exists
QDir dir (configDir);
@ -221,19 +222,19 @@ MyApp::MyApp (int& argc, char ** argv):
dir.mkpath (configDir);
// is this the first time we've run transmission?
const bool firstTime = !QFile (QDir (configDir).absoluteFilePath ("settings.json")).exists ();
const bool firstTime = !dir.exists ("settings.json");
// initialize the prefs
myPrefs = new Prefs (configDir);
if (host != 0)
if (!host.isNull ())
myPrefs->set (Prefs::SESSION_REMOTE_HOST, host);
if (port != 0)
myPrefs->set (Prefs::SESSION_REMOTE_PORT, port);
if (username != 0)
if (!port.isNull ())
myPrefs->set (Prefs::SESSION_REMOTE_PORT, port.toUInt ());
if (!username.isNull ())
myPrefs->set (Prefs::SESSION_REMOTE_USERNAME, username);
if (password != 0)
if (!password.isNull ())
myPrefs->set (Prefs::SESSION_REMOTE_PASSWORD, password);
if ((host != 0) || (port != 0) || (username != 0) || (password != 0))
if (!host.isNull () || !port.isNull () || !username.isNull () || !password.isNull ())
myPrefs->set (Prefs::SESSION_IS_REMOTE, true);
if (myPrefs->getBool (Prefs::START_MINIMIZED))
minimized = true;
@ -331,6 +332,12 @@ MyApp::MyApp (int& argc, char ** argv):
}
}
void
MyApp::quitLater ()
{
QTimer::singleShot (0, this, SLOT (quit ()));
}
/* these functions are for popping up desktop notifications */
void

View File

@ -67,6 +67,8 @@ class MyApp: public QApplication
private:
void maybeUpdateBlocklist ();
void quitLater ();
};
#undef qApp

View File

@ -623,7 +623,7 @@ FilterBar::refreshPref (int key)
{
const bool isBootstrapping = myTrackerModel->rowCount () <= 2;
if (!isBootstrapping)
myPrefs.set (key, "");
myPrefs.set (key, QString ());
}
break;
}

View File

@ -890,10 +890,10 @@ TrMainWindow::reannounceSelected ()
***
**/
void TrMainWindow::showTotalRatio () { myPrefs.set (Prefs::STATUSBAR_STATS, "total-ratio"); }
void TrMainWindow::showTotalTransfer () { myPrefs.set (Prefs::STATUSBAR_STATS, "total-transfer"); }
void TrMainWindow::showSessionRatio () { myPrefs.set (Prefs::STATUSBAR_STATS, "session-ratio"); }
void TrMainWindow::showSessionTransfer () { myPrefs.set (Prefs::STATUSBAR_STATS, "session-transfer"); }
void TrMainWindow::showTotalRatio () { myPrefs.set (Prefs::STATUSBAR_STATS, QString::fromLatin1 ("total-ratio")); }
void TrMainWindow::showTotalTransfer () { myPrefs.set (Prefs::STATUSBAR_STATS, QString::fromLatin1 ("total-transfer")); }
void TrMainWindow::showSessionRatio () { myPrefs.set (Prefs::STATUSBAR_STATS, QString::fromLatin1 ("session-ratio")); }
void TrMainWindow::showSessionTransfer () { myPrefs.set (Prefs::STATUSBAR_STATS, QString::fromLatin1 ("session-transfer")); }
/**
***

View File

@ -125,8 +125,8 @@ Prefs::PrefItem Prefs::myItems[] =
****
***/
Prefs::Prefs (const char * configDir):
myConfigDir (QString::fromUtf8 (configDir))
Prefs::Prefs (const QString& configDir):
myConfigDir (configDir)
{
assert (sizeof(myItems) / sizeof(myItems[0]) == PREFS_COUNT);
@ -142,7 +142,7 @@ Prefs::Prefs (const char * configDir):
tr_variant top;
tr_variantInitDict (&top, 0);
initDefaults (&top);
tr_sessionLoadSettings (&top, configDir, NULL);
tr_sessionLoadSettings (&top, myConfigDir.toUtf8 ().constData (), NULL);
for (int i=0; i<PREFS_COUNT; ++i)
{

View File

@ -25,6 +25,7 @@ extern "C"
struct tr_variant;
}
#include <QDebug>
class Prefs: public QObject
{
Q_OBJECT
@ -144,10 +145,12 @@ class Prefs: public QObject
private:
QSet<int> myTemporaryPrefs;
QString myConfigDir;
QString const myConfigDir;
mutable QVariant myValues[PREFS_COUNT];
void initDefaults (tr_variant *);
void set (int key, const char * value);
public:
bool isCore (int key) const { return FIRST_CORE_PREF<=key && key<=LAST_CORE_PREF; }
bool isClient (int key) const { return !isCore (key); }
@ -156,7 +159,7 @@ class Prefs: public QObject
int type (int i) const { return myItems[i].type; }
const QVariant& variant (int i) const { return myValues[i]; }
Prefs (const char * configDir);
Prefs (const QString& configDir);
~Prefs ();
int getInt (int key) const;
@ -167,14 +170,13 @@ class Prefs: public QObject
template<typename T> T get (int key) const { return myValues[key].value<T>(); }
void set (int key, const char * value) { set (key, QString::fromUtf8 (value)); }
template<typename T> void set (int key, const T& value)
{
QVariant& v (myValues[key]);
const QVariant tmp = QVariant::fromValue (value);
if (v.isNull() || (v!=tmp))
{
qDebug () << key << ":" << v << "->" << tmp;
v = tmp;
emit changed (key);
}

View File

@ -274,12 +274,12 @@ Session::updatePref (int key)
****
***/
Session::Session (const char * configDir, Prefs& prefs):
Session::Session (const QString& configDir, Prefs& prefs):
nextUniqueTag (FIRST_UNIQUE_TAG),
myBlocklistSize (-1),
myPrefs (prefs),
mySession (0),
myConfigDir (QString::fromUtf8 (configDir))
myConfigDir (configDir)
{
myStats.ratio = TR_RATIO_NA;
myStats.uploadedBytes = 0;
@ -830,13 +830,13 @@ Session::updateInfo (tr_variant * d)
/* Use the C API to get settings that, for security reasons, aren't supported by RPC */
if (mySession != 0)
{
myPrefs.set (Prefs::RPC_ENABLED, tr_sessionIsRPCEnabled (mySession));
myPrefs.set (Prefs::RPC_AUTH_REQUIRED, tr_sessionIsRPCPasswordEnabled (mySession));
myPrefs.set (Prefs::RPC_PASSWORD, tr_sessionGetRPCPassword (mySession));
myPrefs.set (Prefs::RPC_PORT, tr_sessionGetRPCPort (mySession));
myPrefs.set (Prefs::RPC_USERNAME, tr_sessionGetRPCUsername (mySession));
myPrefs.set (Prefs::RPC_ENABLED, tr_sessionIsRPCEnabled (mySession));
myPrefs.set (Prefs::RPC_AUTH_REQUIRED, tr_sessionIsRPCPasswordEnabled (mySession));
myPrefs.set (Prefs::RPC_PASSWORD, QString::fromUtf8 (tr_sessionGetRPCPassword (mySession)));
myPrefs.set (Prefs::RPC_PORT, tr_sessionGetRPCPort (mySession));
myPrefs.set (Prefs::RPC_USERNAME, QString::fromUtf8 (tr_sessionGetRPCUsername (mySession)));
myPrefs.set (Prefs::RPC_WHITELIST_ENABLED, tr_sessionGetRPCWhitelistEnabled (mySession));
myPrefs.set (Prefs::RPC_WHITELIST, tr_sessionGetRPCWhitelist (mySession));
myPrefs.set (Prefs::RPC_WHITELIST, QString::fromUtf8 (tr_sessionGetRPCWhitelist (mySession)));
}
if (tr_variantDictFindInt (d, TR_KEY_blocklist_size, &i) && i!=blocklistSize ())

View File

@ -51,7 +51,7 @@ class Session: public QObject
Q_OBJECT
public:
Session (const char * configDir, Prefs& prefs);
Session (const QString& configDir, Prefs& prefs);
~Session ();
public:
@ -158,7 +158,7 @@ class Session: public QObject
int64_t myBlocklistSize;
Prefs& myPrefs;
tr_session * mySession;
QString myConfigDir;
QString const myConfigDir;
QStringList myIdleJSON;
tr_session_stats myStats;
tr_session_stats myCumulativeStats;

View File

@ -7,8 +7,6 @@
* $Id$
*/
#include <iostream>
#ifdef _WIN32
#include <windows.h>
#include <shellapi.h>
@ -44,12 +42,6 @@
extern QPixmap qt_pixmapFromWinHICON(HICON icon);
#endif
void
Utils::toStderr (const QString& str)
{
std::cerr << qPrintable(str) << std::endl;
}
#ifdef _WIN32
namespace
{

View File

@ -41,9 +41,6 @@ class Utils: public QObject
rect.adjust (dx1, 0, -dx2, 0);
}
// meh
static void toStderr (const QString& qstr);
///
/// URLs
///