Merge remote-tracking branch 'origin/master' into jerry-sandbox

This commit is contained in:
Jerry (Xinyu Hou) 2015-06-08 13:53:01 -07:00
commit a21e4cd73b
21 changed files with 433 additions and 248 deletions

View File

@ -1140,12 +1140,14 @@ class InternalCommands:
controlFile.close() controlFile.close()
targetBin = '%s/%s/usr/bin' % (debDir, package) targetBin = '%s/%s/usr/bin' % (debDir, package)
targetPlugin = '%s/%s/usr/lib/synergy/plugins' % (debDir, package)
targetShare = '%s/%s/usr/share' % (debDir, package) targetShare = '%s/%s/usr/share' % (debDir, package)
targetApplications = "%s/applications" % targetShare targetApplications = "%s/applications" % targetShare
targetIcons = "%s/icons" % targetShare targetIcons = "%s/icons" % targetShare
targetDocs = "%s/doc/%s" % (targetShare, self.project) targetDocs = "%s/doc/%s" % (targetShare, self.project)
os.makedirs(targetBin) os.makedirs(targetBin)
os.makedirs(targetPlugin)
os.makedirs(targetApplications) os.makedirs(targetApplications)
os.makedirs(targetIcons) os.makedirs(targetIcons)
os.makedirs(targetDocs) os.makedirs(targetDocs)
@ -1163,6 +1165,17 @@ class InternalCommands:
if err != 0: if err != 0:
raise Exception('strip failed: ' + str(err)) raise Exception('strip failed: ' + str(err))
pluginDir = "%s/plugins" % binDir
pluginFiles = [ 'libns.so']
for f in pluginFiles:
shutil.copy("%s/%s" % (pluginDir, f), targetPlugin)
target = "%s/%s" % (targetPlugin, f)
os.chmod(target, 0o0644)
err = os.system("strip " + target)
if err != 0:
raise Exception('strip failed: ' + str(err))
shutil.copy("%s/synergy.desktop" % resDir, targetApplications) shutil.copy("%s/synergy.desktop" % resDir, targetApplications)
shutil.copy("%s/synergy.ico" % resDir, targetIcons) shutil.copy("%s/synergy.ico" % resDir, targetIcons)

View File

@ -20,6 +20,7 @@ source=%{_topdir}/../..
mkdir -p %{buildroot}/%{_datarootdir}/applications mkdir -p %{buildroot}/%{_datarootdir}/applications
mkdir -p %{buildroot}/%{_datarootdir}/icons mkdir -p %{buildroot}/%{_datarootdir}/icons
mkdir -p %{buildroot}/%{_bindir} mkdir -p %{buildroot}/%{_bindir}
mkdir -p %{buildroot}/%{_bindir}/../lib/synergy/plugins
cp $source/bin/synergy %{buildroot}%{_bindir} cp $source/bin/synergy %{buildroot}%{_bindir}
cp $source/bin/synergyc %{buildroot}%{_bindir} cp $source/bin/synergyc %{buildroot}%{_bindir}
@ -28,6 +29,7 @@ cp $source/bin/synergyd %{buildroot}%{_bindir}
cp $source/bin/syntool %{buildroot}%{_bindir} cp $source/bin/syntool %{buildroot}%{_bindir}
cp $source/res/synergy.desktop %{buildroot}%{_datarootdir}/applications cp $source/res/synergy.desktop %{buildroot}%{_datarootdir}/applications
cp $source/res/synergy.ico %{buildroot}%{_datarootdir}/icons cp $source/res/synergy.ico %{buildroot}%{_datarootdir}/icons
cp $source/bin/plugins/* %{buildroot}%{_bindir}/../lib/synergy/plugins
%files %files
%defattr(755,root,root,-) %defattr(755,root,root,-)
@ -38,6 +40,7 @@ cp $source/res/synergy.ico %{buildroot}%{_datarootdir}/icons
%{_bindir}/syntool %{_bindir}/syntool
%attr(644,-,-) %{_datarootdir}/applications/synergy.desktop %attr(644,-,-) %{_datarootdir}/applications/synergy.desktop
%attr(644,-,-) %{_datarootdir}/icons/synergy.ico %attr(644,-,-) %{_datarootdir}/icons/synergy.ico
%attr(644,-,-) %{_bindir}/../lib/synergy/plugins/*
%changelog %changelog
* Thu Mar 20 2014 Nick Bolton <nick@synergy-project.org> * Thu Mar 20 2014 Nick Bolton <nick@synergy-project.org>

View File

@ -52,12 +52,14 @@ SOURCES += src/main.cpp \
src/DataDownloader.cpp \ src/DataDownloader.cpp \
src/AddClientDialog.cpp \ src/AddClientDialog.cpp \
src/CommandProcess.cpp \ src/CommandProcess.cpp \
src/WebClient.cpp \
src/PluginWizardPage.cpp \ src/PluginWizardPage.cpp \
src/PluginManager.cpp \ src/PluginManager.cpp \
src/CoreInterface.cpp \ src/CoreInterface.cpp \
src/Fingerprint.cpp \ src/Fingerprint.cpp \
src/SslCertificate.cpp src/SslCertificate.cpp \
src/FileSysClient.cpp \
src/Plugin.cpp \
src/WebClient.cpp
HEADERS += src/MainWindow.h \ HEADERS += src/MainWindow.h \
src/AboutDialog.h \ src/AboutDialog.h \
src/ServerConfig.h \ src/ServerConfig.h \
@ -94,14 +96,17 @@ HEADERS += src/MainWindow.h \
src/DataDownloader.h \ src/DataDownloader.h \
src/AddClientDialog.h \ src/AddClientDialog.h \
src/CommandProcess.h \ src/CommandProcess.h \
src/WebClient.h \
src/EditionType.h \ src/EditionType.h \
src/PluginWizardPage.h \ src/PluginWizardPage.h \
src/ProcessorArch.h \ src/ProcessorArch.h \
src/PluginManager.h \ src/PluginManager.h \
src/CoreInterface.h \ src/CoreInterface.h \
src/Fingerprint.h \ src/Fingerprint.h \
src/SslCertificate.h src/SslCertificate.h \
src/LocalFilesystemClient.h \
src/FileSysClient.h \
src/Plugin.h \
src/WebClient.h
RESOURCES += res/Synergy.qrc RESOURCES += res/Synergy.qrc
RC_FILE = res/win/Synergy.rc RC_FILE = res/win/Synergy.rc
macx { macx {

View File

@ -39,6 +39,12 @@ QString CoreInterface::getProfileDir()
return run(args); return run(args);
} }
QString CoreInterface::getInstalledDir()
{
QStringList args("--get-installed-dir");
return run(args);
}
QString CoreInterface::getArch() QString CoreInterface::getArch()
{ {
QStringList args("--get-arch"); QStringList args("--get-arch");

View File

@ -26,6 +26,7 @@ public:
QString getPluginDir(); QString getPluginDir();
QString getProfileDir(); QString getProfileDir();
QString getInstalledDir();
QString getArch(); QString getArch();
QString run(const QStringList& args, const QString& input = ""); QString run(const QStringList& args, const QString& input = "");
}; };

View File

@ -0,0 +1,54 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si, Std.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "FileSysClient.h"
#include "EditionType.h"
#include "QUtility.h"
#include <QDir>
#include <QProcess>
#include <QMessageBox>
#include <QCoreApplication>
#include <stdexcept>
void FileSysClient::queryPluginList()
{
try {
isDone(false);
QString extension = "*" + Plugin::getOsSpecificExt();
QStringList nameFilter(extension);
QString installDir(m_CoreInterface.getInstalledDir()
.append(QDir::separator())
.append(Plugin::getOsSpecificInstallerLocation()));
QString searchDirectory(installDir);
QDir directory(searchDirectory);
m_PluginList = directory.entryList(nameFilter);
isDone(true);
}
catch (std::exception& e)
{
isDone(true);
emit error(tr( "An error occurred while trying to load the "
"plugin list. Please contact the help desk, and "
"provide the following details.\n\n%1").arg(e.what()));
}
emit queryPluginDone();
return;
}

View File

@ -0,0 +1,63 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si, Std.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef FileSysClient_H
#define FileSysClient_H
#include <QString>
#include <QStringList>
#include <QObject>
#include "Plugin.h"
#include "CoreInterface.h"
class QMessageBox;
class QWidget;
class QStringList;
class FileSysClient : public QObject
{
Q_OBJECT
public:
QStringList& getPluginList() { return m_PluginList; }
bool isDone() { return done; }
int count() { return copyCount; }
public slots:
void queryPluginList();
signals:
void error(QString e);
void queryPluginDone();
private:
void isDone(bool b) { done = b; }
QString request(const QString& email,
const QString& password,
QStringList& args);
Plugin plugin;
void count(int i) { copyCount = i; }
private:
int copyCount;
bool done;
QStringList m_PluginList;
CoreInterface m_CoreInterface;
};
#endif // FileSysClient_H

73
src/gui/src/Plugin.cpp Normal file
View File

@ -0,0 +1,73 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Plugin.h"
#include "CoreInterface.h"
static const char kBaseUrl[] = "http://synergy-project.org/files";
static const char kDefaultVersion[] = "1.1";
static const char kWinPackagePlatform32[] = "Windows-x86";
static const char kWinPackagePlatform64[] = "Windows-x64";
static const char kMacPackagePlatform[] = "MacOSX%1-i386";
static const char kLinuxPackagePlatformDeb32[] = "Linux-i686-deb";
static const char kLinuxPackagePlatformDeb64[] = "Linux-x86_64-deb";
static const char kLinuxPackagePlatformRpm32[] = "Linux-i686-rpm";
static const char kLinuxPackagePlatformRpm64[] = "Linux-x86_64-rpm";
#if defined(Q_OS_WIN)
static const char kWinPluginExt[] = ".dll";
static const char kInstallerPluginLocation[] = "Plugins";
#elif defined(Q_OS_MAC)
static const char kMacPluginPrefix[] = "lib";
static const char kMacPluginExt[] = ".dylib";
static const char kInstallerPluginLocation[] = "plugins"; // TODO: Fix for mac
#else
static const char kLinuxPluginPrefix[] = "lib";
static const char kLinuxPluginExt[] = ".so";
// /usr/bin becomes /usr/bin/../lib/syn...
static const char kInstallerPluginLocation[] = "../lib/synergy/plugins";
#endif
QString Plugin::getOsSpecificExt()
{
#if defined(Q_OS_WIN)
return kWinPluginExt;
#elif defined(Q_OS_MAC)
return kMacPluginExt;
#else
return kLinuxPluginExt;
#endif
}
QString Plugin::getOsSpecificName(const QString& pluginName)
{
QString result = pluginName;
#if defined(Q_OS_WIN)
result.append(getOsSpecificExt());
#elif defined(Q_OS_MAC)
result = kMacPluginPrefix + pluginName + getOsSpecificExt();
#else
result = kLinuxPluginPrefix + pluginName + getOsSpecificExt();
#endif
return result;
}
QString Plugin::getOsSpecificInstallerLocation() {
return kInstallerPluginLocation;
}

53
src/gui/src/Plugin.h Normal file
View File

@ -0,0 +1,53 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015 Synergy Si Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PLUGIN_H
#define PLUGIN_H
#include <QString>
#include <QStringList>
#include <QObject>
#include "SslCertificate.h"
#include "CoreInterface.h"
#include "DataDownloader.h"
class Plugin : public QObject
{
Q_OBJECT
public:
//Plugin();
//~PluginManager();
static QString getOsSpecificName(const QString& pluginName);
static QString getOsSpecificExt();
static QString getOsSpecificLocation();
static QString getOsSpecificInstallerLocation();
static QString getOsSpecificUserLocation();
public slots:
private:
// CoreInterface m_CoreInterface;
signals:
private:
};
#endif // PLUGIN_H

View File

@ -23,37 +23,25 @@
#include "QUtility.h" #include "QUtility.h"
#include "ProcessorArch.h" #include "ProcessorArch.h"
#include "Fingerprint.h" #include "Fingerprint.h"
#include "Plugin.h"
#include <QTextStream>
#include <QFile> #include <QFile>
#include <QDir> #include <QDir>
#include <QProcess> #include <QProcess>
#include <QCoreApplication> #include <QCoreApplication>
static const char kBaseUrl[] = "http://synergy-project.org/files"; PluginManager::PluginManager() :
static const char kDefaultVersion[] = "1.1"; m_FileSysPluginList()
static const char kWinPackagePlatform32[] = "Windows-x86";
static const char kWinPackagePlatform64[] = "Windows-x64";
static const char kMacPackagePlatform[] = "MacOSX%1-i386";
static const char kLinuxPackagePlatformDeb32[] = "Linux-i686-deb";
static const char kLinuxPackagePlatformDeb64[] = "Linux-x86_64-deb";
static const char kLinuxPackagePlatformRpm32[] = "Linux-i686-rpm";
static const char kLinuxPackagePlatformRpm64[] = "Linux-x86_64-rpm";
#if defined(Q_OS_WIN)
static const char kWinPluginExt[] = ".dll";
#elif defined(Q_OS_MAC)
static const char kMacPluginPrefix[] = "lib";
static const char kMacPluginExt[] = ".dylib";
#else
static const char kLinuxPluginPrefix[] = "lib";
static const char kLinuxPluginExt[] = ".so";
#endif
PluginManager::PluginManager(QStringList pluginList) :
m_PluginList(pluginList),
m_DownloadIndex(-1)
{ {
}
void PluginManager::initFromFileSys(QStringList pluginList)
{
m_FileSysPluginList.clear();
m_FileSysPluginList.append(pluginList);
m_PluginDir = m_CoreInterface.getPluginDir(); m_PluginDir = m_CoreInterface.getPluginDir();
if (m_PluginDir.isEmpty()) { if (m_PluginDir.isEmpty()) {
emit error(tr("Failed to get plugin directory.")); emit error(tr("Failed to get plugin directory."));
@ -63,6 +51,11 @@ PluginManager::PluginManager(QStringList pluginList) :
if (m_ProfileDir.isEmpty()) { if (m_ProfileDir.isEmpty()) {
emit error(tr("Failed to get profile directory.")); emit error(tr("Failed to get profile directory."));
} }
m_InstalledDir = m_CoreInterface.getInstalledDir();
if (m_InstalledDir.isEmpty()) {
emit error(tr("Failed to get installed directory."));
}
} }
PluginManager::~PluginManager() PluginManager::~PluginManager()
@ -73,7 +66,7 @@ bool PluginManager::exist(QString name)
{ {
CoreInterface coreInterface; CoreInterface coreInterface;
QString PluginDir = coreInterface.getPluginDir(); QString PluginDir = coreInterface.getPluginDir();
QString pluginName = getPluginOsSpecificName(name); QString pluginName = Plugin::getOsSpecificName(name);
QString filename; QString filename;
filename.append(PluginDir); filename.append(PluginDir);
filename.append(QDir::separator()).append(pluginName); filename.append(QDir::separator()).append(pluginName);
@ -86,160 +79,72 @@ bool PluginManager::exist(QString name)
return exist; return exist;
} }
void PluginManager::downloadPlugins() void PluginManager::copyPlugins()
{ {
if (m_DataDownloader.isFinished()) {
if (!savePlugin()) {
return;
}
if (m_DownloadIndex != m_PluginList.size() - 1) {
emit downloadNext();
}
else {
emit downloadFinished();
return;
}
}
m_DownloadIndex++;
if (m_DownloadIndex < m_PluginList.size()) {
QUrl url;
QString pluginUrl = getPluginUrl(m_PluginList.at(m_DownloadIndex));
if (pluginUrl.isEmpty()) {
return;
}
url.setUrl(pluginUrl);
connect(&m_DataDownloader, SIGNAL(isComplete()), this, SLOT(downloadPlugins()));
m_DataDownloader.download(url);
}
}
bool PluginManager::savePlugin()
{
// create the path if not exist
QDir dir(m_PluginDir);
if (!dir.exists()) {
dir.mkpath(".");
}
QString filename = m_PluginDir;
QString pluginName = m_PluginList.at(m_DownloadIndex);
pluginName = getPluginOsSpecificName(pluginName);
filename.append(QDir::separator()).append(pluginName);
QFile file(filename);
if (!file.open(QIODevice::WriteOnly)) {
emit error(
tr("Failed to download plugin '%1' to: %2\n%3")
.arg(m_PluginList.at(m_DownloadIndex))
.arg(m_PluginDir)
.arg(file.errorString()));
file.close();
return false;
}
file.write(m_DataDownloader.data());
file.close();
return true;
}
QString PluginManager::getPluginUrl(const QString& pluginName)
{
QString archName;
#if defined(Q_OS_WIN)
try { try {
QString coreArch = m_CoreInterface.getArch(); // Get the Directory where plugins are put on installation
if (coreArch.startsWith("x86")) { // If it doesn't exist, there is nothing to do
archName = kWinPackagePlatform32; QString srcDirName(m_InstalledDir.append(QDir::separator())
} .append(Plugin::getOsSpecificInstallerLocation()));
else if (coreArch.startsWith("x64")) {
archName = kWinPackagePlatform64; QDir srcDir(srcDirName);
} if (!srcDir.exists()) {
} emit info(
catch (...) { tr("No plugins found to copy from %1")
emit error(tr("Could not get Windows architecture type.")); .arg(srcDirName));
return ""; emit copyFinished();
} }
#elif defined(Q_OS_MAC) // Get the directory where Plugins are installed into Synergy
// If it doesn't exist make it
QString destDirName = m_PluginDir;
QString macVersion = "1010"; QDir destDir(destDirName);
#if __MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 // 10.9 if (!destDir.exists()) {
macVersion = "109"; destDir.mkpath(".");
#elif __MAC_OS_X_VERSION_MIN_REQUIRED <= 1080 // 10.8 }
macVersion = "108"; // Run through the list of plugins and copy them
#elif __MAC_OS_X_VERSION_MIN_REQUIRED <= 1070 // 10.7 for ( int i = 0 ; i < m_FileSysPluginList.size() ; i++ ) {
emit error(tr("Plugins not supported on this Mac OS X version.")); // Get a file entry for the plugin using the full path
return ""; QFile file(srcDirName + QDir::separator() + m_FileSysPluginList.at(i));
#endif
archName = QString(kMacPackagePlatform).arg(macVersion); // construct the destination file name
QString newName(destDirName + QDir::separator() + m_FileSysPluginList.at(i));
#else // Check to see if the plugin already exists
QFile newFile(newName);
QString program("dpkg"); if(newFile.exists()) {
QStringList args; // If it does, delete it. TODO: Check to see if same and leave
args << "-s" << "synergy"; newFile.remove();
}
QProcess process; // make a copy of the plugin in the new location
process.setReadChannel(QProcess::StandardOutput); #if defined(Q_OS_WIN)
process.start(program, args); bool result = file.copy(newName);
bool success = process.waitForStarted(); #else
bool result = file.link(newName);
bool isDeb = (success && process.waitForFinished() & (process.exitCode() == 0)); #endif
if ( !result ) {
int arch = getProcessorArch(); emit error(
if (arch == kProcessorArchLinux32) { tr("Failed to copy plugin '%1' to: %2\n%3")
if (isDeb) { .arg(m_FileSysPluginList.at(i))
archName = kLinuxPackagePlatformDeb32; .arg(newName)
.arg(file.errorString()));
} }
else { else {
archName = kLinuxPackagePlatformRpm32; emit info(
tr("Copying '%1' plugin (%2/%3)...")
.arg(m_FileSysPluginList.at(i))
.arg(i+1)
.arg(m_FileSysPluginList.size()));
} }
} }
else if (arch == kProcessorArchLinux64) {
if (isDeb) {
archName = kLinuxPackagePlatformDeb64;
} }
else { catch (std::exception& e)
archName = kLinuxPackagePlatformRpm64; {
emit error(tr( "An error occurred while trying to copy the "
"plugin list. Please contact the help desk, and "
"provide the following details.\n\n%1").arg(e.what()));
} }
} emit copyFinished();
else { return;
emit error(tr("Could not get Linux architecture type."));
return "";
}
#endif
QString result = QString("%1/plugins/%2/%3/%4/%5")
.arg(kBaseUrl)
.arg(pluginName)
.arg(kDefaultVersion)
.arg(archName)
.arg(getPluginOsSpecificName(pluginName));
qDebug() << result;
return result;
}
QString PluginManager::getPluginOsSpecificName(const QString& pluginName)
{
QString result = pluginName;
#if defined(Q_OS_WIN)
result.append(kWinPluginExt);
#elif defined(Q_OS_MAC)
result = kMacPluginPrefix + pluginName + kMacPluginExt;
#else
result = kLinuxPluginPrefix + pluginName + kLinuxPluginExt;
#endif
return result;
} }

View File

@ -25,44 +25,46 @@
#include "SslCertificate.h" #include "SslCertificate.h"
#include "CoreInterface.h" #include "CoreInterface.h"
#include "DataDownloader.h" #include "DataDownloader.h"
#include "Plugin.h"
class PluginManager : public QObject class PluginManager : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
PluginManager(QStringList pluginList); PluginManager();
~PluginManager(); ~PluginManager();
int downloadIndex() { return m_DownloadIndex; } void initFromWeb(QStringList pluginList);
void initFromFileSys(QStringList pluginList);
int pluginCount() { return m_FileSysPluginList.count(); }
static bool exist(QString name); static bool exist(QString name);
public slots: public slots:
void downloadPlugins(); void copyPlugins();
private: private:
bool savePlugin();
QString getPluginUrl(const QString& pluginName); QString getPluginUrl(const QString& pluginName);
bool runProgram( bool runProgram(
const QString& program, const QString& program,
const QStringList& args, const QStringList& args,
const QStringList& env); const QStringList& env);
static QString getPluginOsSpecificName(const QString& pluginName); //static QString getPluginOsSpecificName(const QString& pluginName);
signals: signals:
void error(QString e); void error(QString e);
void info(QString i); void info(QString i);
void downloadNext(); void updateCopyStatus(int);
void downloadFinished(); void copyFinished();
private: private:
QStringList m_PluginList; QStringList m_FileSysPluginList;
QString m_PluginDir; QString m_PluginDir;
QString m_ProfileDir; QString m_ProfileDir;
int m_DownloadIndex; QString m_InstalledDir;
DataDownloader m_DataDownloader;
CoreInterface m_CoreInterface; CoreInterface m_CoreInterface;
SslCertificate m_SslCertificate; SslCertificate m_SslCertificate;
}; };

View File

@ -19,6 +19,7 @@
#include "ui_PluginWizardPageBase.h" #include "ui_PluginWizardPageBase.h"
#include "SslCertificate.h" #include "SslCertificate.h"
#include "FileSysClient.h"
#include "WebClient.h" #include "WebClient.h"
#include "PluginManager.h" #include "PluginManager.h"
@ -28,8 +29,7 @@
PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) : PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) :
QWizardPage(parent), QWizardPage(parent),
m_Finished(false), m_Finished(false),
m_pWebClient(NULL), m_pFileSysClient(NULL),
m_pPluginManager(NULL),
m_pSslCertificate(NULL), m_pSslCertificate(NULL),
m_AppConfig(appConfig) m_AppConfig(appConfig)
{ {
@ -44,12 +44,8 @@ PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) :
PluginWizardPage::~PluginWizardPage() PluginWizardPage::~PluginWizardPage()
{ {
if (m_pWebClient != NULL) { if (m_pFileSysClient != NULL) {
delete m_pWebClient; delete m_pFileSysClient;
}
if (m_pPluginManager != NULL) {
delete m_pPluginManager;
} }
delete m_pSslCertificate; delete m_pSslCertificate;
@ -75,27 +71,16 @@ void PluginWizardPage::showError(QString error)
void PluginWizardPage::queryPluginDone() void PluginWizardPage::queryPluginDone()
{ {
QStringList pluginList = m_pWebClient->getPluginList(); QStringList pluginList = m_pFileSysClient->getPluginList();
if (pluginList.isEmpty()) { if (pluginList.isEmpty()) {
updateStatus(tr("Setup complete.")); updateStatus(tr("Setup complete."));
showFinished(); showFinished();
} }
else { else {
downloadPlugins(); copyPlugins();
} }
} }
void PluginWizardPage::updateDownloadStatus()
{
QStringList pluginList = m_pWebClient->getPluginList();
int index = m_pPluginManager->downloadIndex();
updateStatus(
tr("Downloading '%1' plugin (%2/%3)...")
.arg(pluginList.at(index + 1))
.arg(index + 2)
.arg(pluginList.size()));
}
void PluginWizardPage::finished() void PluginWizardPage::finished()
{ {
// TODO: we should check if ns plugin exists // TODO: we should check if ns plugin exists
@ -130,33 +115,29 @@ void PluginWizardPage::updateStatus(QString info)
m_pLabelStatus->setText(info); m_pLabelStatus->setText(info);
} }
void PluginWizardPage::downloadPlugins() void PluginWizardPage::copyPlugins()
{ {
QStringList pluginList = m_pWebClient->getPluginList(); QStringList pluginList = m_pFileSysClient->getPluginList();
m_pPluginManager = new PluginManager(pluginList); m_PluginManager.initFromFileSys(pluginList);
m_pThread = new QThread; m_pThread = new QThread;
connect(m_pPluginManager, connect(&m_PluginManager,
SIGNAL(error(QString)), SIGNAL(error(QString)),
this, this,
SLOT(showError(QString))); SLOT(showError(QString)));
connect(m_pPluginManager, connect(&m_PluginManager,
SIGNAL(info(QString)), SIGNAL(info(QString)),
this, this,
SLOT(updateStatus(QString))); SLOT(updateStatus(QString)));
connect(m_pPluginManager, connect(&m_PluginManager,
SIGNAL(downloadNext()), SIGNAL(copyFinished()),
this,
SLOT(updateDownloadStatus()));
connect(m_pPluginManager,
SIGNAL(downloadFinished()),
this, this,
SLOT(generateCertificate())); SLOT(generateCertificate()));
connect(m_pPluginManager, connect(&m_PluginManager,
SIGNAL(error(QString)), SIGNAL(error(QString)),
m_pThread, m_pThread,
SLOT(quit())); SLOT(quit()));
@ -167,16 +148,14 @@ void PluginWizardPage::downloadPlugins()
SLOT(deleteLater())); SLOT(deleteLater()));
updateStatus( updateStatus(
tr("Downloading plugin: %1 (1/%2)") tr("Copying plugins..."));
.arg(pluginList.at(0))
.arg(pluginList.size()));
m_pPluginManager->moveToThread(m_pThread); m_PluginManager.moveToThread(m_pThread);
m_pThread->start(); m_pThread->start();
QMetaObject::invokeMethod( QMetaObject::invokeMethod(
m_pPluginManager, &m_PluginManager,
"downloadPlugins", "copyPlugins",
Qt::QueuedConnection); Qt::QueuedConnection);
} }
@ -195,7 +174,7 @@ bool PluginWizardPage::isComplete() const
void PluginWizardPage::initializePage() void PluginWizardPage::initializePage()
{ {
QWizardPage::initializePage(); QWizardPage::initializePage();
if (m_pWebClient == NULL) { if (m_pFileSysClient == NULL) {
if (m_Email.isEmpty() || if (m_Email.isEmpty() ||
m_Password.isEmpty()) { m_Password.isEmpty()) {
updateStatus(tr("Setup complete.")); updateStatus(tr("Setup complete."));
@ -205,38 +184,38 @@ void PluginWizardPage::initializePage()
m_pLabelSpinning->show(); m_pLabelSpinning->show();
m_pFileSysClient = new FileSysClient();
m_pWebClient = new WebClient(); m_pWebClient = new WebClient();
m_pWebClient->setEmail(m_Email); m_pWebClient->setEmail(m_Email);
m_pWebClient->setPassword(m_Password); m_pWebClient->setPassword(m_Password);
QThread* thread = new QThread; QThread* thread = new QThread;
connect(m_pWebClient, connect(m_pFileSysClient,
SIGNAL(error(QString)), SIGNAL(error(QString)),
this, this,
SLOT(showError(QString))); SLOT(showError(QString)));
connect(m_pWebClient, connect(m_pFileSysClient,
SIGNAL(queryPluginDone()), SIGNAL(queryPluginDone()),
this, this,
SLOT(queryPluginDone())); SLOT(queryPluginDone()));
connect(m_pWebClient, connect(m_pFileSysClient,
SIGNAL(queryPluginDone()), SIGNAL(queryPluginDone()),
thread, thread,
SLOT(quit())); SLOT(quit()));
connect(m_pWebClient, connect(m_pFileSysClient,
SIGNAL(error(QString)), SIGNAL(error(QString)),
thread, thread,
SLOT(quit())); SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
m_pWebClient->moveToThread(thread); m_pFileSysClient->moveToThread(thread);
thread->start(); thread->start();
updateStatus(tr("Getting plugin list...")); QMetaObject::invokeMethod(m_pFileSysClient, "queryPluginList", Qt::QueuedConnection);
QMetaObject::invokeMethod(m_pWebClient, "queryPluginList", Qt::QueuedConnection);
} }
} }

View File

@ -21,10 +21,11 @@
#include "AppConfig.h" #include "AppConfig.h"
#include "ui_PluginWizardPageBase.h" #include "ui_PluginWizardPageBase.h"
#include "PluginManager.h"
#include <QWizardPage> #include <QWizardPage>
class FileSysClient;
class WebClient; class WebClient;
class PluginManager;
class SslCertificate; class SslCertificate;
class PluginWizardPage : public QWizardPage, public Ui::PluginWizardPage { class PluginWizardPage : public QWizardPage, public Ui::PluginWizardPage {
@ -49,12 +50,11 @@ protected slots:
void showError(QString error); void showError(QString error);
void updateStatus(QString info); void updateStatus(QString info);
void queryPluginDone(); void queryPluginDone();
void updateDownloadStatus();
void finished(); void finished();
void generateCertificate(); void generateCertificate();
private: private:
void downloadPlugins(); void copyPlugins();
void showFinished(); void showFinished();
private: private:
@ -62,7 +62,8 @@ private:
QString m_Email; QString m_Email;
QString m_Password; QString m_Password;
WebClient* m_pWebClient; WebClient* m_pWebClient;
PluginManager* m_pPluginManager; FileSysClient* m_pFileSysClient;
PluginManager m_PluginManager;
SslCertificate* m_pSslCertificate; SslCertificate* m_pSslCertificate;
QThread* m_pThread; QThread* m_pThread;
AppConfig& m_AppConfig; AppConfig& m_AppConfig;

View File

@ -92,9 +92,9 @@ std::string
ArchFileUnix::getInstalledDirectory() ArchFileUnix::getInstalledDirectory()
{ {
#if WINAPI_XWINDOWS #if WINAPI_XWINDOWS
return "/bin"; return "/usr/bin";
#else #else
return ""; return "/Applications/Synergy.app/Contents/MacOS";
#endif #endif
} }

View File

@ -69,7 +69,12 @@ ArchPluginWindows::load()
String filename = synergy::string::removeFileExt(*it); String filename = synergy::string::removeFileExt(*it);
m_pluginTable.insert(std::make_pair(filename, lib)); m_pluginTable.insert(std::make_pair(filename, lib));
LOG((CLOG_DEBUG "loaded plugin: %s", (*it).c_str())); char * version = (char*)invoke( filename.c_str(),"version",NULL);
if (version == NULL) {
version = "Pre-1.7.4";
}
LOG((CLOG_DEBUG "loaded plugin: %s (%s)", (*it).c_str(),version));
} }
} }

View File

@ -24,6 +24,7 @@
#include <iostream> #include <iostream>
const char * kSynergyVers = VERSION;
SecureSocket* g_secureSocket = NULL; SecureSocket* g_secureSocket = NULL;
SecureListenSocket* g_secureListenSocket = NULL; SecureListenSocket* g_secureListenSocket = NULL;
Arch* g_arch = NULL; Arch* g_arch = NULL;
@ -86,6 +87,9 @@ invoke(const char* command, void** args)
g_secureListenSocket = NULL; g_secureListenSocket = NULL;
} }
} }
else if(strcmp(command, "version") == 0) {
return (void*) kSynergyVers;
}
return NULL; return NULL;
} }

View File

@ -180,6 +180,10 @@ ArgParser::parseToolArgs(ToolArgs& args, int argc, const char* const* argv)
args.m_getPluginList = true; args.m_getPluginList = true;
return true; return true;
} }
else if (isArg(i, argc, argv, NULL, "--get-installed-dir", 0)) {
args.m_getInstalledDir = true;
return true;
}
else if (isArg(i, argc, argv, NULL, "--get-plugin-dir", 0)) { else if (isArg(i, argc, argv, NULL, "--get-plugin-dir", 0)) {
args.m_getPluginDir = true; args.m_getPluginDir = true;
return true; return true;

View File

@ -74,6 +74,9 @@ ToolApp::run(int argc, char** argv)
else if (m_args.m_getPluginList) { else if (m_args.m_getPluginList) {
getPluginList(); getPluginList();
} }
else if (m_args.m_getInstalledDir) {
std::cout << ARCH->getInstalledDirectory() << std::endl;
}
else if (m_args.m_getPluginDir) { else if (m_args.m_getPluginDir) {
std::cout << ARCH->getPluginDirectory() << std::endl; std::cout << ARCH->getPluginDirectory() << std::endl;
} }

View File

@ -22,6 +22,7 @@ ToolArgs::ToolArgs() :
m_loginAuthenticate(false), m_loginAuthenticate(false),
m_getPluginList(false), m_getPluginList(false),
m_getPluginDir(false), m_getPluginDir(false),
m_getInstalledDir(false),
m_getProfileDir(false) m_getProfileDir(false)
{ {
} }

View File

@ -28,6 +28,7 @@ public:
bool m_loginAuthenticate; bool m_loginAuthenticate;
bool m_getPluginList; bool m_getPluginList;
bool m_getPluginDir; bool m_getPluginDir;
bool m_getInstalledDir;
bool m_getProfileDir; bool m_getProfileDir;
bool m_getArch; bool m_getArch;
}; };

View File

@ -27,6 +27,7 @@
<Feature Id="ProductFeature" Title="$(var.Name)"> <Feature Id="ProductFeature" Title="$(var.Name)">
<ComponentGroupRef Id="ProductComponents" /> <ComponentGroupRef Id="ProductComponents" />
<ComponentGroupRef Id="OpenSslComponents" /> <ComponentGroupRef Id="OpenSslComponents" />
<ComponentGroupRef Id="PluginsComponents" />
<MergeRef Id="CRT" /> <MergeRef Id="CRT" />
</Feature> </Feature>
@ -69,6 +70,7 @@
<Directory Id="INSTALLFOLDER" Name="$(var.Name)"> <Directory Id="INSTALLFOLDER" Name="$(var.Name)">
<Merge Id="CRT" Language="0" SourceFile="$(var.CRT)" DiskId="1" /> <Merge Id="CRT" Language="0" SourceFile="$(var.CRT)" DiskId="1" />
<Directory Id="OpenSslDir" Name="OpenSSL" /> <Directory Id="OpenSslDir" Name="OpenSSL" />
<Directory Id="PluginsDir" Name="Plugins" />
</Directory> </Directory>
</Directory> </Directory>
<Directory Id="ProgramMenuFolder" /> <Directory Id="ProgramMenuFolder" />
@ -130,5 +132,12 @@
<File Source="$(var.ResPath)/openssl/synergy.conf" /> <File Source="$(var.ResPath)/openssl/synergy.conf" />
</Component> </Component>
</ComponentGroup> </ComponentGroup>
<ComponentGroup Id="PluginsComponents" Directory="PluginsDir">
<Component Id="Plugins" Guid="0AB05500-0D04-4932-9B07-EDDA052796E2">
<File Source="$(var.BinPath)/plugins/ns.dll" />
</Component>
</ComponentGroup>
</Fragment> </Fragment>
</Wix> </Wix>