Merge changes made in v1.8.4

This commit is contained in:
Andrew Nelless 2016-10-12 10:41:44 +01:00
commit 964f1aa093
117 changed files with 1414 additions and 3018 deletions

View File

@ -205,7 +205,10 @@ if (UNIX)
set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH}:/usr/local/include") set(CMAKE_INCLUDE_PATH "${CMAKE_INCLUDE_PATH}:/usr/local/include")
set(XKBlib "X11/Xlib.h;X11/XKBlib.h") set(XKBlib "X11/Xlib.h;X11/XKBlib.h")
check_symbol_exists("XRRNotifyEvent" "${XKBlib};X11/extensions/Xrandr.h" HAVE_X11_EXTENSIONS_XRANDR_H) set(CMAKE_EXTRA_INCLUDE_FILES "${XKBlib};X11/extensions/Xrandr.h")
check_type_size("XRRNotifyEvent" X11_EXTENSIONS_XRANDR_H)
set(HAVE_X11_EXTENSIONS_XRANDR_H "${X11_EXTENSIONS_XRANDR_H}")
set(CMAKE_EXTRA_INCLUDE_FILES)
check_include_files("${XKBlib};X11/extensions/dpms.h" HAVE_X11_EXTENSIONS_DPMS_H) check_include_files("${XKBlib};X11/extensions/dpms.h" HAVE_X11_EXTENSIONS_DPMS_H)
check_include_files("X11/extensions/Xinerama.h" HAVE_X11_EXTENSIONS_XINERAMA_H) check_include_files("X11/extensions/Xinerama.h" HAVE_X11_EXTENSIONS_XINERAMA_H)

View File

@ -1,3 +1,17 @@
v1.8.4-stable
=============
Bug #4041 UHD/4K DPI scaling broken on Windows servers
Bug #4420 When XRandR adds a screen, it is inaccessible
Bug #5603 Activation notification depends on existence of /etc/os-release
Bug #5624 Update notification sometimes requests a downgrade
Bug #5329 Current date is shown for build date in the about dialog
Bug #5640 Synergy branding is inconsistent across platforms
Enhancement #5617 Remove redundant plugin infrastructure
Enhancement #5627 Move SSL certificate generation to main window
Enhancement #5628 Move SSL implementation into core binary
Enhancement #5629 Move activation from wizard into new dialog window
v1.8.3-stable v1.8.3-stable
============= =============
Bug #2765 - A letter appears on macOS clients when the spacebar is pressed Bug #2765 - A letter appears on macOS clients when the spacebar is pressed

View File

@ -747,16 +747,6 @@ class InternalCommands:
shutil.copy(targetDir + "/synergys", bundleBinDir) shutil.copy(targetDir + "/synergys", bundleBinDir)
shutil.copy(targetDir + "/syntool", bundleBinDir) shutil.copy(targetDir + "/syntool", bundleBinDir)
# Copy all generated plugins to the package
bundlePluginDir = bundleBinDir + "plugins"
pluginDir = targetDir + "/plugins"
print "Copying plugins dirtree: " + pluginDir
if os.path.isdir(pluginDir):
print "Copying to: " + bundlePluginDir
shutil.copytree(pluginDir, bundlePluginDir)
else:
print "pluginDir doesn't exist, skipping"
self.loadConfig() self.loadConfig()
if not self.macIdentity: if not self.macIdentity:
raise Exception("run config with --mac-identity") raise Exception("run config with --mac-identity")
@ -1152,14 +1142,12 @@ 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)
@ -1177,17 +1165,6 @@ 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)
@ -1403,13 +1380,6 @@ class InternalCommands:
packageTarget = filename packageTarget = filename
ftp.upload(packageSource, packageTarget) ftp.upload(packageSource, packageTarget)
if type != 'src':
pluginsDir = binDir + '/plugins'
nsPluginSource = self.findLibraryFile(type, pluginsDir, 'ns')
if nsPluginSource:
nsPluginTarget = self.getLibraryDistFilename(type, pluginsDir, 'ns')
ftp.upload(nsPluginSource, nsPluginTarget, "plugins")
def getLibraryDistFilename(self, type, dir, name): def getLibraryDistFilename(self, type, dir, name):
(platform, packageExt, libraryExt) = self.getDistributePlatformInfo(type) (platform, packageExt, libraryExt) = self.getDistributePlatformInfo(type)
firstPart = '%s-%s-%s' % (name, self.getVersionForFilename(), platform) firstPart = '%s-%s-%s' % (name, self.getVersionForFilename(), platform)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 451 KiB

After

Width:  |  Height:  |  Size: 601 KiB

15
res/dpiaware.manifest Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />
</application>
</compatibility>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -20,7 +20,6 @@ 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}
@ -29,7 +28,6 @@ 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,-)
@ -40,7 +38,6 @@ cp $source/bin/plugins/* %{buildroot}%{_bindir}/../lib/synergy/plugins
%{_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@symless.com> * Thu Mar 20 2014 Nick Bolton <nick@symless.com>

View File

@ -14,6 +14,38 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
if (WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(OPENSSL_PLAT_DIR openssl-win64)
else()
set(OPENSSL_PLAT_DIR openssl-win32)
endif()
set(OPENSSL_INCLUDE ${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/inc32)
endif()
if (APPLE)
set(OPENSSL_PLAT_DIR openssl-osx)
set(OPENSSL_INCLUDE ${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/include)
endif()
if (WIN32)
set(OPENSSL_LIBS
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/out32dll/libeay32.lib
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/out32dll/ssleay32.lib
)
endif()
if (UNIX)
if (APPLE)
set(OPENSSL_LIBS
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/libssl.a
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/libcrypto.a
)
else()
set(OPENSSL_LIBS ssl crypto)
endif()
endif()
add_subdirectory(lib) add_subdirectory(lib)
add_subdirectory(cmd) add_subdirectory(cmd)
add_subdirectory(micro) add_subdirectory(micro)

View File

@ -58,7 +58,16 @@ endif()
add_executable(synergyc ${sources}) add_executable(synergyc ${sources})
target_link_libraries(synergyc target_link_libraries(synergyc
arch base client common io mt net ipc platform server synergy ${libs}) arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS})
if (WIN32)
ADD_CUSTOM_COMMAND(
TARGET synergyc
POST_BUILD
COMMAND "mt.exe" -manifest \"${CMAKE_SOURCE_DIR}\\res\\dpiaware.manifest\" -inputresource:\"$<TARGET_FILE:synergyc>\"\;\#1 -outputresource:\"$<TARGET_FILE:synergyc>\"\;\#1
COMMENT "Adding display aware manifest..."
)
endif()
if (CONF_CPACK) if (CONF_CPACK)
install(TARGETS install(TARGETS

View File

@ -221,7 +221,7 @@ MSWindowsClientTaskBarReceiver::primaryAction()
const IArchTaskBarReceiver::Icon const IArchTaskBarReceiver::Icon
MSWindowsClientTaskBarReceiver::getIcon() const MSWindowsClientTaskBarReceiver::getIcon() const
{ {
return reinterpret_cast<Icon>(m_icon[getStatus()]); return static_cast<Icon>(m_icon[getStatus()]);
} }
void void
@ -263,7 +263,7 @@ MSWindowsClientTaskBarReceiver::loadIcon(UINT id)
IMAGE_ICON, IMAGE_ICON,
0, 0, 0, 0,
LR_DEFAULTCOLOR); LR_DEFAULTCOLOR);
return reinterpret_cast<HICON>(icon); return static_cast<HICON>(icon);
} }
void void
@ -288,7 +288,7 @@ MSWindowsClientTaskBarReceiver::createWindow()
NULL, NULL,
(DLGPROC)&MSWindowsClientTaskBarReceiver::staticDlgProc, (DLGPROC)&MSWindowsClientTaskBarReceiver::staticDlgProc,
reinterpret_cast<LPARAM>( reinterpret_cast<LPARAM>(
reinterpret_cast<void*>(this))); static_cast<void*>(this)));
// window should appear on top of everything, including (especially) // window should appear on top of everything, including (especially)
// the task bar. // the task bar.
@ -337,7 +337,7 @@ MSWindowsClientTaskBarReceiver::staticDlgProc(HWND hwnd,
// and put it in the extra window data then forward the call. // and put it in the extra window data then forward the call.
MSWindowsClientTaskBarReceiver* self = NULL; MSWindowsClientTaskBarReceiver* self = NULL;
if (msg == WM_INITDIALOG) { if (msg == WM_INITDIALOG) {
self = reinterpret_cast<MSWindowsClientTaskBarReceiver*>( self = static_cast<MSWindowsClientTaskBarReceiver*>(
reinterpret_cast<void*>(lParam)); reinterpret_cast<void*>(lParam));
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) lParam); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR) lParam);
} }

View File

@ -35,7 +35,16 @@ else()
endif() endif()
target_link_libraries(synergyd target_link_libraries(synergyd
arch base common io ipc mt net platform synergy ${libs}) arch base common io ipc mt net platform synergy ${libs} ${OPENSSL_LIBS})
if (WIN32)
ADD_CUSTOM_COMMAND(
TARGET synergyd
POST_BUILD
COMMAND "mt.exe" -manifest \"${CMAKE_SOURCE_DIR}\\res\\dpiaware.manifest\" -inputresource:\"$<TARGET_FILE:synergyd>\"\;\#1 -outputresource:\"$<TARGET_FILE:synergyd>\"\;\#1
COMMENT "Adding display aware manifest..."
)
endif()
if (CONF_CPACK) if (CONF_CPACK)
install(TARGETS install(TARGETS

View File

@ -63,7 +63,7 @@ else()
endif() endif()
target_link_libraries(synergyp target_link_libraries(synergyp
arch base client common io mt net ipc platform server synergy client ${libs}) arch base client common io mt net ipc platform server synergy client ${libs} ${OPENSSL_LIBS})
if (CONF_CPACK) if (CONF_CPACK)
install(TARGETS install(TARGETS

View File

@ -238,7 +238,7 @@ MSWindowsPortableTaskBarReceiver::primaryAction()
const IArchTaskBarReceiver::Icon const IArchTaskBarReceiver::Icon
MSWindowsPortableTaskBarReceiver::getIcon() const MSWindowsPortableTaskBarReceiver::getIcon() const
{ {
return reinterpret_cast<Icon>(m_icon[getStatus()]); return static_cast<Icon>(m_icon[getStatus()]);
} }
void void
@ -280,7 +280,7 @@ MSWindowsPortableTaskBarReceiver::loadIcon(UINT id)
IMAGE_ICON, IMAGE_ICON,
0, 0, 0, 0,
LR_DEFAULTCOLOR); LR_DEFAULTCOLOR);
return reinterpret_cast<HICON>(icon); return static_cast<HICON>(icon);
} }
void void
@ -305,7 +305,7 @@ MSWindowsPortableTaskBarReceiver::createWindow()
NULL, NULL,
(DLGPROC)&MSWindowsPortableTaskBarReceiver::staticDlgProc, (DLGPROC)&MSWindowsPortableTaskBarReceiver::staticDlgProc,
reinterpret_cast<LPARAM>( reinterpret_cast<LPARAM>(
reinterpret_cast<void*>(this))); static_cast<void*>(this)));
// window should appear on top of everything, including (especially) // window should appear on top of everything, including (especially)
// the task bar. // the task bar.
@ -354,7 +354,7 @@ MSWindowsPortableTaskBarReceiver::staticDlgProc(HWND hwnd,
// and put it in the extra window data then forward the call. // and put it in the extra window data then forward the call.
MSWindowsPortableTaskBarReceiver* self = NULL; MSWindowsPortableTaskBarReceiver* self = NULL;
if (msg == WM_INITDIALOG) { if (msg == WM_INITDIALOG) {
self = reinterpret_cast<MSWindowsPortableTaskBarReceiver*>( self = static_cast<MSWindowsPortableTaskBarReceiver*>(
reinterpret_cast<void*>(lParam)); reinterpret_cast<void*>(lParam));
SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam); SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam);
} }
@ -362,7 +362,8 @@ MSWindowsPortableTaskBarReceiver::staticDlgProc(HWND hwnd,
// get the extra window data and forward the call // get the extra window data and forward the call
LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (data != 0) { if (data != 0) {
self = reinterpret_cast<MSWindowsPortableTaskBarReceiver*>(data); self = static_cast<MSWindowsPortableTaskBarReceiver*>(
reinterpret_cast<void*>(data));
} }
} }

View File

@ -58,7 +58,16 @@ endif()
add_executable(synergys ${sources}) add_executable(synergys ${sources})
target_link_libraries(synergys target_link_libraries(synergys
arch base client common io mt net ipc platform server synergy ${libs}) arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS})
if (WIN32)
ADD_CUSTOM_COMMAND(
TARGET synergys
POST_BUILD
COMMAND "mt.exe" -manifest \"${CMAKE_SOURCE_DIR}\\res\\dpiaware.manifest\" -inputresource:\"$<TARGET_FILE:synergys>\"\;\#1 -outputresource:\"$<TARGET_FILE:synergys>\"\;\#1
COMMENT "Adding display aware manifest..."
)
endif()
if (CONF_CPACK) if (CONF_CPACK)
install(TARGETS install(TARGETS

View File

@ -252,7 +252,7 @@ MSWindowsServerTaskBarReceiver::primaryAction()
const IArchTaskBarReceiver::Icon const IArchTaskBarReceiver::Icon
MSWindowsServerTaskBarReceiver::getIcon() const MSWindowsServerTaskBarReceiver::getIcon() const
{ {
return reinterpret_cast<Icon>(m_icon[getStatus()]); return static_cast<Icon>(m_icon[getStatus()]);
} }
void void
@ -294,7 +294,7 @@ MSWindowsServerTaskBarReceiver::loadIcon(UINT id)
IMAGE_ICON, IMAGE_ICON,
0, 0, 0, 0,
LR_DEFAULTCOLOR); LR_DEFAULTCOLOR);
return reinterpret_cast<HICON>(icon); return static_cast<HICON>(icon);
} }
void void
@ -319,7 +319,7 @@ MSWindowsServerTaskBarReceiver::createWindow()
NULL, NULL,
(DLGPROC)&MSWindowsServerTaskBarReceiver::staticDlgProc, (DLGPROC)&MSWindowsServerTaskBarReceiver::staticDlgProc,
reinterpret_cast<LPARAM>( reinterpret_cast<LPARAM>(
reinterpret_cast<void*>(this))); static_cast<void*>(this)));
// window should appear on top of everything, including (especially) // window should appear on top of everything, including (especially)
// the task bar. // the task bar.
@ -368,14 +368,16 @@ MSWindowsServerTaskBarReceiver::staticDlgProc(HWND hwnd,
// and put it in the extra window data then forward the call. // and put it in the extra window data then forward the call.
MSWindowsServerTaskBarReceiver* self = NULL; MSWindowsServerTaskBarReceiver* self = NULL;
if (msg == WM_INITDIALOG) { if (msg == WM_INITDIALOG) {
self = reinterpret_cast<MSWindowsServerTaskBarReceiver*>(lParam); self = static_cast<MSWindowsServerTaskBarReceiver*>(
reinterpret_cast<void*>(lParam));
SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam); SetWindowLongPtr(hwnd, GWLP_USERDATA, lParam);
} }
else { else {
// get the extra window data and forward the call // get the extra window data and forward the call
LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA); LONG_PTR data = GetWindowLongPtr(hwnd, GWLP_USERDATA);
if (data != 0) { if (data != 0) {
self = reinterpret_cast<MSWindowsServerTaskBarReceiver*>(data); self = static_cast<MSWindowsServerTaskBarReceiver*>(
reinterpret_cast<void*>(data));
} }
} }

View File

@ -29,7 +29,7 @@ endif()
add_executable(syntool ${sources}) add_executable(syntool ${sources})
target_link_libraries(syntool target_link_libraries(syntool
synergy arch base client common io ipc mt net platform server ${libs}) synergy arch base client common io ipc mt net platform server ${libs} ${OPENSSL_LIBS})
if (CONF_CPACK) if (CONF_CPACK)
install(TARGETS install(TARGETS

View File

@ -17,7 +17,9 @@ FORMS += res/MainWindowBase.ui \
res/SettingsDialogBase.ui \ res/SettingsDialogBase.ui \
res/SetupWizardBase.ui \ res/SetupWizardBase.ui \
res/AddClientDialogBase.ui \ res/AddClientDialogBase.ui \
res/PluginWizardPageBase.ui res/ActivationDialog.ui \
res/CancelActivationDialog.ui \
res/FailedLoginDialog.ui
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/MainWindow.cpp \ src/MainWindow.cpp \
src/AboutDialog.cpp \ src/AboutDialog.cpp \
@ -54,16 +56,15 @@ SOURCES += src/main.cpp \
src/DataDownloader.cpp \ src/DataDownloader.cpp \
src/AddClientDialog.cpp \ src/AddClientDialog.cpp \
src/CommandProcess.cpp \ src/CommandProcess.cpp \
src/PluginWizardPage.cpp \
src/PluginManager.cpp \
src/CoreInterface.cpp \ src/CoreInterface.cpp \
src/Fingerprint.cpp \ src/Fingerprint.cpp \
src/SslCertificate.cpp \ src/SslCertificate.cpp \
src/Plugin.cpp \
src/WebClient.cpp \ src/WebClient.cpp \
../lib/common/PluginVersion.cpp \
src/SubscriptionManager.cpp \ src/SubscriptionManager.cpp \
src/ActivationNotifier.cpp src/ActivationNotifier.cpp \
src/ActivationDialog.cpp \
src/CancelActivationDialog.cpp \
src/FailedLoginDialog.cpp
HEADERS += src/MainWindow.h \ HEADERS += src/MainWindow.h \
src/AboutDialog.h \ src/AboutDialog.h \
src/ServerConfig.h \ src/ServerConfig.h \
@ -101,18 +102,17 @@ HEADERS += src/MainWindow.h \
src/AddClientDialog.h \ src/AddClientDialog.h \
src/CommandProcess.h \ src/CommandProcess.h \
src/EditionType.h \ src/EditionType.h \
src/PluginWizardPage.h \
src/ProcessorArch.h \ src/ProcessorArch.h \
src/PluginManager.h \
src/CoreInterface.h \ src/CoreInterface.h \
src/Fingerprint.h \ src/Fingerprint.h \
src/SslCertificate.h \ src/SslCertificate.h \
src/Plugin.h \
src/WebClient.h \ src/WebClient.h \
../lib/common/PluginVersion.h \
src/SubscriptionManager.h \ src/SubscriptionManager.h \
src/ActivationNotifier.h \ src/ActivationNotifier.h \
src/ElevateMode.h src/ElevateMode.h \
src/ActivationDialog.h \
src/CancelActivationDialog.h \
src/FailedLoginDialog.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

@ -13,25 +13,19 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>450</width> <width>450</width>
<height>300</height> <height>378</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumSize">
<size>
<width>450</width>
<height>300</height>
</size>
</property>
<property name="maximumSize"> <property name="maximumSize">
<size> <size>
<width>450</width> <width>450</width>
<height>300</height> <height>378</height>
</size> </size>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -41,48 +35,20 @@
<bool>true</bool> <bool>true</bool>
</property> </property>
<layout class="QGridLayout"> <layout class="QGridLayout">
<item row="2" column="1" colspan="2"> <item row="0" column="1">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_2">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="maximumSize">
<string>&lt;p&gt;
Keyboard and mouse sharing application. Cross platform and open source.&lt;br /&gt;&lt;br /&gt;
Copyright © 2012-2016 Symless Ltd.&lt;br /&gt;
Copyright © 2002-2012 Chris Schoeneman, Nick Bolton, Volker Lanz.&lt;br /&gt;&lt;br /&gt;
Synergy is released under the GNU General Public License (GPLv2).&lt;br /&gt;&lt;br /&gt;
Synergy is based on CosmoSynergy by Richard Lee and Adam Feder.&lt;br /&gt;
The Synergy GUI is based on QSynergy by Volker Lanz.&lt;br /&gt;&lt;br /&gt;
Visit our website for help and info (symless.com).
&lt;/p&gt;</string>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>450</width>
<height>100</height> <height>16777215</height>
</size> </size>
</property> </property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>
@ -197,6 +163,41 @@ Visit our website for help and info (symless.com).
</item> </item>
</layout> </layout>
</item> </item>
<item row="2" column="1" colspan="2">
<widget class="QLabel" name="label_3">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Keyboard and mouse sharing application. &lt;br/&gt;&lt;br/&gt;Copyright © 2012-2016 Symless Ltd.&lt;br/&gt;Copyright © 2002-2012 Chris Schoeneman, Nick Bolton, Volker Lanz.&lt;/p&gt;&lt;p&gt;Synergy is based on CosmoSynergy by Richard Lee and Adam Feder.&lt;br/&gt;The Synergy GUI is based on QSynergy by Volker Lanz. &lt;/p&gt;&lt;p&gt;Synergy is released under the GNU General Public License (GPLv2).&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="margin">
<number>1</number>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
</layout> </layout>
</widget> </widget>
<resources> <resources>

View File

@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ActivationDialog</class>
<widget class="QDialog" name="ActivationDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>440</width>
<height>314</height>
</rect>
</property>
<property name="windowTitle">
<string>Activate Synergy</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="m_pRadioButtonActivate">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>&amp;Account login</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout_2">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="horizontalSpacing">
<number>20</number>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="m_pLabelEmail">
<property name="text">
<string>Email:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="m_pLineEditEmail">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="echoMode">
<enum>QLineEdit::Normal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_pLineEditPassword">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QRadioButton" name="m_pRadioButtonSubscription">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>&amp;Serial key</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_5">
<property name="text">
<string>Found on your &lt;a href=&quot;https://symless.com/account/?source=gui&quot;&gt;account&lt;/a&gt; page.</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="m_pTextEditSerialKey">
<property name="enabled">
<bool>false</bool>
</property>
<property name="html">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="acceptRichText">
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ActivationDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ActivationDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CancelActivationDialog</class>
<widget class="QDialog" name="CancelActivationDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>165</height>
</rect>
</property>
<property name="windowTitle">
<string>Cancel Activation</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Are you sure?
If you don't activate Synergy you'll be missing out on some great features</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://symless.com/pricing?source=gui&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Buy now&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::No|QDialogButtonBox::Yes</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>CancelActivationDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>CancelActivationDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FailedLoginDialog</class>
<widget class="QDialog" name="FailedLoginDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>165</height>
</rect>
</property>
<property name="windowTitle">
<string>Activation Error</string>
</property>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="geometry">
<rect>
<x>50</x>
<y>120</y>
<width>341</width>
<height>32</height>
</rect>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>10</x>
<y>90</y>
<width>382</width>
<height>30</height>
</rect>
</property>
<property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;a href=&quot;https://symless.com/account/reset/?source=gui&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;Forgotten your password?&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="messageLabel">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>382</width>
<height>72</height>
</rect>
</property>
<property name="text">
<string>An error occurred while trying to activate Synergy. The Symless server returned the following error:
%1</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
<zorder>label_2</zorder>
<zorder>messageLabel</zorder>
<zorder>buttonBox</zorder>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>FailedLoginDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>FailedLoginDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>MainWindowBase</class> <class>MainWindowBase</class>
<widget class="QMainWindow" name="MainWindowBase"> <widget class="QMainWindow" name="MainWindowBase">
@ -128,7 +128,7 @@
</sizepolicy> </sizepolicy>
</property> </property>
<property name="text"> <property name="text">
<string>Fingerprint:</string> <string>SSL Fingerprint:</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -481,12 +481,12 @@
<string notr="true"/> <string notr="true"/>
</property> </property>
</action> </action>
<action name="m_pActionWizard"> <action name="m_pActivate">
<property name="text"> <property name="text">
<string>Run Wizard</string> <string>Activate</string>
</property> </property>
<property name="shortcut"> <property name="toolTip">
<string notr="true"/> <string>Activate</string>
</property> </property>
</action> </action>
</widget> </widget>

View File

@ -1,137 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>PluginWizardPage</class>
<widget class="QWizardPage" name="PluginWizardPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Setup Synergy</string>
</property>
<property name="title">
<string/>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLabel" name="m_pLabelSpinning">
<property name="text">
<string> </string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="1">
<widget class="QLabel" name="m_pLabelStatus">
<property name="text">
<string>Please wait...</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -176,8 +176,11 @@
</property> </property>
<item row="0" column="0"> <item row="0" column="0">
<widget class="QCheckBox" name="m_pCheckBoxEnableCrypto"> <widget class="QCheckBox" name="m_pCheckBoxEnableCrypto">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Use &amp;SSL encryption (unique certificate)</string> <string>Use &amp;SSL encryption</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -120,214 +120,6 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWizardPage" name="m_pActivatePage">
<property name="title">
<string>Activate</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_9">
<property name="text">
<string>Enable your &lt;a href=&quot;http://symless.com/pricing?source=gui&quot;&gt;Synergy Pro&lt;/a&gt; and Synergy Basic features.</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QRadioButton" name="m_pRadioButtonActivate">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>&amp;Account login</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="horizontalSpacing">
<number>20</number>
</property>
<property name="verticalSpacing">
<number>10</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="m_pLabelEmail">
<property name="text">
<string>Email:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="m_pLineEditEmail">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>20</height>
</size>
</property>
<property name="echoMode">
<enum>QLineEdit::Normal</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Password:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_pLineEditPassword">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>20</height>
</size>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>&lt;a href=&quot;https://symless.com/account/reset/?source=gui&quot;&gt;Forgot password&lt;/a&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QRadioButton" name="m_pRadioButtonSubscription">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>&amp;Serial key</string>
</property>
</widget>
</item>
<item>
<widget class="QTextEdit" name="m_pTextEditSerialKey"/>
</item>
<item>
<spacer name="verticalSpacer_5">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>10</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QRadioButton" name="m_pRadioButtonSkip">
<property name="text">
<string>S&amp;kip activation</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_8">
<property name="styleSheet">
<string notr="true">color: rgb(100, 100, 100);</string>
</property>
<property name="text">
<string>You will see UNREGISTERED in the window title (not recommended).</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Expanding</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>500</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="m_pNodePage"> <widget class="QWizardPage" name="m_pNodePage">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -32,7 +32,9 @@ AboutDialog::AboutDialog(QWidget* parent, const QString& synergyApp) :
version = version + '-' + VERSION_STAGE + '-' + VERSION_REVISION; version = version + '-' + VERSION_STAGE + '-' + VERSION_REVISION;
m_pLabelSynergyVersion->setText(version); m_pLabelSynergyVersion->setText(version);
m_pLabelBuildDate->setText(QDate::currentDate().toString()); QString buildDateString = QString::fromLocal8Bit(__DATE__).simplified();
QDate buildDate = QLocale("en_US").toDate(buildDateString, "MMM d yyyy");
m_pLabelBuildDate->setText(buildDate.toString(Qt::SystemLocaleLongDate));
// change default size based on os // change default size based on os
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)

View File

@ -0,0 +1,165 @@
#include "ActivationDialog.h"
#include "ui_ActivationDialog.h"
#include "CancelActivationDialog.h"
#include "AppConfig.h"
#include "WebClient.h"
#include "EditionType.h"
#include "ActivationNotifier.h"
#include "MainWindow.h"
#include "QUtility.h"
#include "SubscriptionManager.h"
#include "FailedLoginDialog.h"
#include <QMessageBox>
#include <QThread>
#include <iostream>
ActivationDialog::ActivationDialog(QWidget* parent, AppConfig& appConfig) :
QDialog(parent),
ui(new Ui::ActivationDialog),
m_appConfig (&appConfig)
{
ui->setupUi(this);
ui->m_pLineEditEmail->setText(appConfig.activateEmail());
ui->m_pTextEditSerialKey->setText(appConfig.serialKey());
if (!appConfig.serialKey().isEmpty()) {
ui->m_pRadioButtonActivate->setAutoExclusive(false);
ui->m_pRadioButtonSubscription->setAutoExclusive(false);
ui->m_pRadioButtonActivate->setChecked(false);
ui->m_pRadioButtonSubscription->setChecked(true);
ui->m_pRadioButtonActivate->setAutoExclusive(true);
ui->m_pRadioButtonSubscription->setAutoExclusive(true);
ui->m_pTextEditSerialKey->setFocus();
ui->m_pTextEditSerialKey->moveCursor(QTextCursor::End);
} else {
if (ui->m_pLineEditEmail->text().isEmpty()) {
ui->m_pLineEditEmail->setFocus();
} else {
ui->m_pLineEditPassword->setFocus();
}
}
}
ActivationDialog::~ActivationDialog()
{
delete ui;
}
void ActivationDialog::notifyActivation(QString identity)
{
ActivationNotifier* notifier = new ActivationNotifier();
notifier->setIdentity(identity);
QThread* thread = new QThread();
connect(notifier, SIGNAL(finished()), thread, SLOT(quit()));
connect(notifier, SIGNAL(finished()), notifier, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
notifier->moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(notifier, "notify", Qt::QueuedConnection);
}
void ActivationDialog::reject()
{
CancelActivationDialog cancelActivationDialog(this);
if (QDialog::Accepted == cancelActivationDialog.exec()) {
notifyActivation("skip:unknown");
m_appConfig->activationHasRun(true);
m_appConfig->saveSettings();
QDialog::reject();
}
}
void ActivationDialog::on_m_pRadioButtonSubscription_toggled(bool checked)
{
if (checked) {
ui->m_pLineEditEmail->setEnabled(false);
ui->m_pLineEditPassword->setEnabled(false);
ui->m_pTextEditSerialKey->setEnabled(true);
ui->m_pTextEditSerialKey->setFocus();
}
}
void ActivationDialog::on_m_pRadioButtonActivate_toggled(bool checked)
{
if (checked) {
ui->m_pLineEditEmail->setEnabled(true);
ui->m_pLineEditPassword->setEnabled(true);
ui->m_pTextEditSerialKey->setEnabled(false);
if (ui->m_pLineEditEmail->text().isEmpty()) {
ui->m_pLineEditEmail->setFocus();
} else {
ui->m_pLineEditPassword->setFocus();
}
}
}
void ActivationDialog::accept()
{
QMessageBox message;
QString error;
int edition = Unregistered;
m_appConfig->activationHasRun(true);
m_appConfig->saveSettings();
try {
if (ui->m_pRadioButtonActivate->isChecked()) {
WebClient webClient;
QString email = ui->m_pLineEditEmail->text();
QString password = ui->m_pLineEditPassword->text();
if (!webClient.setEmail (email, error)) {
message.critical (this, "Invalid Email Address", tr("%1").arg(error));
return;
}
else if (!webClient.setPassword (password, error)) {
message.critical (this, "Invalid Password", tr("%1").arg(error));
return;
}
else if (!webClient.getEdition (edition, error)) {
FailedLoginDialog failedLoginDialog (this, error);
failedLoginDialog.exec();
return;
}
m_appConfig->setActivateEmail (email);
m_appConfig->clearSerialKey();
ui->m_pTextEditSerialKey->clear();
notifyActivation ("login:" + m_appConfig->activateEmail());
}
else {
QString serialKey = ui->m_pTextEditSerialKey->toPlainText();
if (!m_appConfig->setSerialKey (serialKey, error)) {
message.critical (this, "Invalid Serial Key", tr("%1").arg(error));
return;
}
SubscriptionManager subscriptionManager (this, *m_appConfig, edition);
if (!subscriptionManager.activateSerial (serialKey)) {
return;
}
m_appConfig->setActivateEmail("");
notifyActivation ("serial:" + m_appConfig->serialKey());
}
}
catch (std::exception& e) {
message.critical (this, "Unknown Error",
tr("An error occurred while trying to activate Synergy. "
"Please contact the helpdesk, and provide the "
"following details.\n\n%1").arg(e.what()));
return;
}
m_appConfig->setEdition(edition);
m_appConfig->saveSettings();
message.information (this, "Activated!",
tr("Thanks for activating %1!").arg (getEditionName (edition)));
QDialog::accept();
}

View File

@ -0,0 +1,36 @@
#ifndef ACTIVATIONDIALOG_H
#define ACTIVATIONDIALOG_H
#include <QDialog>
namespace Ui {
class ActivationDialog;
}
class AppConfig;
class ActivationDialog : public QDialog
{
Q_OBJECT
public:
explicit ActivationDialog(QWidget *parent, AppConfig& appConfig);
~ActivationDialog();
public slots:
void reject();
void accept();
protected:
void notifyActivation (QString identity);
private:
Ui::ActivationDialog *ui;
AppConfig* m_appConfig;
private slots:
void on_m_pRadioButtonSubscription_toggled(bool checked);
void on_m_pRadioButtonActivate_toggled(bool checked);
};
#endif // ACTIVATIONDIALOG_H

View File

@ -73,6 +73,18 @@ AppConfig::~AppConfig()
saveSettings(); saveSettings();
} }
const QString &AppConfig::screenName() const { return m_ScreenName; }
int AppConfig::port() const { return m_Port; }
const QString &AppConfig::networkInterface() const { return m_Interface; }
int AppConfig::logLevel() const { return m_LogLevel; }
bool AppConfig::logToFile() const { return m_LogToFile; }
const QString &AppConfig::logFilename() const { return m_LogFilename; }
QString AppConfig::synergyLogDir() const QString AppConfig::synergyLogDir() const
{ {
#if defined(Q_OS_WIN) #if defined(Q_OS_WIN)
@ -116,6 +128,16 @@ QString AppConfig::logLevelText() const
return logLevelNames[logLevel()]; return logLevelNames[logLevel()];
} }
ProcessMode AppConfig::processMode() const { return m_ProcessMode; }
bool AppConfig::wizardShouldRun() const { return m_WizardLastRun < kWizardVersion; }
const QString &AppConfig::language() const { return m_Language; }
bool AppConfig::startedBefore() const { return m_StartedBefore; }
bool AppConfig::autoConfig() const { return m_AutoConfig; }
void AppConfig::loadSettings() void AppConfig::loadSettings()
{ {
m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString(); m_ScreenName = settings().value("screenName", QHostInfo::localHostName()).toString();
@ -135,12 +157,13 @@ void AppConfig::loadSettings()
} }
m_ElevateMode = static_cast<ElevateMode>(elevateMode.toInt()); m_ElevateMode = static_cast<ElevateMode>(elevateMode.toInt());
m_AutoConfigPrompted = settings().value("autoConfigPrompted", false).toBool(); m_AutoConfigPrompted = settings().value("autoConfigPrompted", false).toBool();
m_Edition = settings().value("edition", UnknownEdition).toInt(); m_Edition = settings().value("edition", Unregistered).toInt();
m_ActivateEmail = settings().value("activateEmail", "").toString(); m_ActivateEmail = settings().value("activateEmail", "").toString();
m_CryptoEnabled = settings().value("cryptoEnabled", false).toBool(); m_CryptoEnabled = settings().value("cryptoEnabled", true).toBool();
m_AutoHide = settings().value("autoHide", false).toBool(); m_AutoHide = settings().value("autoHide", false).toBool();
m_Serialkey = settings().value("serialKey", "").toString(); m_Serialkey = settings().value("serialKey", "").toString();
m_LastExpiringWarningTime = settings().value("lastExpiringWarningTime", 0).toInt(); m_LastExpiringWarningTime = settings().value("lastExpiringWarningTime", 0).toInt();
m_ActivationHasRun = settings().value("activationHasRun", false).toBool();
} }
void AppConfig::saveSettings() void AppConfig::saveSettings()
@ -166,19 +189,107 @@ void AppConfig::saveSettings()
settings().setValue("autoHide", m_AutoHide); settings().setValue("autoHide", m_AutoHide);
settings().setValue("serialKey", m_Serialkey); settings().setValue("serialKey", m_Serialkey);
settings().setValue("lastExpiringWarningTime", m_LastExpiringWarningTime); settings().setValue("lastExpiringWarningTime", m_LastExpiringWarningTime);
settings().setValue("activationHasRun", m_ActivationHasRun);
settings().sync();
} }
bool AppConfig::activationHasRun() const
{
return m_ActivationHasRun;
}
AppConfig& AppConfig::activationHasRun(bool value)
{
m_ActivationHasRun = value;
return *this;
}
QSettings &AppConfig::settings() { return *m_pSettings; }
void AppConfig::setScreenName(const QString &s) { m_ScreenName = s; }
void AppConfig::setPort(int i) { m_Port = i; }
void AppConfig::setNetworkInterface(const QString &s) { m_Interface = s; }
void AppConfig::setLogLevel(int i) { m_LogLevel = i; }
void AppConfig::setLogToFile(bool b) { m_LogToFile = b; }
void AppConfig::setLogFilename(const QString &s) { m_LogFilename = s; }
void AppConfig::setWizardHasRun() { m_WizardLastRun = kWizardVersion; }
void AppConfig::setLanguage(const QString language) { m_Language = language; }
void AppConfig::setStartedBefore(bool b) { m_StartedBefore = b; }
void AppConfig::setElevateMode(ElevateMode em) { m_ElevateMode = em; }
void AppConfig::setAutoConfig(bool autoConfig) void AppConfig::setAutoConfig(bool autoConfig)
{ {
m_AutoConfig = autoConfig; m_AutoConfig = autoConfig;
} }
bool AppConfig::autoConfigPrompted() { return m_AutoConfigPrompted; }
void AppConfig::setAutoConfigPrompted(bool prompted) void AppConfig::setAutoConfigPrompted(bool prompted)
{ {
m_AutoConfigPrompted = prompted; m_AutoConfigPrompted = prompted;
} }
void AppConfig::setEdition(int e) {
m_Edition = e;
emit editionSet (e);
}
int AppConfig::edition() const { return m_Edition; }
bool AppConfig::setActivateEmail(QString e) {
m_ActivateEmail = e;
return true;
}
QString AppConfig::activateEmail() { return m_ActivateEmail; }
bool AppConfig::setSerialKey(QString serial, QString& errorOut) {
if (serial.isEmpty()) {
errorOut = "Your serial key cannot be blank.";
return false;
}
m_Serialkey = serial;
return true;
}
void AppConfig::clearSerialKey()
{
m_Serialkey.clear();
}
QString AppConfig::serialKey() { return m_Serialkey; }
int AppConfig::lastExpiringWarningTime() const { return m_LastExpiringWarningTime; }
void AppConfig::setLastExpiringWarningTime(int t) { m_LastExpiringWarningTime = t; }
QString AppConfig::synergysName() const { return m_SynergysName; }
QString AppConfig::synergycName() const { return m_SynergycName; }
ElevateMode AppConfig::elevateMode() ElevateMode AppConfig::elevateMode()
{ {
return m_ElevateMode; return m_ElevateMode;
} }
void AppConfig::setCryptoEnabled(bool e) {
m_CryptoEnabled = e;
emit sslToggled(e);
}
bool AppConfig::getCryptoEnabled() const {
return (edition() == Pro) && m_CryptoEnabled;
}
void AppConfig::setAutoHide(bool b) { m_AutoHide = b; }
bool AppConfig::getAutoHide() { return m_AutoHide; }

View File

@ -20,6 +20,7 @@
#define APPCONFIG_H #define APPCONFIG_H
#include <QObject>
#include <QString> #include <QString>
#include "ElevateMode.h" #include "ElevateMode.h"
@ -48,8 +49,10 @@ enum ProcessMode {
Desktop Desktop
}; };
class AppConfig class AppConfig: public QObject
{ {
Q_OBJECT
friend class SettingsDialog; friend class SettingsDialog;
friend class MainWindow; friend class MainWindow;
friend class SetupWizard; friend class SetupWizard;
@ -59,33 +62,34 @@ class AppConfig
~AppConfig(); ~AppConfig();
public: public:
const QString& screenName() const { return m_ScreenName; } const QString& screenName() const;
int port() const { return m_Port; } int port() const;
const QString& networkInterface() const { return m_Interface; } const QString& networkInterface() const;
int logLevel() const { return m_LogLevel; } int logLevel() const;
bool logToFile() const { return m_LogToFile; } bool logToFile() const;
const QString& logFilename() const { return m_LogFilename; } const QString& logFilename() const;
const QString logFilenameCmd() const; const QString logFilenameCmd() const;
QString logLevelText() const; QString logLevelText() const;
ProcessMode processMode() const { return m_ProcessMode; } ProcessMode processMode() const;
bool wizardShouldRun() const { return m_WizardLastRun < kWizardVersion; } bool wizardShouldRun() const;
const QString& language() const { return m_Language; } const QString& language() const;
bool startedBefore() const { return m_StartedBefore; } bool startedBefore() const;
bool autoConfig() const { return m_AutoConfig; } bool autoConfig() const;
void setAutoConfig(bool autoConfig); void setAutoConfig(bool autoConfig);
bool autoConfigPrompted() { return m_AutoConfigPrompted; } bool autoConfigPrompted();
void setAutoConfigPrompted(bool prompted); void setAutoConfigPrompted(bool prompted);
void setEdition(int e) { m_Edition = e; } void setEdition(int e);
int edition() { return m_Edition; } int edition() const;
void setActivateEmail(QString e) { m_ActivateEmail = e; } bool setActivateEmail(QString e);
QString activateEmail() { return m_ActivateEmail; } QString activateEmail();
void setSerialKey(QString serial) { m_Serialkey = serial; } bool setSerialKey(QString serial, QString& error);
QString serialKey() { return m_Serialkey; } void clearSerialKey();
int lastExpiringWarningTime() const { return m_LastExpiringWarningTime; } QString serialKey();
void setLastExpiringWarningTime(int t) { m_LastExpiringWarningTime = t; } int lastExpiringWarningTime() const;
void setLastExpiringWarningTime(int t);
QString synergysName() const { return m_SynergysName; } QString synergysName() const;
QString synergycName() const { return m_SynergycName; } QString synergycName() const;
QString synergyProgramDir() const; QString synergyProgramDir() const;
QString synergyLogDir() const; QString synergyLogDir() const;
@ -93,26 +97,29 @@ class AppConfig
void persistLogDir(); void persistLogDir();
ElevateMode elevateMode(); ElevateMode elevateMode();
void setCryptoEnabled(bool e) { m_CryptoEnabled = e; } void setCryptoEnabled(bool e);
bool getCryptoEnabled() { return m_CryptoEnabled; } bool getCryptoEnabled() const;
void setAutoHide(bool b) { m_AutoHide = b; }
bool getAutoHide() { return m_AutoHide; } void setAutoHide(bool b);
bool getAutoHide();
bool activationHasRun() const;
AppConfig& activationHasRun(bool value);
void saveSettings(); void saveSettings();
protected: protected:
QSettings& settings() { return *m_pSettings; } QSettings& settings();
void setScreenName(const QString& s) { m_ScreenName = s; } void setScreenName(const QString& s);
void setPort(int i) { m_Port = i; } void setPort(int i);
void setNetworkInterface(const QString& s) { m_Interface = s; } void setNetworkInterface(const QString& s);
void setLogLevel(int i) { m_LogLevel = i; } void setLogLevel(int i);
void setLogToFile(bool b) { m_LogToFile = b; } void setLogToFile(bool b);
void setLogFilename(const QString& s) { m_LogFilename = s; } void setLogFilename(const QString& s);
void setWizardHasRun() { m_WizardLastRun = kWizardVersion; } void setWizardHasRun();
void setLanguage(const QString language) { m_Language = language; } void setLanguage(const QString language);
void setStartedBefore(bool b) { m_StartedBefore = b; } void setStartedBefore(bool b);
void setElevateMode(ElevateMode em) { m_ElevateMode = em; } void setElevateMode(ElevateMode em);
void loadSettings(); void loadSettings();
private: private:
@ -136,10 +143,15 @@ class AppConfig
bool m_AutoHide; bool m_AutoHide;
QString m_Serialkey; QString m_Serialkey;
int m_LastExpiringWarningTime; int m_LastExpiringWarningTime;
bool m_ActivationHasRun;
static const char m_SynergysName[]; static const char m_SynergysName[];
static const char m_SynergycName[]; static const char m_SynergycName[];
static const char m_SynergyLogDir[]; static const char m_SynergyLogDir[];
signals:
void editionSet(int);
void sslToggled(bool enabled);
}; };
#endif #endif

View File

@ -0,0 +1,14 @@
#include "CancelActivationDialog.h"
#include "ui_CancelActivationDialog.h"
CancelActivationDialog::CancelActivationDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::CancelActivationDialog)
{
ui->setupUi(this);
}
CancelActivationDialog::~CancelActivationDialog()
{
delete ui;
}

View File

@ -0,0 +1,22 @@
#ifndef CANCELACTIVATIONDIALOG_H
#define CANCELACTIVATIONDIALOG_H
#include <QDialog>
namespace Ui {
class CancelActivationDialog;
}
class CancelActivationDialog : public QDialog
{
Q_OBJECT
public:
explicit CancelActivationDialog(QWidget *parent = 0);
~CancelActivationDialog();
private:
Ui::CancelActivationDialog *ui;
};
#endif // CANCELACTIVATIONDIALOG_H

View File

@ -18,11 +18,13 @@
#ifndef EDITIONTYPE_H #ifndef EDITIONTYPE_H
#define EDITIONTYPE_H #define EDITIONTYPE_H
enum qEditionType { /* Do not reorder these! */
enum EditionType {
Basic, Basic,
Pro, Pro,
Trial, Trial,
UnknownEdition Unregistered
}; };
#endif // EDITIONTYPE_H #endif // EDITIONTYPE_H

View File

@ -0,0 +1,15 @@
#include "FailedLoginDialog.h"
#include "ui_FailedLoginDialog.h"
FailedLoginDialog::FailedLoginDialog(QWidget *parent, QString message):
QDialog(parent),
ui(new Ui::FailedLoginDialog)
{
ui->setupUi(this);
ui->messageLabel->setText(ui->messageLabel->text().arg(message));
}
FailedLoginDialog::~FailedLoginDialog()
{
delete ui;
}

View File

@ -0,0 +1,23 @@
#ifndef FAILEDLOGINDIALOG_H
#define FAILEDLOGINDIALOG_H
#include <QDialog>
#include <QString>
namespace Ui {
class FailedLoginDialog;
}
class FailedLoginDialog : public QDialog
{
Q_OBJECT
public:
explicit FailedLoginDialog(QWidget *parent = 0, QString message = "");
~FailedLoginDialog();
private:
Ui::FailedLoginDialog *ui;
};
#endif // FAILEDLOGINDIALOG_H

View File

@ -23,11 +23,10 @@
#include "MainWindow.h" #include "MainWindow.h"
#include "Fingerprint.h" #include "Fingerprint.h"
#include "PluginManager.h"
#include "AboutDialog.h" #include "AboutDialog.h"
#include "ServerConfigDialog.h" #include "ServerConfigDialog.h"
#include "SettingsDialog.h" #include "SettingsDialog.h"
#include "SetupWizard.h" #include "ActivationDialog.h"
#include "ZeroconfService.h" #include "ZeroconfService.h"
#include "DataDownloader.h" #include "DataDownloader.h"
#include "CommandProcess.h" #include "CommandProcess.h"
@ -35,6 +34,7 @@
#include "EditionType.h" #include "EditionType.h"
#include "QUtility.h" #include "QUtility.h"
#include "ProcessorArch.h" #include "ProcessorArch.h"
#include "SslCertificate.h"
#include <QtCore> #include <QtCore>
#include <QtGui> #include <QtGui>
@ -98,7 +98,8 @@ MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig) :
m_SuppressAutoConfigWarning(false), m_SuppressAutoConfigWarning(false),
m_BonjourInstall(NULL), m_BonjourInstall(NULL),
m_SuppressEmptyServerWarning(false), m_SuppressEmptyServerWarning(false),
m_ExpectedRunningState(kStopped) m_ExpectedRunningState(kStopped),
m_pSslCertificate(NULL)
{ {
setupUi(this); setupUi(this);
@ -137,8 +138,9 @@ MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig) :
setEdition(m_AppConfig.edition()); setEdition(m_AppConfig.edition());
m_pLabelPadlock->hide(); m_pLabelPadlock->hide();
connect (this, SIGNAL(windowShown()), this, SLOT(on_windowShown()), Qt::QueuedConnection);
updateLocalFingerprint(); connect (&m_AppConfig, SIGNAL(editionSet(int)), this, SLOT(setEdition(int)), Qt::QueuedConnection);
connect (&m_AppConfig, SIGNAL(sslToggled(bool)), this, SLOT(sslToggled(bool)), Qt::QueuedConnection);
} }
MainWindow::~MainWindow() MainWindow::~MainWindow()
@ -159,6 +161,8 @@ MainWindow::~MainWindow()
if (m_BonjourInstall != NULL) { if (m_BonjourInstall != NULL) {
delete m_BonjourInstall; delete m_BonjourInstall;
} }
delete m_pSslCertificate;
} }
void MainWindow::open() void MainWindow::open()
@ -263,7 +267,8 @@ void MainWindow::createMenuBar()
m_pMenuFile->addAction(m_pActionStartSynergy); m_pMenuFile->addAction(m_pActionStartSynergy);
m_pMenuFile->addAction(m_pActionStopSynergy); m_pMenuFile->addAction(m_pActionStopSynergy);
m_pMenuFile->addSeparator(); m_pMenuFile->addSeparator();
m_pMenuFile->addAction(m_pActionWizard); m_pMenuFile->addAction(m_pActivate);
m_pMenuFile->addSeparator();
m_pMenuFile->addAction(m_pActionSave); m_pMenuFile->addAction(m_pActionSave);
m_pMenuFile->addSeparator(); m_pMenuFile->addSeparator();
m_pMenuFile->addAction(m_pActionQuit); m_pMenuFile->addAction(m_pActionQuit);
@ -493,13 +498,19 @@ void MainWindow::restartSynergy()
void MainWindow::proofreadInfo() void MainWindow::proofreadInfo()
{ {
setEdition(m_AppConfig.edition()); setEdition(m_AppConfig.edition()); // Why is this here?
int oldState = m_SynergyState; int oldState = m_SynergyState;
m_SynergyState = synergyDisconnected; m_SynergyState = synergyDisconnected;
setSynergyState((qSynergyState)oldState); setSynergyState((qSynergyState)oldState);
} }
void MainWindow::showEvent(QShowEvent* event)
{
QMainWindow::showEvent(event);
emit windowShown();
}
void MainWindow::clearLog() void MainWindow::clearLog()
{ {
m_pLogOutput->clear(); m_pLogOutput->clear();
@ -618,6 +629,16 @@ void MainWindow::startSynergy()
} }
} }
void
MainWindow::sslToggled (bool enabled)
{
if (enabled) {
m_pSslCertificate = new SslCertificate(this);
m_pSslCertificate->generateCertificate();
}
updateLocalFingerprint();
}
bool MainWindow::clientArgs(QStringList& args, QString& app) bool MainWindow::clientArgs(QStringList& args, QString& app)
{ {
app = appPath(appConfig().synergycName()); app = appPath(appConfig().synergycName());
@ -1014,28 +1035,20 @@ void MainWindow::serverDetected(const QString name)
} }
} }
void MainWindow::setEdition(int type) void MainWindow::setEdition(int edition)
{ {
QString title; setWindowTitle(getEditionName(edition));
if (type == Basic) { if (m_AppConfig.getCryptoEnabled()) {
title = "Synergy Basic"; m_pSslCertificate = new SslCertificate(this);
m_pSslCertificate->generateCertificate();
} }
else if (type == Pro) { updateLocalFingerprint();
title = "Synergy Pro"; saveSettings();
}
else if (type == Trial) {
title = "Synergy Trial";
}
else {
title = "Synergy (UNREGISTERED)";
}
setWindowTitle(title);
} }
void MainWindow::updateLocalFingerprint() void MainWindow::updateLocalFingerprint()
{ {
if (Fingerprint::local().fileExists()) { if (m_AppConfig.getCryptoEnabled() && Fingerprint::local().fileExists()) {
m_pLabelFingerprint->setVisible(true); m_pLabelFingerprint->setVisible(true);
m_pLabelLocalFingerprint->setVisible(true); m_pLabelLocalFingerprint->setVisible(true);
m_pLabelLocalFingerprint->setText(Fingerprint::local().readFirst()); m_pLabelLocalFingerprint->setText(Fingerprint::local().readFirst());
@ -1145,10 +1158,10 @@ void MainWindow::on_m_pButtonConfigureServer_clicked()
showConfigureServer(); showConfigureServer();
} }
void MainWindow::on_m_pActionWizard_triggered() void MainWindow::on_m_pActivate_triggered()
{ {
SetupWizard wizard(*this, false); ActivationDialog activationDialog (this, this->appConfig());
wizard.exec(); activationDialog.exec();
} }
void MainWindow::on_m_pButtonApply_clicked() void MainWindow::on_m_pButtonApply_clicked()
@ -1367,6 +1380,14 @@ void MainWindow::bonjourInstallFinished()
m_pCheckBoxAutoConfig->setChecked(true); m_pCheckBoxAutoConfig->setChecked(true);
} }
void MainWindow::on_windowShown()
{
if (!m_AppConfig.activationHasRun() && (m_AppConfig.edition() == Unregistered)) {
ActivationDialog activationDialog (this, m_AppConfig);
activationDialog.exec();
}
}
QString MainWindow::getProfileRootForArg() QString MainWindow::getProfileRootForArg()
{ {
CoreInterface coreInterface; CoreInterface coreInterface;

View File

@ -33,6 +33,7 @@
#include "VersionChecker.h" #include "VersionChecker.h"
#include "IpcClient.h" #include "IpcClient.h"
#include "Ipc.h" #include "Ipc.h"
#include "ActivationDialog.h"
#include <QMutex> #include <QMutex>
@ -56,6 +57,7 @@ class SetupWizard;
class ZeroconfService; class ZeroconfService;
class DataDownloader; class DataDownloader;
class CommandProcess; class CommandProcess;
class SslCertificate;
class MainWindow : public QMainWindow, public Ui::MainWindowBase class MainWindow : public QMainWindow, public Ui::MainWindowBase
{ {
@ -63,7 +65,8 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
friend class QSynergyApplication; friend class QSynergyApplication;
friend class SetupWizard; friend class SetupWizard;
friend class PluginWizardPage; friend class ActivationDialog;
friend class SettingsDialog;
public: public:
enum qSynergyState enum qSynergyState
@ -112,10 +115,10 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
void autoAddScreen(const QString name); void autoAddScreen(const QString name);
void updateZeroconfService(); void updateZeroconfService();
void serverDetected(const QString name); void serverDetected(const QString name);
void setEdition(int type);
void updateLocalFingerprint(); void updateLocalFingerprint();
public slots: public slots:
void setEdition(int edition);
void appendLogRaw(const QString& text); void appendLogRaw(const QString& text);
void appendLogInfo(const QString& text); void appendLogInfo(const QString& text);
void appendLogDebug(const QString& text); void appendLogDebug(const QString& text);
@ -123,6 +126,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
void startSynergy(); void startSynergy();
protected slots: protected slots:
void sslToggled(bool enabled);
void on_m_pGroupClient_toggled(bool on); void on_m_pGroupClient_toggled(bool on);
void on_m_pGroupServer_toggled(bool on); void on_m_pGroupServer_toggled(bool on);
bool on_m_pButtonBrowseConfigFile_clicked(); bool on_m_pButtonBrowseConfigFile_clicked();
@ -130,7 +134,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
bool on_m_pActionSave_triggered(); bool on_m_pActionSave_triggered();
void on_m_pActionAbout_triggered(); void on_m_pActionAbout_triggered();
void on_m_pActionSettings_triggered(); void on_m_pActionSettings_triggered();
void on_m_pActionWizard_triggered(); void on_m_pActivate_triggered();
void synergyFinished(int exitCode, QProcess::ExitStatus); void synergyFinished(int exitCode, QProcess::ExitStatus);
void trayActivated(QSystemTrayIcon::ActivationReason reason); void trayActivated(QSystemTrayIcon::ActivationReason reason);
void stopSynergy(); void stopSynergy();
@ -180,6 +184,8 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
void restartSynergy(); void restartSynergy();
void proofreadInfo(); void proofreadInfo();
void showEvent (QShowEvent*);
private: private:
QSettings& m_Settings; QSettings& m_Settings;
AppConfig& m_AppConfig; AppConfig& m_AppConfig;
@ -207,12 +213,17 @@ class MainWindow : public QMainWindow, public Ui::MainWindowBase
bool m_SuppressEmptyServerWarning; bool m_SuppressEmptyServerWarning;
qRuningState m_ExpectedRunningState; qRuningState m_ExpectedRunningState;
QMutex m_StopDesktopMutex; QMutex m_StopDesktopMutex;
SslCertificate* m_pSslCertificate;
private slots: private slots:
void on_m_pCheckBoxAutoConfig_toggled(bool checked); void on_m_pCheckBoxAutoConfig_toggled(bool checked);
void on_m_pComboServerList_currentIndexChanged(QString ); void on_m_pComboServerList_currentIndexChanged(QString );
void on_m_pButtonApply_clicked(); void on_m_pButtonApply_clicked();
void installBonjour(); void installBonjour();
void on_windowShown();
signals:
void windowShown();
}; };
#endif #endif

View File

@ -1,73 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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://symless.com/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;
}

View File

@ -1,53 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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

@ -1,186 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 "PluginManager.h"
#include "CoreInterface.h"
#include "DataDownloader.h"
#include "QUtility.h"
#include "ProcessorArch.h"
#include "Fingerprint.h"
#include "Plugin.h"
#include "../lib/common/PluginVersion.h"
#include <QTextStream>
#include <QFile>
#include <QDir>
#include <QProcess>
#include <QCoreApplication>
PluginManager::PluginManager() :
m_PluginList()
{
init();
}
PluginManager::~PluginManager()
{
}
void PluginManager::init()
{
m_PluginDir = m_CoreInterface.getPluginDir();
if (m_PluginDir.isEmpty()) {
emit error(tr("Failed to get plugin directory."));
}
m_ProfileDir = m_CoreInterface.getProfileDir();
if (m_ProfileDir.isEmpty()) {
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."));
}
}
bool PluginManager::exist(QString name)
{
CoreInterface coreInterface;
QString PluginDir = coreInterface.getPluginDir();
QString pluginName = Plugin::getOsSpecificName(name);
QString filename;
filename.append(PluginDir);
filename.append(QDir::separator()).append(pluginName);
QFile file(filename);
bool exist = false;
if (file.exists()) {
exist = true;
}
return exist;
}
void PluginManager::copyPlugins()
{
try {
// Get the Directory where plugins are put on installation
// If it doesn't exist, there is nothing to do
QString srcDirName(m_InstalledDir.append(QDir::separator())
.append(Plugin::getOsSpecificInstallerLocation()));
QDir srcDir(srcDirName);
if (!srcDir.exists()) {
emit info(
tr("No plugins found to copy from %1")
.arg(srcDirName));
emit copyFinished();
}
// 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_PluginList.size() ; i++ ) {
// Get a file entry for the plugin using the full path
QFile file(srcDirName + QDir::separator() + m_PluginList.at(i));
// construct the destination file name
QString newName(destDirName + QDir::separator() + m_PluginList.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
bool result = newFile.remove();
if( !result ) {
emit error(
tr( "Unable to delete plugin:\n%1\n"
"Please stop synergy and run the wizard again.")
.arg(newName));
return;
}
}
// make a copy of the plugin in the new location
#if defined(Q_OS_WIN)
bool result = file.copy(newName);
#else
bool result = file.link(newName);
#endif
if ( !result ) {
emit error(
tr("Failed to copy plugin '%1' to: %2\n%3\n"
"Please stop synergy and run the wizard again.")
.arg(m_PluginList.at(i))
.arg(newName)
.arg(file.errorString()));
return;
}
else {
emit info(
tr("Copying '%1' plugin (%2/%3)...")
.arg(m_PluginList.at(i))
.arg(i+1)
.arg(m_PluginList.size()));
}
}
}
catch (std::exception& e)
{
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();
return;
}
void PluginManager::queryPluginList()
{
try {
setDone(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);
setDone(true);
}
catch (std::exception& e)
{
setDone(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

@ -1,75 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 PLUGINMANAGER_H
#define PLUGINMANAGER_H
#include <QString>
#include <QStringList>
#include <QObject>
#include "SslCertificate.h"
#include "CoreInterface.h"
#include "DataDownloader.h"
#include "Plugin.h"
class PluginManager : public QObject
{
Q_OBJECT
public:
PluginManager();
~PluginManager();
void init();
int pluginCount() { return m_PluginList.count(); }
QStringList& getPluginList() { return m_PluginList; }
bool isDone() { return done; }
void setDone(bool b) { done = b; }
static bool exist(QString name);
public slots:
void copyPlugins();
void queryPluginList();
private:
QString getPluginUrl(const QString& pluginName);
bool runProgram(
const QString& program,
const QStringList& args,
const QStringList& env);
signals:
void error(QString e);
void info(QString i);
void updateCopyStatus(int);
void copyFinished();
void queryPluginDone();
private:
QStringList m_PluginList;
QString m_PluginDir;
QString m_ProfileDir;
QString m_InstalledDir;
CoreInterface m_CoreInterface;
SslCertificate m_SslCertificate;
bool done;
};
#endif // PLUGINMANAGER_H

View File

@ -1,206 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 "PluginWizardPage.h"
#include "ui_PluginWizardPageBase.h"
#include "SslCertificate.h"
#include "PluginManager.h"
#include "MainWindow.h"
#include "EditionType.h"
#include <QMovie>
#include <QThread>
#include <QTime>
PluginWizardPage::PluginWizardPage(MainWindow& mainWindow, QWidget *parent) :
QWizardPage(parent),
m_Finished(false),
m_Edition(UnknownEdition),
m_pSslCertificate(NULL),
m_mainWindow(mainWindow)
{
setupUi(this);
QMovie *movie = new QMovie(":/res/image/spinning-wheel.gif");
m_pLabelSpinning->setMovie(movie);
movie->start();
m_pSslCertificate = new SslCertificate(this);
}
PluginWizardPage::~PluginWizardPage()
{
delete m_pSslCertificate;
}
void PluginWizardPage::changeEvent(QEvent *e)
{
QWizardPage::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
retranslateUi(this);
break;
default:
break;
}
}
void PluginWizardPage::initializePage()
{
QWizardPage::initializePage();
if (m_Edition != Pro) {
updateStatus(tr("Setup complete."));
showFinished();
return;
}
m_pLabelSpinning->show();
QThread* thread = new QThread;
connect(&m_PluginManager,
SIGNAL(error(QString)),
this,
SLOT(showError(QString)));
connect(&m_PluginManager,
SIGNAL(info(QString)),
this,
SLOT(updateStatus(QString)));
connect(&m_PluginManager,
SIGNAL(queryPluginDone()),
this,
SLOT(queryPluginDone()));
connect(&m_PluginManager,
SIGNAL(queryPluginDone()),
thread,
SLOT(quit()));
connect(&m_PluginManager,
SIGNAL(error(QString)),
thread,
SLOT(quit()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
m_PluginManager.moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(&m_PluginManager, "queryPluginList", Qt::QueuedConnection);
}
void PluginWizardPage::queryPluginDone()
{
QStringList pluginList = m_PluginManager.getPluginList();
if (pluginList.isEmpty()) {
updateStatus(tr("Setup complete."));
showFinished();
}
else {
m_mainWindow.stopSynergy();
copyPlugins();
m_mainWindow.startSynergy();
}
}
void PluginWizardPage::copyPlugins()
{
m_pThread = new QThread;
connect(&m_PluginManager,
SIGNAL(copyFinished()),
this,
SLOT(generateCertificate()));
connect(&m_PluginManager,
SIGNAL(error(QString)),
m_pThread,
SLOT(quit()));
connect(m_pThread,
SIGNAL(finished()),
m_pThread,
SLOT(deleteLater()));
updateStatus(
tr("Copying plugins..."));
m_PluginManager.moveToThread(m_pThread);
m_pThread->start();
QMetaObject::invokeMethod(
&m_PluginManager,
"copyPlugins",
Qt::QueuedConnection);
}
void PluginWizardPage::generateCertificate()
{
connect(m_pSslCertificate,
SIGNAL(generateFinished()),
this,
SLOT(finished()));
connect(m_pSslCertificate,
SIGNAL(generateFinished()),
m_pThread,
SLOT(quit()));
updateStatus(tr("Generating SSL certificate..."));
QMetaObject::invokeMethod(
m_pSslCertificate,
"generateCertificate",
Qt::QueuedConnection);
}
void PluginWizardPage::showError(QString error)
{
updateStatus(tr("Error: %1").arg(error));
showFinished();
}
void PluginWizardPage::updateStatus(QString info)
{
m_pLabelStatus->setText(info);
}
void PluginWizardPage::finished()
{
// TODO: we should check if ns plugin exists
m_mainWindow.appConfig().setCryptoEnabled(true);
updateStatus(tr("Plugins installed successfully."));
showFinished();
}
void PluginWizardPage::showFinished()
{
m_pLabelSpinning->hide();
m_Finished = true;
emit completeChanged();
}
bool PluginWizardPage::isComplete() const
{
return m_Finished;
}

View File

@ -1,66 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 PLUGINWIZARDPAGE_H
#define PLUGINWIZARDPAGE_H
#include "AppConfig.h"
#include "ui_PluginWizardPageBase.h"
#include "PluginManager.h"
#include <QWizardPage>
class SslCertificate;
class MainWindow;
class PluginWizardPage : public QWizardPage, public Ui::PluginWizardPage {
Q_OBJECT
public:
PluginWizardPage(MainWindow& mainWindow, QWidget *parent = 0);
~PluginWizardPage();
void setFinished(bool b) { m_Finished = b; }
void setEdition(int edition) { m_Edition = edition; }
bool isComplete() const;
void initializePage();
protected:
void changeEvent(QEvent *e);
protected slots:
void showError(QString error);
void updateStatus(QString info);
void queryPluginDone();
void generateCertificate();
void finished();
private:
void copyPlugins();
void showFinished();
private:
bool m_Finished;
int m_Edition;
PluginManager m_PluginManager;
SslCertificate* m_pSslCertificate;
QThread* m_pThread;
MainWindow& m_mainWindow;
};
#endif // PLUGINWIZARDPAGE_H

View File

@ -19,6 +19,7 @@
#include "ProcessorArch.h" #include "ProcessorArch.h"
#include "CommandProcess.h" #include "CommandProcess.h"
#include "EditionType.h"
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX)
#include <QProcess> #include <QProcess>
@ -41,6 +42,22 @@ void setIndexFromItemData(QComboBox* comboBox, const QVariant& itemData)
} }
} }
QString
getEditionName (int edition) {
if (edition == Basic) {
return "Synergy Basic";
}
else if (edition == Pro) {
return "Synergy Pro";
}
else if (edition == Trial) {
return "Synergy Trial";
}
else {
return "Synergy (UNREGISTERED)";
}
}
QString hash(const QString& string) QString hash(const QString& string)
{ {
QByteArray data = string.toUtf8(); QByteArray data = string.toUtf8();
@ -96,6 +113,8 @@ QString getOSInformation()
QString result; QString result;
#if defined(Q_OS_LINUX) #if defined(Q_OS_LINUX)
result = "Linux";
try {
QStringList arguments; QStringList arguments;
arguments.append("/etc/os-release"); arguments.append("/etc/os-release");
CommandProcess cp("/bin/cat", arguments); CommandProcess cp("/bin/cat", arguments);
@ -103,8 +122,9 @@ QString getOSInformation()
QRegExp resultRegex(".*PRETTY_NAME=\"([^\"]+)\".*"); QRegExp resultRegex(".*PRETTY_NAME=\"([^\"]+)\".*");
if (resultRegex.exactMatch(output)) { if (resultRegex.exactMatch(output)) {
QString OSInfo = resultRegex.cap(1); result = resultRegex.cap(1);
result = OSInfo; }
} catch (...) {
} }
#endif #endif

View File

@ -29,3 +29,4 @@ QString hash(const QString& string);
QString getFirstMacAddress(); QString getFirstMacAddress();
qProcessorArch getProcessorArch(); qProcessorArch getProcessorArch();
QString getOSInformation(); QString getOSInformation();
QString getEditionName (int edition);

View File

@ -18,12 +18,14 @@
#include "SettingsDialog.h" #include "SettingsDialog.h"
#include "PluginManager.h"
#include "CoreInterface.h" #include "CoreInterface.h"
#include "SynergyLocale.h" #include "SynergyLocale.h"
#include "QSynergyApplication.h" #include "QSynergyApplication.h"
#include "QUtility.h" #include "QUtility.h"
#include "AppConfig.h" #include "AppConfig.h"
#include "EditionType.h"
#include "SslCertificate.h"
#include "MainWindow.h"
#include <QtCore> #include <QtCore>
#include <QtGui> #include <QtGui>
@ -36,7 +38,7 @@ static const char networkSecurity[] = "ns";
SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) : SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) :
QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint),
Ui::SettingsDialogBase(), Ui::SettingsDialogBase(),
m_AppConfig(config) m_appConfig(config)
{ {
setupUi(this); setupUi(this);
@ -61,13 +63,8 @@ SettingsDialog::SettingsDialog(QWidget* parent, AppConfig& config) :
m_pComboElevate->hide(); m_pComboElevate->hide();
#endif #endif
if (!PluginManager::exist(networkSecurity)) { m_pCheckBoxEnableCrypto->setChecked(m_appConfig.getCryptoEnabled());
m_pGroupNetworkSecurity->setEnabled(false); m_pCheckBoxEnableCrypto->setEnabled(m_appConfig.edition() == Pro);
m_pCheckBoxEnableCrypto->setChecked(false);
}
else {
m_pCheckBoxEnableCrypto->setChecked(m_AppConfig.getCryptoEnabled());
}
} }
void SettingsDialog::accept() void SettingsDialog::accept()
@ -147,5 +144,12 @@ void SettingsDialog::on_m_pComboLanguage_currentIndexChanged(int index)
void SettingsDialog::on_m_pCheckBoxEnableCrypto_toggled(bool checked) void SettingsDialog::on_m_pCheckBoxEnableCrypto_toggled(bool checked)
{ {
m_AppConfig.setCryptoEnabled(checked); m_appConfig.setCryptoEnabled(checked);
m_appConfig.saveSettings();
if (checked) {
SslCertificate sslCertificate;
sslCertificate.generateCertificate();
MainWindow& mainWindow = dynamic_cast<MainWindow&> (*this->parent());
mainWindow.updateLocalFingerprint();
}
} }

View File

@ -40,10 +40,10 @@ class SettingsDialog : public QDialog, public Ui::SettingsDialogBase
void accept(); void accept();
void reject(); void reject();
void changeEvent(QEvent* event); void changeEvent(QEvent* event);
AppConfig& appConfig() { return m_AppConfig; } AppConfig& appConfig() { return m_appConfig; }
private: private:
AppConfig& m_AppConfig; AppConfig& m_appConfig;
SynergyLocale m_Locale; SynergyLocale m_Locale;
CoreInterface m_CoreInterface; CoreInterface m_CoreInterface;

View File

@ -28,13 +28,9 @@
SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) : SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) :
m_MainWindow(mainWindow), m_MainWindow(mainWindow),
m_StartMain(startMain), m_StartMain(startMain)
m_Edition(UnknownEdition),
m_LoginAttemps(0)
{ {
setupUi(this); setupUi(this);
m_pPluginPage = new PluginWizardPage(mainWindow);
addPage(m_pPluginPage);
#if defined(Q_OS_MAC) #if defined(Q_OS_MAC)
@ -59,13 +55,6 @@ SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) :
m_Locale.fillLanguageComboBox(m_pComboLanguage); m_Locale.fillLanguageComboBox(m_pComboLanguage);
setIndexFromItemData(m_pComboLanguage, m_MainWindow.appConfig().language()); setIndexFromItemData(m_pComboLanguage, m_MainWindow.appConfig().language());
AppConfig& appConfig = m_MainWindow.appConfig();
m_pLineEditEmail->setText(appConfig.activateEmail());
m_pTextEditSerialKey->setText(appConfig.serialKey());
m_pTextEditSerialKey->setEnabled(false);
} }
SetupWizard::~SetupWizard() SetupWizard::~SetupWizard()
@ -78,70 +67,7 @@ bool SetupWizard::validateCurrentPage()
message.setWindowTitle(tr("Setup Synergy")); message.setWindowTitle(tr("Setup Synergy"));
message.setIcon(QMessageBox::Information); message.setIcon(QMessageBox::Information);
if (currentPage() == m_pActivatePage) if (currentPage() == m_pNodePage)
{
if (m_pRadioButtonActivate->isChecked()) {
if (m_pLineEditEmail->text().isEmpty() ||
m_pLineEditPassword->text().isEmpty()) {
message.setText(tr("Please enter your email address and password."));
message.exec();
return false;
}
else {
WebClient webClient;
m_Edition = webClient.getEdition(
m_pLineEditEmail->text(),
m_pLineEditPassword->text(),
message,
this);
if (m_Edition == UnknownEdition) {
m_LoginAttemps++;
if (m_LoginAttemps == kMaximiumLoginAttemps) {
m_LoginAttemps = 0;
QMessageBox::StandardButton reply =
QMessageBox::information(
this, tr("Setup Synergy"),
tr("Would you like to use your serial key instead?"),
QMessageBox::Yes | QMessageBox::No);
if (reply == QMessageBox::Yes) {
m_pRadioButtonSubscription->setChecked(true);
}
}
return false;
}
else {
m_pPluginPage->setEdition(m_Edition);
return true;
}
}
}
else if (m_pRadioButtonSubscription->isChecked()) {
if (m_pTextEditSerialKey->toPlainText().isEmpty()) {
message.setText(tr("Please enter your subscription serial key."));
message.exec();
return false;
}
else {
// create subscription file in profile directory
SubscriptionManager subscriptionManager(this, m_MainWindow.appConfig(), m_Edition);
if (!subscriptionManager.activateSerial(m_pTextEditSerialKey->toPlainText())) {
return false;
}
m_pPluginPage->setEdition(m_Edition);
return true;
}
}
else {
return true;
}
}
else if (currentPage() == m_pNodePage)
{ {
bool result = m_pClientRadioButton->isChecked() || bool result = m_pClientRadioButton->isChecked() ||
m_pServerRadioButton->isChecked(); m_pServerRadioButton->isChecked();
@ -198,31 +124,6 @@ void SetupWizard::accept()
settings.setValue("groupServerChecked", false); settings.setValue("groupServerChecked", false);
} }
if (m_pRadioButtonActivate->isChecked()) {
appConfig.setActivateEmail(m_pLineEditEmail->text());
notifyActivation("login:" + m_pLineEditEmail->text());
}
if (m_pRadioButtonSubscription->isChecked())
{
appConfig.setSerialKey(m_pTextEditSerialKey->toPlainText());
notifyActivation("serial:" + m_pTextEditSerialKey->toPlainText());
}
if (m_pRadioButtonSkip->isChecked())
{
notifyActivation("skip:unknown");
}
appConfig.setEdition(m_Edition);
m_MainWindow.setEdition(m_Edition);
m_MainWindow.updateLocalFingerprint();
appConfig.saveSettings();
settings.sync();
QWizard::accept(); QWizard::accept();
if (m_StartMain) if (m_StartMain)
@ -238,60 +139,14 @@ void SetupWizard::reject()
if (m_StartMain) if (m_StartMain)
{ {
m_MainWindow.setEdition(m_Edition);
m_MainWindow.open(); m_MainWindow.open();
} }
// treat cancel as skip
notifyActivation("skip:unknown");
QWizard::reject(); QWizard::reject();
} }
void SetupWizard::notifyActivation(QString identity)
{
ActivationNotifier* notifier = new ActivationNotifier();
notifier->setIdentity(identity);
QThread* thread = new QThread;
connect(notifier, SIGNAL(finished()), thread, SLOT(quit()));
connect(notifier, SIGNAL(finished()), notifier, SLOT(deleteLater()));
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
notifier->moveToThread(thread);
thread->start();
QMetaObject::invokeMethod(notifier, "notify", Qt::QueuedConnection);
}
void SetupWizard::on_m_pComboLanguage_currentIndexChanged(int index) void SetupWizard::on_m_pComboLanguage_currentIndexChanged(int index)
{ {
QString ietfCode = m_pComboLanguage->itemData(index).toString(); QString ietfCode = m_pComboLanguage->itemData(index).toString();
QSynergyApplication::getInstance()->switchTranslator(ietfCode); QSynergyApplication::getInstance()->switchTranslator(ietfCode);
} }
void SetupWizard::on_m_pRadioButtonSkip_toggled(bool checked)
{
if (checked) {
m_pLineEditEmail->setEnabled(false);
m_pLineEditPassword->setEnabled(false);
m_pTextEditSerialKey->setEnabled(false);
}
}
void SetupWizard::on_m_pRadioButtonActivate_toggled(bool checked)
{
if (checked) {
m_pLineEditEmail->setEnabled(true);
m_pLineEditPassword->setEnabled(true);
m_pTextEditSerialKey->setEnabled(false);
}
}
void SetupWizard::on_m_pRadioButtonSubscription_toggled(bool checked)
{
if (checked) {
m_pLineEditEmail->setEnabled(false);
m_pLineEditPassword->setEnabled(false);
m_pTextEditSerialKey->setEnabled(true);
}
}

View File

@ -19,7 +19,6 @@
#include "ui_SetupWizardBase.h" #include "ui_SetupWizardBase.h"
#include "SynergyLocale.h" #include "SynergyLocale.h"
#include "PluginWizardPage.h"
#include <QWizard> #include <QWizard>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
@ -43,19 +42,12 @@ protected:
void changeEvent(QEvent* event); void changeEvent(QEvent* event);
void accept(); void accept();
void reject(); void reject();
void notifyActivation(QString identity);
private: private:
MainWindow& m_MainWindow; MainWindow& m_MainWindow;
bool m_StartMain; bool m_StartMain;
SynergyLocale m_Locale; SynergyLocale m_Locale;
int m_Edition;
PluginWizardPage* m_pPluginPage;
int m_LoginAttemps;
private slots: private slots:
void on_m_pRadioButtonSubscription_toggled(bool checked);
void on_m_pRadioButtonActivate_toggled(bool checked);
void on_m_pRadioButtonSkip_toggled(bool checked);
void on_m_pComboLanguage_currentIndexChanged(int index); void on_m_pComboLanguage_currentIndexChanged(int index);
}; };

View File

@ -90,6 +90,18 @@ bool SslCertificate::runTool(const QStringList& args)
void SslCertificate::generateCertificate() void SslCertificate::generateCertificate()
{ {
QString sslDirPath = QString("%1%2%3")
.arg(m_ProfileDir)
.arg(QDir::separator())
.arg(kSslDir);
QString filename = QString("%1%2%3")
.arg(sslDirPath)
.arg(QDir::separator())
.arg(kCertificateFilename);
QFile file(filename);
if (!file.exists()) {
QStringList arguments; QStringList arguments;
// self signed certificate // self signed certificate
@ -111,21 +123,11 @@ void SslCertificate::generateCertificate()
arguments.append("-newkey"); arguments.append("-newkey");
arguments.append("rsa:1024"); arguments.append("rsa:1024");
QString sslDirPath = QString("%1%2%3")
.arg(m_ProfileDir)
.arg(QDir::separator())
.arg(kSslDir);
QDir sslDir(sslDirPath); QDir sslDir(sslDirPath);
if (!sslDir.exists()) { if (!sslDir.exists()) {
sslDir.mkpath("."); sslDir.mkpath(".");
} }
QString filename = QString("%1%2%3")
.arg(sslDirPath)
.arg(QDir::separator())
.arg(kCertificateFilename);
// key output filename // key output filename
arguments.append("-keyout"); arguments.append("-keyout");
arguments.append(filename); arguments.append(filename);
@ -139,6 +141,7 @@ void SslCertificate::generateCertificate()
} }
emit info(tr("SSL certificate generated.")); emit info(tr("SSL certificate generated."));
}
generateFingerprint(filename); generateFingerprint(filename);

View File

@ -39,7 +39,7 @@ SubscriptionManager::SubscriptionManager(QWidget* parent, AppConfig& appConfig,
bool SubscriptionManager::activateSerial(const QString& serial) bool SubscriptionManager::activateSerial(const QString& serial)
{ {
m_Edition = UnknownEdition; m_Edition = Unregistered;
persistDirectory(); persistDirectory();
CoreInterface coreInterface; CoreInterface coreInterface;
QString output; QString output;
@ -62,7 +62,7 @@ bool SubscriptionManager::activateSerial(const QString& serial)
bool SubscriptionManager::checkSubscription() bool SubscriptionManager::checkSubscription()
{ {
m_Edition = UnknownEdition; m_Edition = Unregistered;
persistDirectory(); persistDirectory();
CoreInterface coreInterface; CoreInterface coreInterface;
QString output; QString output;
@ -98,7 +98,7 @@ void SubscriptionManager::checkError(QString& error)
} }
else { else {
QMessageBox::warning(m_pParent, tr("Subscription error"), QMessageBox::warning(m_pParent, tr("Subscription error"),
tr("An error occurred while trying to activate using a serial key. " tr("An error occurred while trying to activate Synergy using your serial key. "
"Please contact the helpdesk, and provide the " "Please contact the helpdesk, and provide the "
"following details.\n\n%1").arg(error)); "following details.\n\n%1").arg(error));
} }

View File

@ -51,9 +51,11 @@ void VersionChecker::replyFinished(QNetworkReply* reply)
if (!newestVersion.isEmpty()) if (!newestVersion.isEmpty())
{ {
QString currentVersion = getVersion(); QString currentVersion = getVersion();
if (currentVersion != "Unknown") {
if (compareVersions(currentVersion, newestVersion) > 0) if (compareVersions(currentVersion, newestVersion) > 0)
emit updateFound(newestVersion); emit updateFound(newestVersion);
} }
}
} }
int VersionChecker::compareVersions(const QString& left, const QString& right) int VersionChecker::compareVersions(const QString& left, const QString& right)

View File

@ -25,76 +25,60 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <stdexcept> #include <stdexcept>
int WebClient::getEdition( bool
const QString& email, WebClient::getEdition (int& edition, QString& errorOut) {
const QString& password, QString responseJson = request();
QMessageBox& message,
QWidget* w) /* TODO: This is horrible and should be ripped out as soon as we move
{ * to Qt 5. See issue #5630
QString responseJson; */
int edition = UnknownEdition;
try {
responseJson = request(email, password);
}
catch (std::exception& e)
{
message.critical(
w, "Error",
tr("An error occurred while trying to sign in. "
"Please contact the helpdesk, and provide the "
"following details.\n\n%1").arg(e.what()));
return edition;
}
QRegExp resultRegex(".*\"result\".*:.*(true|false).*"); QRegExp resultRegex(".*\"result\".*:.*(true|false).*");
if (resultRegex.exactMatch(responseJson)) { if (resultRegex.exactMatch (responseJson)) {
QString boolString = resultRegex.cap(1); QString boolString = resultRegex.cap(1);
if (boolString == "true") { if (boolString == "true") {
QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*"); QRegExp editionRegex(".*\"edition\".*:.*\"([^\"]+)\".*");
if (editionRegex.exactMatch(responseJson)) { if (editionRegex.exactMatch(responseJson)) {
QString e = editionRegex.cap(1); QString e = editionRegex.cap(1);
edition = e.toInt(); edition = e.toInt();
return true;
} else {
throw std::runtime_error ("Unrecognised server response.");
} }
} else {
return edition; errorOut = tr("Login failed. Invalid email address or password.");
return false;
} }
else if (boolString == "false") { } else {
message.critical(
w, "Error",
tr("Login failed, invalid email or password."));
return edition;
}
}
else {
QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*"); QRegExp errorRegex(".*\"error\".*:.*\"([^\"]+)\".*");
if (errorRegex.exactMatch(responseJson)) { if (errorRegex.exactMatch (responseJson)) {
errorOut = errorRegex.cap(1).replace("\\n", "\n");
// replace "\n" with real new lines. return false;
QString error = errorRegex.cap(1).replace("\\n", "\n"); } else {
message.critical( throw std::runtime_error ("Unrecognised server response.");
w, "Error",
tr("Login failed, an error occurred.\n\n%1").arg(error));
return edition;
} }
} }
message.critical(
w, "Error",
tr("Login failed, an error occurred.\n\nServer response:\n\n%1")
.arg(responseJson));
return edition;
} }
QString WebClient::request( bool
const QString& email, WebClient::setEmail (QString email, QString& errorOut) {
const QString& password) if (email.isEmpty()) {
{ errorOut = tr("Your email address cannot be left blank.");
return false;
}
m_Email = email;
return true;
}
bool
WebClient::setPassword (QString password, QString&) {
m_Password = password;
return true;
}
QString
WebClient::request() {
QStringList args("--login-auth"); QStringList args("--login-auth");
// hash password in case it contains interesting chars. QString credentials (m_Email + ":" + hash(m_Password) + "\n");
QString credentials(email + ":" + hash(password) + "\n"); return m_CoreInterface.run (args, credentials);
return m_CoreInterface.run(args, credentials);
} }

View File

@ -32,21 +32,15 @@ class WebClient : public QObject
Q_OBJECT Q_OBJECT
public: public:
int getEdition(const QString& email, bool getEdition (int& edition, QString& errorOut);
const QString& password, bool setEmail (QString email, QString& errorOut);
QMessageBox& message, bool setPassword (QString password, QString& errorOut);
QWidget* w);
void setEmail(QString& e) { m_Email = e; }
void setPassword(QString& p) { m_Password = p; }
signals: signals:
void error(QString e); void error(QString e);
private: private:
QString request(const QString& email, QString request();
const QString& password);
private:
QString m_Email; QString m_Email;
QString m_Password; QString m_Password;
CoreInterface m_CoreInterface; CoreInterface m_CoreInterface;

View File

@ -23,7 +23,6 @@ add_subdirectory(ipc)
add_subdirectory(mt) add_subdirectory(mt)
add_subdirectory(net) add_subdirectory(net)
add_subdirectory(platform) add_subdirectory(platform)
add_subdirectory(plugin)
add_subdirectory(server) add_subdirectory(server)
add_subdirectory(synergy) add_subdirectory(synergy)

View File

@ -50,7 +50,6 @@
# include "arch/win32/ArchSystemWindows.h" # include "arch/win32/ArchSystemWindows.h"
# include "arch/win32/ArchTaskBarWindows.h" # include "arch/win32/ArchTaskBarWindows.h"
# include "arch/win32/ArchTimeWindows.h" # include "arch/win32/ArchTimeWindows.h"
# include "arch/win32/ArchPluginWindows.h"
# include "arch/win32/ArchInternetWindows.h" # include "arch/win32/ArchInternetWindows.h"
#elif SYSAPI_UNIX #elif SYSAPI_UNIX
# include "arch/unix/ArchConsoleUnix.h" # include "arch/unix/ArchConsoleUnix.h"
@ -66,7 +65,6 @@
# include "arch/unix/ArchSystemUnix.h" # include "arch/unix/ArchSystemUnix.h"
# include "arch/unix/ArchTaskBarXWindows.h" # include "arch/unix/ArchTaskBarXWindows.h"
# include "arch/unix/ArchTimeUnix.h" # include "arch/unix/ArchTimeUnix.h"
# include "arch/unix/ArchPluginUnix.h"
# include "arch/unix/ArchInternetUnix.h" # include "arch/unix/ArchInternetUnix.h"
#endif #endif
@ -122,12 +120,10 @@ public:
static void setInstance(Arch* s) { s_instance = s; } static void setInstance(Arch* s) { s_instance = s; }
ARCH_PLUGIN& plugin() const { return (ARCH_PLUGIN&)m_plugin; }
ARCH_INTERNET& internet() const { return (ARCH_INTERNET&)m_internet; } ARCH_INTERNET& internet() const { return (ARCH_INTERNET&)m_internet; }
private: private:
static Arch* s_instance; static Arch* s_instance;
ARCH_PLUGIN m_plugin;
ARCH_INTERNET m_internet; ARCH_INTERNET m_internet;
}; };

View File

@ -1,80 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2012 Nick Bolton
*
* 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/>.
*/
#pragma once
#include "common/IInterface.h"
#include "common/stdmap.h"
#include "base/String.h"
class IEventQueue;
//! Interface for plugin manager.
/*!
A plugin manager should load all 3rd party plugins from the plugins dir,
and then look for common function names in the plugins.
*/
class IArchPlugin : public IInterface {
public:
//! @name manipulators
//@{
//!Load plugins
/*!
Scan the plugins dir and load plugins.
*/
virtual void load() = 0;
//!Unload plugins
/*!
Look through the loaded plugins and unload them.
*/
virtual void unload() = 0;
//! Init the common parts
/*!
Initializes common parts like log and arch.
*/
virtual void init(void* log, void* arch) = 0;
//! Init the event part
/*!
Initializes event parts.
*/
virtual void initEvent(void* eventTarget, IEventQueue* events) = 0;
//! Check if exists
/*!
Returns true if the plugin exists and is loaded.
*/
virtual bool exists(const char* name) = 0;
//! Invoke function
/*!
Invokes a function from the plugin.
*/
virtual void* invoke(const char* plugin,
const char* command,
void** args,
void* library = NULL) = 0;
//@}
protected:
typedef std::map<String, void*> PluginTable;
};

View File

@ -697,7 +697,7 @@ void*
ArchMultithreadPosix::threadFunc(void* vrep) ArchMultithreadPosix::threadFunc(void* vrep)
{ {
// get the thread // get the thread
ArchThreadImpl* thread = reinterpret_cast<ArchThreadImpl*>(vrep); ArchThreadImpl* thread = static_cast<ArchThreadImpl*>(vrep);
// setup pthreads // setup pthreads
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL); pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);

View File

@ -737,8 +737,7 @@ ArchNetworkBSD::addrToName(ArchNetAddress addr)
// mutexed name lookup (ugh) // mutexed name lookup (ugh)
ARCH->lockMutex(m_mutex); ARCH->lockMutex(m_mutex);
struct hostent* info = gethostbyaddr( struct hostent* info = gethostbyaddr(&addr->m_addr,
reinterpret_cast<const char*>(&addr->m_addr),
addr->m_len, addr->m_addr.sa_family); addr->m_len, addr->m_addr.sa_family);
if (info == NULL) { if (info == NULL) {
ARCH->unlockMutex(m_mutex); ARCH->unlockMutex(m_mutex);

View File

@ -1,239 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2012 Nick Bolton
*
* 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 "arch/unix/ArchPluginUnix.h"
#include "arch/unix/XArchUnix.h"
#include "common/PluginVersion.h"
#include "base/IEventQueue.h"
#include "base/Event.h"
#include "base/Log.h"
#include <vector>
#include <sys/types.h>
#include <dirent.h>
#include <dlfcn.h>
typedef void (*initFunc)(void*, void*);
typedef int (*initEventFunc)(void (*sendEvent)(const char*, void*));
typedef void* (*invokeFunc)(const char*, void*);
typedef void (*cleanupFunc)();
void* g_eventTarget = NULL;
IEventQueue* g_events = NULL;
ArchPluginUnix::ArchPluginUnix()
{
}
ArchPluginUnix::~ArchPluginUnix()
{
}
void
ArchPluginUnix::load()
{
String pluginsDir = getPluginsDir();
LOG((CLOG_DEBUG "plugins dir: %s", pluginsDir.c_str()));
struct dirent* de = NULL;
DIR* dir = NULL;
dir = opendir(pluginsDir.c_str());
if (dir == NULL) {
LOG((CLOG_DEBUG "can't open plugins dir: %s",
pluginsDir.c_str()));
return;
}
std::vector<String> plugins;
while ((de = readdir(dir)) != NULL) {
// ignore hidden files and diretories like .. and .
if (de->d_name[0] != '.') {
plugins.push_back(de->d_name);
}
}
closedir(dir);
std::vector<String>::iterator it;
for (it = plugins.begin(); it != plugins.end(); ++it) {
String filename = *it;
String path = synergy::string::sprintf(
"%s/%s", pluginsDir.c_str(), filename.c_str());
String name = synergy::string::removeFileExt(filename.substr(3));
LOG((CLOG_DEBUG "loading plugin: %s", filename.c_str()));
void* handle = dlopen(path.c_str(), RTLD_LAZY);
if (handle == NULL) {
LOG((CLOG_ERR "failed to load plugin '%s', error: %s",
filename.c_str(), dlerror()));
continue;
}
String expectedVersion = getExpectedPluginVersion(name.c_str());
String currentVersion = getCurrentVersion(name, handle);
if (currentVersion.empty() || (expectedVersion != currentVersion)) {
LOG((CLOG_ERR
"failed to load plugin '%s', "
"expected version %s but was %s",
filename.c_str(),
expectedVersion.c_str(),
currentVersion.empty() ? "unknown" : currentVersion.c_str()));
dlclose(handle);
continue;
}
LOG((CLOG_DEBUG "plugin loaded: %s (version %s)",
filename.c_str(),
currentVersion.c_str()));
m_pluginTable.insert(std::make_pair(name, handle));
}
}
void
ArchPluginUnix::unload()
{
PluginTable::iterator it;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
cleanupFunc cleanup = (cleanupFunc)dlsym(it->second, "cleanup");
if (cleanup != NULL) {
cleanup();
}
else {
LOG((CLOG_DEBUG "no cleanup function in %s", it->first.c_str()));
}
LOG((CLOG_DEBUG "unloading plugin: %s", it->first.c_str()));
dlclose(it->second);
}
}
void
ArchPluginUnix::init(void* log, void* arch)
{
PluginTable::iterator it;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
initFunc initPlugin = (initFunc)dlsym(it->second, "init");
if (initPlugin != NULL) {
initPlugin(log, arch);
}
else {
LOG((CLOG_DEBUG "no init function in %s", it->first.c_str()));
}
}
}
void
ArchPluginUnix::initEvent(void* eventTarget, IEventQueue* events)
{
g_eventTarget = eventTarget;
g_events = events;
PluginTable::iterator it;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
initEventFunc initEventPlugin = (initEventFunc)dlsym(it->second, "initEvent");
if (initEventPlugin != NULL) {
initEventPlugin(&sendEvent);
}
else {
LOG((CLOG_DEBUG "no init event function in %s", it->first.c_str()));
}
}
}
bool
ArchPluginUnix::exists(const char* name)
{
PluginTable::iterator it;
it = m_pluginTable.find(name);
return it != m_pluginTable.end() ? true : false;
}
void*
ArchPluginUnix::invoke(
const char* plugin,
const char* command,
void** args,
void* library)
{
void* lib = NULL;
if (library == NULL) {
PluginTable::iterator it;
it = m_pluginTable.find(plugin);
if (it != m_pluginTable.end()) {
lib = it->second;
}
else {
LOG((CLOG_DEBUG "invoke command failed, plugin: %s command: %s",
plugin, command));
return NULL;
}
}
else {
lib = library;
}
invokeFunc invokePlugin = (invokeFunc)dlsym(lib, "invoke");
void* result = NULL;
if (invokePlugin != NULL) {
result = invokePlugin(command, args);
}
else {
LOG((CLOG_DEBUG "no invoke function in %s", plugin));
}
return result;
}
String
ArchPluginUnix::getPluginsDir()
{
return ARCH->getPluginDirectory();
}
String
ArchPluginUnix::getCurrentVersion(const String& name, void* handle)
{
char* version = (char*)invoke(name.c_str(), "version", NULL, handle);
if (version == NULL) {
return "";
}
return version;
}
void
sendEvent(const char* eventName, void* data)
{
LOG((CLOG_DEBUG5 "plugin sending event"));
Event::Type type = g_events->getRegisteredType(eventName);
g_events->addEvent(Event(type, g_eventTarget, data));
}
void
log(const char* text)
{
LOG((CLOG_DEBUG "plugin: %s", text));
}

View File

@ -1,53 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2012 Nick Bolton
*
* 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/>.
*/
#pragma once
#include "arch/IArchPlugin.h"
#define ARCH_PLUGIN ArchPluginUnix
class IEventQueue;
//! Unix implementation of IArchPlugin
class ArchPluginUnix : public IArchPlugin {
public:
ArchPluginUnix();
virtual ~ArchPluginUnix();
// IArchPlugin overrides
void load();
void unload();
void init(void* log, void* arch);
void initEvent(void* eventTarget, IEventQueue* events);
bool exists(const char* name);
virtual void* invoke(const char* pluginName,
const char* functionName,
void** args,
void* library = NULL);
private:
String getPluginsDir();
String getCurrentVersion(const String& name, void* handle);
private:
PluginTable m_pluginTable;
};
void sendEvent(const char* text, void* data);
void log(const char* text);

View File

@ -661,7 +661,7 @@ unsigned int __stdcall
ArchMultithreadWindows::threadFunc(void* vrep) ArchMultithreadWindows::threadFunc(void* vrep)
{ {
// get the thread // get the thread
ArchThreadImpl* thread = reinterpret_cast<ArchThreadImpl*>(vrep); ArchThreadImpl* thread = static_cast<ArchThreadImpl*>(vrep);
// run thread // run thread
s_instance->doThreadFunc(thread); s_instance->doThreadFunc(thread);

View File

@ -805,7 +805,7 @@ ArchNetworkWinsock::setAddrPort(ArchNetAddress addr, int port)
case kINET: { case kINET: {
struct sockaddr_in* ipAddr = struct sockaddr_in* ipAddr =
reinterpret_cast<struct sockaddr_in*>(&addr->m_addr); reinterpret_cast<struct sockaddr_in*>(&addr->m_addr);
ipAddr->sin_port = htons_winsock(static_cast<u_short>(port)); ipAddr->sin_port = htons_winsock(port);
break; break;
} }

View File

@ -1,250 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2012 Nick Bolton
*
* 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 "arch/win32/ArchPluginWindows.h"
#include "arch/win32/XArchWindows.h"
#include "common/PluginVersion.h"
#include "base/Log.h"
#include "base/IEventQueue.h"
#include "base/Event.h"
#include "synergy/Screen.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <iostream>
typedef void (*initFunc)(void*, void*);
typedef int (*initEventFunc)(void (*sendEvent)(const char*, void*));
typedef void* (*invokeFunc)(const char*, void**);
typedef void (*cleanupFunc)();
void* g_eventTarget = NULL;
IEventQueue* g_events = NULL;
static const char * kPre174Plugin = "Pre-1.7.v";
ArchPluginWindows::ArchPluginWindows()
{
}
ArchPluginWindows::~ArchPluginWindows()
{
}
void
ArchPluginWindows::load()
{
String dir = getPluginsDir();
LOG((CLOG_DEBUG "plugins dir: %s", dir.c_str()));
String pattern = String(dir).append("\\*.dll");
std::vector<String> plugins;
getFilenames(pattern, plugins);
std::vector<String>::iterator it;
for (it = plugins.begin(); it != plugins.end(); ++it) {
String filename = *it;
String name = synergy::string::removeFileExt(filename);
String path = synergy::string::sprintf(
"%s\\%s", dir.c_str(), filename.c_str());
LOG((CLOG_DEBUG "loading plugin: %s", filename.c_str()));
HINSTANCE handle = LoadLibrary(path.c_str());
void* voidHandle = reinterpret_cast<void*>(handle);
if (handle == NULL) {
String error = XArchEvalWindows().eval();
LOG((CLOG_ERR "failed to load plugin '%s', error: %s",
filename.c_str(), error.c_str()));
continue;
}
String expectedVersion = getExpectedPluginVersion(name.c_str());
String currentVersion = getCurrentVersion(name.c_str(), voidHandle);
if (currentVersion.empty() || (expectedVersion != currentVersion)) {
LOG((CLOG_ERR
"failed to load plugin '%s', "
"expected version %s but was %s",
filename.c_str(),
expectedVersion.c_str(),
currentVersion.empty() ? "unknown" : currentVersion.c_str()));
FreeLibrary(handle);
continue;
}
LOG((CLOG_DEBUG "plugin loaded: %s (version %s)",
filename.c_str(),
currentVersion.c_str()));
m_pluginTable.insert(std::make_pair(name, voidHandle));
}
}
void
ArchPluginWindows::unload()
{
PluginTable::iterator it;
HINSTANCE lib;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
lib = reinterpret_cast<HINSTANCE>(it->second);
cleanupFunc cleanup = (cleanupFunc)GetProcAddress(lib, "cleanup");
if (cleanup != NULL) {
cleanup();
}
else {
LOG((CLOG_DEBUG "no cleanup function in %s", it->first.c_str()));
}
LOG((CLOG_DEBUG "unloading plugin: %s", it->first.c_str()));
FreeLibrary(lib);
}
}
void
ArchPluginWindows::init(void* log, void* arch)
{
PluginTable::iterator it;
HINSTANCE lib;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
lib = reinterpret_cast<HINSTANCE>(it->second);
initFunc initPlugin = (initFunc)GetProcAddress(lib, "init");
if (initPlugin != NULL) {
initPlugin(log, arch);
}
else {
LOG((CLOG_DEBUG "no init function in %s", it->first.c_str()));
}
}
}
void
ArchPluginWindows::initEvent(void* eventTarget, IEventQueue* events)
{
g_eventTarget = eventTarget;
g_events = events;
PluginTable::iterator it;
HINSTANCE lib;
for (it = m_pluginTable.begin(); it != m_pluginTable.end(); it++) {
lib = reinterpret_cast<HINSTANCE>(it->second);
initEventFunc initEventPlugin = (initEventFunc)GetProcAddress(lib, "initEvent");
if (initEventPlugin != NULL) {
initEventPlugin(&sendEvent);
}
else {
LOG((CLOG_DEBUG "no init event function in %s", it->first.c_str()));
}
}
}
bool
ArchPluginWindows::exists(const char* name)
{
PluginTable::iterator it;
it = m_pluginTable.find(name);
return it != m_pluginTable.end() ? true : false;
}
void*
ArchPluginWindows::invoke(
const char* plugin,
const char* command,
void** args,
void* library)
{
HINSTANCE lib = NULL;
if (library == NULL) {
PluginTable::iterator it;
it = m_pluginTable.find(plugin);
if (it != m_pluginTable.end()) {
lib = reinterpret_cast<HINSTANCE>(it->second);
}
else {
LOG((CLOG_DEBUG "invoke command failed, plugin: %s command: %s",
plugin, command));
return NULL;
}
}
else {
lib = reinterpret_cast<HINSTANCE>(library);
}
invokeFunc invokePlugin = (invokeFunc)GetProcAddress(lib, "invoke");
void* result = NULL;
if (invokePlugin != NULL) {
result = invokePlugin(command, args);
}
else {
LOG((CLOG_DEBUG "no invoke function in %s", plugin));
}
return result;
}
void
ArchPluginWindows::getFilenames(const String& pattern, std::vector<String>& filenames)
{
WIN32_FIND_DATA data;
HANDLE find = FindFirstFile(pattern.c_str(), &data);
if (find == INVALID_HANDLE_VALUE) {
FindClose(find);
LOG((CLOG_DEBUG "plugins dir is empty: %s", pattern.c_str()));
return;
}
do {
filenames.push_back(data.cFileName);
} while (FindNextFile(find, &data));
FindClose(find);
}
String
ArchPluginWindows::getPluginsDir()
{
return ARCH->getPluginDirectory();
}
String
ArchPluginWindows::getCurrentVersion(const String& name, void* handle)
{
char* version = (char*)invoke(name.c_str(), "version", NULL, handle);
if (version == NULL) {
return "";
}
return version;
}
void
sendEvent(const char* eventName, void* data)
{
LOG((CLOG_DEBUG5 "plugin sending event"));
Event::Type type = g_events->getRegisteredType(eventName);
g_events->addEvent(Event(type, g_eventTarget, data));
}
void
log(const char* text)
{
LOG((CLOG_DEBUG "plugin: %s", text));
}

View File

@ -1,57 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2012 Nick Bolton
*
* 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/>.
*/
#pragma once
#include "arch/IArchPlugin.h"
#include <vector>
#define ARCH_PLUGIN ArchPluginWindows
class Screen;
class IEventQueue;
//! Windows implementation of IArchPlugin
class ArchPluginWindows : public IArchPlugin {
public:
ArchPluginWindows();
virtual ~ArchPluginWindows();
// IArchPlugin overrides
void load();
void unload();
void init(void* log, void* arch);
void initEvent(void* eventTarget, IEventQueue* events);
bool exists(const char* name);
void* invoke(const char* pluginName,
const char* functionName,
void** args,
void* library = NULL);
private:
void getFilenames(const String& pattern, std::vector<String>& filenames);
String getPluginsDir();
String getCurrentVersion(const String& name, void* handle);
private:
PluginTable m_pluginTable;
};
void sendEvent(const char* text, void* data);
void log(const char* text);

View File

@ -245,7 +245,7 @@ ArchTaskBarWindows::modifyIconNoLock(
receiver->lock(); receiver->lock();
// get icon data // get icon data
HICON icon = reinterpret_cast<HICON>( HICON icon = static_cast<HICON>(
const_cast<IArchTaskBarReceiver::Icon>(receiver->getIcon())); const_cast<IArchTaskBarReceiver::Icon>(receiver->getIcon()));
// get tool tip // get tool tip
@ -415,16 +415,15 @@ ArchTaskBarWindows::staticWndProc(HWND hwnd, UINT msg,
if (msg == WM_NCCREATE) { if (msg == WM_NCCREATE) {
CREATESTRUCT* createInfo; CREATESTRUCT* createInfo;
createInfo = reinterpret_cast<CREATESTRUCT*>(lParam); createInfo = reinterpret_cast<CREATESTRUCT*>(lParam);
self = reinterpret_cast<ArchTaskBarWindows*>( self = static_cast<ArchTaskBarWindows*>(
createInfo->lpCreateParams); createInfo->lpCreateParams);
SetWindowLongPtr(hwnd, 0, reinterpret_cast<LONG_PTR>(self)); SetWindowLongPtr(hwnd, 0, reinterpret_cast<LONG_PTR>(createInfo->lpCreateParams));
} }
else { else {
// get the extra window data and forward the call // get the extra window data and forward the call
LONG_PTR data = GetWindowLongPtr(hwnd, 0); LONG_PTR data = GetWindowLongPtr(hwnd, 0);
if (data != 0) { if (data != 0) {
self = reinterpret_cast<ArchTaskBarWindows*>( self = static_cast<ArchTaskBarWindows*>(reinterpret_cast<void*>(data));
reinterpret_cast<void*>(data));
} }
} }
@ -444,6 +443,7 @@ ArchTaskBarWindows::threadMainLoop()
m_taskBarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); m_taskBarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
// register a window class // register a window class
LPCTSTR className = TEXT("SynergyTaskBar");
WNDCLASSEX classInfo; WNDCLASSEX classInfo;
classInfo.cbSize = sizeof(classInfo); classInfo.cbSize = sizeof(classInfo);
classInfo.style = CS_NOCLOSE; classInfo.style = CS_NOCLOSE;
@ -455,20 +455,20 @@ ArchTaskBarWindows::threadMainLoop()
classInfo.hCursor = NULL; classInfo.hCursor = NULL;
classInfo.hbrBackground = NULL; classInfo.hbrBackground = NULL;
classInfo.lpszMenuName = NULL; classInfo.lpszMenuName = NULL;
classInfo.lpszClassName = TEXT("SynergyTaskBar"); classInfo.lpszClassName = className;
classInfo.hIconSm = NULL; classInfo.hIconSm = NULL;
ATOM windowClass = RegisterClassEx(&classInfo); ATOM windowClass = RegisterClassEx(&classInfo);
// create window // create window
m_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW, m_hwnd = CreateWindowEx(WS_EX_TOOLWINDOW,
reinterpret_cast<LPCTSTR>(windowClass), className,
TEXT("Synergy Task Bar"), TEXT("Synergy Task Bar"),
WS_POPUP, WS_POPUP,
0, 0, 1, 1, 0, 0, 1, 1,
NULL, NULL,
NULL, NULL,
instanceWin32(), instanceWin32(),
reinterpret_cast<void*>(this)); static_cast<void*>(this));
// signal ready // signal ready
ARCH->lockMutex(m_mutex); ARCH->lockMutex(m_mutex);
@ -478,7 +478,7 @@ ArchTaskBarWindows::threadMainLoop()
// handle failure // handle failure
if (m_hwnd == NULL) { if (m_hwnd == NULL) {
UnregisterClass(reinterpret_cast<LPCTSTR>(windowClass), instanceWin32()); UnregisterClass(className, instanceWin32());
return; return;
} }
@ -494,13 +494,13 @@ ArchTaskBarWindows::threadMainLoop()
// clean up // clean up
removeAllIcons(); removeAllIcons();
DestroyWindow(m_hwnd); DestroyWindow(m_hwnd);
UnregisterClass(reinterpret_cast<LPCTSTR>(windowClass), instanceWin32()); UnregisterClass(className, instanceWin32());
} }
void* void*
ArchTaskBarWindows::threadEntry(void* self) ArchTaskBarWindows::threadEntry(void* self)
{ {
reinterpret_cast<ArchTaskBarWindows*>(self)->threadMainLoop(); static_cast<ArchTaskBarWindows*>(self)->threadMainLoop();
return NULL; return NULL;
} }

View File

@ -65,7 +65,7 @@ ArchTimeWindows::~ArchTimeWindows()
{ {
s_freq = 0.0; s_freq = 0.0;
if (s_mmInstance == NULL) { if (s_mmInstance == NULL) {
FreeLibrary(reinterpret_cast<HMODULE>(s_mmInstance)); FreeLibrary(static_cast<HMODULE>(s_mmInstance));
s_tgt = NULL; s_tgt = NULL;
s_mmInstance = NULL; s_mmInstance = NULL;
} }

View File

@ -54,7 +54,7 @@ static
void void
interrupt(Arch::ESignal, void* data) interrupt(Arch::ESignal, void* data)
{ {
EventQueue* events = reinterpret_cast<EventQueue*>(data); EventQueue* events = static_cast<EventQueue*>(data);
events->addEvent(Event(Event::kQuit)); events->addEvent(Event(Event::kQuit));
} }

View File

@ -18,7 +18,6 @@
#include "client/Client.h" #include "client/Client.h"
#include "../plugin/ns/SecureSocket.h"
#include "client/ServerProxy.h" #include "client/ServerProxy.h"
#include "synergy/Screen.h" #include "synergy/Screen.h"
#include "synergy/FileChunk.h" #include "synergy/FileChunk.h"
@ -33,12 +32,12 @@
#include "net/TCPSocket.h" #include "net/TCPSocket.h"
#include "net/IDataSocket.h" #include "net/IDataSocket.h"
#include "net/ISocketFactory.h" #include "net/ISocketFactory.h"
#include "net/SecureSocket.h"
#include "arch/Arch.h" #include "arch/Arch.h"
#include "base/Log.h" #include "base/Log.h"
#include "base/IEventQueue.h" #include "base/IEventQueue.h"
#include "base/TMethodEventJob.h" #include "base/TMethodEventJob.h"
#include "base/TMethodJob.h" #include "base/TMethodJob.h"
#include "common/PluginVersion.h"
#include "common/stdexcept.h" #include "common/stdexcept.h"
#include <cstring> #include <cstring>
@ -72,7 +71,7 @@ Client::Client(
m_sendFileThread(NULL), m_sendFileThread(NULL),
m_writeToDropDirThread(NULL), m_writeToDropDirThread(NULL),
m_socket(NULL), m_socket(NULL),
m_useSecureNetwork(false), m_useSecureNetwork(args.m_enableCrypto),
m_args(args), m_args(args),
m_enableClipboard(true) m_enableClipboard(true)
{ {
@ -99,13 +98,6 @@ Client::Client(
new TMethodEventJob<Client>(this, new TMethodEventJob<Client>(this,
&Client::handleFileRecieveCompleted)); &Client::handleFileRecieveCompleted));
} }
if (m_args.m_enableCrypto) {
m_useSecureNetwork = ARCH->plugin().exists(s_pluginNames[kSecureSocket]);
if (m_useSecureNetwork == false) {
LOG((CLOG_NOTE "crypto disabled because of ns plugin not available"));
}
}
} }
Client::~Client() Client::~Client()
@ -160,8 +152,7 @@ Client::connect()
// filter socket messages, including a packetizing filter // filter socket messages, including a packetizing filter
m_stream = socket; m_stream = socket;
bool adopt = !m_useSecureNetwork; m_stream = new PacketStreamFilter(m_events, m_stream, true);
m_stream = new PacketStreamFilter(m_events, m_stream, adopt);
// connect // connect
LOG((CLOG_DEBUG1 "connecting to server")); LOG((CLOG_DEBUG1 "connecting to server"));
@ -439,7 +430,7 @@ Client::sendConnectionFailedEvent(const char* msg)
void void
Client::sendFileChunk(const void* data) Client::sendFileChunk(const void* data)
{ {
FileChunk* chunk = reinterpret_cast<FileChunk*>(const_cast<void*>(data)); FileChunk* chunk = static_cast<FileChunk*>(const_cast<void*>(data));
LOG((CLOG_DEBUG1 "send file chunk")); LOG((CLOG_DEBUG1 "send file chunk"));
assert(m_server != NULL); assert(m_server != NULL);
@ -593,13 +584,6 @@ Client::cleanupStream()
{ {
delete m_stream; delete m_stream;
m_stream = NULL; m_stream = NULL;
// PacketStreamFilter doen't adopt secure socket, because
// we need to tell the dynamic lib that allocated this object
// to do the deletion.
if (m_useSecureNetwork) {
ARCH->plugin().invoke(s_pluginNames[kSecureSocket], "deleteSocket", NULL);
}
} }
void void
@ -621,7 +605,7 @@ void
Client::handleConnectionFailed(const Event& event, void*) Client::handleConnectionFailed(const Event& event, void*)
{ {
IDataSocket::ConnectionFailedInfo* info = IDataSocket::ConnectionFailedInfo* info =
reinterpret_cast<IDataSocket::ConnectionFailedInfo*>(event.getData()); static_cast<IDataSocket::ConnectionFailedInfo*>(event.getData());
cleanupTimer(); cleanupTimer();
cleanupConnecting(); cleanupConnecting();
@ -677,7 +661,7 @@ Client::handleClipboardGrabbed(const Event& event, void*)
} }
const IScreen::ClipboardInfo* info = const IScreen::ClipboardInfo* info =
reinterpret_cast<const IScreen::ClipboardInfo*>(event.getData()); static_cast<const IScreen::ClipboardInfo*>(event.getData());
// grab ownership // grab ownership
m_server->onGrabClipboard(info->m_id); m_server->onGrabClipboard(info->m_id);
@ -826,14 +810,14 @@ Client::sendFileToServer(const char* filename)
m_sendFileThread = new Thread( m_sendFileThread = new Thread(
new TMethodJob<Client>( new TMethodJob<Client>(
this, &Client::sendFileThread, this, &Client::sendFileThread,
reinterpret_cast<void*>(const_cast<char*>(filename)))); static_cast<void*>(const_cast<char*>(filename))));
} }
void void
Client::sendFileThread(void* filename) Client::sendFileThread(void* filename)
{ {
try { try {
char* name = reinterpret_cast<char*>(filename); char* name = static_cast<char*>(filename);
StreamChunker::sendFile(name, m_events, this); StreamChunker::sendFile(name, m_events, this);
} }
catch (std::runtime_error error) { catch (std::runtime_error error) {

View File

@ -1,36 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 "PluginVersion.h"
#include <string.h>
static const char kUnknownVersion[] = "unknown";
const char* s_pluginNames[] = { "ns" };
static const char* s_pluginVersions[] = { "1.3" };
const char* getExpectedPluginVersion(const char* name)
{
for (int i = 0; i < kPluginCount; i++) {
if (strcmp(name, s_pluginNames[i]) == 0) {
return s_pluginVersions[i];
break;
}
}
return kUnknownVersion;
}

View File

@ -1,31 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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/>.
*/
#pragma once
enum EPluginType {
kSecureSocket,
kPluginCount
};
extern const char* s_pluginNames[];
//! Get expected plugin version
/*!
Returns the plugin version expected by the plugin loader.
*/
const char* getExpectedPluginVersion(const char* name);

View File

@ -59,7 +59,7 @@ StreamBuffer::peek(UInt32 n)
scan = m_chunks.erase(scan); scan = m_chunks.erase(scan);
} }
return reinterpret_cast<const void*>(&(head->begin()[m_headUsed])); return static_cast<const void*>(&(head->begin()[m_headUsed]));
} }
void void
@ -104,7 +104,7 @@ StreamBuffer::write(const void* vdata, UInt32 n)
m_size += n; m_size += n;
// cast data to bytes // cast data to bytes
const UInt8* data = reinterpret_cast<const UInt8*>(vdata); const UInt8* data = static_cast<const UInt8*>(vdata);
// point to last chunk if it has space, otherwise append an empty chunk // point to last chunk if it has space, otherwise append an empty chunk
ChunkList::iterator scan = m_chunks.end(); ChunkList::iterator scan = m_chunks.end();

View File

@ -83,7 +83,7 @@ StreamFilter::shutdownOutput()
void* void*
StreamFilter::getEventTarget() const StreamFilter::getEventTarget() const
{ {
return const_cast<void*>(reinterpret_cast<const void*>(this)); return const_cast<void*>(static_cast<const void*>(this));
} }
bool bool

View File

@ -147,7 +147,7 @@ Thread::threadFunc(void* vjob)
} }
// get job // get job
IJob* job = reinterpret_cast<IJob*>(vjob); IJob* job = static_cast<IJob*>(vjob);
// run job // run job
void* result = NULL; void* result = NULL;

View File

@ -23,6 +23,7 @@ endif()
include_directories( include_directories(
../ ../
${OPENSSL_INCLUDE}
) )
if (UNIX) if (UNIX)
@ -33,6 +34,23 @@ endif()
add_library(net STATIC ${sources}) add_library(net STATIC ${sources})
if (UNIX) if (WIN32)
target_link_libraries(net mt io) add_custom_command(
TARGET net
POST_BUILD
COMMAND xcopy /Y /Q
..\\..\\..\\..\\ext\\${OPENSSL_PLAT_DIR}\\out32dll\\libeay32.*
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}
)
add_custom_command(
TARGET net
POST_BUILD
COMMAND xcopy /Y /Q
..\\..\\..\\..\\ext\\${OPENSSL_PLAT_DIR}\\out32dll\\ssleay32.*
..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}
)
endif()
if (UNIX)
target_link_libraries(net mt io ${OPENSSL_LIBS})
endif() endif()

View File

@ -46,6 +46,7 @@ SocketMultiplexer::SocketMultiplexer() :
// this pointer just has to be unique and not NULL. it will // this pointer just has to be unique and not NULL. it will
// never be dereferenced. it's used to identify cursor nodes // never be dereferenced. it's used to identify cursor nodes
// in the jobs list. // in the jobs list.
// TODO: Remove this evilness
m_cursorMark = reinterpret_cast<ISocketMultiplexerJob*>(this); m_cursorMark = reinterpret_cast<ISocketMultiplexerJob*>(this);
// start thread // start thread

View File

@ -102,7 +102,7 @@ TCPListenSocket::close()
void* void*
TCPListenSocket::getEventTarget() const TCPListenSocket::getEventTarget() const
{ {
return const_cast<void*>(reinterpret_cast<const void*>(this)); return const_cast<void*>(static_cast<const void*>(this));
} }
IDataSocket* IDataSocket*

View File

@ -125,7 +125,7 @@ TCPSocket::close()
void* void*
TCPSocket::getEventTarget() const TCPSocket::getEventTarget() const
{ {
return const_cast<void*>(reinterpret_cast<const void*>(this)); return const_cast<void*>(static_cast<const void*>(this));
} }
UInt32 UInt32

View File

@ -17,11 +17,11 @@
*/ */
#include "net/TCPSocketFactory.h" #include "net/TCPSocketFactory.h"
#include "net/TCPSocket.h" #include "net/TCPSocket.h"
#include "net/TCPListenSocket.h" #include "net/TCPListenSocket.h"
#include "net/SecureSocket.h"
#include "net/SecureListenSocket.h"
#include "arch/Arch.h" #include "arch/Arch.h"
#include "common/PluginVersion.h"
#include "base/Log.h" #include "base/Log.h"
// //
@ -43,20 +43,14 @@ TCPSocketFactory::~TCPSocketFactory()
IDataSocket* IDataSocket*
TCPSocketFactory::create(bool secure) const TCPSocketFactory::create(bool secure) const
{ {
IDataSocket* socket = NULL;
if (secure) { if (secure) {
void* args[2] = { SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer);
m_events, secureSocket->initSsl (false);
m_socketMultiplexer return secureSocket;
};
socket = static_cast<IDataSocket*>(
ARCH->plugin().invoke(s_pluginNames[kSecureSocket], "getSocket", args));
} }
else { else {
socket = new TCPSocket(m_events, m_socketMultiplexer); return new TCPSocket(m_events, m_socketMultiplexer);
} }
return socket;
} }
IListenSocket* IListenSocket*
@ -64,12 +58,7 @@ TCPSocketFactory::createListen(bool secure) const
{ {
IListenSocket* socket = NULL; IListenSocket* socket = NULL;
if (secure) { if (secure) {
void* args[2] = { socket = new SecureListenSocket(m_events, m_socketMultiplexer);
m_events,
m_socketMultiplexer
};
socket = static_cast<IListenSocket*>(
ARCH->plugin().invoke(s_pluginNames[kSecureSocket], "getListenSocket", args));
} }
else { else {
socket = new TCPListenSocket(m_events, m_socketMultiplexer); socket = new TCPListenSocket(m_events, m_socketMultiplexer);

View File

@ -71,21 +71,21 @@ String
MSWindowsClipboardBitmapConverter::toIClipboard(HANDLE data) const MSWindowsClipboardBitmapConverter::toIClipboard(HANDLE data) const
{ {
// get datator // get datator
const char* src = (const char*)GlobalLock(data); LPVOID src = GlobalLock(data);
if (src == NULL) { if (src == NULL) {
return String(); return String();
} }
UInt32 srcSize = (UInt32)GlobalSize(data); UInt32 srcSize = (UInt32)GlobalSize(data);
// check image type // check image type
const BITMAPINFO* bitmap = reinterpret_cast<const BITMAPINFO*>(src); const BITMAPINFO* bitmap = static_cast<const BITMAPINFO*>(src);
LOG((CLOG_INFO "bitmap: %dx%d %d", bitmap->bmiHeader.biWidth, bitmap->bmiHeader.biHeight, (int)bitmap->bmiHeader.biBitCount)); LOG((CLOG_INFO "bitmap: %dx%d %d", bitmap->bmiHeader.biWidth, bitmap->bmiHeader.biHeight, (int)bitmap->bmiHeader.biBitCount));
if (bitmap->bmiHeader.biPlanes == 1 && if (bitmap->bmiHeader.biPlanes == 1 &&
(bitmap->bmiHeader.biBitCount == 24 || (bitmap->bmiHeader.biBitCount == 24 ||
bitmap->bmiHeader.biBitCount == 32) && bitmap->bmiHeader.biBitCount == 32) &&
bitmap->bmiHeader.biCompression == BI_RGB) { bitmap->bmiHeader.biCompression == BI_RGB) {
// already in canonical form // already in canonical form
String image(src, srcSize); String image(static_cast<char const*>(src), srcSize);
GlobalUnlock(data); GlobalUnlock(data);
return image; return image;
} }

View File

@ -656,7 +656,7 @@ MSWindowsDesks::deskThread(void* vdesk)
MSG msg; MSG msg;
// use given desktop for this thread // use given desktop for this thread
Desk* desk = reinterpret_cast<Desk*>(vdesk); Desk* desk = static_cast<Desk*>(vdesk);
desk->m_threadID = GetCurrentThreadId(); desk->m_threadID = GetCurrentThreadId();
desk->m_window = NULL; desk->m_window = NULL;
desk->m_foregroundWindow = NULL; desk->m_foregroundWindow = NULL;

View File

@ -105,6 +105,7 @@ MSWindowsScreen::MSWindowsScreen(
m_xCenter(0), m_yCenter(0), m_xCenter(0), m_yCenter(0),
m_multimon(false), m_multimon(false),
m_xCursor(0), m_yCursor(0), m_xCursor(0), m_yCursor(0),
m_xFractionalMove(0.0f), m_yFractionalMove(0.0f),
m_sequenceNumber(0), m_sequenceNumber(0),
m_mark(0), m_mark(0),
m_markReceived(0), m_markReceived(0),
@ -575,6 +576,21 @@ void MSWindowsScreen::saveMousePosition(SInt32 x, SInt32 y) {
LOG((CLOG_DEBUG5 "saved mouse position for next delta: %+d,%+d", x,y)); LOG((CLOG_DEBUG5 "saved mouse position for next delta: %+d,%+d", x,y));
} }
void MSWindowsScreen::accumulateFractionalMove(float x, float y, SInt32& intX, SInt32& intY)
{
// Accumulate together the move into the running total
m_xFractionalMove += x;
m_yFractionalMove += y;
// Return the integer part
intX = (SInt32)m_xFractionalMove;
intY = (SInt32)m_yFractionalMove;
// And keep only the fractional part
m_xFractionalMove -= intX;
m_yFractionalMove -= intY;
}
UInt32 UInt32
MSWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask) MSWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask)
{ {
@ -941,7 +957,7 @@ MSWindowsScreen::sendClipboardEvent(Event::Type type, ClipboardID id)
void void
MSWindowsScreen::handleSystemEvent(const Event& event, void*) MSWindowsScreen::handleSystemEvent(const Event& event, void*)
{ {
MSG* msg = reinterpret_cast<MSG*>(event.getData()); MSG* msg = static_cast<MSG*>(event.getData());
assert(msg != NULL); assert(msg != NULL);
if (ArchMiscWindows::processDialog(msg)) { if (ArchMiscWindows::processDialog(msg)) {
@ -1355,16 +1371,18 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
{ {
SInt32 originalMX = mx; SInt32 originalMX = mx;
SInt32 originalMY = my; SInt32 originalMY = my;
float scaledMX = (float)mx;
float scaledMY = (float)my;
if (DpiHelper::s_dpiScaled) { if (DpiHelper::s_dpiScaled) {
mx = (SInt32)(mx / DpiHelper::getDpi()); scaledMX /= DpiHelper::getDpi();
my = (SInt32)(my / DpiHelper::getDpi()); scaledMY /= DpiHelper::getDpi();
} }
// compute motion delta (relative to the last known // compute motion delta (relative to the last known
// mouse position) // mouse position)
SInt32 x = mx - m_xCursor; float x = scaledMX - m_xCursor;
SInt32 y = my - m_yCursor; float y = scaledMY - m_yCursor;
LOG((CLOG_DEBUG3 LOG((CLOG_DEBUG3
"mouse move - motion delta: %+d=(%+d - %+d),%+d=(%+d - %+d)", "mouse move - motion delta: %+d=(%+d - %+d),%+d=(%+d - %+d)",
@ -1377,7 +1395,7 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
} }
// save position to compute delta of next motion // save position to compute delta of next motion
saveMousePosition(mx, my); saveMousePosition((SInt32)scaledMX, (SInt32)scaledMY);
if (m_isOnScreen) { if (m_isOnScreen) {
@ -1415,7 +1433,9 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
} }
else { else {
// send motion // send motion
sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(x, y)); SInt32 ix, iy;
accumulateFractionalMove(x, y, ix, iy);
sendEvent(m_events->forIPrimaryScreen().motionOnSecondary(), MotionInfo::alloc(ix, iy));
} }
} }

View File

@ -216,6 +216,10 @@ private: // HACK
// save last position of mouse to compute next delta movement // save last position of mouse to compute next delta movement
void saveMousePosition(SInt32 x, SInt32 y); void saveMousePosition(SInt32 x, SInt32 y);
// accumulates together a series of fractional pixel moves, each time
// taking away and returning just the integer part of the running total.
void accumulateFractionalMove(float x, float y, SInt32& intX, SInt32& intY);
// check if it is a modifier key repeating message // check if it is a modifier key repeating message
bool isModifierRepeat(KeyModifierMask oldState, bool isModifierRepeat(KeyModifierMask oldState,
KeyModifierMask state, WPARAM wParam) const; KeyModifierMask state, WPARAM wParam) const;
@ -266,6 +270,9 @@ private:
// last mouse position // last mouse position
SInt32 m_xCursor, m_yCursor; SInt32 m_xCursor, m_yCursor;
// accumulated fractional pixel moves
float m_xFractionalMove, m_yFractionalMove;
// last clipboard // last clipboard
UInt32 m_sequenceNumber; UInt32 m_sequenceNumber;

View File

@ -975,7 +975,7 @@ OSXScreen::sendClipboardEvent(Event::Type type, ClipboardID id) const
void void
OSXScreen::handleSystemEvent(const Event& event, void*) OSXScreen::handleSystemEvent(const Event& event, void*)
{ {
EventRef* carbonEvent = reinterpret_cast<EventRef*>(event.getData()); EventRef* carbonEvent = static_cast<EventRef*>(event.getData());
assert(carbonEvent != NULL); assert(carbonEvent != NULL);
UInt32 eventClass = GetEventClass(*carbonEvent); UInt32 eventClass = GetEventClass(*carbonEvent);

View File

@ -31,7 +31,7 @@ OSXUchrKeyResource::OSXUchrKeyResource(const void* resource,
m_sri(NULL), m_sri(NULL),
m_st(NULL) m_st(NULL)
{ {
m_resource = reinterpret_cast<const UCKeyboardLayout*>(resource); m_resource = static_cast<const UCKeyboardLayout*>(resource);
if (m_resource == NULL) { if (m_resource == NULL) {
return; return;
} }
@ -56,7 +56,7 @@ OSXUchrKeyResource::OSXUchrKeyResource(const void* resource,
} }
// get tables for keyboard type // get tables for keyboard type
const UInt8* base = reinterpret_cast<const UInt8*>(m_resource); const UInt8* const base = reinterpret_cast<const UInt8*>(m_resource);
m_m = reinterpret_cast<const UCKeyModifiersToTableNum*>(base + m_m = reinterpret_cast<const UCKeyModifiersToTableNum*>(base +
th->keyModifiersToTableNumOffset); th->keyModifiersToTableNumOffset);
m_cti = reinterpret_cast<const UCKeyToCharTableIndex*>(base + m_cti = reinterpret_cast<const UCKeyToCharTableIndex*>(base +
@ -134,7 +134,7 @@ OSXUchrKeyResource::getKey(UInt32 table, UInt32 button) const
assert(table < getNumTables()); assert(table < getNumTables());
assert(button < getNumButtons()); assert(button < getNumButtons());
const UInt8* base = reinterpret_cast<const UInt8*>(m_resource); const UInt8* const base = reinterpret_cast<const UInt8*>(m_resource);
const UCKeyOutput* cPtr = reinterpret_cast<const UCKeyOutput*>(base + const UCKeyOutput* cPtr = reinterpret_cast<const UCKeyOutput*>(base +
m_cti->keyToCharTableOffsets[table]); m_cti->keyToCharTableOffsets[table]);
@ -211,7 +211,7 @@ bool
OSXUchrKeyResource::getKeyRecord( OSXUchrKeyResource::getKeyRecord(
KeySequence& keys, UInt16 index, UInt16& state) const KeySequence& keys, UInt16 index, UInt16& state) const
{ {
const UInt8* base = reinterpret_cast<const UInt8*>(m_resource); const UInt8* const base = reinterpret_cast<const UInt8*>(m_resource);
const UCKeyStateRecord* sr = const UCKeyStateRecord* sr =
reinterpret_cast<const UCKeyStateRecord*>(base + reinterpret_cast<const UCKeyStateRecord*>(base +
m_sri->keyStateRecordOffsets[index]); m_sri->keyStateRecordOffsets[index]);

View File

@ -31,6 +31,7 @@
#include "common/stdvector.h" #include "common/stdvector.h"
#include <cstdio> #include <cstdio>
#include <cstring>
#include <X11/Xatom.h> #include <X11/Xatom.h>
// //
@ -516,7 +517,7 @@ XWindowsClipboard::icccmFillCache()
} }
XWindowsUtil::convertAtomProperty(data); XWindowsUtil::convertAtomProperty(data);
const Atom* targets = reinterpret_cast<const Atom*>(data.data()); const Atom* targets = reinterpret_cast<const Atom*>(data.data()); // TODO: Safe?
const UInt32 numTargets = data.size() / sizeof(Atom); const UInt32 numTargets = data.size() / sizeof(Atom);
LOG((CLOG_DEBUG " available targets: %s", XWindowsUtil::atomsToString(m_display, targets, numTargets).c_str())); LOG((CLOG_DEBUG " available targets: %s", XWindowsUtil::atomsToString(m_display, targets, numTargets).c_str()));
@ -671,11 +672,11 @@ XWindowsClipboard::motifOwnsClipboard() const
} }
// check the owner window against the current clipboard owner // check the owner window against the current clipboard owner
const MotifClipHeader* header = if (data.size() >= sizeof(MotifClipHeader)) {
reinterpret_cast<const MotifClipHeader*>(data.data()); MotifClipHeader header;
if (data.size() >= sizeof(MotifClipHeader) && std::memcpy (&header, data.data(), sizeof(header));
header->m_id == kMotifClipHeader) { if ((header.m_id == kMotifClipHeader) &&
if (static_cast<Window>(header->m_selectionOwner) == owner) { (static_cast<Window>(header.m_selectionOwner) == owner)) {
return true; return true;
} }
} }
@ -699,18 +700,18 @@ XWindowsClipboard::motifFillCache()
return; return;
} }
// check that the header is okay MotifClipHeader header;
const MotifClipHeader* header = if (data.size() < sizeof(header)) { // check that the header is okay
reinterpret_cast<const MotifClipHeader*>(data.data()); return;
if (data.size() < sizeof(MotifClipHeader) || }
header->m_id != kMotifClipHeader || std::memcpy (&header, data.data(), sizeof(header));
header->m_numItems < 1) { if (header.m_id != kMotifClipHeader || header.m_numItems < 1) {
return; return;
} }
// get the Motif item property from the root window // get the Motif item property from the root window
char name[18 + 20]; char name[18 + 20];
sprintf(name, "_MOTIF_CLIP_ITEM_%d", header->m_item); sprintf(name, "_MOTIF_CLIP_ITEM_%d", header.m_item);
Atom atomItem = XInternAtom(m_display, name, False); Atom atomItem = XInternAtom(m_display, name, False);
data = ""; data = "";
if (!XWindowsUtil::getWindowProperty(m_display, root, if (!XWindowsUtil::getWindowProperty(m_display, root,
@ -719,19 +720,20 @@ XWindowsClipboard::motifFillCache()
return; return;
} }
// check that the item is okay MotifClipItem item;
const MotifClipItem* item = if (data.size() < sizeof(item)) { // check that the item is okay
reinterpret_cast<const MotifClipItem*>(data.data()); return;
if (data.size() < sizeof(MotifClipItem) || }
item->m_id != kMotifClipItem || std::memcpy (&item, data.data(), sizeof(item));
item->m_numFormats - item->m_numDeletedFormats < 1) { if (item.m_id != kMotifClipItem ||
item.m_numFormats - item.m_numDeletedFormats < 1) {
return; return;
} }
// format list is after static item structure elements // format list is after static item structure elements
const SInt32 numFormats = item->m_numFormats - item->m_numDeletedFormats; const SInt32 numFormats = item.m_numFormats - item.m_numDeletedFormats;
const SInt32* formats = reinterpret_cast<const SInt32*>(item->m_size + const SInt32* formats = reinterpret_cast<const SInt32*>(item.m_size +
reinterpret_cast<const char*>(data.data())); static_cast<const char*>(data.data()));
// get the available formats // get the available formats
typedef std::map<Atom, String> MotifFormatMap; typedef std::map<Atom, String> MotifFormatMap;
@ -748,18 +750,20 @@ XWindowsClipboard::motifFillCache()
} }
// check that the format is okay // check that the format is okay
const MotifClipFormat* motifFormat = MotifClipFormat motifFormat;
reinterpret_cast<const MotifClipFormat*>(data.data()); if (data.size() < sizeof(motifFormat)) {
if (data.size() < sizeof(MotifClipFormat) || continue;
motifFormat->m_id != kMotifClipFormat || }
motifFormat->m_length < 0 || std::memcpy (&motifFormat, data.data(), sizeof(motifFormat));
motifFormat->m_type == None || if (motifFormat.m_id != kMotifClipFormat ||
motifFormat->m_deleted != 0) { motifFormat.m_length < 0 ||
motifFormat.m_type == None ||
motifFormat.m_deleted != 0) {
continue; continue;
} }
// save it // save it
motifFormats.insert(std::make_pair(motifFormat->m_type, data)); motifFormats.insert(std::make_pair(motifFormat.m_type, data));
} }
//const UInt32 numMotifFormats = motifFormats.size(); //const UInt32 numMotifFormats = motifFormats.size();
@ -782,15 +786,14 @@ XWindowsClipboard::motifFillCache()
} }
// get format // get format
const MotifClipFormat* motifFormat = MotifClipFormat motifFormat;
reinterpret_cast<const MotifClipFormat*>( std::memcpy (&motifFormat, index2->second.data(), sizeof(motifFormat));
index2->second.data()); const Atom target = motifFormat.m_type;
const Atom target = motifFormat->m_type;
// get the data (finally) // get the data (finally)
Atom actualTarget; Atom actualTarget;
String targetData; String targetData;
if (!motifGetSelection(motifFormat, &actualTarget, &targetData)) { if (!motifGetSelection(&motifFormat, &actualTarget, &targetData)) {
LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str())); LOG((CLOG_DEBUG1 " no data for target %s", XWindowsUtil::atomToString(m_display, target).c_str()));
continue; continue;
} }

View File

@ -785,7 +785,7 @@ void
XWindowsKeyState::remapKeyModifiers(KeyID id, SInt32 group, XWindowsKeyState::remapKeyModifiers(KeyID id, SInt32 group,
synergy::KeyMap::KeyItem& item, void* vself) synergy::KeyMap::KeyItem& item, void* vself)
{ {
XWindowsKeyState* self = reinterpret_cast<XWindowsKeyState*>(vself); XWindowsKeyState* self = static_cast<XWindowsKeyState*>(vself);
item.m_required = item.m_required =
self->mapModifiersFromX(XkbBuildCoreState(item.m_required, group)); self->mapModifiersFromX(XkbBuildCoreState(item.m_required, group));
item.m_sensitive = item.m_sensitive =

View File

@ -1179,7 +1179,7 @@ XWindowsScreen::findKeyEvent(Display*, XEvent* xevent, XPointer arg)
void void
XWindowsScreen::handleSystemEvent(const Event& event, void*) XWindowsScreen::handleSystemEvent(const Event& event, void*)
{ {
XEvent* xevent = reinterpret_cast<XEvent*>(event.getData()); XEvent* xevent = static_cast<XEvent*>(event.getData());
assert(xevent != NULL); assert(xevent != NULL);
// update key state // update key state
@ -1442,6 +1442,8 @@ XWindowsScreen::handleSystemEvent(const Event& event, void*)
XMoveWindow(m_display, m_window, m_x, m_y); XMoveWindow(m_display, m_window, m_x, m_y);
XResizeWindow(m_display, m_window, m_w, m_h); XResizeWindow(m_display, m_window, m_w, m_h);
} }
sendEvent(m_events->forIScreen().shapeChanged());
} }
} }
#endif #endif

View File

@ -1386,7 +1386,7 @@ XWindowsUtil::setWindowProperty(Display* display, Window window,
Atom type, SInt32 format) Atom type, SInt32 format)
{ {
const UInt32 length = 4 * XMaxRequestSize(display); const UInt32 length = 4 * XMaxRequestSize(display);
const unsigned char* data = reinterpret_cast<const unsigned char*>(vdata); const unsigned char* data = static_cast<const unsigned char*>(vdata);
UInt32 datumSize = static_cast<UInt32>(format / 8); UInt32 datumSize = static_cast<UInt32>(format / 8);
// format 32 on 64bit systems is 8 bytes not 4. // format 32 on 64bit systems is 8 bytes not 4.
if (format == 32) { if (format == 32) {
@ -1784,5 +1784,5 @@ void
XWindowsUtil::ErrorLock::saveHandler(Display*, XErrorEvent* e, void* flag) XWindowsUtil::ErrorLock::saveHandler(Display*, XErrorEvent* e, void* flag)
{ {
LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code)); LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code));
*reinterpret_cast<bool*>(flag) = true; *static_cast<bool*>(flag) = true;
} }

View File

@ -1,28 +0,0 @@
# synergy -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2012 Nick Bolton
#
# 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/>.
if (WIN32)
add_subdirectory(winmmjoy)
endif()
if (APPLE)
# 10.7 should be supported, but gives is a _NXArgv linker error
if (OSX_TARGET_MINOR GREATER 7)
add_subdirectory(ns)
endif()
else()
add_subdirectory(ns)
endif()

View File

@ -1,128 +0,0 @@
# synergy -- mouse and keyboard sharing utility
# Copyright (C) 2015-2016 Symless 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/>.
file(GLOB headers "*.h")
file(GLOB sources "*.cpp")
if (SYNERGY_ADD_HEADERS)
list(APPEND sources ${headers})
endif()
if (WIN32)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(OPENSSL_PLAT_DIR openssl-win64)
else()
set(OPENSSL_PLAT_DIR openssl-win32)
endif()
set(OPENSSL_INCLUDE ../../../../ext/${OPENSSL_PLAT_DIR}/inc32)
endif()
if (APPLE)
set(OPENSSL_PLAT_DIR openssl-osx)
set(OPENSSL_INCLUDE ../../../../ext/${OPENSSL_PLAT_DIR}/include)
endif()
include_directories(
../../../lib/
../../../..
${OPENSSL_INCLUDE}
)
add_library(ns SHARED ${sources})
if (WIN32)
set(OPENSSL_LIBS
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/out32dll/libeay32.lib
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/out32dll/ssleay32.lib
)
endif()
if (UNIX)
if (APPLE)
set(OPENSSL_LIBS
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/libssl.a
${CMAKE_SOURCE_DIR}/ext/${OPENSSL_PLAT_DIR}/libcrypto.a
)
else()
set(OPENSSL_LIBS ssl crypto)
endif()
endif()
target_link_libraries(ns
arch base client common io mt net ipc platform server synergy ${libs} ${OPENSSL_LIBS})
if (WIN32)
add_custom_command(
TARGET ns
POST_BUILD
COMMAND xcopy /Y /Q
..\\..\\..\\..\\..\\lib\\${CMAKE_CFG_INTDIR}\\ns.*
..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}\\plugins\\
)
add_custom_command(
TARGET ns
POST_BUILD
COMMAND xcopy /Y /Q
..\\..\\..\\..\\..\\ext\\${OPENSSL_PLAT_DIR}\\out32dll\\libeay32.*
..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}
)
add_custom_command(
TARGET ns
POST_BUILD
COMMAND xcopy /Y /Q
..\\..\\..\\..\\..\\ext\\${OPENSSL_PLAT_DIR}\\out32dll\\ssleay32.*
..\\..\\..\\..\\..\\bin\\${CMAKE_CFG_INTDIR}
)
endif()
if (UNIX)
if (APPLE)
add_custom_command(
TARGET ns
POST_BUILD
COMMAND
mkdir -p
${CMAKE_SOURCE_DIR}/bin/${CMAKE_CFG_INTDIR}/plugins
&&
cp
${CMAKE_SOURCE_DIR}/lib/${CMAKE_CFG_INTDIR}/libns.*
${CMAKE_SOURCE_DIR}/bin/${CMAKE_CFG_INTDIR}/plugins/
)
else()
if (CMAKE_BUILD_TYPE STREQUAL Debug)
add_custom_command(
TARGET ns
POST_BUILD
COMMAND mkdir -p
${CMAKE_SOURCE_DIR}/bin/debug/plugins
&&
cp
${CMAKE_SOURCE_DIR}/lib/debug/libns.*
${CMAKE_SOURCE_DIR}/bin/debug/plugins/
)
else()
add_custom_command(
TARGET ns
POST_BUILD
COMMAND mkdir -p
${CMAKE_SOURCE_DIR}/bin/plugins
&&
cp
${CMAKE_SOURCE_DIR}/lib/libns.*
${CMAKE_SOURCE_DIR}/bin/plugins/
)
endif()
endif()
endif()

View File

@ -1,127 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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 "ns.h"
#include "SecureSocket.h"
#include "SecureListenSocket.h"
#include "arch/Arch.h"
#include "common/PluginVersion.h"
#include "base/Log.h"
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
SecureSocket* g_secureSocket = NULL;
SecureListenSocket* g_secureListenSocket = NULL;
Arch* g_arch = NULL;
Log* g_log = NULL;
std::string
helperGetLibsUsed(void)
{
std::stringstream libs(ARCH->getLibsUsed());
std::string msg;
std::string pid;
std::getline(libs,pid);
while( std::getline(libs,msg) ) {
LOG(( CLOG_DEBUG "libs:%s",msg.c_str()));
}
return pid;
}
extern "C" {
void
init(void* log, void* arch)
{
if (g_log == NULL) {
g_log = new Log(reinterpret_cast<Log*>(log));
}
if (g_arch == NULL) {
Arch::setInstance(reinterpret_cast<Arch*>(arch));
}
LOG(( CLOG_DEBUG "library use: %s", helperGetLibsUsed().c_str()));
}
int
initEvent(void (*sendEvent)(const char*, void*))
{
return 0;
}
void*
invoke(const char* command, void** args)
{
IEventQueue* arg1 = NULL;
SocketMultiplexer* arg2 = NULL;
if (args != NULL) {
arg1 = reinterpret_cast<IEventQueue*>(args[0]);
arg2 = reinterpret_cast<SocketMultiplexer*>(args[1]);
}
if (strcmp(command, "getSocket") == 0) {
if (g_secureSocket != NULL) {
delete g_secureSocket;
}
g_secureSocket = new SecureSocket(arg1, arg2);
g_secureSocket->initSsl(false);
return g_secureSocket;
}
else if (strcmp(command, "getListenSocket") == 0) {
if (g_secureListenSocket != NULL) {
delete g_secureListenSocket;
}
g_secureListenSocket = new SecureListenSocket(arg1, arg2);
return g_secureListenSocket;
}
else if (strcmp(command, "deleteSocket") == 0) {
if (g_secureSocket != NULL) {
delete g_secureSocket;
g_secureSocket = NULL;
}
}
else if (strcmp(command, "deleteListenSocket") == 0) {
if (g_secureListenSocket != NULL) {
delete g_secureListenSocket;
g_secureListenSocket = NULL;
}
}
else if (strcmp(command, "version") == 0) {
return (void*)getExpectedPluginVersion(s_pluginNames[kSecureSocket]);
}
return NULL;
}
void
cleanup()
{
if (g_secureSocket != NULL) {
delete g_secureSocket;
}
if (g_secureListenSocket != NULL) {
delete g_secureListenSocket;
}
}
}

View File

@ -1,41 +0,0 @@
/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless 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/>.
*/
#pragma once
#if defined _WIN32
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#if defined(ns_EXPORTS)
#define NS_API __declspec(dllexport)
#else
#define NS_API __declspec(dllimport)
#endif
#else
#define NS_API
#endif
extern "C" {
NS_API void init(void* log, void* arch);
NS_API int initEvent(void (*sendEvent)(const char*, void*));
NS_API void* invoke(const char* command, void** args);
NS_API void cleanup();
}

Some files were not shown because too many files have changed in this diff Show More