Fixed: Plugins dir may change depending on user #4168

This commit is contained in:
Nick Bolton 2015-03-04 11:15:07 +00:00
parent c5ed03a8a0
commit cfd21216cd
11 changed files with 132 additions and 12 deletions

View File

@ -450,6 +450,8 @@ void MainWindow::startSynergy()
args << "--enable-crypto"; args << "--enable-crypto";
} }
args << "--profile-dir" << getProfileDirectoryForArg();
if ((synergyType() == synergyClient && !clientArgs(args, app)) if ((synergyType() == synergyClient && !clientArgs(args, app))
|| (synergyType() == synergyServer && !serverArgs(args, app))) || (synergyType() == synergyServer && !serverArgs(args, app)))
{ {
@ -473,6 +475,8 @@ void MainWindow::startSynergy()
appendLogNote("starting " + QString(synergyType() == synergyServer ? "server" : "client")); appendLogNote("starting " + QString(synergyType() == synergyServer ? "server" : "client"));
qDebug() << args;
// show command if debug log level... // show command if debug log level...
if (appConfig().logLevel() >= 4) { if (appConfig().logLevel() >= 4) {
appendLogNote(QString("command: %1 %2").arg(app, args.join(" "))); appendLogNote(QString("command: %1 %2").arg(app, args.join(" ")));
@ -1216,3 +1220,29 @@ void MainWindow::bonjourInstallFinished()
m_pCheckBoxAutoConfig->setChecked(true); m_pCheckBoxAutoConfig->setChecked(true);
} }
QString MainWindow::getProfileDirectory()
{
#if defined(Q_OS_WIN)
QString qtDataDir = QDesktopServices::storageLocation(
QDesktopServices::DataLocation);
// HACK: core wants the base app data dir, this seems like a very hacky
// way to get it (maybe consider using %LOCALAPPDATA% instead?)
return qtDataDir.replace("\\Synergy\\Synergy", "");
#else
// HACK: this seems hacky, since we're using a hidden folder inside the
// user's home dir to store plugins, etc... but we call it profile dir?
return QDesktopServices::storageLocation(
QDesktopServices::HomeLocation);
#endif
}
QString MainWindow::getProfileDirectoryForArg()
{
return QString("\"%1\"").arg(getProfileDirectory());
}

View File

@ -165,6 +165,8 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
void downloadBonjour(); void downloadBonjour();
void promptAutoConfig(); void promptAutoConfig();
void updateEdition(); void updateEdition();
QString getProfileDirectory();
QString getProfileDirectoryForArg();
private: private:
QSettings& m_Settings; QSettings& m_Settings;

View File

@ -20,6 +20,7 @@
#include "common/IInterface.h" #include "common/IInterface.h"
#include "common/stdstring.h" #include "common/stdstring.h"
#include "base/String.h"
//! Interface for architecture dependent file system operations //! Interface for architecture dependent file system operations
/*! /*!
@ -64,13 +65,16 @@ public:
//! Get plugins directory //! Get plugins directory
/*! /*!
Returns the plugin files directory. Returns the plugin files directory. If no plugin directory is set,
this will return the plugin folder within the user's profile.
*/ */
virtual std::string getPluginDirectory() = 0; virtual std::string getPluginDirectory() = 0;
//! Get local profile directory //! Get user's profile directory
/*! /*!
Returns the local profile directory. Returns the user's profile directory. If no profile directory is set,
this will return the user's profile according to the operating system,
which will depend on which user launched the program.
*/ */
virtual std::string getProfileDirectory() = 0; virtual std::string getProfileDirectory() = 0;
@ -86,4 +90,16 @@ public:
const std::string& suffix) = 0; const std::string& suffix) = 0;
//@} //@}
//! Set the user's profile directory
/*
Returns the user's profile directory.
*/
virtual void setProfileDirectory(const String& s) = 0;
//@}
//! Set the user's plugin directory
/*
Returns the user's plugin directory.
*/
virtual void setPluginDirectory(const String& s) = 0;
}; };

View File

@ -107,6 +107,10 @@ ArchFileUnix::getLogDirectory()
std::string std::string
ArchFileUnix::getPluginDirectory() ArchFileUnix::getPluginDirectory()
{ {
if (!m_pluginDirectory.empty()) {
return m_pluginDirectory;
}
#if WINAPI_XWINDOWS #if WINAPI_XWINDOWS
return getProfileDirectory().append("/plugins"); return getProfileDirectory().append("/plugins");
#else #else
@ -117,12 +121,20 @@ ArchFileUnix::getPluginDirectory()
std::string std::string
ArchFileUnix::getProfileDirectory() ArchFileUnix::getProfileDirectory()
{ {
String dir;
if (!m_profileDirectory.empty()) {
dir = m_profileDirectory;
}
else {
#if WINAPI_XWINDOWS #if WINAPI_XWINDOWS
return getUserDirectory().append("/.synergy"); dir = getUserDirectory().append("/.synergy");
#else #else
return getUserDirectory().append("/Library/Synergy"); dir = getUserDirectory().append("/Library/Synergy");
#endif #endif
} }
return dir;
}
std::string std::string
ArchFileUnix::concatPath(const std::string& prefix, ArchFileUnix::concatPath(const std::string& prefix,
@ -137,3 +149,15 @@ ArchFileUnix::concatPath(const std::string& prefix,
path += suffix; path += suffix;
return path; return path;
} }
void
ArchFileUnix::setProfileDirectory(const String& s)
{
m_profileDirectory = s;
}
void
ArchFileUnix::setPluginDirectory(const String& s)
{
m_pluginDirectory = s;
}

View File

@ -38,4 +38,10 @@ public:
virtual std::string getProfileDirectory(); virtual std::string getProfileDirectory();
virtual std::string concatPath(const std::string& prefix, virtual std::string concatPath(const std::string& prefix,
const std::string& suffix); const std::string& suffix);
virtual void setProfileDirectory(const String& s);
virtual void setPluginDirectory(const String& s);
private:
String m_profileDirectory;
String m_pluginDirectory;
}; };

View File

@ -142,6 +142,10 @@ ArchFileWindows::getLogDirectory()
std::string std::string
ArchFileWindows::getPluginDirectory() ArchFileWindows::getPluginDirectory()
{ {
if (!m_pluginDirectory.empty()) {
return m_pluginDirectory;
}
std::string dir = getProfileDirectory(); std::string dir = getProfileDirectory();
dir.append("\\Plugins"); dir.append("\\Plugins");
return dir; return dir;
@ -150,16 +154,23 @@ ArchFileWindows::getPluginDirectory()
std::string std::string
ArchFileWindows::getProfileDirectory() ArchFileWindows::getProfileDirectory()
{ {
String dir;
if (!m_profileDirectory.empty()) {
dir = m_profileDirectory;
}
else {
TCHAR result[MAX_PATH]; TCHAR result[MAX_PATH];
std::string dir;
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, result))) { if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, result))) {
dir = result; dir = result;
} }
else { else {
dir = getUserDirectory(); dir = getUserDirectory();
} }
}
// HACK: append program name, this seems wrong.
dir.append("\\Synergy"); dir.append("\\Synergy");
return dir; return dir;
} }
@ -178,3 +189,15 @@ ArchFileWindows::concatPath(const std::string& prefix,
path += suffix; path += suffix;
return path; return path;
} }
void
ArchFileWindows::setProfileDirectory(const String& s)
{
m_profileDirectory = s;
}
void
ArchFileWindows::setPluginDirectory(const String& s)
{
m_pluginDirectory = s;
}

View File

@ -38,4 +38,10 @@ public:
virtual std::string getProfileDirectory(); virtual std::string getProfileDirectory();
virtual std::string concatPath(const std::string& prefix, virtual std::string concatPath(const std::string& prefix,
const std::string& suffix); const std::string& suffix);
virtual void setProfileDirectory(const String& s);
virtual void setPluginDirectory(const String& s);
private:
String m_profileDirectory;
String m_pluginDirectory;
}; };

View File

@ -173,6 +173,9 @@ App::initApp(int argc, const char** argv)
// parse command line // parse command line
parseArgs(argc, argv); parseArgs(argc, argv);
ARCH->setProfileDirectory(argsBase().m_profileDirectory);
ARCH->setPluginDirectory(argsBase().m_pluginDirectory);
// set log filter // set log filter
if (!CLOG->setFilter(argsBase().m_logFilter)) { if (!CLOG->setFilter(argsBase().m_logFilter)) {
LOG((CLOG_PRINT "%s: unrecognized log level `%s'" BYE, LOG((CLOG_PRINT "%s: unrecognized log level `%s'" BYE,

View File

@ -253,7 +253,7 @@ ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i)
else if (isArg(i, argc, argv, NULL, "--client")) { else if (isArg(i, argc, argv, NULL, "--client")) {
// HACK: stop error happening when using portable (synergyp) // HACK: stop error happening when using portable (synergyp)
} }
else if (isArg(i, argc, argv, NULL, "--enable-drag-drop")) { else if (isArg(i, argc, argv, NULL, "--enable-drag-drop", 1)) {
bool useDragDrop = true; bool useDragDrop = true;
#ifdef WINAPI_XWINDOWS #ifdef WINAPI_XWINDOWS
@ -283,6 +283,12 @@ ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i)
else if (isArg(i, argc, argv, NULL, "--enable-crypto")) { else if (isArg(i, argc, argv, NULL, "--enable-crypto")) {
argsBase().m_enableCrypto = true; argsBase().m_enableCrypto = true;
} }
else if (isArg(i, argc, argv, NULL, "--profile-dir", 1)) {
argsBase().m_profileDirectory = argv[++i];
}
else if (isArg(i, argc, argv, NULL, "--plugin-dir", 1)) {
argsBase().m_pluginDirectory = argv[++i];
}
else { else {
// option not supported here // option not supported here
return false; return false;

View File

@ -42,7 +42,9 @@ m_enableIpc(false),
m_enableDragDrop(false), m_enableDragDrop(false),
m_shouldExit(false), m_shouldExit(false),
m_synergyAddress(), m_synergyAddress(),
m_enableCrypto(false) m_enableCrypto(false),
m_profileDirectory(""),
m_pluginDirectory("")
{ {
} }

View File

@ -47,4 +47,6 @@ public:
bool m_shouldExit; bool m_shouldExit;
String m_synergyAddress; String m_synergyAddress;
bool m_enableCrypto; bool m_enableCrypto;
String m_profileDirectory;
String m_pluginDirectory;
}; };