From b34044ec6a37229f7c994c0f26954fe7783d7be3 Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Tue, 26 May 2015 11:50:21 -0700 Subject: [PATCH 01/11] Versioned to 1.7.4 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e009d94..1c478fc5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,7 +17,7 @@ # Version number for Synergy set(VERSION_MAJOR 1) set(VERSION_MINOR 7) -set(VERSION_REV 3) +set(VERSION_REV 4) set(VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}") cmake_minimum_required(VERSION 2.6) From dba46707b259633b78cc3523c2be8e16caca21dd Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Tue, 26 May 2015 13:31:15 -0700 Subject: [PATCH 02/11] Removed SSL chunk size limitation #4712 --- src/lib/server/ClientProxy1_6.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp index a27e8ce6..79d890c6 100644 --- a/src/lib/server/ClientProxy1_6.cpp +++ b/src/lib/server/ClientProxy1_6.cpp @@ -61,18 +61,9 @@ ClientProxy1_6::setClipboard(ClipboardID id, const IClipboard* clipboard) size_t size = data.size(); LOG((CLOG_DEBUG "sending clipboard %d to \"%s\"", id, getName().c_str())); - - // HACK: if using SSL, don't send large clipboards (#4601) - bool send = true; - if (getServer()->isSecure() && (size > kSslClipboardMaxSize)) { - send = false; - LOG((CLOG_WARN "large clipboards not supported with ssl, size=%d", size)); - } - - if (send) { - StreamChunker::sendClipboard(data, size, id, 0, m_events, this); - LOG((CLOG_DEBUG "sent clipboard size=%d", size)); - } + + StreamChunker::sendClipboard(data, size, id, 0, m_events, this); + LOG((CLOG_DEBUG "sent clipboard size=%d", size)); } } From f063b094ecee960f2456ebe3dbecb375ca0e147d Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Tue, 26 May 2015 17:12:58 -0700 Subject: [PATCH 03/11] Used log system instead of stdout #4690 --- src/lib/platform/MSWindowsWatchdog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index 8bbb0ab2..fdb2c72a 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -565,7 +565,7 @@ MSWindowsWatchdog::testOutput(String buffer) if (i != String::npos) { size_t s = sizeof(g_activeDesktop); String defaultDesktop("Default"); - String sub = buffer.substr(s - 1, defaultDesktop.size()); + String sub = buffer.substr(i + s - 1, defaultDesktop.size()); if (sub != defaultDesktop) { m_autoElevated = true; } From 907b02fb093b9a171ffa0a265b45d8406079fbd0 Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Tue, 26 May 2015 17:18:14 -0700 Subject: [PATCH 04/11] Used log system instead of stdout (part 2) #4690 --- src/lib/synergy/ToolApp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/synergy/ToolApp.cpp b/src/lib/synergy/ToolApp.cpp index c9a2b5c7..9a1c3385 100644 --- a/src/lib/synergy/ToolApp.cpp +++ b/src/lib/synergy/ToolApp.cpp @@ -63,8 +63,9 @@ ToolApp::run(int argc, char** argv) return kExitFailed; } else { - // HACK: send to standard out so watchdog can parse. - std::cout << "activeDesktop:" << name.c_str() << std::endl; + String output("activeDesktop:"); + output.append(name); + LOG((CLOG_INFO "%s", output.c_str())); } #endif } From d83cb23cc7ead0df253820096e0fcaf8734b3cfe Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Tue, 26 May 2015 17:25:18 -0700 Subject: [PATCH 05/11] Reverted 8b9758 #4712 --- src/lib/server/ClientListener.h | 3 --- src/lib/server/ClientProxy1_6.cpp | 8 ++------ src/lib/server/Server.cpp | 6 ------ src/lib/server/Server.h | 3 --- 4 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h index 70ecb2eb..c0b35ab3 100644 --- a/src/lib/server/ClientListener.h +++ b/src/lib/server/ClientListener.h @@ -64,9 +64,6 @@ public: //! Get server which owns this listener Server* getServer() { return m_server; } - //! Return true if using secure network connection - bool isSecure() { return m_useSecureNetwork; } - //@} private: diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp index 79d890c6..8b429cca 100644 --- a/src/lib/server/ClientProxy1_6.cpp +++ b/src/lib/server/ClientProxy1_6.cpp @@ -29,11 +29,6 @@ // ClientProxy1_6 // -enum -{ - kSslClipboardMaxSize = 1024 -}; - ClientProxy1_6::ClientProxy1_6(const String& name, synergy::IStream* stream, Server* server, IEventQueue* events) : ClientProxy1_5(name, stream, server, events), m_events(events) @@ -61,8 +56,9 @@ ClientProxy1_6::setClipboard(ClipboardID id, const IClipboard* clipboard) size_t size = data.size(); LOG((CLOG_DEBUG "sending clipboard %d to \"%s\"", id, getName().c_str())); - + StreamChunker::sendClipboard(data, size, id, 0, m_events, this); + LOG((CLOG_DEBUG "sent clipboard size=%d", size)); } } diff --git a/src/lib/server/Server.cpp b/src/lib/server/Server.cpp index 8b7c4afd..832a03b0 100644 --- a/src/lib/server/Server.cpp +++ b/src/lib/server/Server.cpp @@ -2389,9 +2389,3 @@ Server::dragInfoReceived(UInt32 fileNum, String content) m_screen->startDraggingFiles(m_dragFileList); } - -bool -Server::isSecure() const -{ - return m_clientListener->isSecure(); -} diff --git a/src/lib/server/Server.h b/src/lib/server/Server.h index 63551efa..d85a113d 100644 --- a/src/lib/server/Server.h +++ b/src/lib/server/Server.h @@ -175,9 +175,6 @@ public: //! Return received file data String& getReceivedFileData() { return m_receivedFileData; } - //! Return true if using secure network connection - bool isSecure() const; - //@} private: From 03fc9b5fa72fd3197ca1e496f2c22e640304a602 Mon Sep 17 00:00:00 2001 From: Maxim Doucet Date: Wed, 27 May 2015 18:34:47 +0200 Subject: [PATCH 06/11] Fix issue synergy/synergy#4720 --- src/gui/src/PluginManager.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gui/src/PluginManager.cpp b/src/gui/src/PluginManager.cpp index fd3a24e4..d1dc8762 100644 --- a/src/gui/src/PluginManager.cpp +++ b/src/gui/src/PluginManager.cpp @@ -194,13 +194,7 @@ QString PluginManager::getPluginUrl(const QString& pluginName) process.start(program, args); bool success = process.waitForStarted(); - if (!success || !process.waitForFinished()) - { - emit error(tr("Could not get Linux package type.")); - return ""; - } - - bool isDeb = (process.exitCode() == 0); + bool isDeb = (success && process.waitForFinished() & (process.exitCode() == 0)); int arch = getProcessorArch(); if (arch == kProcessorArchLinux32) { From 3498d1bc8ed1902fec9f1a000efe83f01247438d Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Wed, 27 May 2015 09:52:58 -0700 Subject: [PATCH 07/11] Used synergy::string::sprintf instead of append #4690 --- src/lib/synergy/ToolApp.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/lib/synergy/ToolApp.cpp b/src/lib/synergy/ToolApp.cpp index 9a1c3385..aa82fc88 100644 --- a/src/lib/synergy/ToolApp.cpp +++ b/src/lib/synergy/ToolApp.cpp @@ -63,8 +63,7 @@ ToolApp::run(int argc, char** argv) return kExitFailed; } else { - String output("activeDesktop:"); - output.append(name); + String output = synergy::string::sprintf("activeDesktop:%s", name.c_str()); LOG((CLOG_INFO "%s", output.c_str())); } #endif From aec52c36e6e9c5961f2fee2e4eb68c60317bca48 Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Wed, 27 May 2015 10:18:45 -0700 Subject: [PATCH 08/11] Added timeout for waiting active destop result #4723 --- src/lib/platform/MSWindowsWatchdog.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index fdb2c72a..c57fb278 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -37,6 +37,7 @@ #include #include +#define MAXIMUM_WAIT_TIME 3 enum { kOutputBufferSize = 4096 }; @@ -549,8 +550,13 @@ MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security) } ARCH->lockMutex(m_mutex); + int waitTime = 0; while (!m_ready) { + break; + } + ARCH->waitCondVar(m_condVar, m_mutex, 1.0); + i++; } m_ready = false; ARCH->unlockMutex(m_mutex); From d7063a87c871cd97d7e026bcf7c9cf3b895e9f55 Mon Sep 17 00:00:00 2001 From: "Jerry (Xinyu Hou)" Date: Wed, 27 May 2015 10:32:13 -0700 Subject: [PATCH 09/11] Fixed using wrong local variable #4723 --- src/lib/platform/MSWindowsWatchdog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index c57fb278..837db1de 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -552,11 +552,12 @@ MSWindowsWatchdog::getActiveDesktop(LPSECURITY_ATTRIBUTES security) ARCH->lockMutex(m_mutex); int waitTime = 0; while (!m_ready) { + if (waitTime >= MAXIMUM_WAIT_TIME) { break; } ARCH->waitCondVar(m_condVar, m_mutex, 1.0); - i++; + waitTime++; } m_ready = false; ARCH->unlockMutex(m_mutex); From 8d70075171b9e4fd72493304ae84e110c5e278e6 Mon Sep 17 00:00:00 2001 From: Adam Potolsky Date: Fri, 29 May 2015 15:57:21 -0700 Subject: [PATCH 10/11] Replaces plugin download with install and copy functionality #4696 --- src/gui/gui.pro | 13 +- src/gui/src/FileSysClient.cpp | 52 +++++++ src/gui/src/FileSysClient.h | 63 ++++++++ src/gui/src/Plugin.cpp | 90 ++++++++++++ src/gui/src/Plugin.h | 53 +++++++ src/gui/src/PluginManager.cpp | 243 ++++++++----------------------- src/gui/src/PluginManager.h | 21 +-- src/gui/src/PluginWizardPage.cpp | 75 ++++------ src/gui/src/PluginWizardPage.h | 9 +- 9 files changed, 373 insertions(+), 246 deletions(-) create mode 100644 src/gui/src/FileSysClient.cpp create mode 100644 src/gui/src/FileSysClient.h create mode 100644 src/gui/src/Plugin.cpp create mode 100644 src/gui/src/Plugin.h diff --git a/src/gui/gui.pro b/src/gui/gui.pro index f519885e..2e441c67 100644 --- a/src/gui/gui.pro +++ b/src/gui/gui.pro @@ -52,12 +52,14 @@ SOURCES += src/main.cpp \ src/DataDownloader.cpp \ src/AddClientDialog.cpp \ src/CommandProcess.cpp \ - src/WebClient.cpp \ src/PluginWizardPage.cpp \ src/PluginManager.cpp \ src/CoreInterface.cpp \ src/Fingerprint.cpp \ - src/SslCertificate.cpp + src/SslCertificate.cpp \ + src/FileSysClient.cpp \ + src/Plugin.cpp \ + src/WebClient.cpp HEADERS += src/MainWindow.h \ src/AboutDialog.h \ src/ServerConfig.h \ @@ -94,14 +96,17 @@ HEADERS += src/MainWindow.h \ src/DataDownloader.h \ src/AddClientDialog.h \ src/CommandProcess.h \ - src/WebClient.h \ src/EditionType.h \ src/PluginWizardPage.h \ src/ProcessorArch.h \ src/PluginManager.h \ src/CoreInterface.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 RC_FILE = res/win/Synergy.rc macx { diff --git a/src/gui/src/FileSysClient.cpp b/src/gui/src/FileSysClient.cpp new file mode 100644 index 00000000..53b759b9 --- /dev/null +++ b/src/gui/src/FileSysClient.cpp @@ -0,0 +1,52 @@ +/* + * 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 . + */ + +#include "FileSysClient.h" + +#include "EditionType.h" +#include "QUtility.h" + +#include +#include +#include +#include +#include + +void FileSysClient::queryPluginList() +{ + try { + isDone(false); + QString extension = "*" + Plugin::getOsSpecificExt(); + QStringList nameFilter(extension); + + QString searchDirectory(Plugin::getOsSpecificInstallerLocation()); + + 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; +} diff --git a/src/gui/src/FileSysClient.h b/src/gui/src/FileSysClient.h new file mode 100644 index 00000000..dfe7ee95 --- /dev/null +++ b/src/gui/src/FileSysClient.h @@ -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 . + */ + +#ifndef FileSysClient_H +#define FileSysClient_H + +#include +#include +#include + +#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 diff --git a/src/gui/src/Plugin.cpp b/src/gui/src/Plugin.cpp new file mode 100644 index 00000000..4759e4e2 --- /dev/null +++ b/src/gui/src/Plugin.cpp @@ -0,0 +1,90 @@ +/* + * 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 . + */ + +#include "Plugin.h" + +#include "CoreInterface.h" +//#include "CommandProcess.h" +//#include "DataDownloader.h" +//#include "QUtility.h" +//#include "ProcessorArch.h" +//#include "Fingerprint.h" + +//#include +//#include +//#include +//#include + +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[] = "C:/Program Files/Synergy/Plugins/"; //TODO: needs proper windows %X% notation +static const char kUserPluginLocation[] = "C:/Users/speaker/AppData/Local/Synergy/Plugins";//TODO: needs proper windows %X% notation +#elif defined(Q_OS_MAC) +static const char kMacPluginPrefix[] = "lib"; +static const char kMacPluginExt[] = ".dylib"; +static const char kInstallerPluginLocation[] = "/usr/lib/synergy/plugins"; +static const char kUserPluginLocation[] = "/home/speaker/.synergy/plugins";//TODO: needs proper unix notation +#else +static const char kLinuxPluginPrefix[] = "lib"; +static const char kLinuxPluginExt[] = ".so"; +static const char kInstallerPluginLocation[] = "/usr/lib/synergy/plugins"; +static const char kUserPluginLocation[] = "/home/speaker/.synergy/plugins";//TODO: needs proper MacOS X notation +#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 + getPluginOsSpecificExt(); +#else + result = kLinuxPluginPrefix + pluginName + getPluginOsSpecificExt(); +#endif + return result; +} + +QString Plugin::getOsSpecificInstallerLocation() { + return kInstallerPluginLocation; +} + +QString Plugin::getOsSpecificUserLocation() { + return kUserPluginLocation; +} + diff --git a/src/gui/src/Plugin.h b/src/gui/src/Plugin.h new file mode 100644 index 00000000..431e1a80 --- /dev/null +++ b/src/gui/src/Plugin.h @@ -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 . + */ +#ifndef PLUGIN_H +#define PLUGIN_H + +#include +#include +#include + +#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 diff --git a/src/gui/src/PluginManager.cpp b/src/gui/src/PluginManager.cpp index fd3a24e4..e73c93e6 100644 --- a/src/gui/src/PluginManager.cpp +++ b/src/gui/src/PluginManager.cpp @@ -23,37 +23,23 @@ #include "QUtility.h" #include "ProcessorArch.h" #include "Fingerprint.h" +#include "Plugin.h" #include #include #include #include -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"; - -#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) +PluginManager::PluginManager() : + m_FileSysPluginList() { +} + +void PluginManager::initFromFileSys(QStringList pluginList) +{ + m_FileSysPluginList.clear(); + m_FileSysPluginList.append(pluginList); + m_PluginDir = m_CoreInterface.getPluginDir(); if (m_PluginDir.isEmpty()) { emit error(tr("Failed to get plugin directory.")); @@ -73,7 +59,7 @@ bool PluginManager::exist(QString name) { CoreInterface coreInterface; QString PluginDir = coreInterface.getPluginDir(); - QString pluginName = getPluginOsSpecificName(name); + QString pluginName = Plugin::getOsSpecificName(name); QString filename; filename.append(PluginDir); filename.append(QDir::separator()).append(pluginName); @@ -86,166 +72,63 @@ bool PluginManager::exist(QString name) 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 { - QString coreArch = m_CoreInterface.getArch(); - if (coreArch.startsWith("x86")) { - archName = kWinPackagePlatform32; + // Get the Directory where plugins are put on installation + // If it doesn't exist, there is nothing to do + QString srcDirName = Plugin::getOsSpecificInstallerLocation(); + QDir srcDir(srcDirName); + if (!srcDir.exists()) { + emit info( + tr("No plugins found to copy from %1") + .arg(srcDirName)); + emit copyFinished(); } - else if (coreArch.startsWith("x64")) { - archName = kWinPackagePlatform64; + + // Get the directory where Plugins are installed into Synergy + // If it doesn't exist make it + QString destDirName = m_PluginDir; + QDir destDir(destDirName); + if (!destDir.exists()) { + destDir.mkpath("."); + } + // Run through the list of plugins and copy them + for ( int i = 0 ; i < m_FileSysPluginList.size() ; i++ ) { + // Get a file entry for the plugin using the full path + QFile file(srcDirName + m_FileSysPluginList.at(i)); + // construct the destination file name + QString newName = destDirName; + newName.append(QDir::separator()).append(m_FileSysPluginList.at(i)); + + QFile newFile(newName); + if(newFile.exists()) { + newFile.remove(); + } + // make a copy of the plugin in the new location + bool result = file.copy(newName); + if ( !result ) { + emit error( + tr("Failed to copy plugin '%1' to: %2\n%3") + .arg(m_FileSysPluginList.at(i)) + .arg(newName) + .arg(file.errorString())); + } + else { + emit info( + tr("Copying '%1' plugin (%2/%3)...") + .arg(m_FileSysPluginList.at(i)) + .arg(i+1) + .arg(m_FileSysPluginList.size())); + } } } - catch (...) { - emit error(tr("Could not get Windows architecture type.")); - return ""; - } - -#elif defined(Q_OS_MAC) - - QString macVersion = "1010"; -#if __MAC_OS_X_VERSION_MIN_REQUIRED <= 1090 // 10.9 - macVersion = "109"; -#elif __MAC_OS_X_VERSION_MIN_REQUIRED <= 1080 // 10.8 - macVersion = "108"; -#elif __MAC_OS_X_VERSION_MIN_REQUIRED <= 1070 // 10.7 - emit error(tr("Plugins not supported on this Mac OS X version.")); - return ""; -#endif - - archName = QString(kMacPackagePlatform).arg(macVersion); - -#else - - QString program("dpkg"); - QStringList args; - args << "-s" << "synergy"; - - QProcess process; - process.setReadChannel(QProcess::StandardOutput); - process.start(program, args); - bool success = process.waitForStarted(); - - if (!success || !process.waitForFinished()) + catch (std::exception& e) { - emit error(tr("Could not get Linux package type.")); - return ""; + 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())); } - - bool isDeb = (process.exitCode() == 0); - - int arch = getProcessorArch(); - if (arch == kProcessorArchLinux32) { - if (isDeb) { - archName = kLinuxPackagePlatformDeb32; - } - else { - archName = kLinuxPackagePlatformRpm32; - } - } - else if (arch == kProcessorArchLinux64) { - if (isDeb) { - archName = kLinuxPackagePlatformDeb64; - } - else { - archName = kLinuxPackagePlatformRpm64; - } - } - else { - 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; + emit copyFinished(); + return; } diff --git a/src/gui/src/PluginManager.h b/src/gui/src/PluginManager.h index 279e5ff4..f6bdb5e4 100644 --- a/src/gui/src/PluginManager.h +++ b/src/gui/src/PluginManager.h @@ -25,44 +25,45 @@ #include "SslCertificate.h" #include "CoreInterface.h" #include "DataDownloader.h" +#include "Plugin.h" class PluginManager : public QObject { Q_OBJECT public: - PluginManager(QStringList pluginList); + 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); public slots: - void downloadPlugins(); + void copyPlugins(); private: - bool savePlugin(); QString getPluginUrl(const QString& pluginName); bool runProgram( const QString& program, const QStringList& args, const QStringList& env); - static QString getPluginOsSpecificName(const QString& pluginName); + //static QString getPluginOsSpecificName(const QString& pluginName); signals: void error(QString e); void info(QString i); - void downloadNext(); - void downloadFinished(); + void updateCopyStatus(int); + void copyFinished(); private: - QStringList m_PluginList; + QStringList m_FileSysPluginList; QString m_PluginDir; QString m_ProfileDir; - int m_DownloadIndex; - DataDownloader m_DataDownloader; CoreInterface m_CoreInterface; SslCertificate m_SslCertificate; }; diff --git a/src/gui/src/PluginWizardPage.cpp b/src/gui/src/PluginWizardPage.cpp index 2abdb178..9c2994a6 100644 --- a/src/gui/src/PluginWizardPage.cpp +++ b/src/gui/src/PluginWizardPage.cpp @@ -19,6 +19,7 @@ #include "ui_PluginWizardPageBase.h" #include "SslCertificate.h" +#include "FileSysClient.h" #include "WebClient.h" #include "PluginManager.h" @@ -28,8 +29,7 @@ PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) : QWizardPage(parent), m_Finished(false), - m_pWebClient(NULL), - m_pPluginManager(NULL), + m_pFileSysClient(NULL), m_pSslCertificate(NULL), m_AppConfig(appConfig) { @@ -44,12 +44,8 @@ PluginWizardPage::PluginWizardPage(AppConfig& appConfig, QWidget *parent) : PluginWizardPage::~PluginWizardPage() { - if (m_pWebClient != NULL) { - delete m_pWebClient; - } - - if (m_pPluginManager != NULL) { - delete m_pPluginManager; + if (m_pFileSysClient != NULL) { + delete m_pFileSysClient; } delete m_pSslCertificate; @@ -75,27 +71,16 @@ void PluginWizardPage::showError(QString error) void PluginWizardPage::queryPluginDone() { - QStringList pluginList = m_pWebClient->getPluginList(); + QStringList pluginList = m_pFileSysClient->getPluginList(); if (pluginList.isEmpty()) { updateStatus(tr("Setup complete.")); showFinished(); } 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() { // TODO: we should check if ns plugin exists @@ -130,33 +115,29 @@ void PluginWizardPage::updateStatus(QString info) m_pLabelStatus->setText(info); } -void PluginWizardPage::downloadPlugins() +void PluginWizardPage::copyPlugins() { - QStringList pluginList = m_pWebClient->getPluginList(); - m_pPluginManager = new PluginManager(pluginList); + QStringList pluginList = m_pFileSysClient->getPluginList(); + m_PluginManager.initFromFileSys(pluginList); + m_pThread = new QThread; - connect(m_pPluginManager, + connect(&m_PluginManager, SIGNAL(error(QString)), this, SLOT(showError(QString))); - connect(m_pPluginManager, + connect(&m_PluginManager, SIGNAL(info(QString)), this, SLOT(updateStatus(QString))); - connect(m_pPluginManager, - SIGNAL(downloadNext()), - this, - SLOT(updateDownloadStatus())); - - connect(m_pPluginManager, - SIGNAL(downloadFinished()), + connect(&m_PluginManager, + SIGNAL(copyFinished()), this, SLOT(generateCertificate())); - connect(m_pPluginManager, + connect(&m_PluginManager, SIGNAL(error(QString)), m_pThread, SLOT(quit())); @@ -167,16 +148,14 @@ void PluginWizardPage::downloadPlugins() SLOT(deleteLater())); updateStatus( - tr("Downloading plugin: %1 (1/%2)") - .arg(pluginList.at(0)) - .arg(pluginList.size())); + tr("Copying plugins...")); - m_pPluginManager->moveToThread(m_pThread); + m_PluginManager.moveToThread(m_pThread); m_pThread->start(); QMetaObject::invokeMethod( - m_pPluginManager, - "downloadPlugins", + &m_PluginManager, + "copyPlugins", Qt::QueuedConnection); } @@ -195,7 +174,7 @@ bool PluginWizardPage::isComplete() const void PluginWizardPage::initializePage() { QWizardPage::initializePage(); - if (m_pWebClient == NULL) { + if (m_pFileSysClient == NULL) { if (m_Email.isEmpty() || m_Password.isEmpty()) { updateStatus(tr("Setup complete.")); @@ -205,38 +184,38 @@ void PluginWizardPage::initializePage() m_pLabelSpinning->show(); + m_pFileSysClient = new FileSysClient(); m_pWebClient = new WebClient(); m_pWebClient->setEmail(m_Email); m_pWebClient->setPassword(m_Password); QThread* thread = new QThread; - connect(m_pWebClient, + connect(m_pFileSysClient, SIGNAL(error(QString)), this, SLOT(showError(QString))); - connect(m_pWebClient, + connect(m_pFileSysClient, SIGNAL(queryPluginDone()), this, SLOT(queryPluginDone())); - connect(m_pWebClient, + connect(m_pFileSysClient, SIGNAL(queryPluginDone()), thread, SLOT(quit())); - connect(m_pWebClient, + connect(m_pFileSysClient, SIGNAL(error(QString)), thread, SLOT(quit())); connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - m_pWebClient->moveToThread(thread); + m_pFileSysClient->moveToThread(thread); thread->start(); - updateStatus(tr("Getting plugin list...")); - QMetaObject::invokeMethod(m_pWebClient, "queryPluginList", Qt::QueuedConnection); + QMetaObject::invokeMethod(m_pFileSysClient, "queryPluginList", Qt::QueuedConnection); } } diff --git a/src/gui/src/PluginWizardPage.h b/src/gui/src/PluginWizardPage.h index 95d4245a..65c7ea18 100644 --- a/src/gui/src/PluginWizardPage.h +++ b/src/gui/src/PluginWizardPage.h @@ -21,10 +21,11 @@ #include "AppConfig.h" #include "ui_PluginWizardPageBase.h" +#include "PluginManager.h" #include +class FileSysClient; class WebClient; -class PluginManager; class SslCertificate; class PluginWizardPage : public QWizardPage, public Ui::PluginWizardPage { @@ -49,12 +50,11 @@ protected slots: void showError(QString error); void updateStatus(QString info); void queryPluginDone(); - void updateDownloadStatus(); void finished(); void generateCertificate(); private: - void downloadPlugins(); + void copyPlugins(); void showFinished(); private: @@ -62,7 +62,8 @@ private: QString m_Email; QString m_Password; WebClient* m_pWebClient; - PluginManager* m_pPluginManager; + FileSysClient* m_pFileSysClient; + PluginManager m_PluginManager; SslCertificate* m_pSslCertificate; QThread* m_pThread; AppConfig& m_AppConfig; From e35fd80cef47fd7faf25030366d3326b4a31ac54 Mon Sep 17 00:00:00 2001 From: Adam Potolsky Date: Fri, 29 May 2015 16:20:47 -0700 Subject: [PATCH 11/11] Fixed name for Mac and Linux Build #4696 --- src/gui/src/Plugin.cpp | 4 ++-- src/gui/src/PluginManager.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/src/Plugin.cpp b/src/gui/src/Plugin.cpp index 4759e4e2..4c1729fb 100644 --- a/src/gui/src/Plugin.cpp +++ b/src/gui/src/Plugin.cpp @@ -73,9 +73,9 @@ QString Plugin::getOsSpecificName(const QString& pluginName) #if defined(Q_OS_WIN) result.append(getOsSpecificExt()); #elif defined(Q_OS_MAC) - result = kMacPluginPrefix + pluginName + getPluginOsSpecificExt(); + result = kMacPluginPrefix + pluginName + getOsSpecificExt(); #else - result = kLinuxPluginPrefix + pluginName + getPluginOsSpecificExt(); + result = kLinuxPluginPrefix + pluginName + getOsSpecificExt(); #endif return result; } diff --git a/src/gui/src/PluginManager.cpp b/src/gui/src/PluginManager.cpp index e73c93e6..371194a2 100644 --- a/src/gui/src/PluginManager.cpp +++ b/src/gui/src/PluginManager.cpp @@ -101,8 +101,10 @@ void PluginManager::copyPlugins() QString newName = destDirName; newName.append(QDir::separator()).append(m_FileSysPluginList.at(i)); + // Check to see if the plugin already exists QFile newFile(newName); if(newFile.exists()) { + // If it does, delete it. TODO: Check to see if same and leave newFile.remove(); } // make a copy of the plugin in the new location