Treat command-line arguments as UTF-8-encoded; hide char* Prefs setter, require explicit conversion
This commit is contained in:
parent
fb3500242f
commit
e707e8d4c5
69
qt/app.cc
69
qt/app.cc
|
@ -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
|
||||
|
|
2
qt/app.h
2
qt/app.h
|
@ -67,6 +67,8 @@ class MyApp: public QApplication
|
|||
|
||||
private:
|
||||
void maybeUpdateBlocklist ();
|
||||
|
||||
void quitLater ();
|
||||
};
|
||||
|
||||
#undef qApp
|
||||
|
|
|
@ -623,7 +623,7 @@ FilterBar::refreshPref (int key)
|
|||
{
|
||||
const bool isBootstrapping = myTrackerModel->rowCount () <= 2;
|
||||
if (!isBootstrapping)
|
||||
myPrefs.set (key, "");
|
||||
myPrefs.set (key, QString ());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -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")); }
|
||||
|
||||
/**
|
||||
***
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
10
qt/prefs.h
10
qt/prefs.h
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 ())
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -41,9 +41,6 @@ class Utils: public QObject
|
|||
rect.adjust (dx1, 0, -dx2, 0);
|
||||
}
|
||||
|
||||
// meh
|
||||
static void toStderr (const QString& qstr);
|
||||
|
||||
///
|
||||
/// URLs
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue