
commit e36785b3bc90fd33eed45e5ca6d334780d5fab30 Author: Tomás Touceda <chiiph@torproject.org> Date: Thu Mar 22 19:54:20 2012 -0300 Add {Default,}{Plugin,Profile}Directory settings If defined relative, make Vidalia's binary path the start point. --- src/vidalia/MainWindow.cpp | 54 +++++++++++++++++++--------- src/vidalia/config/VidaliaSettings.cpp | 61 ++++++++++++++++++++++++++++++- src/vidalia/config/VidaliaSettings.h | 10 +++++ 3 files changed, 106 insertions(+), 19 deletions(-) diff --git a/src/vidalia/MainWindow.cpp b/src/vidalia/MainWindow.cpp index e45919d..e116269 100644 --- a/src/vidalia/MainWindow.cpp +++ b/src/vidalia/MainWindow.cpp @@ -624,31 +624,43 @@ MainWindow::launchBrowserFromDirectory() { VidaliaSettings settings; + /** Directory for the browser */ QString browserDirectory = settings.getBrowserDirectory(); - QString browserDirectoryFilename = settings.getBrowserExecutable(); + if(QDir(browserDirectory).isRelative()) + browserDirectory = QDir::toNativeSeparators(QCoreApplication::applicationDirPath() + + "/" + browserDirectory); - _browserProcess->setEnvironment(updateBrowserEnv()); + /** Relative path to the browser executable from the browserDirectory */ + QString browserExecutable = QDir::toNativeSeparators(browserDirectory + "/" + settings.getBrowserExecutable()); - /* The browser is in <browserDirectory>/App/Firefox/<browserDirectoryFilename> */ - QString browserExecutable = - QDir::toNativeSeparators(browserDirectory + "/App/Firefox/" + browserDirectoryFilename); - /* The profile is in <browserDirectory>/Data/profile */ - QString profileDir = - QDir::toNativeSeparators(browserDirectory + "/Data/profile"); + /** Relative path to profile from the browserDirectory */ + QString profileDirectory = QDir::toNativeSeparators(settings.getProfileDirectory()); + /** Default profile to copy from */ + QString defaultProfileDirectory = QDir::toNativeSeparators(settings.getDefaultProfileDirectory()); + + /** Relative path to the plugins directory from the browserDirectory */ + QString pluginsDirectory = QDir::toNativeSeparators(settings.getPluginsDirectory()); + /** Relative path to the default plugins directory from the browserDirectory */ + QString defaultPluginsDirectory = QDir::toNativeSeparators(settings.getDefaultPluginsDirectory()); + + QString profileDir = browserDirectory + "/" + profileDirectory; + + _browserProcess->setEnvironment(updateBrowserEnv()); - /* Copy the profile directory if it's not already there */ QDir browserDirObj = QDir(browserDirectory); /* Copy the profile directory if it's not already there */ - if (!browserDirObj.exists("Data/profile")) { - browserDirObj.mkdir("Data/profile"); - copy_dir(browserDirectory + "/App/DefaultData/profile", browserDirectory + "/Data/profile"); + if (!browserDirObj.exists(profileDirectory)) { + browserDirObj.mkdir(profileDirectory); + copy_dir(browserDirectory + "/" + defaultProfileDirectory, + browserDirectory + "/" + profileDirectory); } - /* Copy the plugins directory if it's not already there */ - if (!browserDirObj.exists("Data/plugins")) { - browserDirObj.mkdir("Data/plugins"); - copy_dir(browserDirectory + "/App/DefaultData/plugins", browserDirectory + "/Data/plugins"); + /* Copy the pluginss directory if it's not already there */ + if (!browserDirObj.exists(pluginsDirectory)) { + browserDirObj.mkdir(pluginsDirectory); + copy_dir(browserDirectory + "/" + defaultPluginsDirectory, + browserDirectory + "/" + pluginsDirectory); } /* Build the command line arguments */ @@ -1054,6 +1066,8 @@ MainWindow::start() } QString torrc = settings.getTorrc(); + if(QDir(QFileInfo(torrc).filePath()).isRelative()) + torrc = QCoreApplication::applicationDirPath() + "/" + torrc; if(settings.bootstrap()) { QString boottorrc = settings.bootstrapFrom(); @@ -1075,6 +1089,9 @@ MainWindow::start() /* Specify Tor's data directory, if different from the default */ QString dataDirectory = settings.getDataDirectory(); + if(QDir(dataDirectory).isRelative()) + dataDirectory = QCoreApplication::applicationDirPath() + "/" + dataDirectory; + QString expDataDirectory = expand_filename(dataDirectory); if (!dataDirectory.isEmpty()) args << "DataDirectory" << expDataDirectory; @@ -1129,7 +1146,10 @@ MainWindow::start() * start. */ _isIntentionalExit = true; /* Kick off the Tor process */ - _torControl->start(settings.getExecutable(), args); + QString torExecutable = settings.getExecutable(); + if(QDir(QFileInfo(torExecutable).filePath()).isRelative()) + torExecutable = QCoreApplication::applicationDirPath() + "/" + torExecutable; + _torControl->start(torExecutable, args); } /** Called when the user changes a setting that needs Tor restarting */ diff --git a/src/vidalia/config/VidaliaSettings.cpp b/src/vidalia/config/VidaliaSettings.cpp index 7273f10..7d317dc 100644 --- a/src/vidalia/config/VidaliaSettings.cpp +++ b/src/vidalia/config/VidaliaSettings.cpp @@ -29,8 +29,12 @@ #define SETTING_RUN_TOR_AT_START "RunTorAtStart" #define SETTING_DATA_DIRECTORY "DataDirectory" #define SETTING_SHOW_MAINWINDOW_AT_START "ShowMainWindowAtStart" -#define SETTING_BROWSER_EXECUTABLE "BrowserExecutable" -#define SETTING_BROWSER_DIRECTORY "BrowserDirectory" +#define SETTING_BROWSER_EXECUTABLE "BrowserExecutable" +#define SETTING_BROWSER_DIRECTORY "BrowserDirectory" +#define SETTING_PROFILE_DIRECTORY "ProfileDirectory" +#define SETTING_DEFAULT_PROFILE_DIRECTORY "DefaultProfileDirectory" +#define SETTING_PLUGINS_DIRECTORY "PluginsDirectory" +#define SETTING_DEFAULT_PLUGINS_DIRECTORY "DefaultPluginsDirectory" #define SETTING_IM_EXECUTABLE "IMExecutable" #define SETTING_RUN_PROXY_AT_START "RunProxyAtStart" #define SETTING_PROXY_EXECUTABLE "ProxyExecutable" @@ -86,6 +90,11 @@ VidaliaSettings::VidaliaSettings() setDefault(SETTING_LOCAL_GEOIP_DATABASE, ""); setDefault(SETTING_ICON_PREF, Both); setDefault(SETTING_SKIP_VERSION_CHECK, false); + + setDefault(SETTING_PROFILE_DIRECTORY, ""); + setDefault(SETTING_DEFAULT_PROFILE_DIRECTORY, ""); + setDefault(SETTING_PLUGINS_DIRECTORY, ""); + setDefault(SETTING_DEFAULT_PLUGINS_DIRECTORY, ""); } /** Gets the currently preferred language code for Vidalia. */ @@ -363,3 +372,51 @@ VidaliaSettings::skipVersionCheck() const { return value(SETTING_SKIP_VERSION_CHECK).toBool(); } + +QString +VidaliaSettings::getDefaultProfileDirectory() const +{ + return QDir::convertSeparators(value(SETTING_DEFAULT_PROFILE_DIRECTORY).toString()); +} + +void +VidaliaSettings::setDefaultProfileDirectory(const QString &dir) +{ + setValue(SETTING_DEFAULT_PROFILE_DIRECTORY, dir); +} + +QString +VidaliaSettings::getProfileDirectory() const +{ + return QDir::convertSeparators(value(SETTING_PROFILE_DIRECTORY).toString()); +} + +void +VidaliaSettings::setProfileDirectory(const QString &dir) +{ + setValue(SETTING_PROFILE_DIRECTORY, dir); +} + +QString +VidaliaSettings::getPluginsDirectory() const +{ + return QDir::convertSeparators(value(SETTING_PLUGINS_DIRECTORY).toString()); +} + +void +VidaliaSettings::setPluginsDirectory(const QString &dir) +{ + setValue(SETTING_PLUGINS_DIRECTORY, dir); +} + +QString +VidaliaSettings::getDefaultPluginsDirectory() const +{ + return QDir::convertSeparators(value(SETTING_DEFAULT_PLUGINS_DIRECTORY).toString()); +} + +void +VidaliaSettings::setDefaultPluginsDirectory(const QString &dir) +{ + setValue(SETTING_DEFAULT_PLUGINS_DIRECTORY, dir); +} diff --git a/src/vidalia/config/VidaliaSettings.h b/src/vidalia/config/VidaliaSettings.h index b378d9b..6967740 100644 --- a/src/vidalia/config/VidaliaSettings.h +++ b/src/vidalia/config/VidaliaSettings.h @@ -82,6 +82,16 @@ public: * If set to the empty string, the browser will not be started. */ void setBrowserDirectory(const QString &browserDirectory); + /** Browser directories */ + QString getDefaultProfileDirectory() const; + void setDefaultProfileDirectory(const QString &dir); + QString getProfileDirectory() const; + void setProfileDirectory(const QString &dir); + QString getPluginsDirectory() const; + void setPluginsDirectory(const QString &dir); + QString getDefaultPluginsDirectory() const; + void setDefaultPluginsDirectory(const QString &dir); + /** Returns a fully-qualified path to the IM client, including the * executable name. */ QString getIMExecutable() const;