aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorLibravatarUnit 193 <unit193@unit193.net>2021-11-10 00:54:35 -0500
committerLibravatarUnit 193 <unit193@unit193.net>2021-11-10 00:54:35 -0500
commit58fb7a0cee13d84170aac52f3f89d91888e1afe3 (patch)
tree1d6312ba15f9ece5a8031e5280dfb8b38be8dfa3 /src/lib
parent28db84b46139c9bb2bbcac8c6cc56e71d1e35629 (diff)
parentbeb08eb751fa8e1f72042f263316ab5e5ddb596d (diff)
Update upstream source from tag 'upstream/2.4.0+dfsg'
Update to upstream version '2.4.0+dfsg' with Debian dir 4b6668cc08c7b0e56b1e1f7b4e89ecdb316182a0
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/CMakeLists.txt4
-rw-r--r--src/lib/arch/Arch.cpp4
-rw-r--r--src/lib/arch/Arch.h4
-rw-r--r--src/lib/arch/ArchConsoleStd.cpp6
-rw-r--r--src/lib/arch/ArchConsoleStd.h4
-rw-r--r--src/lib/arch/ArchDaemonNone.cpp4
-rw-r--r--src/lib/arch/ArchDaemonNone.h4
-rw-r--r--src/lib/arch/CMakeLists.txt4
-rw-r--r--src/lib/arch/IArchConsole.h4
-rw-r--r--src/lib/arch/IArchDaemon.h8
-rw-r--r--src/lib/arch/IArchLog.h4
-rw-r--r--src/lib/arch/IArchMultithread.h30
-rw-r--r--src/lib/arch/IArchNetwork.h12
-rw-r--r--src/lib/arch/IArchSleep.h4
-rw-r--r--src/lib/arch/IArchString.cpp4
-rw-r--r--src/lib/arch/IArchString.h14
-rw-r--r--src/lib/arch/IArchSystem.h4
-rw-r--r--src/lib/arch/IArchTaskBar.h4
-rw-r--r--src/lib/arch/IArchTaskBarReceiver.h4
-rw-r--r--src/lib/arch/IArchTime.h4
-rw-r--r--src/lib/arch/XArch.h6
-rw-r--r--src/lib/arch/multibyte.h4
-rw-r--r--src/lib/arch/unix/ArchConsoleUnix.cpp4
-rw-r--r--src/lib/arch/unix/ArchConsoleUnix.h4
-rw-r--r--src/lib/arch/unix/ArchDaemonUnix.cpp20
-rw-r--r--src/lib/arch/unix/ArchDaemonUnix.h4
-rw-r--r--src/lib/arch/unix/ArchInternetUnix.cpp8
-rw-r--r--src/lib/arch/unix/ArchLogUnix.cpp4
-rw-r--r--src/lib/arch/unix/ArchLogUnix.h4
-rw-r--r--src/lib/arch/unix/ArchMultithreadPosix.cpp35
-rw-r--r--src/lib/arch/unix/ArchMultithreadPosix.h7
-rw-r--r--src/lib/arch/unix/ArchNetworkBSD.cpp4
-rw-r--r--src/lib/arch/unix/ArchNetworkBSD.h4
-rw-r--r--src/lib/arch/unix/ArchSleepUnix.cpp4
-rw-r--r--src/lib/arch/unix/ArchSleepUnix.h4
-rw-r--r--src/lib/arch/unix/ArchStringUnix.cpp5
-rw-r--r--src/lib/arch/unix/ArchStringUnix.h4
-rw-r--r--src/lib/arch/unix/ArchSystemUnix.cpp4
-rw-r--r--src/lib/arch/unix/ArchSystemUnix.h4
-rw-r--r--src/lib/arch/unix/ArchTaskBarXWindows.cpp4
-rw-r--r--src/lib/arch/unix/ArchTaskBarXWindows.h4
-rw-r--r--src/lib/arch/unix/ArchTimeUnix.cpp4
-rw-r--r--src/lib/arch/unix/ArchTimeUnix.h4
-rw-r--r--src/lib/arch/unix/XArchUnix.cpp4
-rw-r--r--src/lib/arch/unix/XArchUnix.h4
-rw-r--r--src/lib/arch/vsnprintf.h67
-rw-r--r--src/lib/arch/win32/ArchConsoleWindows.cpp4
-rw-r--r--src/lib/arch/win32/ArchConsoleWindows.h4
-rw-r--r--src/lib/arch/win32/ArchDaemonWindows.cpp10
-rw-r--r--src/lib/arch/win32/ArchDaemonWindows.h4
-rw-r--r--src/lib/arch/win32/ArchInternetWindows.cpp8
-rw-r--r--src/lib/arch/win32/ArchLogWindows.cpp4
-rw-r--r--src/lib/arch/win32/ArchLogWindows.h4
-rw-r--r--src/lib/arch/win32/ArchMiscWindows.cpp22
-rw-r--r--src/lib/arch/win32/ArchMiscWindows.h6
-rw-r--r--src/lib/arch/win32/ArchMultithreadWindows.cpp33
-rw-r--r--src/lib/arch/win32/ArchMultithreadWindows.h7
-rw-r--r--src/lib/arch/win32/ArchNetworkWinsock.cpp4
-rw-r--r--src/lib/arch/win32/ArchNetworkWinsock.h4
-rw-r--r--src/lib/arch/win32/ArchSleepWindows.cpp6
-rw-r--r--src/lib/arch/win32/ArchSleepWindows.h4
-rw-r--r--src/lib/arch/win32/ArchStringWindows.cpp9
-rw-r--r--src/lib/arch/win32/ArchStringWindows.h4
-rw-r--r--src/lib/arch/win32/ArchSystemWindows.cpp4
-rw-r--r--src/lib/arch/win32/ArchSystemWindows.h4
-rw-r--r--src/lib/arch/win32/ArchTaskBarWindows.cpp15
-rw-r--r--src/lib/arch/win32/ArchTaskBarWindows.h7
-rw-r--r--src/lib/arch/win32/ArchTimeWindows.cpp4
-rw-r--r--src/lib/arch/win32/ArchTimeWindows.h4
-rw-r--r--src/lib/arch/win32/XArchWindows.cpp80
-rw-r--r--src/lib/arch/win32/XArchWindows.h4
-rw-r--r--src/lib/barrier/App.cpp47
-rw-r--r--src/lib/barrier/App.h24
-rw-r--r--src/lib/barrier/AppUtil.cpp8
-rw-r--r--src/lib/barrier/AppUtil.h8
-rw-r--r--src/lib/barrier/ArgParser.cpp67
-rw-r--r--src/lib/barrier/ArgParser.h20
-rw-r--r--src/lib/barrier/ArgsBase.cpp9
-rw-r--r--src/lib/barrier/ArgsBase.h10
-rw-r--r--src/lib/barrier/BarrierType.h26
-rw-r--r--src/lib/barrier/CMakeLists.txt4
-rw-r--r--src/lib/barrier/Chunk.cpp4
-rw-r--r--src/lib/barrier/Chunk.h6
-rw-r--r--src/lib/barrier/ClientApp.cpp58
-rw-r--r--src/lib/barrier/ClientApp.h7
-rw-r--r--src/lib/barrier/ClientArgs.cpp4
-rw-r--r--src/lib/barrier/ClientArgs.h4
-rw-r--r--src/lib/barrier/ClientTaskBarReceiver.cpp4
-rw-r--r--src/lib/barrier/ClientTaskBarReceiver.h4
-rw-r--r--src/lib/barrier/Clipboard.cpp4
-rw-r--r--src/lib/barrier/Clipboard.h4
-rw-r--r--src/lib/barrier/ClipboardChunk.cpp8
-rw-r--r--src/lib/barrier/ClipboardChunk.h4
-rw-r--r--src/lib/barrier/DragInformation.cpp16
-rw-r--r--src/lib/barrier/DragInformation.h8
-rw-r--r--src/lib/barrier/DropHelper.cpp11
-rw-r--r--src/lib/barrier/DropHelper.h4
-rw-r--r--src/lib/barrier/FileChunk.cpp4
-rw-r--r--src/lib/barrier/FileChunk.h4
-rw-r--r--src/lib/barrier/IApp.h4
-rw-r--r--src/lib/barrier/IAppUtil.h6
-rw-r--r--src/lib/barrier/IClient.h4
-rw-r--r--src/lib/barrier/IClipboard.cpp8
-rw-r--r--src/lib/barrier/IClipboard.h4
-rw-r--r--src/lib/barrier/IKeyState.cpp4
-rw-r--r--src/lib/barrier/IKeyState.h8
-rw-r--r--src/lib/barrier/INode.h6
-rw-r--r--src/lib/barrier/IPlatformScreen.cpp4
-rw-r--r--src/lib/barrier/IPlatformScreen.h7
-rw-r--r--src/lib/barrier/IPrimaryScreen.cpp4
-rw-r--r--src/lib/barrier/IPrimaryScreen.h4
-rw-r--r--src/lib/barrier/IScreen.h6
-rw-r--r--src/lib/barrier/IScreenSaver.h6
-rw-r--r--src/lib/barrier/ISecondaryScreen.h4
-rw-r--r--src/lib/barrier/KeyMap.cpp14
-rw-r--r--src/lib/barrier/KeyMap.h12
-rw-r--r--src/lib/barrier/KeyState.cpp10
-rw-r--r--src/lib/barrier/KeyState.h8
-rw-r--r--src/lib/barrier/PacketStreamFilter.cpp26
-rw-r--r--src/lib/barrier/PacketStreamFilter.h10
-rw-r--r--src/lib/barrier/PlatformScreen.cpp4
-rw-r--r--src/lib/barrier/PlatformScreen.h1
-rw-r--r--src/lib/barrier/PortableTaskBarReceiver.cpp6
-rw-r--r--src/lib/barrier/PortableTaskBarReceiver.h4
-rw-r--r--src/lib/barrier/ProtocolUtil.cpp18
-rw-r--r--src/lib/barrier/ProtocolUtil.h10
-rw-r--r--src/lib/barrier/Screen.cpp12
-rw-r--r--src/lib/barrier/Screen.h14
-rw-r--r--src/lib/barrier/ServerApp.cpp92
-rw-r--r--src/lib/barrier/ServerApp.h8
-rw-r--r--src/lib/barrier/ServerArgs.h1
-rw-r--r--src/lib/barrier/ServerTaskBarReceiver.cpp6
-rw-r--r--src/lib/barrier/ServerTaskBarReceiver.h4
-rw-r--r--src/lib/barrier/StreamChunker.cpp27
-rw-r--r--src/lib/barrier/StreamChunker.h11
-rw-r--r--src/lib/barrier/XBarrier.cpp6
-rw-r--r--src/lib/barrier/XBarrier.h10
-rw-r--r--src/lib/barrier/XScreen.cpp4
-rw-r--r--src/lib/barrier/XScreen.h4
-rw-r--r--src/lib/barrier/clipboard_types.h4
-rw-r--r--src/lib/barrier/key_types.cpp14
-rw-r--r--src/lib/barrier/key_types.h17
-rw-r--r--src/lib/barrier/mouse_types.h4
-rw-r--r--src/lib/barrier/option_types.h4
-rw-r--r--src/lib/barrier/protocol_types.cpp4
-rw-r--r--src/lib/barrier/protocol_types.h16
-rw-r--r--src/lib/barrier/unix/AppUtilUnix.cpp4
-rw-r--r--src/lib/barrier/unix/AppUtilUnix.h6
-rw-r--r--src/lib/barrier/win32/AppUtilWindows.cpp28
-rw-r--r--src/lib/barrier/win32/AppUtilWindows.h6
-rw-r--r--src/lib/barrier/win32/DaemonApp.cpp25
-rw-r--r--src/lib/barrier/win32/DaemonApp.h6
-rw-r--r--src/lib/base/CMakeLists.txt4
-rw-r--r--src/lib/base/ELevel.h4
-rw-r--r--src/lib/base/Event.cpp4
-rw-r--r--src/lib/base/Event.h8
-rw-r--r--src/lib/base/EventQueue.cpp16
-rw-r--r--src/lib/base/EventQueue.h6
-rw-r--r--src/lib/base/EventTypes.cpp5
-rw-r--r--src/lib/base/EventTypes.h44
-rw-r--r--src/lib/base/FunctionEventJob.cpp4
-rw-r--r--src/lib/base/FunctionEventJob.h4
-rw-r--r--src/lib/base/FunctionJob.cpp43
-rw-r--r--src/lib/base/FunctionJob.h39
-rw-r--r--src/lib/base/IEventJob.h4
-rw-r--r--src/lib/base/IEventQueue.h8
-rw-r--r--src/lib/base/IEventQueueBuffer.h6
-rw-r--r--src/lib/base/IJob.h4
-rw-r--r--src/lib/base/ILogOutputter.h4
-rw-r--r--src/lib/base/Log.cpp10
-rw-r--r--src/lib/base/Log.h12
-rw-r--r--src/lib/base/PriorityQueue.h4
-rw-r--r--src/lib/base/SimpleEventQueueBuffer.cpp4
-rw-r--r--src/lib/base/SimpleEventQueueBuffer.h6
-rw-r--r--src/lib/base/Stopwatch.cpp4
-rw-r--r--src/lib/base/Stopwatch.h6
-rw-r--r--src/lib/base/String.cpp78
-rw-r--r--src/lib/base/String.h9
-rw-r--r--src/lib/base/TMethodEventJob.h4
-rw-r--r--src/lib/base/TMethodJob.h68
-rw-r--r--src/lib/base/Unicode.cpp4
-rw-r--r--src/lib/base/Unicode.h4
-rw-r--r--src/lib/base/XBase.cpp4
-rw-r--r--src/lib/base/XBase.h4
-rw-r--r--src/lib/base/finally.h61
-rw-r--r--src/lib/base/log_outputters.cpp11
-rw-r--r--src/lib/base/log_outputters.h4
-rw-r--r--src/lib/client/CMakeLists.txt4
-rw-r--r--src/lib/client/Client.cpp46
-rw-r--r--src/lib/client/Client.h16
-rw-r--r--src/lib/client/ServerProxy.cpp37
-rw-r--r--src/lib/client/ServerProxy.h8
-rw-r--r--src/lib/common/CMakeLists.txt4
-rw-r--r--src/lib/common/DataDirectories.h37
-rw-r--r--src/lib/common/DataDirectories_static.cpp41
-rw-r--r--src/lib/common/IInterface.h4
-rw-r--r--src/lib/common/MacOSXPrecomp.h23
-rw-r--r--src/lib/common/PathUtilities.cpp75
-rw-r--r--src/lib/common/PathUtilities.h31
-rw-r--r--src/lib/common/Version.cpp4
-rw-r--r--src/lib/common/Version.h4
-rw-r--r--src/lib/common/basic_types.h67
-rw-r--r--src/lib/common/common.h24
-rw-r--r--src/lib/common/stdbitset.h4
-rw-r--r--src/lib/common/stddeque.h4
-rw-r--r--src/lib/common/stdfstream.h4
-rw-r--r--src/lib/common/stdistream.h4
-rw-r--r--src/lib/common/stdlist.h4
-rw-r--r--src/lib/common/stdmap.h4
-rw-r--r--src/lib/common/stdostream.h4
-rw-r--r--src/lib/common/stdpost.h4
-rw-r--r--src/lib/common/stdpre.h4
-rw-r--r--src/lib/common/stdset.h4
-rw-r--r--src/lib/common/stdsstream.h4
-rw-r--r--src/lib/common/stdstring.h4
-rw-r--r--src/lib/common/stdvector.h4
-rw-r--r--src/lib/common/unix/DataDirectories.cpp38
-rw-r--r--src/lib/common/win32/DataDirectories.cpp36
-rw-r--r--src/lib/common/win32/encoding_utilities.cpp37
-rw-r--r--src/lib/common/win32/encoding_utilities.h28
-rw-r--r--src/lib/io/CMakeLists.txt4
-rw-r--r--src/lib/io/IStream.h4
-rw-r--r--src/lib/io/StreamBuffer.cpp6
-rw-r--r--src/lib/io/StreamBuffer.h4
-rw-r--r--src/lib/io/StreamFilter.cpp4
-rw-r--r--src/lib/io/StreamFilter.h4
-rw-r--r--src/lib/io/XIO.cpp4
-rw-r--r--src/lib/io/XIO.h4
-rw-r--r--src/lib/io/filesystem.cpp71
-rw-r--r--src/lib/io/filesystem.h41
-rw-r--r--src/lib/ipc/CMakeLists.txt4
-rw-r--r--src/lib/ipc/Ipc.h4
-rw-r--r--src/lib/ipc/IpcClient.cpp4
-rw-r--r--src/lib/ipc/IpcClient.h6
-rw-r--r--src/lib/ipc/IpcClientProxy.cpp8
-rw-r--r--src/lib/ipc/IpcClientProxy.h6
-rw-r--r--src/lib/ipc/IpcLogOutputter.cpp11
-rw-r--r--src/lib/ipc/IpcLogOutputter.h16
-rw-r--r--src/lib/ipc/IpcMessage.cpp4
-rw-r--r--src/lib/ipc/IpcMessage.h4
-rw-r--r--src/lib/ipc/IpcServer.cpp4
-rw-r--r--src/lib/ipc/IpcServer.h8
-rw-r--r--src/lib/ipc/IpcServerProxy.cpp12
-rw-r--r--src/lib/ipc/IpcServerProxy.h4
-rw-r--r--src/lib/mt/CMakeLists.txt4
-rw-r--r--src/lib/mt/CondVar.cpp6
-rw-r--r--src/lib/mt/CondVar.h6
-rw-r--r--src/lib/mt/Lock.cpp4
-rw-r--r--src/lib/mt/Lock.h4
-rw-r--r--src/lib/mt/Mutex.cpp4
-rw-r--r--src/lib/mt/Mutex.h4
-rw-r--r--src/lib/mt/Thread.cpp46
-rw-r--r--src/lib/mt/Thread.h35
-rw-r--r--src/lib/mt/XMT.cpp4
-rw-r--r--src/lib/mt/XMT.h4
-rw-r--r--src/lib/mt/XThread.h14
-rw-r--r--src/lib/net/CMakeLists.txt4
-rw-r--r--src/lib/net/ConnectionSecurityLevel.h27
-rw-r--r--src/lib/net/FingerprintData.cpp52
-rw-r--r--src/lib/net/FingerprintData.h46
-rw-r--r--src/lib/net/FingerprintDatabase.cpp135
-rw-r--r--src/lib/net/FingerprintDatabase.h53
-rw-r--r--src/lib/net/IDataSocket.cpp4
-rw-r--r--src/lib/net/IDataSocket.h4
-rw-r--r--src/lib/net/IListenSocket.h6
-rw-r--r--src/lib/net/ISocket.h4
-rw-r--r--src/lib/net/ISocketFactory.h15
-rw-r--r--src/lib/net/ISocketMultiplexerJob.h4
-rw-r--r--src/lib/net/NetworkAddress.cpp4
-rw-r--r--src/lib/net/NetworkAddress.h6
-rw-r--r--src/lib/net/SecureListenSocket.cpp36
-rw-r--r--src/lib/net/SecureListenSocket.h15
-rw-r--r--src/lib/net/SecureSocket.cpp356
-rw-r--r--src/lib/net/SecureSocket.h62
-rw-r--r--src/lib/net/SecureUtils.cpp312
-rw-r--r--src/lib/net/SecureUtils.h43
-rw-r--r--src/lib/net/SocketMultiplexer.cpp17
-rw-r--r--src/lib/net/SocketMultiplexer.h6
-rw-r--r--src/lib/net/TCPListenSocket.cpp16
-rw-r--r--src/lib/net/TCPListenSocket.h4
-rw-r--r--src/lib/net/TCPSocket.cpp42
-rw-r--r--src/lib/net/TCPSocket.h10
-rw-r--r--src/lib/net/TCPSocketFactory.cpp21
-rw-r--r--src/lib/net/TCPSocketFactory.h15
-rw-r--r--src/lib/net/TSocketMultiplexerMethodJob.h94
-rw-r--r--src/lib/net/XSocket.cpp6
-rw-r--r--src/lib/net/XSocket.h4
-rw-r--r--src/lib/platform/CMakeLists.txt4
-rw-r--r--src/lib/platform/IMSWindowsClipboardFacade.h6
-rw-r--r--src/lib/platform/IOSXKeyResource.cpp6
-rw-r--r--src/lib/platform/IOSXKeyResource.h8
-rw-r--r--src/lib/platform/IXWindowsImpl.h58
-rw-r--r--src/lib/platform/ImmuneKeysReader.cpp2
-rw-r--r--src/lib/platform/ImmuneKeysReader.h4
-rw-r--r--src/lib/platform/MSWindowsClipboard.cpp6
-rw-r--r--src/lib/platform/MSWindowsClipboard.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardAnyTextConverter.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardBitmapConverter.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardBitmapConverter.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardFacade.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardFacade.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardHTMLConverter.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardHTMLConverter.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardTextConverter.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardTextConverter.h4
-rw-r--r--src/lib/platform/MSWindowsClipboardUTF16Converter.cpp4
-rw-r--r--src/lib/platform/MSWindowsClipboardUTF16Converter.h4
-rw-r--r--src/lib/platform/MSWindowsDebugOutputter.cpp4
-rw-r--r--src/lib/platform/MSWindowsDebugOutputter.h6
-rw-r--r--src/lib/platform/MSWindowsDesks.cpp25
-rw-r--r--src/lib/platform/MSWindowsDesks.h13
-rw-r--r--src/lib/platform/MSWindowsDropTarget.cpp10
-rw-r--r--src/lib/platform/MSWindowsDropTarget.h8
-rw-r--r--src/lib/platform/MSWindowsEventQueueBuffer.cpp4
-rw-r--r--src/lib/platform/MSWindowsEventQueueBuffer.h4
-rw-r--r--src/lib/platform/MSWindowsHook.cpp66
-rw-r--r--src/lib/platform/MSWindowsHook.h4
-rw-r--r--src/lib/platform/MSWindowsHookResource.cpp2
-rw-r--r--src/lib/platform/MSWindowsHookResource.h2
-rw-r--r--src/lib/platform/MSWindowsKeyState.cpp105
-rw-r--r--src/lib/platform/MSWindowsKeyState.h6
-rw-r--r--src/lib/platform/MSWindowsScreen.cpp92
-rw-r--r--src/lib/platform/MSWindowsScreen.h19
-rw-r--r--src/lib/platform/MSWindowsScreenSaver.cpp17
-rw-r--r--src/lib/platform/MSWindowsScreenSaver.h8
-rw-r--r--src/lib/platform/MSWindowsSession.cpp14
-rw-r--r--src/lib/platform/MSWindowsSession.h6
-rw-r--r--src/lib/platform/MSWindowsUtil.cpp4
-rw-r--r--src/lib/platform/MSWindowsUtil.h4
-rw-r--r--src/lib/platform/MSWindowsWatchdog.cpp60
-rw-r--r--src/lib/platform/MSWindowsWatchdog.h8
-rw-r--r--src/lib/platform/OSXClipboard.cpp14
-rw-r--r--src/lib/platform/OSXClipboard.h4
-rw-r--r--src/lib/platform/OSXClipboardAnyTextConverter.cpp4
-rw-r--r--src/lib/platform/OSXClipboardAnyTextConverter.h4
-rw-r--r--src/lib/platform/OSXClipboardHTMLConverter.cpp2
-rw-r--r--src/lib/platform/OSXClipboardTextConverter.cpp12
-rw-r--r--src/lib/platform/OSXClipboardTextConverter.h4
-rw-r--r--src/lib/platform/OSXClipboardUTF16Converter.cpp4
-rw-r--r--src/lib/platform/OSXClipboardUTF16Converter.h4
-rw-r--r--src/lib/platform/OSXDragSimulator.h2
-rw-r--r--src/lib/platform/OSXDragSimulator.mm (renamed from src/lib/platform/OSXDragSimulator.m)24
-rw-r--r--src/lib/platform/OSXDragView.mm (renamed from src/lib/platform/OSXDragView.m)0
-rw-r--r--src/lib/platform/OSXEventQueueBuffer.cpp18
-rw-r--r--src/lib/platform/OSXEventQueueBuffer.h4
-rw-r--r--src/lib/platform/OSXKeyState.cpp74
-rw-r--r--src/lib/platform/OSXKeyState.h8
-rw-r--r--src/lib/platform/OSXMediaKeySimulator.mm (renamed from src/lib/platform/OSXMediaKeySimulator.m)4
-rw-r--r--src/lib/platform/OSXMediaKeySupport.mm (renamed from src/lib/platform/OSXMediaKeySupport.m)4
-rw-r--r--src/lib/platform/OSXPasteboardPeeker.h2
-rw-r--r--src/lib/platform/OSXPasteboardPeeker.mm (renamed from src/lib/platform/OSXPasteboardPeeker.m)0
-rw-r--r--src/lib/platform/OSXScreen.h48
-rw-r--r--src/lib/platform/OSXScreen.mm218
-rw-r--r--src/lib/platform/OSXScreenSaver.cpp14
-rw-r--r--src/lib/platform/OSXScreenSaver.h8
-rw-r--r--src/lib/platform/OSXScreenSaverControl.h2
-rw-r--r--src/lib/platform/OSXScreenSaverUtil.h4
-rw-r--r--src/lib/platform/OSXScreenSaverUtil.mm (renamed from src/lib/platform/OSXScreenSaverUtil.m)0
-rw-r--r--src/lib/platform/OSXUchrKeyResource.cpp4
-rw-r--r--src/lib/platform/OSXUchrKeyResource.h12
-rw-r--r--src/lib/platform/XWindowsClipboard.cpp8
-rw-r--r--src/lib/platform/XWindowsClipboard.h10
-rw-r--r--src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardAnyBitmapConverter.h4
-rw-r--r--src/lib/platform/XWindowsClipboardBMPConverter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardBMPConverter.h4
-rw-r--r--src/lib/platform/XWindowsClipboardHTMLConverter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardHTMLConverter.h4
-rw-r--r--src/lib/platform/XWindowsClipboardTextConverter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardTextConverter.h4
-rw-r--r--src/lib/platform/XWindowsClipboardUCS2Converter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardUCS2Converter.h4
-rw-r--r--src/lib/platform/XWindowsClipboardUTF8Converter.cpp4
-rw-r--r--src/lib/platform/XWindowsClipboardUTF8Converter.h4
-rw-r--r--src/lib/platform/XWindowsEventQueueBuffer.cpp8
-rw-r--r--src/lib/platform/XWindowsEventQueueBuffer.h10
-rw-r--r--src/lib/platform/XWindowsKeyState.cpp20
-rw-r--r--src/lib/platform/XWindowsKeyState.h24
-rw-r--r--src/lib/platform/XWindowsScreen.cpp12
-rw-r--r--src/lib/platform/XWindowsScreen.h10
-rw-r--r--src/lib/platform/XWindowsScreenSaver.cpp28
-rw-r--r--src/lib/platform/XWindowsScreenSaver.h12
-rw-r--r--src/lib/platform/XWindowsUtil.cpp49
-rw-r--r--src/lib/platform/XWindowsUtil.h12
-rw-r--r--src/lib/platform/synwinhk.h4
-rw-r--r--src/lib/server/BaseClientProxy.cpp4
-rw-r--r--src/lib/server/BaseClientProxy.h4
-rw-r--r--src/lib/server/CMakeLists.txt4
-rw-r--r--src/lib/server/ClientListener.cpp37
-rw-r--r--src/lib/server/ClientListener.h13
-rw-r--r--src/lib/server/ClientProxy.cpp4
-rw-r--r--src/lib/server/ClientProxy.h4
-rw-r--r--src/lib/server/ClientProxy1_0.cpp27
-rw-r--r--src/lib/server/ClientProxy1_0.h4
-rw-r--r--src/lib/server/ClientProxy1_1.cpp4
-rw-r--r--src/lib/server/ClientProxy1_1.h4
-rw-r--r--src/lib/server/ClientProxy1_2.cpp4
-rw-r--r--src/lib/server/ClientProxy1_2.h4
-rw-r--r--src/lib/server/ClientProxy1_3.cpp4
-rw-r--r--src/lib/server/ClientProxy1_3.h4
-rw-r--r--src/lib/server/ClientProxy1_4.cpp4
-rw-r--r--src/lib/server/ClientProxy1_4.h4
-rw-r--r--src/lib/server/ClientProxy1_5.cpp8
-rw-r--r--src/lib/server/ClientProxy1_5.h4
-rw-r--r--src/lib/server/ClientProxy1_6.cpp6
-rw-r--r--src/lib/server/ClientProxy1_6.h4
-rw-r--r--src/lib/server/ClientProxyUnknown.cpp10
-rw-r--r--src/lib/server/ClientProxyUnknown.h4
-rw-r--r--src/lib/server/Config.cpp38
-rw-r--r--src/lib/server/Config.h6
-rw-r--r--src/lib/server/InputFilter.cpp16
-rw-r--r--src/lib/server/InputFilter.h18
-rw-r--r--src/lib/server/PrimaryClient.cpp4
-rw-r--r--src/lib/server/PrimaryClient.h10
-rw-r--r--src/lib/server/Server.cpp32
-rw-r--r--src/lib/server/Server.h26
417 files changed, 3376 insertions, 2789 deletions
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 70a0629..fdec71c 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/arch/Arch.cpp b/src/lib/arch/Arch.cpp
index 0a3b3e5..810b74f 100644
--- a/src/lib/arch/Arch.cpp
+++ b/src/lib/arch/Arch.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/Arch.h b/src/lib/arch/Arch.h
index 940a2e3..3b37617 100644
--- a/src/lib/arch/Arch.h
+++ b/src/lib/arch/Arch.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/ArchConsoleStd.cpp b/src/lib/arch/ArchConsoleStd.cpp
index f7f7691..2e188bb 100644
--- a/src/lib/arch/ArchConsoleStd.cpp
+++ b/src/lib/arch/ArchConsoleStd.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -30,4 +30,4 @@ ArchConsoleStd::writeConsole(ELevel level, const char* str)
std::cout << str << std::endl;
std::cout.flush();
-} \ No newline at end of file
+}
diff --git a/src/lib/arch/ArchConsoleStd.h b/src/lib/arch/ArchConsoleStd.h
index 8560fad..1d306e7 100644
--- a/src/lib/arch/ArchConsoleStd.h
+++ b/src/lib/arch/ArchConsoleStd.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/ArchDaemonNone.cpp b/src/lib/arch/ArchDaemonNone.cpp
index 1222549..5cb4681 100644
--- a/src/lib/arch/ArchDaemonNone.cpp
+++ b/src/lib/arch/ArchDaemonNone.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/ArchDaemonNone.h b/src/lib/arch/ArchDaemonNone.h
index e02405f..425ae56 100644
--- a/src/lib/arch/ArchDaemonNone.h
+++ b/src/lib/arch/ArchDaemonNone.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/CMakeLists.txt b/src/lib/arch/CMakeLists.txt
index db92634..5ff7b51 100644
--- a/src/lib/arch/CMakeLists.txt
+++ b/src/lib/arch/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/arch/IArchConsole.h b/src/lib/arch/IArchConsole.h
index d115c50..41e3527 100644
--- a/src/lib/arch/IArchConsole.h
+++ b/src/lib/arch/IArchConsole.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchDaemon.h b/src/lib/arch/IArchDaemon.h
index 23a34f2..6a4fb67 100644
--- a/src/lib/arch/IArchDaemon.h
+++ b/src/lib/arch/IArchDaemon.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -64,7 +64,7 @@ public:
Installs the default daemon.
*/
virtual void installDaemon() = 0;
-
+
//! Uninstall daemon
/*!
Uninstalls the default daemon.
@@ -76,7 +76,7 @@ public:
Daemonize. Throw XArchDaemonFailed on error. \c name is the name
of the daemon. Once daemonized, \c func is invoked and daemonize
returns when and what it does.
-
+
Exactly what happens when daemonizing depends on the platform.
<ul>
<li>unix:
diff --git a/src/lib/arch/IArchLog.h b/src/lib/arch/IArchLog.h
index 165b1df..704ad47 100644
--- a/src/lib/arch/IArchLog.h
+++ b/src/lib/arch/IArchLog.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchMultithread.h b/src/lib/arch/IArchMultithread.h
index e8d358b..6a57694 100644
--- a/src/lib/arch/IArchMultithread.h
+++ b/src/lib/arch/IArchMultithread.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -19,8 +19,9 @@
#pragma once
#include "common/IInterface.h"
+#include <functional>
-/*!
+/*!
\class ArchCondImpl
\brief Internal condition variable data.
An architecture dependent type holding the necessary data for a
@@ -28,35 +29,35 @@ condition variable.
*/
class ArchCondImpl;
-/*!
+/*!
\var ArchCond
\brief Opaque condition variable type.
An opaque type representing a condition variable.
*/
typedef ArchCondImpl* ArchCond;
-/*!
+/*!
\class ArchMutexImpl
\brief Internal mutex data.
An architecture dependent type holding the necessary data for a mutex.
*/
class ArchMutexImpl;
-/*!
+/*!
\var ArchMutex
\brief Opaque mutex type.
An opaque type representing a mutex.
*/
typedef ArchMutexImpl* ArchMutex;
-/*!
+/*!
\class ArchThreadImpl
\brief Internal thread data.
An architecture dependent type holding the necessary data for a thread.
*/
class ArchThreadImpl;
-/*!
+/*!
\var ArchThread
\brief Opaque thread type.
An opaque type representing a thread.
@@ -71,7 +72,7 @@ barrier. Each architecture must implement this interface.
class IArchMultithread : public IInterface {
public:
//! Type of thread entry point
- typedef void* (*ThreadFunc)(void*);
+ typedef void (*ThreadFunc)(void*);
//! Type of thread identifier
typedef unsigned int ThreadID;
//! Types of signals
@@ -160,7 +161,7 @@ public:
Creates and starts a new thread, using \c func as the entry point
and passing it \c userData. The thread is an opaque data type.
*/
- virtual ArchThread newThread(ThreadFunc func, void* userData) = 0;
+ virtual ArchThread newThread(const std::function<void()>& func) = 0;
//! Get a reference to the calling thread
/*!
@@ -235,15 +236,6 @@ public:
*/
virtual bool isExitedThread(ArchThread thread) = 0;
- //! Returns the exit code of a thread
- /*!
- Waits indefinitely for \c thread to exit (if it hasn't yet) then
- returns the thread's exit code.
-
- (Cancellation point)
- */
- virtual void* getResultOfThread(ArchThread thread) = 0;
-
//! Returns an ID for a thread
/*!
Returns some ID number for \c thread. This is for logging purposes.
diff --git a/src/lib/arch/IArchNetwork.h b/src/lib/arch/IArchNetwork.h
index b859506..7eae63e 100644
--- a/src/lib/arch/IArchNetwork.h
+++ b/src/lib/arch/IArchNetwork.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -24,21 +24,21 @@
class ArchThreadImpl;
typedef ArchThreadImpl* ArchThread;
-/*!
+/*!
\class ArchSocketImpl
\brief Internal socket data.
An architecture dependent type holding the necessary data for a socket.
*/
class ArchSocketImpl;
-/*!
+/*!
\var ArchSocket
\brief Opaque socket type.
An opaque type representing a socket.
*/
typedef ArchSocketImpl* ArchSocket;
-/*!
+/*!
\class ArchNetAddressImpl
\brief Internal network address data.
An architecture dependent type holding the necessary data for a network
@@ -46,7 +46,7 @@ address.
*/
class ArchNetAddressImpl;
-/*!
+/*!
\var ArchNetAddress
\brief Opaque network address type.
An opaque type representing a network address.
diff --git a/src/lib/arch/IArchSleep.h b/src/lib/arch/IArchSleep.h
index 9999d0e..86c571f 100644
--- a/src/lib/arch/IArchSleep.h
+++ b/src/lib/arch/IArchSleep.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchString.cpp b/src/lib/arch/IArchString.cpp
index 0f7f300..b1118ec 100644
--- a/src/lib/arch/IArchString.cpp
+++ b/src/lib/arch/IArchString.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchString.h b/src/lib/arch/IArchString.h
index ea10b65..f1803d8 100644
--- a/src/lib/arch/IArchString.h
+++ b/src/lib/arch/IArchString.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -46,16 +46,6 @@ public:
//! @name manipulators
//@{
- //! printf() to limited size buffer with va_list
- /*!
- This method is equivalent to vsprintf() except it will not write
- more than \c n bytes to the buffer, returning -1 if the output
- was truncated and the number of bytes written not including the
- trailing NUL otherwise.
- */
- virtual int vsnprintf(char* str,
- int size, const char* fmt, va_list ap);
-
//! Convert multibyte string to wide character string
virtual int convStringMBToWC(wchar_t*,
const char*, UInt32 n, bool* errors);
diff --git a/src/lib/arch/IArchSystem.h b/src/lib/arch/IArchSystem.h
index 9446505..3e7aa98 100644
--- a/src/lib/arch/IArchSystem.h
+++ b/src/lib/arch/IArchSystem.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchTaskBar.h b/src/lib/arch/IArchTaskBar.h
index 85a32d8..fc5f0d0 100644
--- a/src/lib/arch/IArchTaskBar.h
+++ b/src/lib/arch/IArchTaskBar.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchTaskBarReceiver.h b/src/lib/arch/IArchTaskBarReceiver.h
index 997c8ae..b4f0d30 100644
--- a/src/lib/arch/IArchTaskBarReceiver.h
+++ b/src/lib/arch/IArchTaskBarReceiver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/IArchTime.h b/src/lib/arch/IArchTime.h
index abb3cdd..297aab7 100644
--- a/src/lib/arch/IArchTime.h
+++ b/src/lib/arch/IArchTime.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/XArch.h b/src/lib/arch/XArch.h
index 8484d06..2fcf686 100644
--- a/src/lib/arch/XArch.h
+++ b/src/lib/arch/XArch.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -57,7 +57,7 @@ class XArchEval {
public:
XArchEval() { }
virtual ~XArchEval() noexcept { }
-
+
virtual std::string eval() const = 0;
};
diff --git a/src/lib/arch/multibyte.h b/src/lib/arch/multibyte.h
index 4a4e0ec..7812e0b 100644
--- a/src/lib/arch/multibyte.h
+++ b/src/lib/arch/multibyte.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchConsoleUnix.cpp b/src/lib/arch/unix/ArchConsoleUnix.cpp
index 79a4634..d5e8e1d 100644
--- a/src/lib/arch/unix/ArchConsoleUnix.cpp
+++ b/src/lib/arch/unix/ArchConsoleUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchConsoleUnix.h b/src/lib/arch/unix/ArchConsoleUnix.h
index 8326ab5..136c606 100644
--- a/src/lib/arch/unix/ArchConsoleUnix.h
+++ b/src/lib/arch/unix/ArchConsoleUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchDaemonUnix.cpp b/src/lib/arch/unix/ArchDaemonUnix.cpp
index a03bf7a..f1ac1d5 100644
--- a/src/lib/arch/unix/ArchDaemonUnix.cpp
+++ b/src/lib/arch/unix/ArchDaemonUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -53,15 +53,15 @@ execSelfNonDaemonized()
{
extern char** NXArgv;
char** selfArgv = NXArgv;
-
+
setenv("_BARRIER_DAEMONIZED", "", 1);
-
+
execvp(selfArgv[0], selfArgv);
return 0;
}
bool alreadyDaemonized() {
- return getenv("_BARRIER_DAEMONIZED") != NULL;
+ return std::getenv("_BARRIER_DAEMONIZED") != NULL;
}
#endif
@@ -73,7 +73,7 @@ ArchDaemonUnix::daemonize(const char* name, DaemonFunc func)
if (alreadyDaemonized())
return func(1, &name);
#endif
-
+
// fork so shell thinks we're done and so we're not a process
// group leader
switch (fork()) {
@@ -92,7 +92,7 @@ ArchDaemonUnix::daemonize(const char* name, DaemonFunc func)
// become leader of a new session
setsid();
-
+
#ifndef __APPLE__
// NB: don't run chdir on apple; causes strange behaviour.
// chdir to root so we don't keep mounted filesystems points busy
@@ -115,18 +115,18 @@ ArchDaemonUnix::daemonize(const char* name, DaemonFunc func)
// of standard I/O safely goes in the bit bucket.
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
-
+
int dupErr = dup(1);
if (dupErr < 0) {
// NB: file logging actually isn't working at this point!
LOG((CLOG_ERR "dup error: %i", dupErr));
}
-
+
#ifdef __APPLE__
return execSelfNonDaemonized();
#endif
-
+
// invoke function
return func(1, &name);
}
diff --git a/src/lib/arch/unix/ArchDaemonUnix.h b/src/lib/arch/unix/ArchDaemonUnix.h
index 530159a..52a531e 100644
--- a/src/lib/arch/unix/ArchDaemonUnix.h
+++ b/src/lib/arch/unix/ArchDaemonUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchInternetUnix.cpp b/src/lib/arch/unix/ArchInternetUnix.cpp
index 76966dc..dcea2ae 100644
--- a/src/lib/arch/unix/ArchInternetUnix.cpp
+++ b/src/lib/arch/unix/ArchInternetUnix.cpp
@@ -94,16 +94,16 @@ std::string CurlFacade::get(const std::string& url)
userAgent << "Barrier ";
userAgent << kVersion;
curl_easy_setopt(m_curl, CURLOPT_USERAGENT, userAgent.str().c_str());
-
+
std::string result;
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &result);
-
+
CURLcode code = curl_easy_perform(m_curl);
if (code != CURLE_OK) {
LOG((CLOG_ERR "curl perform error: %s", curl_easy_strerror(code)));
throw XArch("CURL perform failed.");
}
-
+
return result;
}
@@ -114,7 +114,7 @@ std::string CurlFacade::urlEncode(const std::string& url)
if (resultCStr == NULL) {
throw XArch("CURL escape failed.");
}
-
+
std::string result(resultCStr);
curl_free(resultCStr);
diff --git a/src/lib/arch/unix/ArchLogUnix.cpp b/src/lib/arch/unix/ArchLogUnix.cpp
index b1f9089..2389f48 100644
--- a/src/lib/arch/unix/ArchLogUnix.cpp
+++ b/src/lib/arch/unix/ArchLogUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchLogUnix.h b/src/lib/arch/unix/ArchLogUnix.h
index cdd733f..f37bab8 100644
--- a/src/lib/arch/unix/ArchLogUnix.h
+++ b/src/lib/arch/unix/ArchLogUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchMultithreadPosix.cpp b/src/lib/arch/unix/ArchMultithreadPosix.cpp
index 4866edc..8400f9d 100644
--- a/src/lib/arch/unix/ArchMultithreadPosix.cpp
+++ b/src/lib/arch/unix/ArchMultithreadPosix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -59,24 +59,19 @@ public:
int m_refCount;
IArchMultithread::ThreadID m_id;
pthread_t m_thread;
- IArchMultithread::ThreadFunc m_func;
- void* m_userData;
+ std::function<void()> func_;;
bool m_cancel;
bool m_cancelling;
bool m_exited;
- void* m_result;
void* m_networkData;
};
ArchThreadImpl::ArchThreadImpl() :
m_refCount(1),
m_id(0),
- m_func(NULL),
- m_userData(NULL),
m_cancel(false),
m_cancelling(false),
m_exited(false),
- m_result(NULL),
m_networkData(NULL)
{
// do nothing
@@ -319,11 +314,8 @@ ArchMultithreadPosix::unlockMutex(ArchMutex mutex)
}
}
-ArchThread
-ArchMultithreadPosix::newThread(ThreadFunc func, void* data)
+ArchThread ArchMultithreadPosix::newThread(const std::function<void()>& func)
{
- assert(func != NULL);
-
// initialize signal handler. we do this here instead of the
// constructor so we can avoid daemonizing (using fork())
// when there are multiple threads. clients can safely
@@ -341,8 +333,7 @@ ArchMultithreadPosix::newThread(ThreadFunc func, void* data)
// create thread impl for new thread
ArchThreadImpl* thread = new ArchThreadImpl;
- thread->m_func = func;
- thread->m_userData = data;
+ thread->func_ = func;
// create the thread. pthread_create() on RedHat 7.2 smp fails
// if passed a NULL attr so use a default attr.
@@ -389,7 +380,7 @@ ArchMultithreadPosix::closeThread(ArchThread thread)
// decrement ref count and clean up thread if no more references
if (--thread->m_refCount == 0) {
// detach from thread (unless it's the main thread)
- if (thread->m_func != NULL) {
+ if (thread->func_) {
pthread_detach(thread->m_thread);
}
@@ -526,13 +517,6 @@ ArchMultithreadPosix::isExitedThread(ArchThread thread)
return thread->m_exited;
}
-void*
-ArchMultithreadPosix::getResultOfThread(ArchThread thread)
-{
- std::lock_guard<std::mutex> lock(m_threadMutex);
- return thread->m_result;
-}
-
IArchMultithread::ThreadID
ArchMultithreadPosix::getIDOfThread(ArchThread thread)
{
@@ -549,7 +533,7 @@ ArchMultithreadPosix::setSignalHandler(
}
void
-ArchMultithreadPosix::raiseSignal(ESignal signal)
+ArchMultithreadPosix::raiseSignal(ESignal signal)
{
std::lock_guard<std::mutex> lock(m_threadMutex);
if (m_signalFunc[signal] != NULL) {
@@ -699,10 +683,8 @@ ArchMultithreadPosix::doThreadFunc(ArchThread thread)
std::lock_guard<std::mutex> lock(m_threadMutex);
}
- void* result = NULL;
try {
- // go
- result = (*thread->m_func)(thread->m_userData);
+ thread->func_();
}
catch (XThreadCancel&) {
@@ -721,7 +703,6 @@ ArchMultithreadPosix::doThreadFunc(ArchThread thread)
// thread has exited
{
std::lock_guard<std::mutex> lock(m_threadMutex);
- thread->m_result = result;
thread->m_exited = true;
}
diff --git a/src/lib/arch/unix/ArchMultithreadPosix.h b/src/lib/arch/unix/ArchMultithreadPosix.h
index 4bd879f..798147a 100644
--- a/src/lib/arch/unix/ArchMultithreadPosix.h
+++ b/src/lib/arch/unix/ArchMultithreadPosix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -67,7 +67,7 @@ public:
virtual void closeMutex(ArchMutex);
virtual void lockMutex(ArchMutex);
virtual void unlockMutex(ArchMutex);
- virtual ArchThread newThread(ThreadFunc, void*);
+ virtual ArchThread newThread(const std::function<void()>& func);
virtual ArchThread newCurrentThread();
virtual ArchThread copyThread(ArchThread);
virtual void closeThread(ArchThread);
@@ -77,7 +77,6 @@ public:
virtual bool wait(ArchThread, double timeout);
virtual bool isSameThread(ArchThread, ArchThread);
virtual bool isExitedThread(ArchThread);
- virtual void* getResultOfThread(ArchThread);
virtual ThreadID getIDOfThread(ArchThread);
virtual void setSignalHandler(ESignal, SignalFunc, void*);
virtual void raiseSignal(ESignal);
diff --git a/src/lib/arch/unix/ArchNetworkBSD.cpp b/src/lib/arch/unix/ArchNetworkBSD.cpp
index 496c988..5507bfe 100644
--- a/src/lib/arch/unix/ArchNetworkBSD.cpp
+++ b/src/lib/arch/unix/ArchNetworkBSD.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchNetworkBSD.h b/src/lib/arch/unix/ArchNetworkBSD.h
index 3f5679a..e3f11d5 100644
--- a/src/lib/arch/unix/ArchNetworkBSD.h
+++ b/src/lib/arch/unix/ArchNetworkBSD.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchSleepUnix.cpp b/src/lib/arch/unix/ArchSleepUnix.cpp
index 48e2600..1f91c34 100644
--- a/src/lib/arch/unix/ArchSleepUnix.cpp
+++ b/src/lib/arch/unix/ArchSleepUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchSleepUnix.h b/src/lib/arch/unix/ArchSleepUnix.h
index 3e307a5..d2cdbca 100644
--- a/src/lib/arch/unix/ArchSleepUnix.h
+++ b/src/lib/arch/unix/ArchSleepUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchStringUnix.cpp b/src/lib/arch/unix/ArchStringUnix.cpp
index 591c826..dbb91c1 100644
--- a/src/lib/arch/unix/ArchStringUnix.cpp
+++ b/src/lib/arch/unix/ArchStringUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -25,7 +25,6 @@
//
#include "arch/multibyte.h"
-#include "arch/vsnprintf.h"
ArchStringUnix::ArchStringUnix()
{
diff --git a/src/lib/arch/unix/ArchStringUnix.h b/src/lib/arch/unix/ArchStringUnix.h
index f7d0035..551f497 100644
--- a/src/lib/arch/unix/ArchStringUnix.h
+++ b/src/lib/arch/unix/ArchStringUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchSystemUnix.cpp b/src/lib/arch/unix/ArchSystemUnix.cpp
index f51e47f..f956998 100644
--- a/src/lib/arch/unix/ArchSystemUnix.cpp
+++ b/src/lib/arch/unix/ArchSystemUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchSystemUnix.h b/src/lib/arch/unix/ArchSystemUnix.h
index aa9c564..f3c2ad6 100644
--- a/src/lib/arch/unix/ArchSystemUnix.h
+++ b/src/lib/arch/unix/ArchSystemUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchTaskBarXWindows.cpp b/src/lib/arch/unix/ArchTaskBarXWindows.cpp
index c3577ad..522c7fd 100644
--- a/src/lib/arch/unix/ArchTaskBarXWindows.cpp
+++ b/src/lib/arch/unix/ArchTaskBarXWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchTaskBarXWindows.h b/src/lib/arch/unix/ArchTaskBarXWindows.h
index f2c8977..5b60a08 100644
--- a/src/lib/arch/unix/ArchTaskBarXWindows.h
+++ b/src/lib/arch/unix/ArchTaskBarXWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchTimeUnix.cpp b/src/lib/arch/unix/ArchTimeUnix.cpp
index 24685aa..665a7eb 100644
--- a/src/lib/arch/unix/ArchTimeUnix.cpp
+++ b/src/lib/arch/unix/ArchTimeUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/ArchTimeUnix.h b/src/lib/arch/unix/ArchTimeUnix.h
index 3c5c0f8..c6a7dc6 100644
--- a/src/lib/arch/unix/ArchTimeUnix.h
+++ b/src/lib/arch/unix/ArchTimeUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/XArchUnix.cpp b/src/lib/arch/unix/XArchUnix.cpp
index fc7ff65..db2006d 100644
--- a/src/lib/arch/unix/XArchUnix.cpp
+++ b/src/lib/arch/unix/XArchUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/unix/XArchUnix.h b/src/lib/arch/unix/XArchUnix.h
index 93d6d62..be2e689 100644
--- a/src/lib/arch/unix/XArchUnix.h
+++ b/src/lib/arch/unix/XArchUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/vsnprintf.h b/src/lib/arch/vsnprintf.h
deleted file mode 100644
index 5a4e3dc..0000000
--- a/src/lib/arch/vsnprintf.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * barrier -- mouse and keyboard sharing utility
- * Copyright (C) 2012-2016 Symless Ltd.
- * Copyright (C) 2002 Chris Schoeneman
- *
- * 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/IArchString.h"
-
-#if HAVE_VSNPRINTF
-
-#if !defined(ARCH_VSNPRINTF)
-# define ARCH_VSNPRINTF vsnprintf
-#endif
-
-int
-IArchString::vsnprintf(char* str, int size, const char* fmt, va_list ap)
-{
- int n = ::ARCH_VSNPRINTF(str, size, fmt, ap);
- if (n > size) {
- n = -1;
- }
- return n;
-}
-
-#elif SYSAPI_UNIX // !HAVE_VSNPRINTF
-
-#include <stdio.h>
-
-int
-IArchString::vsnprintf(char* str, int size, const char* fmt, va_list ap)
-{
- static FILE* bitbucket = fopen("/dev/null", "w");
- if (bitbucket == NULL) {
- // uh oh
- if (size > 0) {
- str[0] = '\0';
- }
- return 0;
- }
- else {
- // count the characters using the bitbucket
- int n = vfprintf(bitbucket, fmt, ap);
- if (n + 1 <= size) {
- // it'll fit so print it into str
- vsprintf(str, fmt, ap);
- }
- return n;
- }
-}
-
-#else // !HAVE_VSNPRINTF && !SYSAPI_UNIX
-
-#error vsnprintf not implemented
-
-#endif // !HAVE_VSNPRINTF
diff --git a/src/lib/arch/win32/ArchConsoleWindows.cpp b/src/lib/arch/win32/ArchConsoleWindows.cpp
index 4514555..2c61eb7 100644
--- a/src/lib/arch/win32/ArchConsoleWindows.cpp
+++ b/src/lib/arch/win32/ArchConsoleWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchConsoleWindows.h b/src/lib/arch/win32/ArchConsoleWindows.h
index f1f0cc9..a6c6d68 100644
--- a/src/lib/arch/win32/ArchConsoleWindows.h
+++ b/src/lib/arch/win32/ArchConsoleWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchDaemonWindows.cpp b/src/lib/arch/win32/ArchDaemonWindows.cpp
index efcf235..df0a4ce 100644
--- a/src/lib/arch/win32/ArchDaemonWindows.cpp
+++ b/src/lib/arch/win32/ArchDaemonWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -441,7 +441,7 @@ ArchDaemonWindows::serviceMain(DWORD argc, LPTSTR* argvIn)
// create synchronization objects
m_serviceMutex = ARCH->newMutex();
m_serviceCondVar = ARCH->newCondVar();
-
+
// register our service handler function
m_statusHandle = RegisterServiceCtrlHandler(argv[0],
&ArchDaemonWindows::serviceHandlerEntry);
@@ -667,7 +667,7 @@ ArchDaemonWindows::stop(const char* name)
// ask the service to stop, asynchronously
SERVICE_STATUS ss;
if (!ControlService(service, SERVICE_CONTROL_STOP, &ss)) {
- DWORD dwErrCode = GetLastError();
+ DWORD dwErrCode = GetLastError();
if (dwErrCode != ERROR_SERVICE_NOT_ACTIVE) {
throw XArchDaemonFailed(new XArchEvalWindows());
}
@@ -681,7 +681,7 @@ ArchDaemonWindows::installDaemon()
if (!isDaemonInstalled(DEFAULT_DAEMON_NAME)) {
char path[MAX_PATH];
GetModuleFileName(ArchMiscWindows::instanceWin32(), path, MAX_PATH);
-
+
// wrap in quotes so a malicious user can't start \Program.exe as admin.
std::stringstream ss;
ss << '"';
diff --git a/src/lib/arch/win32/ArchDaemonWindows.h b/src/lib/arch/win32/ArchDaemonWindows.h
index 2db9792..7813f09 100644
--- a/src/lib/arch/win32/ArchDaemonWindows.h
+++ b/src/lib/arch/win32/ArchDaemonWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchInternetWindows.cpp b/src/lib/arch/win32/ArchInternetWindows.cpp
index 8a28fde..fb75e7d 100644
--- a/src/lib/arch/win32/ArchInternetWindows.cpp
+++ b/src/lib/arch/win32/ArchInternetWindows.cpp
@@ -72,7 +72,7 @@ std::string ArchInternetWindows::urlEncode(const std::string& url)
std::string result(buffer);
- // the win32 url encoding funcitons are pretty useless (to us) and only
+ // the win32 url encoding functions are pretty useless (to us) and only
// escape "unsafe" chars, but not + or =, so we need to replace these
// manually (and probably many other chars).
barrier::string::findReplaceAll(result, "+", "%2B");
@@ -121,12 +121,12 @@ std::string WinINetRequest::send()
openSession();
connect();
openRequest();
-
+
std::string headers("Content-Type: text/html");
if (!HttpSendRequest(m_request, headers.c_str(), (DWORD)headers.length(), NULL, NULL)) {
throw XArch(new XArchEvalWindows());
}
-
+
std::stringstream result;
CHAR buffer[1025];
DWORD read = 0;
@@ -170,7 +170,7 @@ WinINetRequest::connect()
INTERNET_SERVICE_HTTP,
NULL,
NULL);
-
+
if (m_connect == NULL) {
throw XArch(new XArchEvalWindows());
}
diff --git a/src/lib/arch/win32/ArchLogWindows.cpp b/src/lib/arch/win32/ArchLogWindows.cpp
index bc17abf..1b8855a 100644
--- a/src/lib/arch/win32/ArchLogWindows.cpp
+++ b/src/lib/arch/win32/ArchLogWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchLogWindows.h b/src/lib/arch/win32/ArchLogWindows.h
index 3a997f1..efc466f 100644
--- a/src/lib/arch/win32/ArchLogWindows.h
+++ b/src/lib/arch/win32/ArchLogWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchMiscWindows.cpp b/src/lib/arch/win32/ArchMiscWindows.cpp
index 2c022b1..ab16daa 100644
--- a/src/lib/arch/win32/ArchMiscWindows.cpp
+++ b/src/lib/arch/win32/ArchMiscWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -429,7 +429,7 @@ ArchMiscWindows::wakeupDisplay()
}
bool
-ArchMiscWindows::wasLaunchedAsService()
+ArchMiscWindows::wasLaunchedAsService()
{
std::string name;
if (!getParentProcessName(name)) {
@@ -441,9 +441,9 @@ ArchMiscWindows::wasLaunchedAsService()
}
bool ArchMiscWindows::getParentProcessName(std::string &name)
-{
+{
PROCESSENTRY32 parentEntry;
- if (!getParentProcessEntry(parentEntry)){
+ if (!getParentProcessEntry(parentEntry)) {
LOG((CLOG_ERR "could not get entry for parent process"));
return false;
}
@@ -452,14 +452,14 @@ bool ArchMiscWindows::getParentProcessName(std::string &name)
return true;
}
-BOOL WINAPI
+BOOL WINAPI
ArchMiscWindows::getSelfProcessEntry(PROCESSENTRY32& entry)
{
// get entry from current PID
return getProcessEntry(entry, GetCurrentProcessId());
}
-BOOL WINAPI
+BOOL WINAPI
ArchMiscWindows::getParentProcessEntry(PROCESSENTRY32& entry)
{
// get the current process, so we can get parent PID
@@ -472,24 +472,24 @@ ArchMiscWindows::getParentProcessEntry(PROCESSENTRY32& entry)
return getProcessEntry(entry, selfEntry.th32ParentProcessID);
}
-BOOL WINAPI
+BOOL WINAPI
ArchMiscWindows::getProcessEntry(PROCESSENTRY32& entry, DWORD processID)
{
// first we need to take a snapshot of the running processes
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE) {
- LOG((CLOG_ERR "could not get process snapshot (error: %i)",
+ LOG((CLOG_ERR "could not get process snapshot (error: %i)",
GetLastError()));
return FALSE;
}
entry.dwSize = sizeof(PROCESSENTRY32);
- // get the first process, and if we can't do that then it's
+ // get the first process, and if we can't do that then it's
// unlikely we can go any further
BOOL gotEntry = Process32First(snapshot, &entry);
if (!gotEntry) {
- LOG((CLOG_ERR "could not get first process entry (error: %i)",
+ LOG((CLOG_ERR "could not get first process entry (error: %i)",
GetLastError()));
return FALSE;
}
diff --git a/src/lib/arch/win32/ArchMiscWindows.h b/src/lib/arch/win32/ArchMiscWindows.h
index 91cd8f5..d5373a0 100644
--- a/src/lib/arch/win32/ArchMiscWindows.h
+++ b/src/lib/arch/win32/ArchMiscWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -167,7 +167,7 @@ public:
static HINSTANCE instanceWin32();
static void setInstanceWin32(HINSTANCE instance);
-
+
static BOOL WINAPI getProcessEntry(PROCESSENTRY32& entry, DWORD processID);
static BOOL WINAPI getSelfProcessEntry(PROCESSENTRY32& entry);
static BOOL WINAPI getParentProcessEntry(PROCESSENTRY32& entry);
diff --git a/src/lib/arch/win32/ArchMultithreadWindows.cpp b/src/lib/arch/win32/ArchMultithreadWindows.cpp
index d3fd059..43a7374 100644
--- a/src/lib/arch/win32/ArchMultithreadWindows.cpp
+++ b/src/lib/arch/win32/ArchMultithreadWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -49,12 +49,10 @@ public:
int m_refCount;
HANDLE m_thread;
DWORD m_id;
- IArchMultithread::ThreadFunc m_func;
- void* m_userData;
+ std::function<void()> func_;
HANDLE m_cancel;
bool m_cancelling;
HANDLE m_exit;
- void* m_result;
void* m_networkData;
};
@@ -62,10 +60,7 @@ ArchThreadImpl::ArchThreadImpl() :
m_refCount(1),
m_thread(NULL),
m_id(0),
- m_func(NULL),
- m_userData(NULL),
m_cancelling(false),
- m_result(NULL),
m_networkData(NULL)
{
m_exit = CreateEvent(NULL, TRUE, FALSE, NULL);
@@ -292,15 +287,13 @@ ArchMultithreadWindows::unlockMutex(ArchMutex mutex)
LeaveCriticalSection(&mutex->m_mutex);
}
-ArchThread
-ArchMultithreadWindows::newThread(ThreadFunc func, void* data)
+ArchThread ArchMultithreadWindows::newThread(const std::function<void()>& func)
{
lockMutex(m_threadMutex);
// create thread impl for new thread
ArchThreadImpl* thread = new ArchThreadImpl;
- thread->m_func = func;
- thread->m_userData = data;
+ thread->func_ = func;
// create thread
unsigned int id = 0;
@@ -523,15 +516,6 @@ ArchMultithreadWindows::isExitedThread(ArchThread thread)
return (WaitForSingleObject(thread->m_exit, 0) == WAIT_OBJECT_0);
}
-void*
-ArchMultithreadWindows::getResultOfThread(ArchThread thread)
-{
- lockMutex(m_threadMutex);
- void* result = thread->m_result;
- unlockMutex(m_threadMutex);
- return result;
-}
-
IArchMultithread::ThreadID
ArchMultithreadWindows::getIDOfThread(ArchThread thread)
{
@@ -678,10 +662,8 @@ ArchMultithreadWindows::doThreadFunc(ArchThread thread)
lockMutex(m_threadMutex);
unlockMutex(m_threadMutex);
- void* result = NULL;
try {
- // go
- result = (*thread->m_func)(thread->m_userData);
+ thread->func_();
}
catch (XThreadCancel&) {
@@ -695,9 +677,6 @@ ArchMultithreadWindows::doThreadFunc(ArchThread thread)
}
// thread has exited
- lockMutex(m_threadMutex);
- thread->m_result = result;
- unlockMutex(m_threadMutex);
SetEvent(thread->m_exit);
// done with thread
diff --git a/src/lib/arch/win32/ArchMultithreadWindows.h b/src/lib/arch/win32/ArchMultithreadWindows.h
index 99aa640..31a2b30 100644
--- a/src/lib/arch/win32/ArchMultithreadWindows.h
+++ b/src/lib/arch/win32/ArchMultithreadWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -73,7 +73,7 @@ public:
virtual void closeMutex(ArchMutex);
virtual void lockMutex(ArchMutex);
virtual void unlockMutex(ArchMutex);
- virtual ArchThread newThread(ThreadFunc, void*);
+ virtual ArchThread newThread(const std::function<void()>& func);
virtual ArchThread newCurrentThread();
virtual ArchThread copyThread(ArchThread);
virtual void closeThread(ArchThread);
@@ -83,7 +83,6 @@ public:
virtual bool wait(ArchThread, double timeout);
virtual bool isSameThread(ArchThread, ArchThread);
virtual bool isExitedThread(ArchThread);
- virtual void* getResultOfThread(ArchThread);
virtual ThreadID getIDOfThread(ArchThread);
virtual void setSignalHandler(ESignal, SignalFunc, void*);
virtual void raiseSignal(ESignal);
diff --git a/src/lib/arch/win32/ArchNetworkWinsock.cpp b/src/lib/arch/win32/ArchNetworkWinsock.cpp
index 4bc61d8..2d444fd 100644
--- a/src/lib/arch/win32/ArchNetworkWinsock.cpp
+++ b/src/lib/arch/win32/ArchNetworkWinsock.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchNetworkWinsock.h b/src/lib/arch/win32/ArchNetworkWinsock.h
index 0b01671..7f65795 100644
--- a/src/lib/arch/win32/ArchNetworkWinsock.h
+++ b/src/lib/arch/win32/ArchNetworkWinsock.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchSleepWindows.cpp b/src/lib/arch/win32/ArchSleepWindows.cpp
index 69648a7..0395031 100644
--- a/src/lib/arch/win32/ArchSleepWindows.cpp
+++ b/src/lib/arch/win32/ArchSleepWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -57,5 +57,5 @@ ArchSleepWindows::sleep(double timeout)
else {
Sleep((DWORD)(1000.0 * timeout));
}
- ARCH->testCancelThread();
+ ARCH->testCancelThread();
}
diff --git a/src/lib/arch/win32/ArchSleepWindows.h b/src/lib/arch/win32/ArchSleepWindows.h
index d673caf..da89cea 100644
--- a/src/lib/arch/win32/ArchSleepWindows.h
+++ b/src/lib/arch/win32/ArchSleepWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchStringWindows.cpp b/src/lib/arch/win32/ArchStringWindows.cpp
index deaf536..0033659 100644
--- a/src/lib/arch/win32/ArchStringWindows.cpp
+++ b/src/lib/arch/win32/ArchStringWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -26,11 +26,6 @@
// ArchStringWindows
//
-#include "arch/multibyte.h"
-#define HAVE_VSNPRINTF 1
-#define ARCH_VSNPRINTF _vsnprintf
-#include "arch/vsnprintf.h"
-
ArchStringWindows::ArchStringWindows()
{
}
diff --git a/src/lib/arch/win32/ArchStringWindows.h b/src/lib/arch/win32/ArchStringWindows.h
index 23812dc..b2869b4 100644
--- a/src/lib/arch/win32/ArchStringWindows.h
+++ b/src/lib/arch/win32/ArchStringWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchSystemWindows.cpp b/src/lib/arch/win32/ArchSystemWindows.cpp
index cf3b066..badcf28 100644
--- a/src/lib/arch/win32/ArchSystemWindows.cpp
+++ b/src/lib/arch/win32/ArchSystemWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchSystemWindows.h b/src/lib/arch/win32/ArchSystemWindows.h
index 3d45ee6..835560d 100644
--- a/src/lib/arch/win32/ArchSystemWindows.h
+++ b/src/lib/arch/win32/ArchSystemWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchTaskBarWindows.cpp b/src/lib/arch/win32/ArchTaskBarWindows.cpp
index 731dc59..bf71b74 100644
--- a/src/lib/arch/win32/ArchTaskBarWindows.cpp
+++ b/src/lib/arch/win32/ArchTaskBarWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -88,7 +88,7 @@ ArchTaskBarWindows::init()
// create a window on the current desktop with the current
// thread then the current thread won't be able to switch
// desktops if it needs to.
- m_thread = ARCH->newThread(&ArchTaskBarWindows::threadEntry, this);
+ m_thread = ARCH->newThread([this]() { threadMainLoop(); });
// wait for child thread
while (!m_ready) {
@@ -501,14 +501,7 @@ ArchTaskBarWindows::threadMainLoop()
UnregisterClass(className, instanceWin32());
}
-void*
-ArchTaskBarWindows::threadEntry(void* self)
-{
- static_cast<ArchTaskBarWindows*>(self)->threadMainLoop();
- return NULL;
-}
-
HINSTANCE ArchTaskBarWindows::instanceWin32()
{
return ArchMiscWindows::instanceWin32();
-} \ No newline at end of file
+}
diff --git a/src/lib/arch/win32/ArchTaskBarWindows.h b/src/lib/arch/win32/ArchTaskBarWindows.h
index 0edddf8..2b8b7ad 100644
--- a/src/lib/arch/win32/ArchTaskBarWindows.h
+++ b/src/lib/arch/win32/ArchTaskBarWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -36,7 +36,7 @@ public:
virtual void init();
- //! Add a dialog window
+ //! Add a dialog window
/*!
Tell the task bar event loop about a dialog. Win32 annoyingly
requires messages destined for modeless dialog boxes to be
@@ -84,7 +84,6 @@ private:
static LRESULT CALLBACK
staticWndProc(HWND, UINT, WPARAM, LPARAM);
void threadMainLoop();
- static void* threadEntry(void*);
HINSTANCE instanceWin32();
diff --git a/src/lib/arch/win32/ArchTimeWindows.cpp b/src/lib/arch/win32/ArchTimeWindows.cpp
index 568a483..eae0c15 100644
--- a/src/lib/arch/win32/ArchTimeWindows.cpp
+++ b/src/lib/arch/win32/ArchTimeWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/ArchTimeWindows.h b/src/lib/arch/win32/ArchTimeWindows.h
index 42351a1..c695e79 100644
--- a/src/lib/arch/win32/ArchTimeWindows.h
+++ b/src/lib/arch/win32/ArchTimeWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/arch/win32/XArchWindows.cpp b/src/lib/arch/win32/XArchWindows.cpp
index e116eda..eb3c151 100644
--- a/src/lib/arch/win32/XArchWindows.cpp
+++ b/src/lib/arch/win32/XArchWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -57,58 +57,58 @@ XArchEvalWinsock::eval() const noexcept
// may not look up network error messages correctly. we'll have
// to do it ourself.
static const struct { int m_code; const char* m_msg; } s_netErrorCodes[] = {
- /* 10004 */{WSAEINTR, "The (blocking) call was canceled via WSACancelBlockingCall"},
- /* 10009 */{WSAEBADF, "Bad file handle"},
- /* 10013 */{WSAEACCES, "The requested address is a broadcast address, but the appropriate flag was not set"},
- /* 10014 */{WSAEFAULT, "WSAEFAULT"},
- /* 10022 */{WSAEINVAL, "WSAEINVAL"},
- /* 10024 */{WSAEMFILE, "No more file descriptors available"},
- /* 10035 */{WSAEWOULDBLOCK, "Socket is marked as non-blocking and no connections are present or the receive operation would block"},
- /* 10036 */{WSAEINPROGRESS, "A blocking Windows Sockets operation is in progress"},
+ /* 10004 */{WSAEINTR, "The (blocking) call was canceled via WSACancelBlockingCall"},
+ /* 10009 */{WSAEBADF, "Bad file handle"},
+ /* 10013 */{WSAEACCES, "The requested address is a broadcast address, but the appropriate flag was not set"},
+ /* 10014 */{WSAEFAULT, "WSAEFAULT"},
+ /* 10022 */{WSAEINVAL, "WSAEINVAL"},
+ /* 10024 */{WSAEMFILE, "No more file descriptors available"},
+ /* 10035 */{WSAEWOULDBLOCK, "Socket is marked as non-blocking and no connections are present or the receive operation would block"},
+ /* 10036 */{WSAEINPROGRESS, "A blocking Windows Sockets operation is in progress"},
/* 10037 */{WSAEALREADY, "The asynchronous routine being canceled has already completed"},
/* 10038 */{WSAENOTSOCK, "At least on descriptor is not a socket"},
/* 10039 */{WSAEDESTADDRREQ, "A destination address is required"},
/* 10040 */{WSAEMSGSIZE, "The datagram was too large to fit into the specified buffer and was truncated"},
- /* 10041 */{WSAEPROTOTYPE, "The specified protocol is the wrong type for this socket"},
- /* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"},
- /* 10043 */{WSAEPROTONOSUPPORT,"The specified protocol is not supported"},
- /* 10044 */{WSAESOCKTNOSUPPORT,"The specified socket type is not supported by this address family"},
- /* 10045 */{WSAEOPNOTSUPP, "The referenced socket is not a type that supports that operation"},
+ /* 10041 */{WSAEPROTOTYPE, "The specified protocol is the wrong type for this socket"},
+ /* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"},
+ /* 10043 */{WSAEPROTONOSUPPORT, "The specified protocol is not supported"},
+ /* 10044 */{WSAESOCKTNOSUPPORT, "The specified socket type is not supported by this address family"},
+ /* 10045 */{WSAEOPNOTSUPP, "The referenced socket is not a type that supports that operation"},
/* 10046 */{WSAEPFNOSUPPORT, "BSD: Protocol family not supported"},
/* 10047 */{WSAEAFNOSUPPORT, "The specified address family is not supported"},
- /* 10048 */{WSAEADDRINUSE, "The specified address is already in use"},
- /* 10049 */{WSAEADDRNOTAVAIL, "The specified address is not available from the local machine"},
+ /* 10048 */{WSAEADDRINUSE, "The specified address is already in use"},
+ /* 10049 */{WSAEADDRNOTAVAIL, "The specified address is not available from the local machine"},
/* 10050 */{WSAENETDOWN, "The Windows Sockets implementation has detected that the network subsystem has failed"},
- /* 10051 */{WSAENETUNREACH, "The network can't be reached from this host at this time"},
- /* 10052 */{WSAENETRESET, "The connection must be reset because the Windows Sockets implementation dropped it"},
+ /* 10051 */{WSAENETUNREACH, "The network can't be reached from this host at this time"},
+ /* 10052 */{WSAENETRESET, "The connection must be reset because the Windows Sockets implementation dropped it"},
/* 10053 */{WSAECONNABORTED, "The virtual circuit was aborted due to timeout or other failure"},
- /* 10054 */{WSAECONNRESET, "The virtual circuit was reset by the remote side"},
- /* 10055 */{WSAENOBUFS, "No buffer space is available or a buffer deadlock has occured. The socket cannot be created"},
- /* 10056 */{WSAEISCONN, "The socket is already connected"},
+ /* 10054 */{WSAECONNRESET, "The virtual circuit was reset by the remote side"},
+ /* 10055 */{WSAENOBUFS, "No buffer space is available or a buffer deadlock has occurred. The socket cannot be created"},
+ /* 10056 */{WSAEISCONN, "The socket is already connected"},
/* 10057 */{WSAENOTCONN, "The socket is not connected"},
- /* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"},
+ /* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"},
/* 10059 */{WSAETOOMANYREFS, "BSD: Too many references"},
- /* 10060 */{WSAETIMEDOUT, "Attempt to connect timed out without establishing a connection"},
+ /* 10060 */{WSAETIMEDOUT, "Attempt to connect timed out without establishing a connection"},
/* 10061 */{WSAECONNREFUSED, "Connection was refused"},
- /* 10062 */{WSAELOOP, "Undocumented WinSock error code used in BSD"},
+ /* 10062 */{WSAELOOP, "Undocumented WinSock error code used in BSD"},
/* 10063 */{WSAENAMETOOLONG, "Undocumented WinSock error code used in BSD"},
- /* 10064 */{WSAEHOSTDOWN, "Undocumented WinSock error code used in BSD"},
+ /* 10064 */{WSAEHOSTDOWN, "Undocumented WinSock error code used in BSD"},
/* 10065 */{WSAEHOSTUNREACH, "No route to host"},
- /* 10066 */{WSAENOTEMPTY, "Undocumented WinSock error code"},
+ /* 10066 */{WSAENOTEMPTY, "Undocumented WinSock error code"},
/* 10067 */{WSAEPROCLIM, "Undocumented WinSock error code"},
- /* 10068 */{WSAEUSERS, "Undocumented WinSock error code"},
- /* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"},
- /* 10070 */{WSAESTALE, "Undocumented WinSock error code"},
- /* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"},
- /* 10091 */{WSASYSNOTREADY, "Underlying network subsytem is not ready for network communication"},
- /* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"},
- /* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"},
- /* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"},
- /* 11001 */{WSAHOST_NOT_FOUND, "The specified host is unknown"},
- /* 11002 */{WSATRY_AGAIN, "A temporary error occurred on an authoritative name server"},
- /* 11003 */{WSANO_RECOVERY, "A non-recoverable name server error occurred"},
- /* 11004 */{WSANO_DATA, "The requested name is valid but does not have an IP address"},
- /* end */{0, NULL}
+ /* 10068 */{WSAEUSERS, "Undocumented WinSock error code"},
+ /* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"},
+ /* 10070 */{WSAESTALE, "Undocumented WinSock error code"},
+ /* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"},
+ /* 10091 */{WSASYSNOTREADY, "Underlying network subsystem is not ready for network communication"},
+ /* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"},
+ /* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"},
+ /* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"},
+ /* 11001 */{WSAHOST_NOT_FOUND, "The specified host is unknown"},
+ /* 11002 */{WSATRY_AGAIN, "A temporary error occurred on an authoritative name server"},
+ /* 11003 */{WSANO_RECOVERY, "A non-recoverable name server error occurred"},
+ /* 11004 */{WSANO_DATA, "The requested name is valid but does not have an IP address"},
+ /* end */{0, NULL}
};
for (unsigned int i = 0; s_netErrorCodes[i].m_code != 0; ++i) {
diff --git a/src/lib/arch/win32/XArchWindows.h b/src/lib/arch/win32/XArchWindows.h
index 4fb2a23..5ac71f2 100644
--- a/src/lib/arch/win32/XArchWindows.h
+++ b/src/lib/arch/win32/XArchWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/App.cpp b/src/lib/barrier/App.cpp
index 8a79aa2..2b3eccc 100644
--- a/src/lib/barrier/App.cpp
+++ b/src/lib/barrier/App.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -34,7 +34,6 @@
#if SYSAPI_WIN32
#include "base/IEventQueue.h"
-#include "base/TMethodJob.h"
#endif
#include <iostream>
@@ -79,18 +78,18 @@ App::~App()
void
App::version()
{
- std::cout << argsBase().m_exename << " " << kVersion << std::endl;
- std::cout <<"Protocol version " << kProtocolMajorVersion << "." << kProtocolMinorVersion << std::endl;
- std::cout << kCopyright << std::endl;
+ std::cout << argsBase().m_exename << " " << kVersion << "\n";
+ std::cout <<"Protocol version " << kProtocolMajorVersion << "." << kProtocolMinorVersion << "\n";
+ std::cout << kCopyright << "\n";
}
int
App::run(int argc, char** argv)
-{
+{
#if MAC_OS_X_VERSION_10_7
// dock hide only supported on lion :(
ProcessSerialNumber psn = { 0, kCurrentProcess };
-
+
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
GetCurrentProcess(&psn);
@@ -101,7 +100,7 @@ App::run(int argc, char** argv)
// install application in to arch
appUtil().adoptApp(this);
-
+
// HACK: fail by default (saves us setting result in each catch)
int result = kExitFailed;
@@ -110,7 +109,7 @@ App::run(int argc, char** argv)
}
catch (XExitApp& e) {
// instead of showing a nasty error, just exit with the error code.
- // not sure if i like this behaviour, but it's probably better than
+ // not sure if i like this behaviour, but it's probably better than
// using the exit(int) function!
result = e.getCode();
}
@@ -122,7 +121,7 @@ App::run(int argc, char** argv)
}
appUtil().beforeAppExit();
-
+
return result;
}
@@ -137,7 +136,7 @@ App::daemonMainLoop(int, const char**)
return mainLoop();
}
-void
+void
App::setupFileLogging()
{
if (argsBase().m_logFile != NULL) {
@@ -147,24 +146,24 @@ App::setupFileLogging()
}
}
-void
+void
App::loggingFilterWarning()
{
if (CLOG->getFilter() > CLOG->getConsoleMaxLevel()) {
if (argsBase().m_logFile == NULL) {
- LOG((CLOG_WARN "log messages above %s are NOT sent to console (use file logging)",
+ LOG((CLOG_WARN "log messages above %s are NOT sent to console (use file logging)",
CLOG->getFilterName(CLOG->getConsoleMaxLevel())));
}
}
}
-void
+void
App::initApp(int argc, const char** argv)
{
// parse command line
parseArgs(argc, argv);
-
- DataDirectories::profile(argsBase().m_profileDirectory);
+
+ barrier::DataDirectories::profile(argsBase().m_profileDirectory);
// set log filter
if (!CLOG->setFilter(argsBase().m_logFilter)) {
@@ -173,9 +172,12 @@ App::initApp(int argc, const char** argv)
m_bye(kExitArgs);
}
loggingFilterWarning();
-
+
if (argsBase().m_enableDragDrop) {
LOG((CLOG_INFO "drag and drop enabled"));
+ if (!argsBase().m_dropTarget.empty()) {
+ LOG((CLOG_INFO "drop target: %s", argsBase().m_dropTarget.c_str()));
+ }
}
// setup file logging after parsing args
@@ -226,15 +228,14 @@ App::handleIpcMessage(const Event& e, void*)
}
}
-void
-App::runEventsLoop(void*)
+void App::run_events_loop()
{
m_events->loop();
-
+
#if defined(MAC_OS_X_VERSION_10_7)
-
+
stopCocoaLoop();
-
+
#endif
}
diff --git a/src/lib/barrier/App.h b/src/lib/barrier/App.h
index 8040da8..8e17a71 100644
--- a/src/lib/barrier/App.h
+++ b/src/lib/barrier/App.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -59,7 +59,7 @@ public:
// Parse command line arguments.
virtual void parseArgs(int argc, const char* const* argv) = 0;
-
+
int run(int argc, char** argv);
int daemonMainLoop(int, const char**);
@@ -90,11 +90,11 @@ public:
ARCH_APP_UTIL& appUtil() { return m_appUtil; }
- virtual IArchTaskBarReceiver* taskBarReceiver() const { return m_taskBarReceiver; }
+ virtual IArchTaskBarReceiver* taskBarReceiver() const { return m_taskBarReceiver; }
virtual void setByeFunc(void(*bye)(int)) { m_bye = bye; }
virtual void bye(int error) { m_bye(error); }
-
+
virtual IEventQueue* getEvents() const { return m_events; }
void setSocketMultiplexer(std::unique_ptr<SocketMultiplexer>&& sm) { m_socketMultiplexer = std::move(sm); }
@@ -108,7 +108,7 @@ private:
protected:
void initIpcClient();
void cleanupIpcClient();
- void runEventsLoop(void*);
+ void run_events_loop();
IArchTaskBarReceiver* m_taskBarReceiver;
bool m_suspended;
@@ -135,7 +135,7 @@ public:
virtual void startNode();
virtual int mainLoop();
virtual int foregroundStartup(int argc, char** argv);
- virtual barrier::Screen*
+ virtual barrier::Screen*
createScreen();
virtual void loadConfig();
virtual bool loadConfig(const String& pathname);
@@ -166,7 +166,10 @@ private:
" -l --log <file> write log messages to file.\n" \
" --no-tray disable the system tray icon.\n" \
" --enable-drag-drop enable file drag & drop.\n" \
- " --enable-crypto enable the crypto (ssl) plugin.\n"
+ " --enable-crypto enable the crypto (ssl) plugin (default, deprecated).\n" \
+ " --disable-crypto disable the crypto (ssl) plugin.\n" \
+ " --profile-dir <path> use named profile directory instead.\n" \
+ " --drop-dir <path> use named drop target directory instead.\n"
#define HELP_COMMON_INFO_2 \
" -h, --help display this help and exit.\n" \
@@ -191,12 +194,11 @@ private:
// windows args
# define HELP_SYS_ARGS \
- " [--service <action>] [--relaunch] [--exit-pause]"
+ " [--exit-pause]"
# define HELP_SYS_INFO \
" --service <action> manage the windows service, valid options are:\n" \
" install/uninstall/start/stop\n" \
- " --relaunch persistently relaunches process in current user \n" \
- " session (useful for vista and upward).\n" \
+ " (obsolete, use barrierd instead)\n" \
" --exit-pause wait for key press on exit, can be useful for\n" \
" reading error messages that occur on exit.\n"
#endif
diff --git a/src/lib/barrier/AppUtil.cpp b/src/lib/barrier/AppUtil.cpp
index 3298d7b..d615648 100644
--- a/src/lib/barrier/AppUtil.cpp
+++ b/src/lib/barrier/AppUtil.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -15,11 +15,11 @@
* 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 "barrier/AppUtil.h"
AppUtil* AppUtil::s_instance = nullptr;
-
+
AppUtil::AppUtil() :
m_app(nullptr)
{
diff --git a/src/lib/barrier/AppUtil.h b/src/lib/barrier/AppUtil.h
index 6f5f073..097c7f2 100644
--- a/src/lib/barrier/AppUtil.h
+++ b/src/lib/barrier/AppUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -15,7 +15,7 @@
* 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 "barrier/IAppUtil.h"
@@ -33,7 +33,7 @@ public:
static AppUtil& instance();
static void exitAppStatic(int code) { instance().exitApp(code); }
virtual void beforeAppExit() {}
-
+
private:
IApp* m_app;
static AppUtil* s_instance;
diff --git a/src/lib/barrier/ArgParser.cpp b/src/lib/barrier/ArgParser.cpp
index ec3991c..99cd803 100644
--- a/src/lib/barrier/ArgParser.cpp
+++ b/src/lib/barrier/ArgParser.cpp
@@ -24,7 +24,7 @@
#include "barrier/ArgsBase.h"
#include "base/Log.h"
#include "base/String.h"
-#include "common/PathUtilities.h"
+#include "io/filesystem.h"
#ifdef WINAPI_MSWINDOWS
#include <VersionHelpers.h>
@@ -65,7 +65,9 @@ ArgParser::parseServerArgs(ServerArgs& args, int argc, const char* const* argv)
// save screen change script path
args.m_screenChangeScript = argv[++i];
}
- else {
+ else if (isArg(i, argc, argv, nullptr, "--disable-client-cert-checking")) {
+ args.check_client_certificates = false;
+ } else {
LOG((CLOG_PRINT "%s: unrecognized option `%s'" BYE, args.m_exename.c_str(), argv[i], args.m_exename.c_str()));
return false;
}
@@ -133,10 +135,10 @@ ArgParser::parseClientArgs(ClientArgs& args, int argc, const char* const* argv)
return true;
}
+#if WINAPI_MSWINDOWS
bool
-ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
+ArgParser::parseMSWindowsArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
{
-#if WINAPI_MSWINDOWS
if (isArg(i, argc, argv, NULL, "--service")) {
LOG((CLOG_WARN "obsolete argument --service, use barrierd instead."));
argsBase.m_shouldExit = true;
@@ -153,25 +155,46 @@ ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* con
}
return true;
-#elif WINAPI_XWINDOWS
+}
+#endif
+
+#if WINAPI_CARBON
+bool
+ArgParser::parseCarbonArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
+{
+ // no options for carbon
+ return false;
+}
+#endif
+
+#if WINAPI_XWINDOWS
+bool
+ArgParser::parseXWindowsArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
+{
if (isArg(i, argc, argv, "-display", "--display", 1)) {
// use alternative display
argsBase.m_display = argv[++i];
}
-
else if (isArg(i, argc, argv, NULL, "--no-xinitthreads")) {
argsBase.m_disableXInitThreads = true;
- }
-
- else {
+ } else {
// option not supported here
return false;
}
return true;
+}
+#endif
+
+bool
+ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
+{
+#if WINAPI_MSWINDOWS
+ return parseMSWindowsArg(argsBase, argc, argv, i);
#elif WINAPI_CARBON
- // no options for carbon
- return false;
+ return parseCarbonArg(argsBase, argc, argv, i);
+#elif WINAPI_XWINDOWS
+ return parseXWindowsArg(argsBase, argc, argv, i);
#endif
}
@@ -257,14 +280,20 @@ ArgParser::parseGenericArgs(int argc, const char* const* argv, int& i)
argsBase().m_enableDragDrop = true;
}
}
+ else if (isArg(i, argc, argv, NULL, "--drop-dir")) {
+ argsBase().m_dropTarget = argv[++i];
+ }
else if (isArg(i, argc, argv, NULL, "--enable-crypto")) {
- argsBase().m_enableCrypto = true;
+ LOG((CLOG_INFO "--enable-crypto is used by default. The option is deprecated."));
+ }
+ else if (isArg(i, argc, argv, NULL, "--disable-crypto")) {
+ argsBase().m_enableCrypto = false;
}
else if (isArg(i, argc, argv, NULL, "--profile-dir", 1)) {
- argsBase().m_profileDirectory = argv[++i];
+ argsBase().m_profileDirectory = barrier::fs::u8path(argv[++i]);
}
else if (isArg(i, argc, argv, NULL, "--plugin-dir", 1)) {
- argsBase().m_pluginDirectory = argv[++i];
+ argsBase().m_pluginDirectory = barrier::fs::u8path(argv[++i]);
}
else {
// option not supported here
@@ -349,7 +378,7 @@ ArgParser::splitCommandString(String& command, std::vector<String>& argv)
if (space > leftDoubleQuote && space < rightDoubleQuote) {
ignoreThisSpace = true;
}
- else if (space > rightDoubleQuote){
+ else if (space > rightDoubleQuote) {
searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1);
}
@@ -460,7 +489,13 @@ void
ArgParser::updateCommonArgs(const char* const* argv)
{
argsBase().m_name = ARCH->getHostName();
- argsBase().m_exename = PathUtilities::basename(argv[0]);
+ argsBase().m_exename = parse_exename(argv[0]);
+}
+
+std::string ArgParser::parse_exename(const char* arg)
+{
+ // FIXME: we assume UTF-8 encoding, but on Windows this is not correct
+ return barrier::fs::u8path(arg).filename().u8string();
}
bool
diff --git a/src/lib/barrier/ArgParser.h b/src/lib/barrier/ArgParser.h
index 32300c6..472d93a 100644
--- a/src/lib/barrier/ArgParser.h
+++ b/src/lib/barrier/ArgParser.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
@@ -14,7 +14,7 @@
* 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 "base/String.h"
@@ -41,21 +41,27 @@ public:
const char* name1, const char* name2,
int minRequiredParameters = 0);
static void splitCommandString(String& command, std::vector<String>& argv);
- static bool searchDoubleQuotes(String& command, size_t& left,
+ static bool searchDoubleQuotes(String& command, size_t& left,
size_t& right, size_t startPos = 0);
static void removeDoubleQuotes(String& arg);
static const char** getArgv(std::vector<String>& argsArray);
- static String assembleCommand(std::vector<String>& argsArray,
+ static String assembleCommand(std::vector<String>& argsArray,
String ignoreArg = "", int parametersRequired = 0);
+ static std::string parse_exename(const char* arg);
+
private:
void updateCommonArgs(const char* const* argv);
bool checkUnexpectedArgs();
-
+
static ArgsBase& argsBase() { return *m_argsBase; }
+ bool parseMSWindowsArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i);
+ bool parseCarbonArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i);
+ bool parseXWindowsArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i);
+
private:
App* m_app;
-
+
static ArgsBase* m_argsBase;
};
diff --git a/src/lib/barrier/ArgsBase.cpp b/src/lib/barrier/ArgsBase.cpp
index eb63150..e3e3803 100644
--- a/src/lib/barrier/ArgsBase.cpp
+++ b/src/lib/barrier/ArgsBase.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -39,10 +39,11 @@ m_display(NULL),
m_disableTray(false),
m_enableIpc(false),
m_enableDragDrop(false),
+m_dropTarget(""),
m_shouldExit(false),
m_barrierAddress(),
-m_enableCrypto(false),
-m_profileDirectory(""),
+ m_enableCrypto(true),
+m_profileDirectory(),
m_pluginDirectory("")
{
}
diff --git a/src/lib/barrier/ArgsBase.h b/src/lib/barrier/ArgsBase.h
index 99929b3..cdb5092 100644
--- a/src/lib/barrier/ArgsBase.h
+++ b/src/lib/barrier/ArgsBase.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -19,6 +19,7 @@
#pragma once
#include "base/String.h"
+#include "io/filesystem.h"
class ArgsBase {
public:
@@ -38,6 +39,7 @@ public:
bool m_disableTray;
bool m_enableIpc;
bool m_enableDragDrop;
+ String m_dropTarget;
#if SYSAPI_WIN32
bool m_debugServiceWait;
bool m_pauseOnExit;
@@ -49,6 +51,6 @@ public:
bool m_shouldExit;
String m_barrierAddress;
bool m_enableCrypto;
- String m_profileDirectory;
- String m_pluginDirectory;
+ barrier::fs::path m_profileDirectory;
+ barrier::fs::path m_pluginDirectory;
};
diff --git a/src/lib/barrier/BarrierType.h b/src/lib/barrier/BarrierType.h
new file mode 100644
index 0000000..0a18477
--- /dev/null
+++ b/src/lib/barrier/BarrierType.h
@@ -0,0 +1,26 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_BARRIER_BARRIER_TYPE_H
+#define BARRIER_LIB_BARRIER_BARRIER_TYPE_H
+
+enum class BarrierType {
+ Server,
+ Client
+};
+
+#endif // BARRIER_LIB_BARRIER_BARRIER_TYPE_H
diff --git a/src/lib/barrier/CMakeLists.txt b/src/lib/barrier/CMakeLists.txt
index 6978aef..b60936d 100644
--- a/src/lib/barrier/CMakeLists.txt
+++ b/src/lib/barrier/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/barrier/Chunk.cpp b/src/lib/barrier/Chunk.cpp
index f11bff5..fd69cdb 100644
--- a/src/lib/barrier/Chunk.cpp
+++ b/src/lib/barrier/Chunk.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
diff --git a/src/lib/barrier/Chunk.h b/src/lib/barrier/Chunk.h
index 42b85bf..26a343d 100644
--- a/src/lib/barrier/Chunk.h
+++ b/src/lib/barrier/Chunk.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -17,7 +17,7 @@
#pragma once
-#include "common/basic_types.h"
+#include <cstddef>
class Chunk {
public:
diff --git a/src/lib/barrier/ClientApp.cpp b/src/lib/barrier/ClientApp.cpp
index b1a7661..4b0ef61 100644
--- a/src/lib/barrier/ClientApp.cpp
+++ b/src/lib/barrier/ClientApp.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -37,10 +37,8 @@
#include "base/TMethodEventJob.h"
#include "base/log_outputters.h"
#include "base/EventQueue.h"
-#include "base/TMethodJob.h"
#include "base/Log.h"
#include "common/Version.h"
-#include "common/PathUtilities.h"
#if WINAPI_MSWINDOWS
#include "platform/MSWindowsScreen.h"
@@ -118,23 +116,23 @@ ClientApp::help()
#endif
std::ostringstream buffer;
- buffer << "Start the barrier client and connect to a remote server component." << std::endl
- << std::endl
+ buffer << "Start the barrier client and connect to a remote server component.\n"
+ << "\n"
<< "Usage: " << args().m_exename << " [--yscroll <delta>]" << WINAPI_ARG << HELP_SYS_ARGS
- << HELP_COMMON_ARGS << " <server-address>" << std::endl
- << std::endl
- << "Options:" << std::endl
+ << HELP_COMMON_ARGS << " <server-address>\n"
+ << "\n"
+ << "Options:\n"
<< HELP_COMMON_INFO_1 << WINAPI_INFO << HELP_SYS_INFO
- << " --yscroll <delta> defines the vertical scrolling delta, which is" << std::endl
- << " 120 by default." << std::endl
+ << " --yscroll <delta> defines the vertical scrolling delta, which is\n"
+ << " 120 by default.\n"
<< HELP_COMMON_INFO_2
- << std::endl
- << "Default options are marked with a *" << std::endl
- << std::endl
- << "The server address is of the form: [<hostname>][:<port>]. The hostname" << std::endl
- << "must be the address or hostname of the server. Placing brackets around" << std::endl
- << "an IPv6 address is required when also specifying a port number and " << std::endl
- << "optional otherwise. The default port number is " << kDefaultPort << "." << std::endl;
+ << "\n"
+ << "Default options are marked with a *\n"
+ << "\n"
+ << "The server address is of the form: [<hostname>][:<port>]. The hostname\n"
+ << "must be the address or hostname of the server. Placing brackets around\n"
+ << "an IPv6 address is required when also specifying a port number and \n"
+ << "optional otherwise. The default port number is " << kDefaultPort << ".\n";
LOG((CLOG_PRINT "%s", buffer.str().c_str()));
}
@@ -235,6 +233,9 @@ barrier::Screen*
ClientApp::openClientScreen()
{
barrier::Screen* screen = createScreen();
+ if (!argsBase().m_dropTarget.empty()) {
+ screen->setDropTarget(argsBase().m_dropTarget);
+ }
screen->setEnableDragDrop(argsBase().m_enableDragDrop);
m_events->adoptHandler(m_events->forIScreen().error(),
screen->getEventTarget(),
@@ -449,7 +450,7 @@ ClientApp::mainLoop()
// start client, etc
appUtil().startNode();
-
+
// init ipc client after node start, since create a new screen wipes out
// the event queue (the screen ctors call adoptBuffer).
if (argsBase().m_enableIpc) {
@@ -460,24 +461,21 @@ ClientApp::mainLoop()
// later. the timer installed by startClient() will take care of
// that.
DAEMON_RUNNING(true);
-
+
#if defined(MAC_OS_X_VERSION_10_7)
-
- Thread thread(
- new TMethodJob<ClientApp>(
- this, &ClientApp::runEventsLoop,
- NULL));
-
+
+ Thread thread([this](){ run_events_loop(); });
+
// wait until carbon loop is ready
OSXScreen* screen = dynamic_cast<OSXScreen*>(
m_clientScreen->getPlatformScreen());
screen->waitForCarbonLoop();
-
+
runCocoaApp();
#else
m_events->loop();
#endif
-
+
DAEMON_RUNNING(false);
// close down
@@ -519,7 +517,7 @@ ClientApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc
{
// general initialization
m_serverAddress = new NetworkAddress;
- args().m_exename = PathUtilities::basename(argv[0]);
+ argsBase().m_exename = ArgParser::parse_exename(argv[0]);
// install caller's output filter
if (outputter != NULL) {
@@ -548,7 +546,7 @@ ClientApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc
return result;
}
-void
+void
ClientApp::startNode()
{
// start the client. if this return false then we've failed and
diff --git a/src/lib/barrier/ClientApp.h b/src/lib/barrier/ClientApp.h
index 777f3d3..d1db8d0 100644
--- a/src/lib/barrier/ClientApp.h
+++ b/src/lib/barrier/ClientApp.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -24,7 +24,6 @@ namespace barrier { class Screen; }
class Event;
class Client;
class NetworkAddress;
-class Thread;
class ClientArgs;
class ClientApp : public App {
@@ -64,7 +63,7 @@ public:
void handleClientConnected(const Event&, void*);
void handleClientFailed(const Event& e, void*);
void handleClientDisconnected(const Event&, void*);
- Client* openClient(const String& name, const NetworkAddress& address,
+ Client* openClient(const String& name, const NetworkAddress& address,
barrier::Screen* screen);
void closeClient(Client* client);
bool startClient();
diff --git a/src/lib/barrier/ClientArgs.cpp b/src/lib/barrier/ClientArgs.cpp
index 5c9ed88..9d1d37a 100644
--- a/src/lib/barrier/ClientArgs.cpp
+++ b/src/lib/barrier/ClientArgs.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
diff --git a/src/lib/barrier/ClientArgs.h b/src/lib/barrier/ClientArgs.h
index 70285fa..c11fa28 100644
--- a/src/lib/barrier/ClientArgs.h
+++ b/src/lib/barrier/ClientArgs.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
diff --git a/src/lib/barrier/ClientTaskBarReceiver.cpp b/src/lib/barrier/ClientTaskBarReceiver.cpp
index 2ea6566..ea29f3d 100644
--- a/src/lib/barrier/ClientTaskBarReceiver.cpp
+++ b/src/lib/barrier/ClientTaskBarReceiver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/ClientTaskBarReceiver.h b/src/lib/barrier/ClientTaskBarReceiver.h
index da15154..b79b958 100644
--- a/src/lib/barrier/ClientTaskBarReceiver.h
+++ b/src/lib/barrier/ClientTaskBarReceiver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/Clipboard.cpp b/src/lib/barrier/Clipboard.cpp
index a6a166d..d7ad0b8 100644
--- a/src/lib/barrier/Clipboard.cpp
+++ b/src/lib/barrier/Clipboard.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/Clipboard.h b/src/lib/barrier/Clipboard.h
index 23bea75..5365a8c 100644
--- a/src/lib/barrier/Clipboard.h
+++ b/src/lib/barrier/Clipboard.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/ClipboardChunk.cpp b/src/lib/barrier/ClipboardChunk.cpp
index bc71471..c2ffab0 100644
--- a/src/lib/barrier/ClipboardChunk.cpp
+++ b/src/lib/barrier/ClipboardChunk.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -74,7 +74,7 @@ ClipboardChunk::end(ClipboardID id, UInt32 sequence)
{
ClipboardChunk* end = new ClipboardChunk(CLIPBOARD_CHUNK_META_SIZE);
char* chunk = end->m_chunk;
-
+
chunk[0] = id;
std::memcpy (&chunk[1], &sequence, 4);
chunk[5] = kDataEnd;
@@ -95,7 +95,7 @@ ClipboardChunk::assemble(barrier::IStream* stream,
if (!ProtocolUtil::readf(stream, kMsgDClipboard + 4, &id, &sequence, &mark, &data)) {
return kError;
}
-
+
if (mark == kDataStart) {
s_expectedSize = barrier::string::stringToSizeType(data);
LOG((CLOG_DEBUG "start receiving clipboard data"));
diff --git a/src/lib/barrier/ClipboardChunk.h b/src/lib/barrier/ClipboardChunk.h
index 6402aca..a96877f 100644
--- a/src/lib/barrier/ClipboardChunk.h
+++ b/src/lib/barrier/ClipboardChunk.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
diff --git a/src/lib/barrier/DragInformation.cpp b/src/lib/barrier/DragInformation.cpp
index db28f3d..5a46678 100644
--- a/src/lib/barrier/DragInformation.cpp
+++ b/src/lib/barrier/DragInformation.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -41,7 +41,7 @@ DragInformation::parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, Strin
if (data.find("/", startPos) != string::npos) {
slash = "/";
}
-
+
UInt32 index = 0;
while (index < fileNum) {
findResult1 = data.find(',', startPos);
@@ -51,7 +51,7 @@ DragInformation::parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, Strin
//TODO: file number does not match, something goes wrong
break;
}
-
+
// set filename
if (findResult1 - findResult2 > 1) {
String filename = data.substr(findResult2 + 1,
@@ -61,7 +61,7 @@ DragInformation::parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, Strin
dragFileList.push_back(di);
}
startPos = findResult1 + 1;
-
+
//set filesize
findResult2 = data.find(',', startPos);
if (findResult2 - findResult1 > 1) {
@@ -71,7 +71,7 @@ DragInformation::parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, Strin
dragFileList.at(index).setFilesize(size);
}
startPos = findResult1 + 1;
-
+
++index;
}
@@ -151,8 +151,8 @@ DragInformation::getFileSize(String& filename)
stringstream ss;
ss << size;
-
+
file. close();
-
+
return ss.str();
}
diff --git a/src/lib/barrier/DragInformation.h b/src/lib/barrier/DragInformation.h
index b985bd1..a5d76b0 100644
--- a/src/lib/barrier/DragInformation.h
+++ b/src/lib/barrier/DragInformation.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -28,12 +28,12 @@ class DragInformation {
public:
DragInformation();
~DragInformation() { }
-
+
String& getFilename() { return m_filename; }
void setFilename(String& name) { m_filename = name; }
size_t getFilesize() { return m_filesize; }
void setFilesize(size_t size) { m_filesize = size; }
-
+
static void parseDragInfo(DragFileList& dragFileList, UInt32 fileNum, String data);
static String getDragFileExtension(String filename);
// helper function to setup drag info
diff --git a/src/lib/barrier/DropHelper.cpp b/src/lib/barrier/DropHelper.cpp
index ee5e5ee..af22b52 100644
--- a/src/lib/barrier/DropHelper.cpp
+++ b/src/lib/barrier/DropHelper.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
@@ -18,6 +18,7 @@
#include "barrier/DropHelper.h"
#include "base/Log.h"
+#include "io/filesystem.h"
#include <fstream>
@@ -35,15 +36,15 @@ DropHelper::writeToDir(const String& destination, DragFileList& fileList, String
dropTarget.append("/");
#endif
dropTarget.append(fileList.at(0).getFilename());
- file.open(dropTarget.c_str(), std::ios::out | std::ios::binary);
+ barrier::open_utf8_path(file, dropTarget, std::ios::out | std::ios::binary);
if (!file.is_open()) {
LOG((CLOG_ERR "drop file failed: can not open %s", dropTarget.c_str()));
}
-
+
file.write(data.c_str(), data.size());
file.close();
- LOG((CLOG_DEBUG "%s is saved to %s", fileList.at(0).getFilename().c_str(), destination.c_str()));
+ LOG((CLOG_INFO "dropped file \"%s\" in \"%s\"", fileList.at(0).getFilename().c_str(), destination.c_str()));
fileList.clear();
}
diff --git a/src/lib/barrier/DropHelper.h b/src/lib/barrier/DropHelper.h
index 67facbb..801779c 100644
--- a/src/lib/barrier/DropHelper.h
+++ b/src/lib/barrier/DropHelper.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
diff --git a/src/lib/barrier/FileChunk.cpp b/src/lib/barrier/FileChunk.cpp
index 3a98568..08c489b 100644
--- a/src/lib/barrier/FileChunk.cpp
+++ b/src/lib/barrier/FileChunk.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
diff --git a/src/lib/barrier/FileChunk.h b/src/lib/barrier/FileChunk.h
index bdc2f64..bdb5006 100644
--- a/src/lib/barrier/FileChunk.h
+++ b/src/lib/barrier/FileChunk.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
diff --git a/src/lib/barrier/IApp.h b/src/lib/barrier/IApp.h
index 3a8cd56..0c516b9 100644
--- a/src/lib/barrier/IApp.h
+++ b/src/lib/barrier/IApp.h
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/barrier/IAppUtil.h b/src/lib/barrier/IAppUtil.h
index 39df65d..521bfce 100644
--- a/src/lib/barrier/IAppUtil.h
+++ b/src/lib/barrier/IAppUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -15,7 +15,7 @@
* 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"
diff --git a/src/lib/barrier/IClient.h b/src/lib/barrier/IClient.h
index d9b2194..e1382b7 100644
--- a/src/lib/barrier/IClient.h
+++ b/src/lib/barrier/IClient.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/IClipboard.cpp b/src/lib/barrier/IClipboard.cpp
index 19b4b56..d484121 100644
--- a/src/lib/barrier/IClipboard.cpp
+++ b/src/lib/barrier/IClipboard.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -66,13 +66,13 @@ IClipboard::unmarshall(IClipboard* clipboard, const String& data, Time time)
String
IClipboard::marshall(const IClipboard* clipboard)
{
- // return data format:
+ // return data format:
// 4 bytes => number of formats included
// 4 bytes => format enum
// 4 bytes => clipboard data size n
// n bytes => clipboard data
// back to the second 4 bytes if there is another format
-
+
assert(clipboard != NULL);
String data;
diff --git a/src/lib/barrier/IClipboard.h b/src/lib/barrier/IClipboard.h
index e11b264..436b21b 100644
--- a/src/lib/barrier/IClipboard.h
+++ b/src/lib/barrier/IClipboard.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/IKeyState.cpp b/src/lib/barrier/IKeyState.cpp
index 5d1114c..e89c0e9 100644
--- a/src/lib/barrier/IKeyState.cpp
+++ b/src/lib/barrier/IKeyState.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/IKeyState.h b/src/lib/barrier/IKeyState.h
index b9d4706..e7f88fa 100644
--- a/src/lib/barrier/IKeyState.h
+++ b/src/lib/barrier/IKeyState.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -122,14 +122,14 @@ public:
complete and false if normal key processing should continue.
*/
virtual bool fakeCtrlAltDel() = 0;
-
+
//! Fake a media key
/*!
Synthesizes a media key down and up. Only Mac would implement this by
use cocoa appkit framework.
*/
virtual bool fakeMediaKey(KeyID id) = 0;
-
+
//@}
//! @name accessors
//@{
diff --git a/src/lib/barrier/INode.h b/src/lib/barrier/INode.h
index 2e78f7c..02fd9de 100644
--- a/src/lib/barrier/INode.h
+++ b/src/lib/barrier/INode.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -21,5 +21,5 @@
#include "common/IInterface.h"
class INode : IInterface {
-
+
};
diff --git a/src/lib/barrier/IPlatformScreen.cpp b/src/lib/barrier/IPlatformScreen.cpp
index d1d9f78..a037f75 100644
--- a/src/lib/barrier/IPlatformScreen.cpp
+++ b/src/lib/barrier/IPlatformScreen.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2016 Symless.
- *
+ *
* 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 COPYING 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
diff --git a/src/lib/barrier/IPlatformScreen.h b/src/lib/barrier/IPlatformScreen.h
index 440e218..995ff73 100644
--- a/src/lib/barrier/IPlatformScreen.h
+++ b/src/lib/barrier/IPlatformScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -197,7 +197,8 @@ public:
virtual void fakeDraggingFiles(DragFileList fileList) = 0;
virtual const String&
getDropTarget() const = 0;
-
+ virtual void setDropTarget(const String&) = 0;
+
protected:
//! Handle system event
/*!
diff --git a/src/lib/barrier/IPrimaryScreen.cpp b/src/lib/barrier/IPrimaryScreen.cpp
index 4954e4f..2220212 100644
--- a/src/lib/barrier/IPrimaryScreen.cpp
+++ b/src/lib/barrier/IPrimaryScreen.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/IPrimaryScreen.h b/src/lib/barrier/IPrimaryScreen.h
index 7f3fa9c..0cf3688 100644
--- a/src/lib/barrier/IPrimaryScreen.h
+++ b/src/lib/barrier/IPrimaryScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/IScreen.h b/src/lib/barrier/IScreen.h
index 47d6578..a1e7c47 100644
--- a/src/lib/barrier/IScreen.h
+++ b/src/lib/barrier/IScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -66,6 +66,6 @@ public:
Return the current position of the cursor in \c x and \c y.
*/
virtual void getCursorPos(SInt32& x, SInt32& y) const = 0;
-
+
//@}
};
diff --git a/src/lib/barrier/IScreenSaver.h b/src/lib/barrier/IScreenSaver.h
index fc21ac5..2099f6d 100644
--- a/src/lib/barrier/IScreenSaver.h
+++ b/src/lib/barrier/IScreenSaver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -56,7 +56,7 @@ public:
//! Deactivate screen saver
/*!
- Deactivate (i.e. hide) the screen saver, reseting the screen saver
+ Deactivate (i.e. hide) the screen saver, resetting the screen saver
timer.
*/
virtual void deactivate() = 0;
diff --git a/src/lib/barrier/ISecondaryScreen.h b/src/lib/barrier/ISecondaryScreen.h
index 527ca2e..85da511 100644
--- a/src/lib/barrier/ISecondaryScreen.h
+++ b/src/lib/barrier/ISecondaryScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/KeyMap.cpp b/src/lib/barrier/KeyMap.cpp
index 621e747..7d53deb 100644
--- a/src/lib/barrier/KeyMap.cpp
+++ b/src/lib/barrier/KeyMap.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2005 Chris Schoeneman
- *
+ *
* 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
@@ -733,7 +733,7 @@ KeyMap::keyForModifier(KeyButton button, SInt32 group,
assert(modifierBit >= 0 && modifierBit < kKeyModifierNumBits);
assert(group >= 0 && group < getNumGroups());
- // find a key that generates the given modifier in the given group
+ // find a key that generates the given modifier in the given group
// but doesn't use the given button, presumably because we're trying
// to generate a KeyID that's only bound the the given button.
// this is important when a shift button is modified by shift; we
@@ -989,7 +989,7 @@ KeyMap::addKeystrokes(EKeystroke type, const KeyItem& keyItem,
}
}
break;
-
+
case kKeystrokeRelease:
keystrokes.push_back(Keystroke(button, false, false, data));
if (keyItem.m_generates != 0 && !keyItem.m_lock) {
@@ -1011,19 +1011,19 @@ KeyMap::addKeystrokes(EKeystroke type, const KeyItem& keyItem,
}
}
break;
-
+
case kKeystrokeRepeat:
keystrokes.push_back(Keystroke(button, false, true, data));
keystrokes.push_back(Keystroke(button, true, true, data));
// no modifier changes on key repeat
break;
-
+
case kKeystrokeClick:
keystrokes.push_back(Keystroke(button, true, false, data));
keystrokes.push_back(Keystroke(button, false, false, data));
// no modifier changes on key click
break;
-
+
case kKeystrokeModify:
case kKeystrokeUnmodify:
if (keyItem.m_lock) {
diff --git a/src/lib/barrier/KeyMap.h b/src/lib/barrier/KeyMap.h
index b6eb865..bc72020 100644
--- a/src/lib/barrier/KeyMap.h
+++ b/src/lib/barrier/KeyMap.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2005 Chris Schoeneman
- *
+ *
* 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
@@ -24,7 +24,9 @@
#include "common/stdset.h"
#include "common/stdvector.h"
+#ifdef BARRIER_TEST_ENV
#include <gtest/gtest_prod.h>
+#endif
namespace barrier {
@@ -320,13 +322,14 @@ public:
Converts a string into a modifier mask. Returns \c true on success
and \c false if the string cannot be parsed. The modifiers plus any
remaining leading and trailing whitespace is stripped from the input
- string.
+ string.
*/
static bool parseModifiers(String&, KeyModifierMask&);
//@}
private:
+#ifdef BARRIER_TEST_ENV
FRIEND_TEST(KeyMapTests,
findBestKey_requiredDown_matchExactFirstItem);
FRIEND_TEST(KeyMapTests,
@@ -340,6 +343,7 @@ private:
FRIEND_TEST(KeyMapTests,
findBestKey_onlyOneRequiredDown_matchTwoRequiredChangesItem);
FRIEND_TEST(KeyMapTests, findBestKey_noRequiredDown_cannotMatch);
+#endif
private:
//! Ways to synthesize a key
@@ -351,7 +355,7 @@ private:
kKeystrokeModify, //!< Synthesize pressing a modifier
kKeystrokeUnmodify //!< Synthesize releasing a modifier
};
-
+
// A list of ways to synthesize a KeyID
typedef std::vector<KeyItemList> KeyEntryList;
diff --git a/src/lib/barrier/KeyState.cpp b/src/lib/barrier/KeyState.cpp
index fc5579d..4c04277 100644
--- a/src/lib/barrier/KeyState.cpp
+++ b/src/lib/barrier/KeyState.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -529,7 +529,7 @@ KeyState::addActiveModifierCB(KeyID, SInt32 group,
(keyItem.m_generates & context->m_mask) != 0) {
context->m_activeModifiers.insert(std::make_pair(
keyItem.m_generates, keyItem));
- }
+ }
}
void
@@ -581,10 +581,10 @@ KeyState::fakeKeyDown(KeyID id, KeyModifierMask mask, KeyButton serverID)
LOG((CLOG_DEBUG1 "emulating media key"));
fakeMediaKey(id);
}
-
+
return;
}
-
+
KeyButton localID = (KeyButton)(keyItem->m_button & kButtonMask);
updateModifierKeyState(localID, oldActiveModifiers, m_activeModifiers);
if (localID != 0) {
diff --git a/src/lib/barrier/KeyState.h b/src/lib/barrier/KeyState.h
index 737d515..6f32b5d 100644
--- a/src/lib/barrier/KeyState.h
+++ b/src/lib/barrier/KeyState.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -74,7 +74,7 @@ public:
virtual void fakeAllKeysUp();
virtual bool fakeCtrlAltDel() = 0;
virtual bool fakeMediaKey(KeyID id);
-
+
virtual bool isKeyDown(KeyButton) const;
virtual KeyModifierMask
getActiveModifiers() const;
@@ -157,7 +157,7 @@ public:
AddActiveModifierContext& operator=(const AddActiveModifierContext&);
};
private:
-
+
class ButtonToKeyLess {
public:
bool operator()(const barrier::KeyMap::ButtonToKeyMap::value_type& a,
diff --git a/src/lib/barrier/PacketStreamFilter.cpp b/src/lib/barrier/PacketStreamFilter.cpp
index 16f0fe7..5955b6c 100644
--- a/src/lib/barrier/PacketStreamFilter.cpp
+++ b/src/lib/barrier/PacketStreamFilter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -17,6 +17,7 @@
*/
#include "barrier/PacketStreamFilter.h"
+#include "barrier/protocol_types.h"
#include "base/IEventQueue.h"
#include "mt/Lock.h"
#include "base/TMethodEventJob.h"
@@ -133,8 +134,7 @@ PacketStreamFilter::isReadyNoLock() const
return (m_size != 0 && m_buffer.getSize() >= m_size);
}
-void
-PacketStreamFilter::readPacketSize()
+bool PacketStreamFilter::readPacketSize()
{
// note -- m_mutex must be locked on entry
@@ -146,7 +146,13 @@ PacketStreamFilter::readPacketSize()
((UInt32)buffer[1] << 16) |
((UInt32)buffer[2] << 8) |
(UInt32)buffer[3];
+
+ if (m_size > PROTOCOL_MAX_MESSAGE_LENGTH) {
+ m_events->addEvent(Event(m_events->forIStream().inputFormatError(), getEventTarget()));
+ return false;
+ }
}
+ return true;
}
bool
@@ -160,13 +166,17 @@ PacketStreamFilter::readMore()
UInt32 n = getStream()->read(buffer, sizeof(buffer));
while (n > 0) {
m_buffer.write(buffer, n);
+
+ // if we don't yet have the next packet size then get it, if possible.
+ // Note that we can't wait for whole pending data to arrive because it may be huge in
+ // case of malicious or erroneous peer.
+ if (!readPacketSize()) {
+ break;
+ }
+
n = getStream()->read(buffer, sizeof(buffer));
}
- // if we don't yet have the next packet size then get it,
- // if possible.
- readPacketSize();
-
// note if we now have a whole packet
bool isReady = isReadyNoLock();
diff --git a/src/lib/barrier/PacketStreamFilter.h b/src/lib/barrier/PacketStreamFilter.h
index bcbd604..0c4bb04 100644
--- a/src/lib/barrier/PacketStreamFilter.h
+++ b/src/lib/barrier/PacketStreamFilter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -24,7 +24,7 @@
class IEventQueue;
-//! Packetizing stream filter
+//! Packetizing stream filter
/*!
Filters a stream to read and write packets.
*/
@@ -47,7 +47,9 @@ protected:
private:
bool isReadyNoLock() const;
- void readPacketSize();
+
+ // returns false on erroneous packet size
+ bool readPacketSize();
bool readMore();
private:
diff --git a/src/lib/barrier/PlatformScreen.cpp b/src/lib/barrier/PlatformScreen.cpp
index b0fdc75..d72e69a 100644
--- a/src/lib/barrier/PlatformScreen.cpp
+++ b/src/lib/barrier/PlatformScreen.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/PlatformScreen.h b/src/lib/barrier/PlatformScreen.h
index 38bf8de..19a3da1 100644
--- a/src/lib/barrier/PlatformScreen.h
+++ b/src/lib/barrier/PlatformScreen.h
@@ -101,6 +101,7 @@ public:
virtual void fakeDraggingFiles(DragFileList fileList) { throw std::runtime_error("fakeDraggingFiles not implemented"); }
virtual const String&
getDropTarget() const { throw std::runtime_error("getDropTarget not implemented"); }
+ virtual void setDropTarget(const String&) { throw std::runtime_error("setDropTarget not implemented"); }
protected:
//! Update mouse buttons
diff --git a/src/lib/barrier/PortableTaskBarReceiver.cpp b/src/lib/barrier/PortableTaskBarReceiver.cpp
index 384cacd..e9a5f40 100644
--- a/src/lib/barrier/PortableTaskBarReceiver.cpp
+++ b/src/lib/barrier/PortableTaskBarReceiver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -111,7 +111,7 @@ PortableTaskBarReceiver::getToolTip() const
case kNotWorking:
return barrier::string::sprintf("%s: %s",
kAppVersion, m_errorMessage.c_str());
-
+
case kNotConnected:
return barrier::string::sprintf("%s: Unknown", kAppVersion);
diff --git a/src/lib/barrier/PortableTaskBarReceiver.h b/src/lib/barrier/PortableTaskBarReceiver.h
index d335e44..3db27ba 100644
--- a/src/lib/barrier/PortableTaskBarReceiver.h
+++ b/src/lib/barrier/PortableTaskBarReceiver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/ProtocolUtil.cpp b/src/lib/barrier/ProtocolUtil.cpp
index e742687..5a71010 100644
--- a/src/lib/barrier/ProtocolUtil.cpp
+++ b/src/lib/barrier/ProtocolUtil.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -19,6 +19,8 @@
#include "barrier/ProtocolUtil.h"
#include "io/IStream.h"
#include "base/Log.h"
+#include "barrier/protocol_types.h"
+#include "barrier/XBarrier.h"
#include "common/stdvector.h"
#include "base/String.h"
@@ -80,7 +82,7 @@ ProtocolUtil::vwritef(barrier::IStream* stream,
// fill buffer
UInt8* buffer = new UInt8[size];
- writef(buffer, fmt, args);
+ writef_void(buffer, fmt, args);
try {
// write buffer
@@ -159,6 +161,10 @@ ProtocolUtil::vreadf(barrier::IStream* stream, const char* fmt, va_list args)
(static_cast<UInt32>(buffer[2]) << 8) |
static_cast<UInt32>(buffer[3]);
+ if (n > PROTOCOL_MAX_LIST_LENGTH) {
+ throw XBadClient("Too long message received");
+ }
+
// convert it
void* v = va_arg(args, void*);
switch (len) {
@@ -211,6 +217,10 @@ ProtocolUtil::vreadf(barrier::IStream* stream, const char* fmt, va_list args)
(static_cast<UInt32>(buffer[2]) << 8) |
static_cast<UInt32>(buffer[3]);
+ if (len > PROTOCOL_MAX_STRING_LENGTH) {
+ throw XBadClient("Too long message received");
+ }
+
// use a fixed size buffer if its big enough
const bool useFixed = (len <= sizeof(buffer));
@@ -339,7 +349,7 @@ ProtocolUtil::getLength(const char* fmt, va_list args)
}
void
-ProtocolUtil::writef(void* buffer, const char* fmt, va_list args)
+ProtocolUtil::writef_void(void* buffer, const char* fmt, va_list args)
{
UInt8* dst = static_cast<UInt8*>(buffer);
diff --git a/src/lib/barrier/ProtocolUtil.h b/src/lib/barrier/ProtocolUtil.h
index 9930cfc..af4fea8 100644
--- a/src/lib/barrier/ProtocolUtil.h
+++ b/src/lib/barrier/ProtocolUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -38,7 +38,7 @@ public:
regular characters and format specifiers. Format specifiers
begin with \%. All characters not part of a format specifier
are regular and are transmitted unchanged.
-
+
Format specifiers are:
- \%\% -- literal `\%'
- \%1i -- converts integer argument to 1 byte integer
@@ -58,7 +58,7 @@ public:
Read formatted binary data from a buffer. This performs the
reverse operation of writef(). Returns true if the entire
format was successfully parsed, false otherwise.
-
+
Format specifiers are:
- \%\% -- read (and discard) a literal `\%'
- \%1i -- reads a 1 byte integer; argument is a SInt32* or UInt32*
@@ -79,7 +79,7 @@ private:
const char* fmt, va_list);
static UInt32 getLength(const char* fmt, va_list);
- static void writef(void*, const char* fmt, va_list);
+ static void writef_void(void*, const char* fmt, va_list);
static UInt32 eatLength(const char** fmt);
static void read(barrier::IStream*, void*, UInt32);
};
diff --git a/src/lib/barrier/Screen.cpp b/src/lib/barrier/Screen.cpp
index 32442f6..2a2c877 100644
--- a/src/lib/barrier/Screen.cpp
+++ b/src/lib/barrier/Screen.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -376,7 +376,7 @@ Screen::isLockedToScreen() const
if (buttonID != kButtonLeft) {
LOG((CLOG_DEBUG "locked by mouse buttonID: %d", buttonID));
}
-
+
if (m_enableDragDrop) {
return (buttonID == kButtonLeft) ? false : true;
}
@@ -466,6 +466,12 @@ Screen::getDropTarget() const
return m_screen->getDropTarget();
}
+void
+Screen::setDropTarget(const String& target)
+{
+ return m_screen->setDropTarget(target);
+}
+
void*
Screen::getEventTarget() const
{
diff --git a/src/lib/barrier/Screen.h b/src/lib/barrier/Screen.h
index b16feff..1c8e7de 100644
--- a/src/lib/barrier/Screen.h
+++ b/src/lib/barrier/Screen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -42,7 +42,7 @@ public:
Screen(IPlatformScreen* platformScreen, IEventQueue* events);
virtual ~Screen();
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
Screen() : m_mock(true) { }
#endif
@@ -223,7 +223,7 @@ public:
//! Change dragging status
void setDraggingStarted(bool started);
-
+
//! Fake a files dragging operation
void startDraggingFiles(DragFileList& fileList);
@@ -278,7 +278,7 @@ public:
//! Test if file is dragged on primary screen
bool isDraggingStarted() const;
-
+
//! Test if file is dragged on secondary screen
bool isFakeDraggingStarted() const;
@@ -290,6 +290,8 @@ public:
//! Get the drop target directory
const String& getDropTarget() const;
+ //! Set the drop target directory
+ void setDropTarget(const String&);
//@}
@@ -299,7 +301,7 @@ public:
virtual void getShape(SInt32& x, SInt32& y,
SInt32& width, SInt32& height) const;
virtual void getCursorPos(SInt32& x, SInt32& y) const;
-
+
IPlatformScreen* getPlatformScreen() { return m_screen; }
protected:
diff --git a/src/lib/barrier/ServerApp.cpp b/src/lib/barrier/ServerApp.cpp
index 18cf935..71158ce 100644
--- a/src/lib/barrier/ServerApp.cpp
+++ b/src/lib/barrier/ServerApp.cpp
@@ -34,13 +34,11 @@
#include "base/EventQueue.h"
#include "base/log_outputters.h"
#include "base/FunctionEventJob.h"
-#include "base/TMethodJob.h"
#include "base/IEventQueue.h"
#include "base/Log.h"
#include "base/TMethodEventJob.h"
#include "common/Version.h"
#include "common/DataDirectories.h"
-#include "common/PathUtilities.h"
#if SYSAPI_WIN32
#include "arch/win32/ArchMiscWindows.h"
@@ -128,30 +126,43 @@ ServerApp::help()
# define WINAPI_INFO ""
#endif
+ // refer to custom profile directory even if not saved yet
+ barrier::fs::path profile_path = argsBase().m_profileDirectory;
+ if (profile_path.empty()) {
+ profile_path = barrier::DataDirectories::profile();
+ }
+
+ auto usr_config_path = (profile_path / barrier::fs::u8path(USR_CONFIG_NAME)).u8string();
+ auto sys_config_path = (barrier::DataDirectories::systemconfig() /
+ barrier::fs::u8path(SYS_CONFIG_NAME)).u8string();
+
std::ostringstream buffer;
- buffer << "Start the barrier server component." << std::endl
- << std::endl
+ buffer << "Start the barrier server component.\n"
+ << "\n"
<< "Usage: " << args().m_exename
<< " [--address <address>]"
<< " [--config <pathname>]"
- << WINAPI_ARGS << HELP_SYS_ARGS << HELP_COMMON_ARGS << std::endl
- << std::endl
- << "Options:" << std::endl
- << " -a, --address <address> listen for clients on the given address." << std::endl
- << " -c, --config <pathname> use the named configuration file instead." << std::endl
- << HELP_COMMON_INFO_1 << WINAPI_INFO << HELP_SYS_INFO << HELP_COMMON_INFO_2 << std::endl
- << "Default options are marked with a *" << std::endl
- << std::endl
- << "The argument for --address is of the form: [<hostname>][:<port>]. The" << std::endl
- << "hostname must be the address or hostname of an interface on the system." << std::endl
- << "Placing brackets around an IPv6 address is required when also specifying " << std::endl
- << "a port number and optional otherwise. The default is to listen on all" << std::endl
- << "interfaces using port number " << kDefaultPort << "." << std::endl
- << std::endl
- << "If no configuration file pathname is provided then the first of the" << std::endl
- << "following to load successfully sets the configuration:" << std::endl
- << " " << PathUtilities::concat(DataDirectories::profile(), USR_CONFIG_NAME) << std::endl
- << " " << PathUtilities::concat(DataDirectories::systemconfig(), SYS_CONFIG_NAME) << std::endl;
+ << WINAPI_ARGS << HELP_SYS_ARGS << HELP_COMMON_ARGS << "\n"
+ << "\n"
+ << "Options:\n"
+ << " -a, --address <address> listen for clients on the given address.\n"
+ << " -c, --config <pathname> use the named configuration file instead.\n"
+ << HELP_COMMON_INFO_1
+ << " --disable-client-cert-checking disable client SSL certificate \n"
+ " checking (deprecated)\n"
+ << WINAPI_INFO << HELP_SYS_INFO << HELP_COMMON_INFO_2 << "\n"
+ << "Default options are marked with a *\n"
+ << "\n"
+ << "The argument for --address is of the form: [<hostname>][:<port>]. The\n"
+ << "hostname must be the address or hostname of an interface on the system.\n"
+ << "Placing brackets around an IPv6 address is required when also specifying \n"
+ << "a port number and optional otherwise. The default is to listen on all\n"
+ << "interfaces using port number " << kDefaultPort << ".\n"
+ << "\n"
+ << "If no configuration file pathname is provided then the first of the\n"
+ << "following to load successfully sets the configuration:\n"
+ << " " << usr_config_path << "\n"
+ << " " << sys_config_path << "\n";
LOG((CLOG_PRINT "%s", buffer.str().c_str()));
}
@@ -188,25 +199,25 @@ ServerApp::loadConfig()
// load the default configuration if no explicit file given
else {
- String path = DataDirectories::profile();
+ auto path = barrier::DataDirectories::profile();
if (!path.empty()) {
// complete path
- path = PathUtilities::concat(path, USR_CONFIG_NAME);
+ path /= barrier::fs::u8path(USR_CONFIG_NAME);
// now try loading the user's configuration
- if (loadConfig(path)) {
+ if (loadConfig(path.u8string())) {
loaded = true;
- args().m_configFile = path;
+ args().m_configFile = path.u8string();
}
}
if (!loaded) {
// try the system-wide config file
- path = DataDirectories::systemconfig();
+ path = barrier::DataDirectories::systemconfig();
if (!path.empty()) {
- path = PathUtilities::concat(path, SYS_CONFIG_NAME);
- if (loadConfig(path)) {
+ path /= barrier::fs::u8path(SYS_CONFIG_NAME);
+ if (loadConfig(path.u8string())) {
loaded = true;
- args().m_configFile = path;
+ args().m_configFile = path.u8string();
}
}
}
@@ -496,6 +507,9 @@ barrier::Screen*
ServerApp::openServerScreen()
{
barrier::Screen* screen = createScreen();
+ if (!argsBase().m_dropTarget.empty()) {
+ screen->setDropTarget(argsBase().m_dropTarget);
+ }
screen->setEnableDragDrop(argsBase().m_enableDragDrop);
m_events->adoptHandler(m_events->forIScreen().error(),
screen->getEventTarget(),
@@ -643,11 +657,18 @@ ServerApp::handleResume(const Event&, void*)
ClientListener*
ServerApp::openClientListener(const NetworkAddress& address)
{
+ auto security_level = ConnectionSecurityLevel::PLAINTEXT;
+ if (args().m_enableCrypto) {
+ security_level = ConnectionSecurityLevel::ENCRYPTED;
+ if (args().check_client_certificates) {
+ security_level = ConnectionSecurityLevel::ENCRYPTED_AUTHENTICATED;
+ }
+ }
+
ClientListener* listen = new ClientListener(
address,
new TCPSocketFactory(m_events, getSocketMultiplexer()),
- m_events,
- args().m_enableCrypto);
+ m_events, security_level);
m_events->adoptHandler(
m_events->forClientListener().connected(), listen,
@@ -775,10 +796,7 @@ ServerApp::mainLoop()
#if defined(MAC_OS_X_VERSION_10_7)
- Thread thread(
- new TMethodJob<ServerApp>(
- this, &ServerApp::runEventsLoop,
- NULL));
+ Thread thread([this](){ run_events_loop(); });
// wait until carbon loop is ready
OSXScreen* screen = dynamic_cast<OSXScreen*>(
@@ -823,7 +841,7 @@ ServerApp::runInner(int argc, char** argv, ILogOutputter* outputter, StartupFunc
// general initialization
m_barrierAddress = new NetworkAddress;
args().m_config = new Config(m_events);
- args().m_exename = PathUtilities::basename(argv[0]);
+ args().m_exename = ArgParser::parse_exename(argv[0]);
// install caller's output filter
if (outputter != NULL) {
diff --git a/src/lib/barrier/ServerApp.h b/src/lib/barrier/ServerApp.h
index 528aa24..ca38568 100644
--- a/src/lib/barrier/ServerApp.h
+++ b/src/lib/barrier/ServerApp.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -51,7 +51,7 @@ class ServerApp : public App {
public:
ServerApp(IEventQueue* events, CreateTaskBarReceiverFunc createTaskBarReceiver);
virtual ~ServerApp();
-
+
// Parse server specific command line arguments.
void parseArgs(int argc, const char* const* argv);
@@ -104,7 +104,7 @@ public:
static ServerApp& instance() { return (ServerApp&)App::instance(); }
Server* getServerPtr() { return m_server; }
-
+
Server* m_server;
EServerState m_serverState;
barrier::Screen* m_serverScreen;
diff --git a/src/lib/barrier/ServerArgs.h b/src/lib/barrier/ServerArgs.h
index 6d91233..6323705 100644
--- a/src/lib/barrier/ServerArgs.h
+++ b/src/lib/barrier/ServerArgs.h
@@ -30,4 +30,5 @@ public:
String m_configFile;
Config* m_config;
String m_screenChangeScript;
+ bool check_client_certificates = true;
};
diff --git a/src/lib/barrier/ServerTaskBarReceiver.cpp b/src/lib/barrier/ServerTaskBarReceiver.cpp
index b427cd1..c3ba7cf 100644
--- a/src/lib/barrier/ServerTaskBarReceiver.cpp
+++ b/src/lib/barrier/ServerTaskBarReceiver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -125,7 +125,7 @@ ServerTaskBarReceiver::getToolTip() const
case kNotWorking:
return barrier::string::sprintf("%s: %s",
kAppVersion, m_errorMessage.c_str());
-
+
case kNotConnected:
return barrier::string::sprintf("%s: Waiting for clients", kAppVersion);
diff --git a/src/lib/barrier/ServerTaskBarReceiver.h b/src/lib/barrier/ServerTaskBarReceiver.h
index 3cef9c0..086de8c 100644
--- a/src/lib/barrier/ServerTaskBarReceiver.h
+++ b/src/lib/barrier/ServerTaskBarReceiver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/StreamChunker.cpp b/src/lib/barrier/StreamChunker.cpp
index 579d02f..0f6c0a9 100644
--- a/src/lib/barrier/StreamChunker.cpp
+++ b/src/lib/barrier/StreamChunker.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -42,14 +42,13 @@ bool StreamChunker::s_interruptFile = false;
Mutex* StreamChunker::s_interruptMutex = NULL;
void
-StreamChunker::sendFile(
- char* filename,
+StreamChunker::sendFile(const char* filename,
IEventQueue* events,
void* eventTarget)
{
s_isChunkingFile = true;
-
- std::fstream file(static_cast<char*>(filename), std::ios::in | std::ios::binary);
+
+ std::fstream file(filename, std::ios::in | std::ios::binary);
if (!file.is_open()) {
throw runtime_error("failed to open file");
@@ -76,9 +75,9 @@ StreamChunker::sendFile(
LOG((CLOG_DEBUG "file transmission interrupted"));
break;
}
-
+
events->addEvent(Event(events->forFile().keepAlive(), eventTarget));
-
+
// make sure we don't read too much from the mock data.
if (sentLength + chunkSize > size) {
chunkSize = size - sentLength;
@@ -106,7 +105,7 @@ StreamChunker::sendFile(
events->addEvent(Event(events->forFile().fileChunkSending(), eventTarget, end));
file.close();
-
+
s_isChunkingFile = false;
}
@@ -122,16 +121,16 @@ StreamChunker::sendClipboard(
// send first message (data size)
String dataSize = barrier::string::sizeTypeToString(size);
ClipboardChunk* sizeMessage = ClipboardChunk::start(id, sequence, dataSize);
-
+
events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, sizeMessage));
// send clipboard chunk with a fixed size
size_t sentLength = 0;
size_t chunkSize = g_chunkSize;
-
+
while (true) {
events->addEvent(Event(events->forFile().keepAlive(), eventTarget));
-
+
// make sure we don't read too much from the mock data.
if (sentLength + chunkSize > size) {
chunkSize = size - sentLength;
@@ -139,7 +138,7 @@ StreamChunker::sendClipboard(
String chunk(data.substr(sentLength, chunkSize).c_str(), chunkSize);
ClipboardChunk* dataChunk = ClipboardChunk::data(id, sequence, chunk);
-
+
events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, dataChunk));
sentLength += chunkSize;
@@ -152,7 +151,7 @@ StreamChunker::sendClipboard(
ClipboardChunk* end = ClipboardChunk::end(id, sequence);
events->addEvent(Event(events->forClipboard().clipboardSending(), eventTarget, end));
-
+
LOG((CLOG_DEBUG "sent clipboard size=%d", sentLength));
}
diff --git a/src/lib/barrier/StreamChunker.h b/src/lib/barrier/StreamChunker.h
index ab57c7e..ed5d83c 100644
--- a/src/lib/barrier/StreamChunker.h
+++ b/src/lib/barrier/StreamChunker.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -25,10 +25,7 @@ class Mutex;
class StreamChunker {
public:
- static void sendFile(
- char* filename,
- IEventQueue* events,
- void* eventTarget);
+ static void sendFile(const char* filename, IEventQueue* events, void* eventTarget);
static void sendClipboard(
String& data,
size_t size,
@@ -37,7 +34,7 @@ public:
IEventQueue* events,
void* eventTarget);
static void interruptFile();
-
+
private:
static bool s_isChunkingFile;
static bool s_interruptFile;
diff --git a/src/lib/barrier/XBarrier.cpp b/src/lib/barrier/XBarrier.cpp
index 7fe3577..44593d1 100644
--- a/src/lib/barrier/XBarrier.cpp
+++ b/src/lib/barrier/XBarrier.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -118,6 +118,6 @@ int XExitApp::getCode() const noexcept
String XExitApp::getWhat() const noexcept
{
return format(
- "XExitApp", "exiting with code %{1}",
+ "XExitApp", "exiting with code %{1}",
barrier::string::sprintf("%d", m_code).c_str());
}
diff --git a/src/lib/barrier/XBarrier.h b/src/lib/barrier/XBarrier.h
index fef931e..b7a3891 100644
--- a/src/lib/barrier/XBarrier.h
+++ b/src/lib/barrier/XBarrier.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -113,8 +113,8 @@ private:
//! Generic exit eception
/*!
-Thrown when we want to abort, with the opportunity to clean up. This is a
-little bit of a hack, but it's a better way of exiting, than just calling
+Thrown when we want to abort, with the opportunity to clean up. This is a
+little bit of a hack, but it's a better way of exiting, than just calling
exit(int).
*/
class XExitApp : public XBarrier {
@@ -127,7 +127,7 @@ public:
protected:
virtual std::string getWhat() const noexcept;
-
+
private:
int m_code;
};
diff --git a/src/lib/barrier/XScreen.cpp b/src/lib/barrier/XScreen.cpp
index 3398423..bb5c860 100644
--- a/src/lib/barrier/XScreen.cpp
+++ b/src/lib/barrier/XScreen.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/XScreen.h b/src/lib/barrier/XScreen.h
index f8fe7a7..7033556 100644
--- a/src/lib/barrier/XScreen.h
+++ b/src/lib/barrier/XScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/clipboard_types.h b/src/lib/barrier/clipboard_types.h
index 54f2732..7de608c 100644
--- a/src/lib/barrier/clipboard_types.h
+++ b/src/lib/barrier/clipboard_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/key_types.cpp b/src/lib/barrier/key_types.cpp
index 902670d..33ee3eb 100644
--- a/src/lib/barrier/key_types.cpp
+++ b/src/lib/barrier/key_types.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -17,6 +17,7 @@
*/
#include "barrier/key_types.h"
+#include <cstddef>
const KeyNameMapEntry kKeyNameMap[] = {
{ "AltGr", kKeyAltGr },
@@ -43,6 +44,7 @@ const KeyNameMapEntry kKeyNameMap[] = {
{ "Control_R", kKeyControl_R },
{ "Delete", kKeyDelete },
{ "Down", kKeyDown },
+ { "EisuToggle", kKeyEisuToggle },
{ "Eject", kKeyEject },
{ "End", kKeyEnd },
{ "Escape", kKeyEscape },
@@ -89,6 +91,7 @@ const KeyNameMapEntry kKeyNameMap[] = {
{ "Hyper_L", kKeyHyper_L },
{ "Hyper_R", kKeyHyper_R },
{ "Insert", kKeyInsert },
+ { "Kana", kKeyKana },
{ "KP_0", kKeyKP_0 },
{ "KP_1", kKeyKP_1 },
{ "KP_2", kKeyKP_2 },
@@ -130,6 +133,7 @@ const KeyNameMapEntry kKeyNameMap[] = {
{ "Menu", kKeyMenu },
{ "Meta_L", kKeyMeta_L },
{ "Meta_R", kKeyMeta_R },
+ { "Muhenkan", kKeyMuhenkan },
{ "NumLock", kKeyNumLock },
{ "PageDown", kKeyPageDown },
{ "PageUp", kKeyPageUp },
@@ -191,6 +195,12 @@ const KeyNameMapEntry kKeyNameMap[] = {
{ "Bar", 0x007c },
{ "BraceR", 0x007d },
{ "Tilde", 0x007e },
+ { "Copy", kKeyCopy },
+ { "Cut", kKeyCut },
+ { "Open", kKeyOpen },
+ { "Paste", kKeyPaste },
+ { "Props", kKeyProps },
+ { "Front", kKeyFront },
{ NULL, 0 },
};
diff --git a/src/lib/barrier/key_types.h b/src/lib/barrier/key_types.h
index 7a8ea53..863dc17 100644
--- a/src/lib/barrier/key_types.h
+++ b/src/lib/barrier/key_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -109,11 +109,13 @@ static const KeyID kKeyPause = 0xEF13; /* Pause, hold */
static const KeyID kKeyScrollLock = 0xEF14;
static const KeyID kKeySysReq = 0xEF15;
static const KeyID kKeyEscape = 0xEF1B;
+static const KeyID kKeyMuhenkan = 0xEF22; /* Cancel Conversion */
static const KeyID kKeyHenkan = 0xEF23; /* Start/Stop Conversion */
static const KeyID kKeyKana = 0xEF26; /* Kana */
static const KeyID kKeyHiraganaKatakana = 0xEF27; /* Hiragana/Katakana toggle */
static const KeyID kKeyZenkaku = 0xEF2A; /* Zenkaku/Hankaku */
static const KeyID kKeyKanzi = 0xEF2A; /* Kanzi */
+static const KeyID kKeyEisuToggle = 0xEF30; /* Alphanumeric toggle */
static const KeyID kKeyHangul = 0xEF31; /* Hangul */
static const KeyID kKeyHanja = 0xEF34; /* Hanja */
static const KeyID kKeyDelete = 0xEFFF; /* Delete, rubout */
@@ -170,7 +172,7 @@ static const KeyID kKeyKP_Separator= 0xEFAC; /* separator, often comma */
static const KeyID kKeyKP_Subtract = 0xEFAD;
static const KeyID kKeyKP_Decimal = 0xEFAE;
static const KeyID kKeyKP_Divide = 0xEFAF;
-static const KeyID kKeyKP_0 = 0xEFB0;
+static const KeyID kKeyKP_0 = 0xEFB0;
static const KeyID kKeyKP_1 = 0xEFB1;
static const KeyID kKeyKP_2 = 0xEFB2;
static const KeyID kKeyKP_3 = 0xEFB3;
@@ -234,6 +236,13 @@ static const KeyID kKeySuper_R = 0xEFEC; /* Right super */
static const KeyID kKeyHyper_L = 0xEFED; /* Left hyper */
static const KeyID kKeyHyper_R = 0xEFEE; /* Right hyper */
+static const KeyID kKeyCopy = 0x1008EF57;
+static const KeyID kKeyCut = 0x1008EF58;
+static const KeyID kKeyOpen = 0x1008EF6b;
+static const KeyID kKeyPaste = 0x1008EF6d;
+static const KeyID kKeyProps = 0x1005EF70;
+static const KeyID kKeyFront = 0x1005EF71;
+
// multi-key character composition
static const KeyID kKeyCompose = 0xEF20;
static const KeyID kKeyDeadGrave = 0x0300;
@@ -284,6 +293,8 @@ static const KeyID kKeyAppUser1 = 0xE0B6;
static const KeyID kKeyAppUser2 = 0xE0B7;
static const KeyID kKeyBrightnessDown = 0xE0B8;
static const KeyID kKeyBrightnessUp = 0xE0B9;
+static const KeyID kKeyKbdBrightnessDown = 0xE0BA;
+static const KeyID kKeyKbdBrightnessUp = 0xE0BB;
static const KeyID kKeyMissionControl = 0xE0C0;
static const KeyID kKeyLaunchpad = 0xE0C1;
diff --git a/src/lib/barrier/mouse_types.h b/src/lib/barrier/mouse_types.h
index 62a2396..ccb18ac 100644
--- a/src/lib/barrier/mouse_types.h
+++ b/src/lib/barrier/mouse_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/option_types.h b/src/lib/barrier/option_types.h
index 6323e37..42103d4 100644
--- a/src/lib/barrier/option_types.h
+++ b/src/lib/barrier/option_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/protocol_types.cpp b/src/lib/barrier/protocol_types.cpp
index 07acf61..9710841 100644
--- a/src/lib/barrier/protocol_types.cpp
+++ b/src/lib/barrier/protocol_types.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/protocol_types.h b/src/lib/barrier/protocol_types.h
index bc5e037..f730606 100644
--- a/src/lib/barrier/protocol_types.h
+++ b/src/lib/barrier/protocol_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -20,6 +20,8 @@
#include "base/EventTypes.h"
+#include <cstdint>
+
// protocol version number
// 1.0: initial protocol
// 1.1: adds KeyCode to key press, release, and repeat
@@ -51,6 +53,12 @@ static const double kKeepAlivesUntilDeath = 3.0;
static const double kHeartRate = -1.0;
static const double kHeartBeatsUntilDeath = 3.0;
+// Messages of very large size indicate a likely protocol error. We don't parse such messages and
+// drop connection instead. Note that e.g. the clipboard messages are already limited to 32kB.
+static constexpr std::uint32_t PROTOCOL_MAX_MESSAGE_LENGTH = 4 * 1024 * 1024;
+static constexpr std::uint32_t PROTOCOL_MAX_LIST_LENGTH = 1024 * 1024;
+static constexpr std::uint32_t PROTOCOL_MAX_STRING_LENGTH = 1024 * 1024;
+
// direction constants
enum EDirection {
kNoDirection,
@@ -267,8 +275,8 @@ extern const char* kMsgDSetOptions;
// 2 means the file transfer is finished.
extern const char* kMsgDFileTransfer;
-// drag infomation: primary <-> secondary
-// transfer drag infomation. The first 2 bytes are used for storing
+// drag information: primary <-> secondary
+// transfer drag information. The first 2 bytes are used for storing
// the number of dragging objects. Then the following string consists
// of each object's directory.
extern const char* kMsgDDragInfo;
diff --git a/src/lib/barrier/unix/AppUtilUnix.cpp b/src/lib/barrier/unix/AppUtilUnix.cpp
index a1548d8..272dcf4 100644
--- a/src/lib/barrier/unix/AppUtilUnix.cpp
+++ b/src/lib/barrier/unix/AppUtilUnix.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/barrier/unix/AppUtilUnix.h b/src/lib/barrier/unix/AppUtilUnix.h
index fefcfea..9555ccd 100644
--- a/src/lib/barrier/unix/AppUtilUnix.h
+++ b/src/lib/barrier/unix/AppUtilUnix.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -28,7 +28,7 @@ class AppUtilUnix : public AppUtil {
public:
AppUtilUnix(IEventQueue* events);
virtual ~AppUtilUnix();
-
+
int run(int argc, char** argv);
void startNode();
};
diff --git a/src/lib/barrier/win32/AppUtilWindows.cpp b/src/lib/barrier/win32/AppUtilWindows.cpp
index 560b029..b19cf15 100644
--- a/src/lib/barrier/win32/AppUtilWindows.cpp
+++ b/src/lib/barrier/win32/AppUtilWindows.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -60,13 +60,13 @@ BOOL WINAPI AppUtilWindows::consoleHandler(DWORD)
}
static
-int
-mainLoopStatic()
+int
+mainLoopStatic()
{
return AppUtil::instance().app().mainLoop();
}
-int
+int
AppUtilWindows::daemonNTMainLoop(int argc, const char** argv)
{
app().initApp(argc, argv);
@@ -74,11 +74,11 @@ AppUtilWindows::daemonNTMainLoop(int argc, const char** argv)
// NB: what the hell does this do?!
app().argsBase().m_backend = false;
-
+
return ArchMiscWindows::runDaemon(mainLoopStatic);
}
-void
+void
AppUtilWindows::exitApp(int code)
{
switch (m_exitMode) {
@@ -97,7 +97,7 @@ int daemonNTMainLoopStatic(int argc, const char** argv)
return AppUtilWindows::instance().daemonNTMainLoop(argc, argv);
}
-int
+int
AppUtilWindows::daemonNTStartup(int, char**)
{
SystemLogger sysLogger(app().daemonName(), false);
@@ -126,7 +126,7 @@ AppUtilWindows::beforeAppExit()
// a new console window, and will normally close on exit (making it so
// that we can't see error messages).
if (app().argsBase().m_pauseOnExit) {
- std::cout << std::endl << "press any key to exit..." << std::endl;
+ std::cout << "\n" << "press any key to exit...\n";
int c = _getch();
}
}
@@ -155,13 +155,13 @@ AppUtilWindows::run(int argc, char** argv)
return app().runInner(argc, argv, NULL, startup);
}
-AppUtilWindows&
+AppUtilWindows&
AppUtilWindows::instance()
{
return (AppUtilWindows&)AppUtil::instance();
}
-void
+void
AppUtilWindows::debugServiceWait()
{
if (app().argsBase().m_debugServiceWait)
@@ -169,8 +169,8 @@ AppUtilWindows::debugServiceWait()
while(true)
{
// this code is only executed when the process is launched via the
- // windows service controller (and --debug-service-wait arg is
- // used). to debug, set a breakpoint on this line so that
+ // windows service controller (and --debug-service-wait arg is
+ // used). to debug, set a breakpoint on this line so that
// execution is delayed until the debugger is attached.
ARCH->sleep(1);
LOG((CLOG_INFO "waiting for debugger to attach"));
@@ -178,7 +178,7 @@ AppUtilWindows::debugServiceWait()
}
}
-void
+void
AppUtilWindows::startNode()
{
app().startNode();
diff --git a/src/lib/barrier/win32/AppUtilWindows.h b/src/lib/barrier/win32/AppUtilWindows.h
index c5da228..23e7919 100644
--- a/src/lib/barrier/win32/AppUtilWindows.h
+++ b/src/lib/barrier/win32/AppUtilWindows.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -39,7 +39,7 @@ public:
virtual ~AppUtilWindows();
int daemonNTStartup(int, char**);
-
+
int daemonNTMainLoop(int argc, const char** argv);
void debugServiceWait();
diff --git a/src/lib/barrier/win32/DaemonApp.cpp b/src/lib/barrier/win32/DaemonApp.cpp
index 482c465..81ec5ff 100644
--- a/src/lib/barrier/win32/DaemonApp.cpp
+++ b/src/lib/barrier/win32/DaemonApp.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -28,7 +28,6 @@
#include "net/SocketMultiplexer.h"
#include "arch/XArch.h"
#include "base/Log.h"
-#include "base/TMethodJob.h"
#include "base/TMethodEventJob.h"
#include "base/EventQueue.h"
#include "base/log_outputters.h"
@@ -87,7 +86,7 @@ DaemonApp::run(int argc, char** argv)
{
// win32 instance needed for threading, etc.
ArchMiscWindows::setInstanceWin32(GetModuleHandle(NULL));
-
+
Arch arch;
arch.init();
@@ -174,7 +173,7 @@ DaemonApp::mainLoop(bool daemonized)
try
{
DAEMON_RUNNING(true);
-
+
if (daemonized) {
m_fileLogOutputter = new FileLogOutputter(logFilename().c_str());
CLOG->insert(m_fileLogOutputter);
@@ -190,19 +189,19 @@ DaemonApp::mainLoop(bool daemonized)
// send logging to gui via ipc, log system adopts outputter.
m_ipcLogOutputter = new IpcLogOutputter(*m_ipcServer, kIpcClientGui, true);
CLOG->insert(m_ipcLogOutputter);
-
+
m_watchdog = new MSWindowsWatchdog(daemonized, false, *m_ipcServer, *m_ipcLogOutputter);
m_watchdog->setFileLogOutputter(m_fileLogOutputter);
-
+
m_events->adoptHandler(
m_events->forIpcServer().messageReceived(), m_ipcServer,
new TMethodEventJob<DaemonApp>(this, &DaemonApp::handleIpcMessage));
m_ipcServer->listen();
-
+
// install the platform event queue to handle service stop events.
m_events->adoptBuffer(new MSWindowsEventQueueBuffer(m_events));
-
+
String command = ARCH->setting("Command");
bool elevate = ARCH->setting("Elevate") == "1";
if (command != "") {
@@ -219,11 +218,11 @@ DaemonApp::mainLoop(bool daemonized)
m_events->removeHandler(
m_events->forIpcServer().messageReceived(), m_ipcServer);
-
+
CLOG->remove(m_ipcLogOutputter);
delete m_ipcLogOutputter;
delete m_ipcServer;
-
+
DAEMON_RUNNING(false);
}
catch (std::exception& e) {
@@ -245,7 +244,7 @@ DaemonApp::logFilename()
{
string logFilename = ARCH->setting("LogFilename");
if (logFilename.empty())
- logFilename = DataDirectories::global() + "\\" + LOG_FILENAME;
+ logFilename = (barrier::DataDirectories::global() / LOG_FILENAME).u8string();
MSWindowsUtil::createDirectory(logFilename, true);
return logFilename;
}
@@ -287,7 +286,7 @@ DaemonApp::handleIpcMessage(const Event& e, void*)
}
delete[] argv;
-
+
String logLevel(argBase->m_logFilter);
if (!logLevel.empty()) {
try {
diff --git a/src/lib/barrier/win32/DaemonApp.h b/src/lib/barrier/win32/DaemonApp.h
index 2a8484b..e0eb385 100644
--- a/src/lib/barrier/win32/DaemonApp.h
+++ b/src/lib/barrier/win32/DaemonApp.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -15,7 +15,7 @@
* 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/Arch.h"
diff --git a/src/lib/base/CMakeLists.txt b/src/lib/base/CMakeLists.txt
index 66ba5a6..9bd4472 100644
--- a/src/lib/base/CMakeLists.txt
+++ b/src/lib/base/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/base/ELevel.h b/src/lib/base/ELevel.h
index ec0f94f..45b51d7 100644
--- a/src/lib/base/ELevel.h
+++ b/src/lib/base/ELevel.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/Event.cpp b/src/lib/base/Event.cpp
index f2c1a12..cc548fc 100644
--- a/src/lib/base/Event.cpp
+++ b/src/lib/base/Event.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/Event.h b/src/lib/base/Event.h
index 2741813..38a2cf1 100644
--- a/src/lib/base/Event.h
+++ b/src/lib/base/Event.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -71,7 +71,7 @@ public:
Deletes event data for the given event (using free()).
*/
static void deleteData(const Event&);
-
+
//! Set data (non-POD)
/*!
Set non-POD (non plain old data), where delete is called when the event
@@ -114,7 +114,7 @@ public:
Returns the event flags.
*/
Flags getFlags() const;
-
+
//@}
private:
diff --git a/src/lib/base/EventQueue.cpp b/src/lib/base/EventQueue.cpp
index 2429522..7764ed8 100644
--- a/src/lib/base/EventQueue.cpp
+++ b/src/lib/base/EventQueue.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -100,7 +100,7 @@ EventQueue::~EventQueue()
delete m_buffer;
delete m_readyCondVar;
delete m_readyMutex;
-
+
ARCH->setSignalHandler(Arch::kINTERRUPT, NULL, NULL);
ARCH->setSignalHandler(Arch::kTERMINATE, NULL, NULL);
}
@@ -121,7 +121,7 @@ EventQueue::loop()
addEventToBuffer(event);
m_pending.pop();
}
-
+
Event event;
getEvent(event);
while (event.getType() != Event::kQuit) {
@@ -298,7 +298,7 @@ EventQueue::addEvent(const Event& event)
default:
break;
}
-
+
if ((event.getFlags() & Event::kDeliverImmediately) != 0) {
dispatchEvent(event);
Event::deleteData(event);
@@ -315,10 +315,10 @@ void
EventQueue::addEventToBuffer(const Event& event)
{
std::lock_guard<std::mutex> lock(m_mutex);
-
+
// store the event's data locally
UInt32 eventID = saveEvent(event);
-
+
// add it
if (!m_buffer->addEvent(eventID)) {
// failed to send event
@@ -568,7 +568,7 @@ EventQueue::waitForReady() const
{
double timeout = ARCH->time() + 10;
Lock lock(m_readyMutex);
-
+
while (!m_readyCondVar->wait()) {
if (ARCH->time() > timeout) {
throw std::runtime_error("event queue is not ready within 5 sec");
diff --git a/src/lib/base/EventQueue.h b/src/lib/base/EventQueue.h
index 842c5ca..55b6fce 100644
--- a/src/lib/base/EventQueue.h
+++ b/src/lib/base/EventQueue.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -71,7 +71,7 @@ private:
double getNextTimerTimeout() const;
void addEventToBuffer(const Event& event);
bool parent_requests_shutdown() const;
-
+
private:
class Timer {
public:
diff --git a/src/lib/base/EventTypes.cpp b/src/lib/base/EventTypes.cpp
index 2ba2077..173a0a9 100644
--- a/src/lib/base/EventTypes.cpp
+++ b/src/lib/base/EventTypes.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -56,6 +56,7 @@ REGISTER_EVENT(IStream, outputFlushed)
REGISTER_EVENT(IStream, outputError)
REGISTER_EVENT(IStream, inputShutdown)
REGISTER_EVENT(IStream, outputShutdown)
+REGISTER_EVENT(IStream, inputFormatError)
//
// IpcClient
diff --git a/src/lib/base/EventTypes.h b/src/lib/base/EventTypes.h
index f81617e..995490e 100644
--- a/src/lib/base/EventTypes.h
+++ b/src/lib/base/EventTypes.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -133,14 +133,20 @@ public:
*/
Event::Type outputShutdown();
+ /** Get input format error event type
+
+ This is sent when a stream receives an irrecoverable input format error.
+ */
+ Event::Type inputFormatError();
//@}
-
+
private:
Event::Type m_inputReady;
Event::Type m_outputFlushed;
Event::Type m_outputError;
Event::Type m_inputShutdown;
Event::Type m_outputShutdown;
+ Event::Type m_inputFormatError;
};
class IpcClientEvents : public EventTypes {
@@ -159,7 +165,7 @@ public:
Event::Type messageReceived();
//@}
-
+
private:
Event::Type m_connected;
Event::Type m_messageReceived;
@@ -179,7 +185,7 @@ public:
//! Raised when the client disconnects from the server.
Event::Type disconnected();
-
+
//@}
private:
@@ -198,7 +204,7 @@ public:
//! Raised when we have created the client proxy.
Event::Type clientConnected();
-
+
//! Raised when a message is received through a client proxy.
Event::Type messageReceived();
@@ -242,7 +248,7 @@ public:
event when a remote connection has been established.
*/
Event::Type connected();
-
+
//! Get secure connected event type
/*!
Returns the secure socket connected event type. A secure socket sends
@@ -342,14 +348,14 @@ public:
//! @name accessors
//@{
-
+
//! Get accepted event type
/*!
Returns the accepted event type. This is sent whenever a server
accepts a client.
*/
Event::Type accepted();
-
+
//! Get connected event type
/*!
Returns the connected event type. This is sent whenever a
@@ -419,7 +425,7 @@ public:
Event::Type failure();
//@}
-
+
private:
Event::Type m_success;
Event::Type m_failure;
@@ -510,7 +516,7 @@ public:
Event::Type screenSwitched();
//@}
-
+
private:
Event::Type m_error;
Event::Type m_connected;
@@ -529,16 +535,16 @@ public:
m_reloadConfig(Event::kUnknown),
m_forceReconnect(Event::kUnknown),
m_resetServer(Event::kUnknown) { }
-
+
//! @name accessors
//@{
-
+
Event::Type reloadConfig();
Event::Type forceReconnect();
Event::Type resetServer();
//@}
-
+
private:
Event::Type m_reloadConfig;
Event::Type m_forceReconnect;
@@ -565,7 +571,7 @@ public:
Event::Type keyRepeat();
//@}
-
+
private:
Event::Type m_keyDown;
Event::Type m_keyUp;
@@ -589,7 +595,7 @@ public:
//! @name accessors
//@{
-
+
//! button down event type. Event data is ButtonInfo*.
Event::Type buttonDown();
@@ -677,7 +683,7 @@ public:
to sleep or a user session is deactivated (fast user switching).
*/
Event::Type suspend();
-
+
//! Get resume event type
/*!
Returns the resume event type. This is sent whenever the system wakes
@@ -686,7 +692,7 @@ public:
Event::Type resume();
//@}
-
+
private:
Event::Type m_error;
Event::Type m_shapeChanged;
@@ -722,7 +728,7 @@ public:
//! Clipboard sending event type
/*!
- Returns the clipboard sending event type. This is used to send
+ Returns the clipboard sending event type. This is used to send
clipboard chunks.
*/
Event::Type clipboardSending();
diff --git a/src/lib/base/FunctionEventJob.cpp b/src/lib/base/FunctionEventJob.cpp
index 705e058..751b50d 100644
--- a/src/lib/base/FunctionEventJob.cpp
+++ b/src/lib/base/FunctionEventJob.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/FunctionEventJob.h b/src/lib/base/FunctionEventJob.h
index 4b2c2fc..3d9acaa 100644
--- a/src/lib/base/FunctionEventJob.h
+++ b/src/lib/base/FunctionEventJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/FunctionJob.cpp b/src/lib/base/FunctionJob.cpp
deleted file mode 100644
index 859010e..0000000
--- a/src/lib/base/FunctionJob.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * barrier -- mouse and keyboard sharing utility
- * Copyright (C) 2012-2016 Symless Ltd.
- * Copyright (C) 2002 Chris Schoeneman
- *
- * 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 "base/FunctionJob.h"
-
-//
-// FunctionJob
-//
-
-FunctionJob::FunctionJob(void (*func)(void*), void* arg) :
- m_func(func),
- m_arg(arg)
-{
- // do nothing
-}
-
-FunctionJob::~FunctionJob()
-{
- // do nothing
-}
-
-void
-FunctionJob::run()
-{
- if (m_func != NULL) {
- m_func(m_arg);
- }
-}
diff --git a/src/lib/base/FunctionJob.h b/src/lib/base/FunctionJob.h
deleted file mode 100644
index 9cdfa9d..0000000
--- a/src/lib/base/FunctionJob.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * barrier -- mouse and keyboard sharing utility
- * Copyright (C) 2012-2016 Symless Ltd.
- * Copyright (C) 2002 Chris Schoeneman
- *
- * 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 "base/IJob.h"
-
-//! Use a function as a job
-/*!
-A job class that invokes a function.
-*/
-class FunctionJob : public IJob {
-public:
- //! run() invokes \c func(arg)
- FunctionJob(void (*func)(void*), void* arg = NULL);
- virtual ~FunctionJob();
-
- // IJob overrides
- virtual void run();
-
-private:
- void (*m_func)(void*);
- void* m_arg;
-};
diff --git a/src/lib/base/IEventJob.h b/src/lib/base/IEventJob.h
index 3e4a420..844cc4a 100644
--- a/src/lib/base/IEventJob.h
+++ b/src/lib/base/IEventJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/IEventQueue.h b/src/lib/base/IEventQueue.h
index 150595c..833081c 100644
--- a/src/lib/base/IEventQueue.h
+++ b/src/lib/base/IEventQueue.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -184,7 +184,7 @@ public:
be added.
*/
virtual void waitForReady() const = 0;
-
+
//@}
//! @name accessors
//@{
@@ -216,7 +216,7 @@ public:
virtual void* getSystemTarget() = 0;
//@}
-
+
//
// Event type providers.
//
diff --git a/src/lib/base/IEventQueueBuffer.h b/src/lib/base/IEventQueueBuffer.h
index b594436..f25cc66 100644
--- a/src/lib/base/IEventQueueBuffer.h
+++ b/src/lib/base/IEventQueueBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -38,7 +38,7 @@ public:
//! @name manipulators
//@{
-
+
//! Initialize
/*!
Useful for platform-specific initialisation from a specific thread.
diff --git a/src/lib/base/IJob.h b/src/lib/base/IJob.h
index f966ec0..29aa941 100644
--- a/src/lib/base/IJob.h
+++ b/src/lib/base/IJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/ILogOutputter.h b/src/lib/base/ILogOutputter.h
index ab218fc..e11f9e2 100644
--- a/src/lib/base/ILogOutputter.h
+++ b/src/lib/base/ILogOutputter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/Log.cpp b/src/lib/base/Log.cpp
index a3b328d..8f52a80 100644
--- a/src/lib/base/Log.cpp
+++ b/src/lib/base/Log.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -25,7 +25,7 @@
#include <cstdio>
#include <cstring>
#include <iostream>
-#include <ctime>
+#include <ctime>
// names of priorities
static const char* g_priority[] = {
@@ -62,7 +62,7 @@ Log::Log()
{
assert(s_log == NULL);
- // other initalization
+ // other initialization
m_maxPriority = g_defaultMaxPriority;
m_maxNewlineLength = 0;
insert(new ConsoleLogOutputter);
@@ -145,7 +145,7 @@ Log::print(const char* file, int line, const char* fmt, ...)
// try printing into the buffer
va_list args;
va_start(args, fmt);
- int n = ARCH->vsnprintf(buffer, len - sPad, fmt, args);
+ int n = std::vsnprintf(buffer, len - sPad, fmt, args);
va_end(args);
// if the buffer wasn't big enough then make it bigger and try again
diff --git a/src/lib/base/Log.h b/src/lib/base/Log.h
index 0ed458f..22224b9 100644
--- a/src/lib/base/Log.h
+++ b/src/lib/base/Log.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -91,7 +91,7 @@ public:
then it simply returns true.
*/
bool setFilter(const char* name);
-
+
//! Set the minimum priority filter (by ordinal).
void setFilter(int);
@@ -193,9 +193,9 @@ otherwise it expands to a call that doesn't.
#define CLOG_TRACE __FILE__, __LINE__,
#endif
-// the CLOG_* defines are line and file plus %z and an octal number (060=0,
-// 071=9), but the limitation is that once we run out of numbers at either
-// end, then we resort to using non-numerical chars. this still works (since
+// the CLOG_* defines are line and file plus %z and an octal number (060=0,
+// 071=9), but the limitation is that once we run out of numbers at either
+// end, then we resort to using non-numerical chars. this still works (since
// to deduce the number we subtract octal \060, so '/' is -1, and ':' is 10
#define CLOG_PRINT CLOG_TRACE "%z\057" // char is '/'
diff --git a/src/lib/base/PriorityQueue.h b/src/lib/base/PriorityQueue.h
index d2ca70e..8aac88c 100644
--- a/src/lib/base/PriorityQueue.h
+++ b/src/lib/base/PriorityQueue.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/SimpleEventQueueBuffer.cpp b/src/lib/base/SimpleEventQueueBuffer.cpp
index b55fe55..a26f255 100644
--- a/src/lib/base/SimpleEventQueueBuffer.cpp
+++ b/src/lib/base/SimpleEventQueueBuffer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/SimpleEventQueueBuffer.h b/src/lib/base/SimpleEventQueueBuffer.h
index 4aa76d3..db6a502 100644
--- a/src/lib/base/SimpleEventQueueBuffer.h
+++ b/src/lib/base/SimpleEventQueueBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -28,7 +28,7 @@ An event queue buffer provides a queue of events for an IEventQueue.
*/
class SimpleEventQueueBuffer : public IEventQueueBuffer {
public:
- SimpleEventQueueBuffer();
+ SimpleEventQueueBuffer();
~SimpleEventQueueBuffer();
// IEventQueueBuffer overrides
diff --git a/src/lib/base/Stopwatch.cpp b/src/lib/base/Stopwatch.cpp
index b9ceb85..a174ea6 100644
--- a/src/lib/base/Stopwatch.cpp
+++ b/src/lib/base/Stopwatch.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/Stopwatch.h b/src/lib/base/Stopwatch.h
index dda74ea..81098fd 100644
--- a/src/lib/base/Stopwatch.h
+++ b/src/lib/base/Stopwatch.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -88,7 +88,7 @@ public:
*/
bool isStopped() const;
- // return the time since the last reset().
+ // return the time since the last reset().
//! Get elapsed time
/*!
Returns the time since the last reset(). This cannot trigger the
diff --git a/src/lib/base/String.cpp b/src/lib/base/String.cpp
index 1ab3623..adbb11d 100644
--- a/src/lib/base/String.cpp
+++ b/src/lib/base/String.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
@@ -35,6 +35,42 @@
namespace barrier {
namespace string {
+namespace {
+
+// returns negative in case of non-matching character
+int hex_to_number(char ch)
+{
+ switch (ch) {
+ case '0': return 0;
+ case '1': return 1;
+ case '2': return 2;
+ case '3': return 3;
+ case '4': return 4;
+ case '5': return 5;
+ case '6': return 6;
+ case '7': return 7;
+ case '8': return 8;
+ case '9': return 9;
+
+ case 'a': return 10;
+ case 'b': return 11;
+ case 'c': return 12;
+ case 'd': return 13;
+ case 'e': return 14;
+ case 'f': return 15;
+
+ case 'A': return 10;
+ case 'B': return 11;
+ case 'C': return 12;
+ case 'D': return 13;
+ case 'E': return 14;
+ case 'F': return 15;
+ }
+ return -1;
+}
+
+} // namespace
+
std::string
format(const char* fmt, ...)
{
@@ -135,7 +171,7 @@ sprintf(const char* fmt, ...)
// try printing into the buffer
va_list args;
va_start(args, fmt);
- int n = ARCH->vsnprintf(buffer, len, fmt, args);
+ int n = std::vsnprintf(buffer, len, fmt, args);
va_end(args);
// if the buffer wasn't big enough then make it bigger and try again
@@ -185,16 +221,42 @@ removeFileExt(std::string filename)
return filename.substr(0, dot);
}
-void
-toHex(std::string& subject, int width, const char fill)
+std::string to_hex(const std::vector<std::uint8_t>& subject, int width, const char fill)
{
std::stringstream ss;
ss << std::hex;
- for (unsigned int i = 0; i < subject.length(); i++) {
- ss << std::setw(width) << std::setfill(fill) << (int)(unsigned char)subject[i];
+ for (unsigned int i = 0; i < subject.size(); i++) {
+ ss << std::setw(width) << std::setfill(fill) << static_cast<int>(subject[i]);
}
- subject = ss.str();
+ return ss.str();
+}
+
+std::vector<std::uint8_t> from_hex(const std::string& data)
+{
+ std::vector<std::uint8_t> result;
+ result.reserve(data.size() / 2);
+
+ std::size_t i = 0;
+ while (i < data.size()) {
+ if (data[i] == ':') {
+ i++;
+ continue;
+ }
+
+ if (i + 2 > data.size()) {
+ return {}; // uneven character count follows, it's unclear how to interpret it
+ }
+
+ auto high = hex_to_number(data[i]);
+ auto low = hex_to_number(data[i + 1]);
+ if (high < 0 || low < 0) {
+ return {};
+ }
+ result.push_back(high * 16 + low);
+ i += 2;
+ }
+ return result;
}
void
diff --git a/src/lib/base/String.h b/src/lib/base/String.h
index 73526b4..9c5a53b 100644
--- a/src/lib/base/String.h
+++ b/src/lib/base/String.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -75,7 +75,10 @@ std::string removeFileExt(std::string filename);
/*!
Convert each character in \c subject into hexdecimal form with \c width
*/
-void toHex(std::string& subject, int width, const char fill = '0');
+std::string to_hex(const std::vector<std::uint8_t>& subject, int width, const char fill = '0');
+
+/// Convert binary data from hexadecimal
+std::vector<std::uint8_t> from_hex(const std::string& data);
//! Convert to all uppercase
/*!
diff --git a/src/lib/base/TMethodEventJob.h b/src/lib/base/TMethodEventJob.h
index a65f8c9..04a36fd 100644
--- a/src/lib/base/TMethodEventJob.h
+++ b/src/lib/base/TMethodEventJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/TMethodJob.h b/src/lib/base/TMethodJob.h
deleted file mode 100644
index ec88f05..0000000
--- a/src/lib/base/TMethodJob.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * barrier -- mouse and keyboard sharing utility
- * Copyright (C) 2012-2016 Symless Ltd.
- * Copyright (C) 2002 Chris Schoeneman
- *
- * 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 "IJob.h"
-
-//! Use a function as a job
-/*!
-A job class that invokes a member function.
-*/
-template <class T>
-class TMethodJob : public IJob {
-public:
- //! run() invokes \c object->method(arg)
- TMethodJob(T* object, void (T::*method)(void*), void* arg = NULL);
- virtual ~TMethodJob();
-
- // IJob overrides
- virtual void run();
-
-private:
- T* m_object;
- void (T::*m_method)(void*);
- void* m_arg;
-};
-
-template <class T>
-inline
-TMethodJob<T>::TMethodJob(T* object, void (T::*method)(void*), void* arg) :
- m_object(object),
- m_method(method),
- m_arg(arg)
-{
- // do nothing
-}
-
-template <class T>
-inline
-TMethodJob<T>::~TMethodJob()
-{
- // do nothing
-}
-
-template <class T>
-inline
-void
-TMethodJob<T>::run()
-{
- if (m_object != NULL) {
- (m_object->*m_method)(m_arg);
- }
-}
diff --git a/src/lib/base/Unicode.cpp b/src/lib/base/Unicode.cpp
index 05b0212..2bd0360 100644
--- a/src/lib/base/Unicode.cpp
+++ b/src/lib/base/Unicode.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/Unicode.h b/src/lib/base/Unicode.h
index 9bf83ae..430bb1b 100644
--- a/src/lib/base/Unicode.h
+++ b/src/lib/base/Unicode.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/XBase.cpp b/src/lib/base/XBase.cpp
index cb0db2e..b7a7baf 100644
--- a/src/lib/base/XBase.cpp
+++ b/src/lib/base/XBase.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/XBase.h b/src/lib/base/XBase.h
index 59b700e..0b46750 100644
--- a/src/lib/base/XBase.h
+++ b/src/lib/base/XBase.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/base/finally.h b/src/lib/base/finally.h
new file mode 100644
index 0000000..f3be617
--- /dev/null
+++ b/src/lib/base/finally.h
@@ -0,0 +1,61 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_BASE_FINALLY_H
+#define BARRIER_LIB_BASE_FINALLY_H
+
+#include <utility>
+
+namespace barrier {
+
+// this implements a common pattern of executing an action at the end of function
+
+template<class Callable>
+class final_action {
+public:
+ final_action() noexcept {}
+ final_action(Callable callable) noexcept : callable_{callable} {}
+
+ ~final_action() noexcept
+ {
+ if (!invoked_) {
+ callable_();
+ }
+ }
+
+ final_action(final_action&& other) noexcept :
+ callable_{std::move(other.callable_)}
+ {
+ std::swap(invoked_, other.invoked_);
+ }
+
+ final_action(const final_action&) = delete;
+ final_action& operator=(const final_action&) = delete;
+private:
+ bool invoked_ = false;
+ Callable callable_;
+};
+
+template<class Callable>
+inline final_action<Callable> finally(Callable&& callable) noexcept
+{
+ return final_action<Callable>(std::forward<Callable>(callable));
+}
+
+} // namespace barrier
+
+#endif // BARRIER_LIB_BASE_FINALLY_H
diff --git a/src/lib/base/log_outputters.cpp b/src/lib/base/log_outputters.cpp
index af53192..176af2d 100644
--- a/src/lib/base/log_outputters.cpp
+++ b/src/lib/base/log_outputters.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -17,10 +17,9 @@
*/
#include "base/log_outputters.h"
-#include "base/TMethodJob.h"
#include "arch/Arch.h"
#include "base/String.h"
-
+#include "io/filesystem.h"
#include <fstream>
enum EFileLogOutputter {
@@ -260,7 +259,7 @@ FileLogOutputter::write(ELevel level, const char *message)
bool moveFile = false;
std::ofstream m_handle;
- m_handle.open(m_fileName.c_str(), std::fstream::app);
+ barrier::open_utf8_path(m_handle, m_fileName, std::fstream::app);
if (m_handle.is_open() && m_handle.fail() != true) {
m_handle << message << std::endl;
@@ -305,7 +304,7 @@ MesssageBoxLogOutputter::~MesssageBoxLogOutputter()
}
void
-MesssageBoxLogOutputter::open(const char* title)
+MesssageBoxLogOutputter::open(const char* title)
{
// do nothing
}
diff --git a/src/lib/base/log_outputters.h b/src/lib/base/log_outputters.h
index 15f1e7a..2a84170 100644
--- a/src/lib/base/log_outputters.h
+++ b/src/lib/base/log_outputters.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/client/CMakeLists.txt b/src/lib/client/CMakeLists.txt
index 97dc9db..033876f 100644
--- a/src/lib/client/CMakeLists.txt
+++ b/src/lib/client/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp
index 96d2c67..a7b15cf 100644
--- a/src/lib/client/Client.cpp
+++ b/src/lib/client/Client.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -37,7 +37,6 @@
#include "base/Log.h"
#include "base/IEventQueue.h"
#include "base/TMethodEventJob.h"
-#include "base/TMethodJob.h"
#include <cstring>
#include <cstdlib>
@@ -127,6 +126,12 @@ Client::connect()
return;
}
+ auto security_level = ConnectionSecurityLevel::PLAINTEXT;
+ if (m_useSecureNetwork) {
+ // client always authenticates server
+ security_level = ConnectionSecurityLevel::ENCRYPTED_AUTHENTICATED;
+ }
+
try {
// resolve the server hostname. do this every time we connect
// in case we couldn't resolve the address earlier or the address
@@ -134,20 +139,19 @@ Client::connect()
// being shuttled between various networks). patch by Brent
// Priddy.
m_serverAddress.resolve();
-
+
// m_serverAddress will be null if the hostname address is not reolved
if (m_serverAddress.getAddress() != NULL) {
// to help users troubleshoot, show server host name (issue: 60)
- LOG((CLOG_NOTE "connecting to '%s': %s:%i",
+ LOG((CLOG_NOTE "connecting to '%s': %s:%i",
m_serverAddress.getHostname().c_str(),
ARCH->addrToString(m_serverAddress.getAddress()).c_str(),
m_serverAddress.getPort()));
}
// create the socket
- IDataSocket* socket = m_socketFactory->create(
- ARCH->getAddrFamily(m_serverAddress.getAddress()),
- m_useSecureNetwork);
+ IDataSocket* socket = m_socketFactory->create(ARCH->getAddrFamily(m_serverAddress.getAddress()),
+ security_level);
m_socket = dynamic_cast<TCPSocket*>(socket);
// filter socket messages, including a packetizing filter
@@ -255,7 +259,7 @@ Client::leave()
m_active = false;
m_screen->leave();
-
+
if (m_enableClipboard) {
// send clipboards that we own and that have changed
for (ClipboardID id = 0; id < kClipboardEnd; ++id) {
@@ -755,9 +759,7 @@ void
Client::onFileRecieveCompleted()
{
if (isReceivedFileSizeValid()) {
- m_writeToDropDirThread = new Thread(
- new TMethodJob<Client>(
- this, &Client::writeToDropDirThread));
+ m_writeToDropDirThread = new Thread([this](){ write_to_drop_dir_thread(); });
}
}
@@ -767,15 +769,14 @@ Client::handleStopRetry(const Event&, void*)
m_args.m_restartable = false;
}
-void
-Client::writeToDropDirThread(void*)
+void Client::write_to_drop_dir_thread()
{
LOG((CLOG_DEBUG "starting write to drop dir thread"));
while (m_screen->isFakeDraggingStarted()) {
ARCH->sleep(.1f);
}
-
+
DropHelper::writeToDir(m_screen->getDropTarget(), m_dragFileList,
m_receivedFileData);
}
@@ -790,7 +791,7 @@ Client::dragInfoReceived(UInt32 fileNum, std::string data)
}
DragInformation::parseDragInfo(m_dragFileList, fileNum, data);
-
+
m_screen->startDraggingFiles(m_dragFileList);
}
@@ -806,19 +807,14 @@ Client::sendFileToServer(const char* filename)
if (m_sendFileThread != NULL) {
StreamChunker::interruptFile();
}
-
- m_sendFileThread = new Thread(
- new TMethodJob<Client>(
- this, &Client::sendFileThread,
- static_cast<void*>(const_cast<char*>(filename))));
+
+ m_sendFileThread = new Thread([this, filename]() { send_file_thread(filename); });
}
-void
-Client::sendFileThread(void* filename)
+void Client::send_file_thread(const char* filename)
{
try {
- char* name = static_cast<char*>(filename);
- StreamChunker::sendFile(name, m_events, this);
+ StreamChunker::sendFile(filename, m_events, this);
}
catch (std::runtime_error& error) {
LOG((CLOG_ERR "failed sending file chunks: %s", error.what()));
diff --git a/src/lib/client/Client.h b/src/lib/client/Client.h
index 7e566be..c172af2 100644
--- a/src/lib/client/Client.h
+++ b/src/lib/client/Client.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -90,11 +90,11 @@ public:
//! Create a new thread and use it to send file to Server
void sendFileToServer(const char* filename);
-
+
//! Send dragging file information back to server
void sendDragInfo(UInt32 fileCount, std::string& info, size_t size);
-
+
//@}
//! @name accessors
//@{
@@ -118,8 +118,8 @@ public:
to connect) to.
*/
NetworkAddress getServerAddress() const;
-
- //! Return true if recieved file size is valid
+
+ //! Return true if received file size is valid
bool isReceivedFileSizeValid();
//! Return expected file size
@@ -167,8 +167,8 @@ private:
void sendEvent(Event::Type, void*);
void sendConnectionFailedEvent(const char* msg);
void sendFileChunk(const void* data);
- void sendFileThread(void*);
- void writeToDropDirThread(void*);
+ void send_file_thread(const char* filename);
+ void write_to_drop_dir_thread();
void setupConnecting();
void setupConnection();
void setupScreen();
diff --git a/src/lib/client/ServerProxy.cpp b/src/lib/client/ServerProxy.cpp
index c067f13..c6e3576 100644
--- a/src/lib/client/ServerProxy.cpp
+++ b/src/lib/client/ServerProxy.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -26,6 +26,7 @@
#include "barrier/ProtocolUtil.h"
#include "barrier/option_types.h"
#include "barrier/protocol_types.h"
+#include "barrier/XBarrier.h"
#include "io/IStream.h"
#include "base/Log.h"
#include "base/IEventQueue.h"
@@ -124,17 +125,27 @@ ServerProxy::handleData(const Event&, void*)
// parse message
LOG((CLOG_DEBUG2 "msg from server: %c%c%c%c", code[0], code[1], code[2], code[3]));
- switch ((this->*m_parser)(code)) {
- case kOkay:
- break;
-
- case kUnknown:
- LOG((CLOG_ERR "invalid message from server: %c%c%c%c", code[0], code[1], code[2], code[3]));
+ try {
+ switch ((this->*m_parser)(code)) {
+ case kOkay:
+ break;
+
+ case kUnknown:
+ LOG((CLOG_ERR "invalid message from server: %c%c%c%c", code[0], code[1], code[2], code[3]));
+ m_client->disconnect("invalid message from server");
+ return;
+
+ case kDisconnect:
+ return;
+ }
+ } catch (const XBadClient& e) {
+ // TODO: disconnect handling is currently dispersed across both parseMessage() and
+ // handleData() functions, we should collect that to a single place
+
+ LOG((CLOG_ERR "protocol error from server: %s", e.what()));
+ ProtocolUtil::writef(m_stream, kMsgEBad);
m_client->disconnect("invalid message from server");
return;
-
- case kDisconnect:
- return;
}
// next message
@@ -553,7 +564,7 @@ ServerProxy::setClipboard()
static std::string dataCached;
ClipboardID id;
UInt32 seq;
-
+
int r = ClipboardChunk::assemble(m_stream, dataCached, id, seq);
if (r == kStart) {
@@ -562,7 +573,7 @@ ServerProxy::setClipboard()
}
else if (r == kFinish) {
LOG((CLOG_DEBUG "received clipboard %d size=%d", id, dataCached.size()));
-
+
// forward
Clipboard clipboard;
clipboard.unmarshall(dataCached, 0);
diff --git a/src/lib/client/ServerProxy.h b/src/lib/client/ServerProxy.h
index abca4c3..12a3226 100644
--- a/src/lib/client/ServerProxy.h
+++ b/src/lib/client/ServerProxy.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -58,8 +58,8 @@ public:
// sending dragging information to server
void sendDragInfo(UInt32 fileCount, const char* info, size_t size);
-
-#ifdef TEST_ENV
+
+#ifdef BARRIER_TEST_ENV
void handleDataForTest() { handleData(Event(), NULL); }
#endif
diff --git a/src/lib/common/CMakeLists.txt b/src/lib/common/CMakeLists.txt
index b3791c1..82ca614 100644
--- a/src/lib/common/CMakeLists.txt
+++ b/src/lib/common/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/common/DataDirectories.h b/src/lib/common/DataDirectories.h
index 6b990c2..4550211 100644
--- a/src/lib/common/DataDirectories.h
+++ b/src/lib/common/DataDirectories.h
@@ -15,27 +15,36 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#pragma once
+#ifndef BARRIER_LIB_COMMON_DATA_DIRECTORIES_H
+#define BARRIER_LIB_COMMON_DATA_DIRECTORIES_H
-#include <string>
+#include "io/filesystem.h"
+
+namespace barrier {
class DataDirectories
{
public:
- static const std::string& profile();
- static const std::string& profile(const std::string& path);
+ static const fs::path& profile();
+ static const fs::path& profile(const fs::path& path);
- static const std::string& global();
- static const std::string& global(const std::string& path);
+ static const fs::path& global();
+ static const fs::path& global(const fs::path& path);
- static const std::string& systemconfig();
- static const std::string& systemconfig(const std::string& path);
+ static const fs::path& systemconfig();
+ static const fs::path& systemconfig(const fs::path& path);
+ static fs::path ssl_fingerprints_path();
+ static fs::path local_ssl_fingerprints_path();
+ static fs::path trusted_servers_ssl_fingerprints_path();
+ static fs::path trusted_clients_ssl_fingerprints_path();
+ static fs::path ssl_certificate_path();
private:
- // static class
- DataDirectories() {}
-
- static std::string _profile;
- static std::string _global;
- static std::string _systemconfig;
+ static fs::path _profile;
+ static fs::path _global;
+ static fs::path _systemconfig;
};
+
+} // namespace barrier
+
+#endif
diff --git a/src/lib/common/DataDirectories_static.cpp b/src/lib/common/DataDirectories_static.cpp
index 48dccb6..47f88e7 100644
--- a/src/lib/common/DataDirectories_static.cpp
+++ b/src/lib/common/DataDirectories_static.cpp
@@ -17,7 +17,40 @@
#include "DataDirectories.h"
-// static member
-std::string DataDirectories::_profile;
-std::string DataDirectories::_global;
-std::string DataDirectories::_systemconfig;
+namespace barrier {
+
+fs::path DataDirectories::_profile;
+fs::path DataDirectories::_global;
+fs::path DataDirectories::_systemconfig;
+
+static const char kFingerprintsDirName[] = "SSL/Fingerprints";
+static const char kFingerprintsLocalFilename[] = "Local.txt";
+static const char kFingerprintsTrustedServersFilename[] = "TrustedServers.txt";
+static const char kFingerprintsTrustedClientsFilename[] = "TrustedClients.txt";
+
+fs::path DataDirectories::ssl_fingerprints_path()
+{
+ return profile() / kFingerprintsDirName;
+}
+
+fs::path DataDirectories::local_ssl_fingerprints_path()
+{
+ return ssl_fingerprints_path() / kFingerprintsLocalFilename;
+}
+
+fs::path DataDirectories::trusted_servers_ssl_fingerprints_path()
+{
+ return ssl_fingerprints_path() / kFingerprintsTrustedServersFilename;
+}
+
+fs::path DataDirectories::trusted_clients_ssl_fingerprints_path()
+{
+ return ssl_fingerprints_path() / kFingerprintsTrustedClientsFilename;
+}
+
+fs::path DataDirectories::ssl_certificate_path()
+{
+ return profile() / "SSL" / "Barrier.pem";
+}
+
+} // namespace barrier
diff --git a/src/lib/common/IInterface.h b/src/lib/common/IInterface.h
index 84a76a9..65ede4d 100644
--- a/src/lib/common/IInterface.h
+++ b/src/lib/common/IInterface.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/MacOSXPrecomp.h b/src/lib/common/MacOSXPrecomp.h
deleted file mode 100644
index 7dbc8d0..0000000
--- a/src/lib/common/MacOSXPrecomp.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * barrier -- mouse and keyboard sharing utility
- * Copyright (C) 2012-2016 Symless Ltd.
- * Copyright (C) 2002 Chris Schoeneman
- *
- * 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/>.
- */
-
- //
-// Prefix header for all source files of the 'deleteme' target in the 'deleteme' project.
-//
-
-#include <Carbon/Carbon.h>
diff --git a/src/lib/common/PathUtilities.cpp b/src/lib/common/PathUtilities.cpp
deleted file mode 100644
index a2ab38a..0000000
--- a/src/lib/common/PathUtilities.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
-* barrier -- mouse and keyboard sharing utility
-* Copyright (C) 2018 Debauchee Open Source Group
-*
-* 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/>.
-*/
-
-/*
-
-These functions cover the vast majority of cases for different paths across
-windows and unixes. They are not, however, fullproof and probably don't cover
-fringe cases very well. The library below might be used as an alternative if
-these implementations prove to be insufficient. As the library's readme states
-it is simply a temporary band-aid until std::filesystem is integrated (C++17
-has it in std::experimental) and this class should also be treated as such.
-
-https://github.com/wjakob/filesystem/
-
-*/
-
-#include "PathUtilities.h"
-
-// keep the default platform delimiter as the first in the list
-#ifdef _WIN32
-static const char *Delimiters = "\\/";
-#else
-static const char *Delimiters = "/";
-#endif
-
-static const char DefaultDelimiter = Delimiters[0];
-
-std::string PathUtilities::basename(const std::string& path)
-{
- return path.substr(path.find_last_of(Delimiters) + 1);
-}
-
-std::string PathUtilities::concat(const std::string& left, const std::string& right)
-{
- // although npos is usually (-1) we can't count on that so handle it explicitly
- auto leftEnd = left.find_last_not_of(Delimiters);
- if (leftEnd == std::string::npos)
- leftEnd = 0;
- else
- ++leftEnd;
- auto rightStart = right.find_first_not_of(Delimiters, 0);
- if (rightStart == std::string::npos) {
- // both left/right are empty
- if (left.size() == 0 && right.size() == 0)
- return "";
- // right is full of delims, left is okay
- if (leftEnd > 0)
- return left.substr(0, leftEnd);
- // both left/right useless but at least one has delims
- return std::string(1, DefaultDelimiter);
- }
- if (leftEnd == 0) {
- // right is okay and not prefixed with delims, left is empty
- if (left.size() == 0 && rightStart == 0)
- return right.substr(rightStart);
- // (right is okay and prefixed with delims) OR left is full of delims
- return DefaultDelimiter + right.substr(rightStart);
- }
- // concatenation using both left and right
- return left.substr(0, leftEnd) + DefaultDelimiter + right.substr(rightStart);
-}
diff --git a/src/lib/common/PathUtilities.h b/src/lib/common/PathUtilities.h
deleted file mode 100644
index 70b85b4..0000000
--- a/src/lib/common/PathUtilities.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-* barrier -- mouse and keyboard sharing utility
-* Copyright (C) 2018 Debauchee Open Source Group
-*
-* 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 <string>
-
-class PathUtilities
-{
-public:
- static std::string basename(const std::string& path);
- static std::string concat(const std::string& left, const std::string& right);
-
-private:
- // static class
- PathUtilities() {}
-};
diff --git a/src/lib/common/Version.cpp b/src/lib/common/Version.cpp
index 94d6c5d..41d2804 100644
--- a/src/lib/common/Version.cpp
+++ b/src/lib/common/Version.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/Version.h b/src/lib/common/Version.h
index 66bb2e2..ad4a3e7 100644
--- a/src/lib/common/Version.h
+++ b/src/lib/common/Version.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/basic_types.h b/src/lib/common/basic_types.h
index f84550c..1882e57 100644
--- a/src/lib/common/basic_types.h
+++ b/src/lib/common/basic_types.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -18,49 +18,7 @@
#pragma once
-#include "common/common.h"
-
-//
-// pick types of particular sizes
-//
-
-#if !defined(TYPE_OF_SIZE_1)
-# if SIZEOF_CHAR == 1
-# define TYPE_OF_SIZE_1 char
-# endif
-#endif
-
-#if !defined(TYPE_OF_SIZE_2)
-# if SIZEOF_INT == 2
-# define TYPE_OF_SIZE_2 int
-# else
-# define TYPE_OF_SIZE_2 short
-# endif
-#endif
-
-#if !defined(TYPE_OF_SIZE_4)
- // Carbon defines SInt32 and UInt32 in terms of long
-# if SIZEOF_INT == 4 && !defined(__APPLE__)
-# define TYPE_OF_SIZE_4 int
-# else
-# define TYPE_OF_SIZE_4 long
-# endif
-#endif
-
- //
-// verify existence of required types
-//
-
-#if !defined(TYPE_OF_SIZE_1)
-# error No 1 byte integer type
-#endif
-#if !defined(TYPE_OF_SIZE_2)
-# error No 2 byte integer type
-#endif
-#if !defined(TYPE_OF_SIZE_4)
-# error No 4 byte integer type
-#endif
-
+#include <cstdint>
//
// make typedefs
@@ -75,18 +33,11 @@
#if defined(__APPLE__)
#include <CoreServices/CoreServices.h>
#else
-typedef signed TYPE_OF_SIZE_1 SInt8;
-typedef signed TYPE_OF_SIZE_2 SInt16;
-typedef signed TYPE_OF_SIZE_4 SInt32;
-typedef unsigned TYPE_OF_SIZE_1 UInt8;
-typedef unsigned TYPE_OF_SIZE_2 UInt16;
-typedef unsigned TYPE_OF_SIZE_4 UInt32;
+using SInt8 = std::int8_t;
+using SInt16 = std::int16_t;
+using SInt32 = std::int32_t;
+using UInt8 = std::uint8_t;
+using UInt16 = std::uint16_t;
+using UInt32 = std::uint32_t;
#endif
#endif
-//
-// clean up
-//
-
-#undef TYPE_OF_SIZE_1
-#undef TYPE_OF_SIZE_2
-#undef TYPE_OF_SIZE_4
diff --git a/src/lib/common/common.h b/src/lib/common/common.h
index 5ea215f..3946256 100644
--- a/src/lib/common/common.h
+++ b/src/lib/common/common.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -18,26 +18,8 @@
#pragma once
-#if defined(_WIN32)
-# define SYSAPI_WIN32 1
-# define WINAPI_MSWINDOWS 1
-#elif HAVE_CONFIG_H
+#if HAVE_CONFIG_H
# include "config.h"
-#else
-# error "config.h missing"
-#endif
-
-// VC++ has built-in sized types
-#if defined(_MSC_VER)
-# include <wchar.h>
-# define TYPE_OF_SIZE_1 __int8
-# define TYPE_OF_SIZE_2 __int16
-# define TYPE_OF_SIZE_4 __int32
-#else
-# define SIZE_OF_CHAR 1
-# define SIZE_OF_SHORT 2
-# define SIZE_OF_INT 4
-# define SIZE_OF_LONG 4
#endif
// define NULL
diff --git a/src/lib/common/stdbitset.h b/src/lib/common/stdbitset.h
index 1096249..65433ac 100644
--- a/src/lib/common/stdbitset.h
+++ b/src/lib/common/stdbitset.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stddeque.h b/src/lib/common/stddeque.h
index ffaed24..5033826 100644
--- a/src/lib/common/stddeque.h
+++ b/src/lib/common/stddeque.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdfstream.h b/src/lib/common/stdfstream.h
index e9aa263..0328a4b 100644
--- a/src/lib/common/stdfstream.h
+++ b/src/lib/common/stdfstream.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdistream.h b/src/lib/common/stdistream.h
index b19e2ab..2e9c3cc 100644
--- a/src/lib/common/stdistream.h
+++ b/src/lib/common/stdistream.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdlist.h b/src/lib/common/stdlist.h
index d530e57..f1c03e2 100644
--- a/src/lib/common/stdlist.h
+++ b/src/lib/common/stdlist.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdmap.h b/src/lib/common/stdmap.h
index 2351074..7a1040e 100644
--- a/src/lib/common/stdmap.h
+++ b/src/lib/common/stdmap.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdostream.h b/src/lib/common/stdostream.h
index bb82285..10b65d0 100644
--- a/src/lib/common/stdostream.h
+++ b/src/lib/common/stdostream.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdpost.h b/src/lib/common/stdpost.h
index 8046da0..d7f0f9c 100644
--- a/src/lib/common/stdpost.h
+++ b/src/lib/common/stdpost.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdpre.h b/src/lib/common/stdpre.h
index 8ccd308..bf8b9bf 100644
--- a/src/lib/common/stdpre.h
+++ b/src/lib/common/stdpre.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdset.h b/src/lib/common/stdset.h
index 1c98971..e247745 100644
--- a/src/lib/common/stdset.h
+++ b/src/lib/common/stdset.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdsstream.h b/src/lib/common/stdsstream.h
index 43671ff..1bfdd7e 100644
--- a/src/lib/common/stdsstream.h
+++ b/src/lib/common/stdsstream.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdstring.h b/src/lib/common/stdstring.h
index f320ca8..3b3ba0e 100644
--- a/src/lib/common/stdstring.h
+++ b/src/lib/common/stdstring.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/stdvector.h b/src/lib/common/stdvector.h
index ab4b853..4dd263d 100644
--- a/src/lib/common/stdvector.h
+++ b/src/lib/common/stdvector.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/common/unix/DataDirectories.cpp b/src/lib/common/unix/DataDirectories.cpp
index 72e510a..cf3ca24 100644
--- a/src/lib/common/unix/DataDirectories.cpp
+++ b/src/lib/common/unix/DataDirectories.cpp
@@ -18,11 +18,11 @@
#include "../DataDirectories.h"
#include <unistd.h> // sysconf
-#include <stdlib.h> // getenv
+#include <cstdlib> // getenv
#include <sys/types.h> // getpwuid(_r)
#include <pwd.h> // getpwuid(_r)
-const std::string ProfileSubdir = "/barrier";
+namespace barrier {
static std::string pw_dir(struct passwd* pwentp)
{
@@ -33,7 +33,7 @@ static std::string pw_dir(struct passwd* pwentp)
#ifdef HAVE_GETPWUID_R
-static std::string unix_home()
+static fs::path unix_home()
{
long size = -1;
#if defined(_SC_GETPW_R_SIZE_MAX)
@@ -46,47 +46,47 @@ static std::string unix_home()
struct passwd* pwentp;
std::string buffer(size, 0);
getpwuid_r(getuid(), &pwent, &buffer[0], size, &pwentp);
- return pw_dir(pwentp);
+ return fs::u8path(pw_dir(pwentp));
}
#else // not HAVE_GETPWUID_R
-static std::string unix_home()
+static fs::path unix_home()
{
- return pw_dir(getpwuid(getuid()));
+ return fs::u8path(pw_dir(getpwuid(getuid())));
}
#endif // HAVE_GETPWUID_R
-static std::string profile_basedir()
+static fs::path profile_basedir()
{
#ifdef WINAPI_XWINDOWS
// linux/bsd adheres to freedesktop standards
// https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
- const char* dir = getenv("XDG_DATA_HOME");
+ const char* dir = std::getenv("XDG_DATA_HOME");
if (dir != NULL)
- return dir;
- return unix_home() + "/.local/share";
+ return fs::u8path(dir);
+ return unix_home() / ".local/share";
#else
// macos has its own standards
// https://developer.apple.com/library/content/documentation/General/Conceptual/MOSXAppProgrammingGuide/AppRuntime/AppRuntime.html
- return unix_home() + "/Library/Application Support";
+ return unix_home() / "Library/Application Support";
#endif
}
-const std::string& DataDirectories::profile()
+const fs::path& DataDirectories::profile()
{
if (_profile.empty())
- _profile = profile_basedir() + ProfileSubdir;
+ _profile = profile_basedir() / "barrier";
return _profile;
}
-const std::string& DataDirectories::profile(const std::string& path)
+const fs::path& DataDirectories::profile(const fs::path& path)
{
_profile = path;
return _profile;
}
-const std::string& DataDirectories::global()
+const fs::path& DataDirectories::global()
{
if (_global.empty())
// TODO: where on a unix system should public/global shared data go?
@@ -94,21 +94,23 @@ const std::string& DataDirectories::global()
_global = "/tmp";
return _global;
}
-const std::string& DataDirectories::global(const std::string& path)
+const fs::path& DataDirectories::global(const fs::path& path)
{
_global = path;
return _global;
}
-const std::string& DataDirectories::systemconfig()
+const fs::path& DataDirectories::systemconfig()
{
if (_systemconfig.empty())
_systemconfig = "/etc";
return _systemconfig;
}
-const std::string& DataDirectories::systemconfig(const std::string& path)
+const fs::path& DataDirectories::systemconfig(const fs::path& path)
{
_systemconfig = path;
return _systemconfig;
}
+
+} // namespace barrier
diff --git a/src/lib/common/win32/DataDirectories.cpp b/src/lib/common/win32/DataDirectories.cpp
index 15cb64e..31a428f 100644
--- a/src/lib/common/win32/DataDirectories.cpp
+++ b/src/lib/common/win32/DataDirectories.cpp
@@ -16,66 +16,62 @@
*/
#include "../DataDirectories.h"
+#include "encoding_utilities.h"
#include <Shlobj.h>
-std::string unicode_to_mb(const WCHAR* utfStr)
-{
- int utfLength = lstrlenW(utfStr);
- int mbLength = WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, NULL, 0, NULL, NULL);
- std::string mbStr(mbLength, 0);
- WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, &mbStr[0], mbLength, NULL, NULL);
- return mbStr;
-}
+namespace barrier {
-std::string known_folder_path(const KNOWNFOLDERID& id)
+fs::path known_folder_path(const KNOWNFOLDERID& id)
{
- std::string path;
+ fs::path path;
WCHAR* buffer;
HRESULT result = SHGetKnownFolderPath(id, 0, NULL, &buffer);
if (result == S_OK) {
- path = unicode_to_mb(buffer);
+ path = fs::path(std::wstring(buffer));
CoTaskMemFree(buffer);
}
return path;
}
-const std::string& DataDirectories::profile()
+const fs::path& DataDirectories::profile()
{
if (_profile.empty())
- _profile = known_folder_path(FOLDERID_LocalAppData) + "\\Barrier";
+ _profile = known_folder_path(FOLDERID_LocalAppData) / "Barrier";
return _profile;
}
-const std::string& DataDirectories::profile(const std::string& path)
+const fs::path& DataDirectories::profile(const fs::path& path)
{
_profile = path;
return _profile;
}
-const std::string& DataDirectories::global()
+const fs::path& DataDirectories::global()
{
if (_global.empty())
- _global = known_folder_path(FOLDERID_ProgramData) + "\\Barrier";
+ _global = known_folder_path(FOLDERID_ProgramData) / "Barrier";
return _global;
}
-const std::string& DataDirectories::global(const std::string& path)
+const fs::path& DataDirectories::global(const fs::path& path)
{
_global = path;
return _global;
}
-const std::string& DataDirectories::systemconfig()
+const fs::path& DataDirectories::systemconfig()
{
// systemconfig() is a special case in that it will track the current value
- // of global() unless and until it is explictly set otherwise
+ // of global() unless and until it is explicitly set otherwise
// previously it would default to the windows folder which was horrible!
if (_systemconfig.empty())
return global();
return _systemconfig;
}
-const std::string& DataDirectories::systemconfig(const std::string& path)
+const fs::path& DataDirectories::systemconfig(const fs::path& path)
{
_systemconfig = path;
return _systemconfig;
}
+
+} // namespace barrier
diff --git a/src/lib/common/win32/encoding_utilities.cpp b/src/lib/common/win32/encoding_utilities.cpp
new file mode 100644
index 0000000..11781d3
--- /dev/null
+++ b/src/lib/common/win32/encoding_utilities.cpp
@@ -0,0 +1,37 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 "encoding_utilities.h"
+#include <stringapiset.h>
+
+std::string win_wchar_to_utf8(const WCHAR* utfStr)
+{
+ int utfLength = lstrlenW(utfStr);
+ int mbLength = WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, NULL, 0, NULL, NULL);
+ std::string mbStr(mbLength, 0);
+ WideCharToMultiByte(CP_UTF8, 0, utfStr, utfLength, &mbStr[0], mbLength, NULL, NULL);
+ return mbStr;
+}
+
+std::vector<WCHAR> utf8_to_win_char(const std::string& str)
+{
+ int result_len = MultiByteToWideChar(CP_UTF8, 0, str.data(), str.size(), NULL, 0);
+ std::vector<WCHAR> result;
+ result.resize(result_len + 1, 0);
+ MultiByteToWideChar(CP_UTF8, 0, str.data(), str.size(), result.data(), result_len);
+ return result;
+}
diff --git a/src/lib/common/win32/encoding_utilities.h b/src/lib/common/win32/encoding_utilities.h
new file mode 100644
index 0000000..747371e
--- /dev/null
+++ b/src/lib/common/win32/encoding_utilities.h
@@ -0,0 +1,28 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_COMMON_WIN32_ENCODING_UTILITIES_H
+#define BARRIER_LIB_COMMON_WIN32_ENCODING_UTILITIES_H
+
+#include <windows.h>
+#include <string>
+#include <vector>
+
+std::string win_wchar_to_utf8(const WCHAR* utfStr);
+std::vector<WCHAR> utf8_to_win_char(const std::string& str);
+
+#endif
diff --git a/src/lib/io/CMakeLists.txt b/src/lib/io/CMakeLists.txt
index 32ae7ec..10b79df 100644
--- a/src/lib/io/CMakeLists.txt
+++ b/src/lib/io/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/io/IStream.h b/src/lib/io/IStream.h
index cf93ac4..7601fc4 100644
--- a/src/lib/io/IStream.h
+++ b/src/lib/io/IStream.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/StreamBuffer.cpp b/src/lib/io/StreamBuffer.cpp
index 61f05ba..8abbbb8 100644
--- a/src/lib/io/StreamBuffer.cpp
+++ b/src/lib/io/StreamBuffer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -22,6 +22,8 @@
// StreamBuffer
//
+#include <cassert>
+
const UInt32 StreamBuffer::kChunkSize = 4096;
StreamBuffer::StreamBuffer() :
diff --git a/src/lib/io/StreamBuffer.h b/src/lib/io/StreamBuffer.h
index 49b666b..364175f 100644
--- a/src/lib/io/StreamBuffer.h
+++ b/src/lib/io/StreamBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/StreamFilter.cpp b/src/lib/io/StreamFilter.cpp
index 170e237..dca0a69 100644
--- a/src/lib/io/StreamFilter.cpp
+++ b/src/lib/io/StreamFilter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/StreamFilter.h b/src/lib/io/StreamFilter.h
index e578e0c..55d481e 100644
--- a/src/lib/io/StreamFilter.h
+++ b/src/lib/io/StreamFilter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/XIO.cpp b/src/lib/io/XIO.cpp
index 911fa87..f78e031 100644
--- a/src/lib/io/XIO.cpp
+++ b/src/lib/io/XIO.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/XIO.h b/src/lib/io/XIO.h
index 4964441..5803388 100644
--- a/src/lib/io/XIO.h
+++ b/src/lib/io/XIO.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/io/filesystem.cpp b/src/lib/io/filesystem.cpp
new file mode 100644
index 0000000..46ae06d
--- /dev/null
+++ b/src/lib/io/filesystem.cpp
@@ -0,0 +1,71 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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/>.
+*/
+
+// this header must come first so that it picks up the filesystem implementation
+#include <ghc/fs_impl.hpp>
+
+#include "filesystem.h"
+#if SYSAPI_WIN32
+#include "common/win32/encoding_utilities.h"
+#endif
+#include <fstream>
+
+namespace barrier {
+
+namespace {
+
+template<class Stream>
+void open_utf8_path_impl(Stream& stream, const fs::path& path, std::ios_base::openmode mode)
+{
+#if SYSAPI_WIN32
+ // on Windows we need to use a non-standard constructor from wchar_t* string
+ // which fs::path::native() returns
+ stream.open(path.native().c_str(), mode);
+#else
+ stream.open(path.native().c_str(), mode);
+#endif
+}
+
+} // namespace
+
+void open_utf8_path(std::ifstream& stream, const fs::path& path, std::ios_base::openmode mode)
+{
+ open_utf8_path_impl(stream, path, mode);
+}
+
+void open_utf8_path(std::ofstream& stream, const fs::path& path, std::ios_base::openmode mode)
+{
+ open_utf8_path_impl(stream, path, mode);
+}
+
+void open_utf8_path(std::fstream& stream, const fs::path& path, std::ios_base::openmode mode)
+{
+ open_utf8_path_impl(stream, path, mode);
+}
+
+std::FILE* fopen_utf8_path(const fs::path& path, const std::string& mode)
+{
+#if SYSAPI_WIN32
+ auto wchar_mode = utf8_to_win_char(mode);
+ return _wfopen(path.native().c_str(),
+ reinterpret_cast<wchar_t*>(wchar_mode.data()));
+#else
+ return std::fopen(path.native().c_str(), mode.c_str());
+#endif
+}
+
+} // namespace barrier
diff --git a/src/lib/io/filesystem.h b/src/lib/io/filesystem.h
new file mode 100644
index 0000000..78e3423
--- /dev/null
+++ b/src/lib/io/filesystem.h
@@ -0,0 +1,41 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_IO_FILESYSTEM_H
+#define BARRIER_LIB_IO_FILESYSTEM_H
+
+#include <cstdio>
+#include <iosfwd>
+#include <ios>
+#include <ghc/fs_fwd.hpp>
+
+namespace barrier {
+
+namespace fs = ghc::filesystem;
+
+void open_utf8_path(std::ifstream& stream, const fs::path& path,
+ std::ios_base::openmode mode = std::ios_base::in);
+void open_utf8_path(std::ofstream& stream, const fs::path& path,
+ std::ios_base::openmode mode = std::ios_base::out);
+void open_utf8_path(std::fstream& stream, const fs::path& path,
+ std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out);
+
+std::FILE* fopen_utf8_path(const fs::path& path, const std::string& mode);
+
+} // namespace barrier
+
+#endif // BARRIER_LIB_IO_FILESYSTEM_H
diff --git a/src/lib/ipc/CMakeLists.txt b/src/lib/ipc/CMakeLists.txt
index 3c7302a..e7ada8f 100644
--- a/src/lib/ipc/CMakeLists.txt
+++ b/src/lib/ipc/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/ipc/Ipc.h b/src/lib/ipc/Ipc.h
index bc69c08..65e7aaf 100644
--- a/src/lib/ipc/Ipc.h
+++ b/src/lib/ipc/Ipc.h
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/ipc/IpcClient.cpp b/src/lib/ipc/IpcClient.cpp
index 4eeae5b..ea5eee1 100644
--- a/src/lib/ipc/IpcClient.cpp
+++ b/src/lib/ipc/IpcClient.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/ipc/IpcClient.h b/src/lib/ipc/IpcClient.h
index 1e9bca6..900b46c 100644
--- a/src/lib/ipc/IpcClient.h
+++ b/src/lib/ipc/IpcClient.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -42,7 +42,7 @@ public:
//! Connects to the IPC server at localhost.
void connect();
-
+
//! Disconnects from the IPC server.
void disconnect();
diff --git a/src/lib/ipc/IpcClientProxy.cpp b/src/lib/ipc/IpcClientProxy.cpp
index 432cc8c..cedfa5b 100644
--- a/src/lib/ipc/IpcClientProxy.cpp
+++ b/src/lib/ipc/IpcClientProxy.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -67,7 +67,7 @@ IpcClientProxy::~IpcClientProxy()
m_events->forIStream().inputShutdown(), m_stream.getEventTarget());
m_events->removeHandler(
m_events->forIStream().outputShutdown(), m_stream.getEventTarget());
-
+
// don't delete the stream while it's being used.
{
std::lock_guard<std::mutex> lock_read(m_readMutex);
@@ -145,7 +145,7 @@ IpcClientProxy::send(const IpcMessage& message)
ProtocolUtil::writef(&m_stream, kIpcMsgLogLine, &logLine);
break;
}
-
+
case kIpcShutdown:
ProtocolUtil::writef(&m_stream, kIpcMsgShutdown);
break;
diff --git a/src/lib/ipc/IpcClientProxy.h b/src/lib/ipc/IpcClientProxy.h
index eb9f1e9..dbd0846 100644
--- a/src/lib/ipc/IpcClientProxy.h
+++ b/src/lib/ipc/IpcClientProxy.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -46,7 +46,7 @@ private:
IpcHelloMessage* parseHello();
IpcCommandMessage* parseCommand();
void disconnect();
-
+
private:
barrier::IStream& m_stream;
EIpcClientType m_clientType;
diff --git a/src/lib/ipc/IpcLogOutputter.cpp b/src/lib/ipc/IpcLogOutputter.cpp
index 44ecdba..5118a0a 100644
--- a/src/lib/ipc/IpcLogOutputter.cpp
+++ b/src/lib/ipc/IpcLogOutputter.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -28,7 +28,6 @@
#include "base/Event.h"
#include "base/EventQueue.h"
#include "base/TMethodEventJob.h"
-#include "base/TMethodJob.h"
enum EIpcLogOutputter {
kBufferMaxSize = 1000,
@@ -54,8 +53,7 @@ IpcLogOutputter::IpcLogOutputter(IpcServer& ipcServer, EIpcClientType clientType
m_clientType(clientType)
{
if (useThread) {
- m_bufferThread = new Thread(new TMethodJob<IpcLogOutputter>(
- this, &IpcLogOutputter::bufferThread));
+ m_bufferThread = new Thread([this](){ buffer_thread(); });
}
}
@@ -142,8 +140,7 @@ IpcLogOutputter::isRunning()
return m_running;
}
-void
-IpcLogOutputter::bufferThread(void*)
+void IpcLogOutputter::buffer_thread()
{
m_bufferThreadId = m_bufferThread->getID();
m_running = true;
diff --git a/src/lib/ipc/IpcLogOutputter.h b/src/lib/ipc/IpcLogOutputter.h
index cc7b2fe..3f3ab0a 100644
--- a/src/lib/ipc/IpcLogOutputter.h
+++ b/src/lib/ipc/IpcLogOutputter.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -50,7 +50,7 @@ public:
virtual void close();
virtual void show(bool showIfEmpty);
virtual bool write(ELevel level, const char* message);
-
+
//! @name manipulators
//@{
@@ -76,23 +76,23 @@ public:
when threaded mode is on.
*/
void sendBuffer();
-
+
//@}
-
+
//! @name accessors
//@{
-
+
//! Get the buffer size
/*!
Returns the maximum size of the buffer.
*/
UInt16 bufferMaxSize() const;
-
+
//@}
private:
void init();
- void bufferThread(void*);
+ void buffer_thread();
std::string getChunk(size_t count);
void appendBuffer(const std::string& text);
bool isRunning();
diff --git a/src/lib/ipc/IpcMessage.cpp b/src/lib/ipc/IpcMessage.cpp
index 9c321cb..f1b13b1 100644
--- a/src/lib/ipc/IpcMessage.cpp
+++ b/src/lib/ipc/IpcMessage.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/ipc/IpcMessage.h b/src/lib/ipc/IpcMessage.h
index d37ebc3..06ca08a 100644
--- a/src/lib/ipc/IpcMessage.h
+++ b/src/lib/ipc/IpcMessage.h
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/ipc/IpcServer.cpp b/src/lib/ipc/IpcServer.cpp
index 8df98d1..da201c1 100644
--- a/src/lib/ipc/IpcServer.cpp
+++ b/src/lib/ipc/IpcServer.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/ipc/IpcServer.h b/src/lib/ipc/IpcServer.h
index 179bad8..f6227f2 100644
--- a/src/lib/ipc/IpcServer.h
+++ b/src/lib/ipc/IpcServer.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -73,7 +73,7 @@ private:
private:
typedef std::list<IpcClientProxy*> ClientList;
-
+
bool m_mock;
IEventQueue* m_events;
SocketMultiplexer* m_socketMultiplexer;
@@ -82,7 +82,7 @@ private:
ClientList m_clients;
mutable std::mutex m_clientsMutex;
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
public:
IpcServer() :
m_mock(true),
diff --git a/src/lib/ipc/IpcServerProxy.cpp b/src/lib/ipc/IpcServerProxy.cpp
index 49b3e00..073f7e7 100644
--- a/src/lib/ipc/IpcServerProxy.cpp
+++ b/src/lib/ipc/IpcServerProxy.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -56,7 +56,7 @@ IpcServerProxy::handleData(const Event&, void*)
LOG((CLOG_DEBUG "ipc read: %c%c%c%c",
code[0], code[1], code[2], code[3]));
-
+
IpcMessage* m = nullptr;
if (memcmp(code, kIpcMsgLogLine, 4) == 0) {
m = parseLogLine();
@@ -68,7 +68,7 @@ IpcServerProxy::handleData(const Event&, void*)
LOG((CLOG_ERR "invalid ipc message"));
disconnect();
}
-
+
// don't delete with this event; the data is passed to a new event.
Event e(m_events->forIpcServerProxy().messageReceived(), this, NULL, Event::kDontFreeData);
e.setDataObject(m);
@@ -76,7 +76,7 @@ IpcServerProxy::handleData(const Event&, void*)
n = m_stream.read(code, 4);
}
-
+
LOG((CLOG_DEBUG "finished ipc handle data"));
}
@@ -110,7 +110,7 @@ IpcServerProxy::parseLogLine()
{
std::string logLine;
ProtocolUtil::readf(&m_stream, kIpcMsgLogLine + 4, &logLine);
-
+
// must be deleted by event handler.
return new IpcLogLineMessage(logLine);
}
diff --git a/src/lib/ipc/IpcServerProxy.h b/src/lib/ipc/IpcServerProxy.h
index f2218a4..f724f97 100644
--- a/src/lib/ipc/IpcServerProxy.h
+++ b/src/lib/ipc/IpcServerProxy.h
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/mt/CMakeLists.txt b/src/lib/mt/CMakeLists.txt
index 9ee5ea4..19d1829 100644
--- a/src/lib/mt/CMakeLists.txt
+++ b/src/lib/mt/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/mt/CondVar.cpp b/src/lib/mt/CondVar.cpp
index 11318f9..b9cf565 100644
--- a/src/lib/mt/CondVar.cpp
+++ b/src/lib/mt/CondVar.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -24,7 +24,7 @@
// CondVarBase
//
-CondVarBase::CondVarBase(Mutex* mutex) :
+CondVarBase::CondVarBase(Mutex* mutex) :
m_mutex(mutex)
{
assert(m_mutex != NULL);
diff --git a/src/lib/mt/CondVar.h b/src/lib/mt/CondVar.h
index 0ab956b..fc18748 100644
--- a/src/lib/mt/CondVar.h
+++ b/src/lib/mt/CondVar.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -78,7 +78,7 @@ public:
signalled, otherwise up to \c timeout seconds or until signalled,
whichever comes first. Returns true if the object was signalled
during the wait, false otherwise.
-
+
The proper way to wait for a condition is:
\code
cv.lock();
diff --git a/src/lib/mt/Lock.cpp b/src/lib/mt/Lock.cpp
index 80721b9..6614858 100644
--- a/src/lib/mt/Lock.cpp
+++ b/src/lib/mt/Lock.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/Lock.h b/src/lib/mt/Lock.h
index 4a3f311..e4bbacf 100644
--- a/src/lib/mt/Lock.h
+++ b/src/lib/mt/Lock.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/Mutex.cpp b/src/lib/mt/Mutex.cpp
index e9a62e8..02d34c9 100644
--- a/src/lib/mt/Mutex.cpp
+++ b/src/lib/mt/Mutex.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/Mutex.h b/src/lib/mt/Mutex.h
index 51a9649..53b8f45 100644
--- a/src/lib/mt/Mutex.h
+++ b/src/lib/mt/Mutex.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/Thread.cpp b/src/lib/mt/Thread.cpp
index 7474c16..755c0e6 100644
--- a/src/lib/mt/Thread.cpp
+++ b/src/lib/mt/Thread.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -28,12 +28,10 @@
// Thread
//
-Thread::Thread(IJob* job)
+Thread::Thread(const std::function<void()>& fun)
{
- m_thread = ARCH->newThread(&Thread::threadFunc, job);
+ m_thread = ARCH->newThread([=](){ threadFunc(fun); });
if (m_thread == NULL) {
- // couldn't create thread
- delete job;
throw XMTThreadUnavailable();
}
}
@@ -69,7 +67,7 @@ Thread::operator=(const Thread& thread)
void
Thread::exit(void* result)
{
- throw XThreadExit(result);
+ throw XThreadExit();
}
void
@@ -108,15 +106,6 @@ Thread::wait(double timeout) const
return ARCH->wait(m_thread, timeout);
}
-void*
-Thread::getResult() const
-{
- if (wait())
- return ARCH->getResultOfThread(m_thread);
- else
- return NULL;
-}
-
IArchMultithread::ThreadID
Thread::getID() const
{
@@ -135,8 +124,7 @@ Thread::operator!=(const Thread& thread) const
return !ARCH->isSameThread(m_thread, thread.m_thread);
}
-void*
-Thread::threadFunc(void* vjob)
+void Thread::threadFunc(const std::function<void()>& func)
{
// get this thread's id for logging
IArchMultithread::ThreadID id;
@@ -146,42 +134,26 @@ Thread::threadFunc(void* vjob)
ARCH->closeThread(thread);
}
- // get job
- IJob* job = static_cast<IJob*>(vjob);
-
- // run job
- void* result = NULL;
try {
// go
LOG((CLOG_DEBUG1 "thread 0x%08x entry", id));
- job->run();
+ func();
LOG((CLOG_DEBUG1 "thread 0x%08x exit", id));
}
catch (XThreadCancel&) {
// client called cancel()
LOG((CLOG_DEBUG1 "caught cancel on thread 0x%08x", id));
- delete job;
throw;
}
- catch (XThreadExit& e) {
- // client called exit()
- result = e.m_result;
- LOG((CLOG_DEBUG1 "caught exit on thread 0x%08x, result %p", id, result));
+ catch (XThreadExit&) {
+ LOG((CLOG_DEBUG1 "caught exit on thread 0x%08x", id));
}
catch (XBase& e) {
LOG((CLOG_ERR "exception on thread 0x%08x: %s", id, e.what()));
- delete job;
throw;
}
catch (...) {
LOG((CLOG_ERR "exception on thread 0x%08x: <unknown>", id));
- delete job;
throw;
}
-
- // done with job
- delete job;
-
- // return exit result
- return result;
}
diff --git a/src/lib/mt/Thread.h b/src/lib/mt/Thread.h
index a7434fd..141d59f 100644
--- a/src/lib/mt/Thread.h
+++ b/src/lib/mt/Thread.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -19,13 +19,12 @@
#pragma once
#include "arch/IArchMultithread.h"
-
-class IJob;
+#include <functional>
//! Thread handle
/*!
Creating a Thread creates a new context of execution (i.e. thread) that
-runs simulatenously with the calling thread. A Thread is only a handle
+runs simultaneously with the calling thread. A Thread is only a handle
to a thread; deleting a Thread does not cancel or destroy the thread it
refers to and multiple Thread objects can refer to the same thread.
@@ -44,10 +43,9 @@ class Thread {
public:
//! Run \c adoptedJob in a new thread
/*!
- Create and start a new thread executing the \c adoptedJob. The
- new thread takes ownership of \c adoptedJob and will delete it.
+ Create and start a new thread executing the \c fun.
*/
- Thread(IJob* adoptedJob);
+ Thread(const std::function<void()>& fun);
//! Duplicate a thread handle
/*!
@@ -79,8 +77,7 @@ public:
/*!
Terminate the calling thread. This function does not return but
the stack is unwound and automatic objects are destroyed, as if
- exit() threw an exception (which is, in fact, what it does). The
- argument is saved as the result returned by getResult(). If you
+ exit() threw an exception (which is, in fact, what it does). If you
have \c catch(...) blocks then you should add the following before
each to avoid catching the exit:
\code
@@ -98,7 +95,7 @@ public:
enabled. If cancellation is disabled then the cancel is
remembered but not acted on until the first call to a
cancellation point after cancellation is enabled.
-
+
A cancellation point is a function that can act on cancellation.
A cancellation point does not return if there's a cancel pending.
Instead, it unwinds the stack and destroys automatic objects, as
@@ -110,7 +107,7 @@ public:
objects (like Lock). Clients are strongly encouraged to do the latter.
During cancellation, further cancel() calls are ignored (i.e.
a thread cannot be interrupted by a cancel during cancellation).
-
+
Clients that \c catch(XThreadCancel) must always rethrow the
exception. Clients that \c catch(...) must either rethrow the
exception or include a \c catch(XThreadCancel) handler that
@@ -122,7 +119,7 @@ public:
/*!
Change the priority of the thread. Normal priority is 0, 1 is
the next lower, etc. -1 is the next higher, etc. but boosting
- the priority may not be permitted and will be silenty ignored.
+ the priority may not be permitted and will be silently ignored.
*/
void setPriority(int n);
@@ -167,16 +164,6 @@ public:
*/
bool wait(double timeout = -1.0) const;
- //! Get the exit result
- /*!
- Returns the exit result. This does an implicit wait(). It returns
- NULL immediately if called by a thread on itself or on a thread that
- was cancelled.
-
- (cancellation point)
- */
- void* getResult() const;
-
//! Get the thread id
/*!
Returns an integer id for this thread. This id must not be used to
@@ -203,7 +190,7 @@ public:
private:
Thread(ArchThread);
- static void* threadFunc(void*);
+ static void threadFunc(const std::function<void()>& func);
private:
ArchThread m_thread;
diff --git a/src/lib/mt/XMT.cpp b/src/lib/mt/XMT.cpp
index 2274a6b..2282d63 100644
--- a/src/lib/mt/XMT.cpp
+++ b/src/lib/mt/XMT.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/XMT.h b/src/lib/mt/XMT.h
index 9e48fd9..ec4a683 100644
--- a/src/lib/mt/XMT.h
+++ b/src/lib/mt/XMT.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/mt/XThread.h b/src/lib/mt/XThread.h
index acc32e3..41172b3 100644
--- a/src/lib/mt/XThread.h
+++ b/src/lib/mt/XThread.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -26,12 +26,4 @@ Thrown by Thread::exit() to exit a thread. Clients of Thread
must not throw this type but must rethrow it if caught (by
XThreadExit, XThread, or ...).
*/
-class XThreadExit : public XThread {
-public:
- //! \c result is the result of the thread
- XThreadExit(void* result) : m_result(result) { }
- ~XThreadExit() { }
-
-public:
- void* m_result;
-};
+class XThreadExit : public XThread {};
diff --git a/src/lib/net/CMakeLists.txt b/src/lib/net/CMakeLists.txt
index 5439450..8c12ed9 100644
--- a/src/lib/net/CMakeLists.txt
+++ b/src/lib/net/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/net/ConnectionSecurityLevel.h b/src/lib/net/ConnectionSecurityLevel.h
new file mode 100644
index 0000000..913c2fd
--- /dev/null
+++ b/src/lib/net/ConnectionSecurityLevel.h
@@ -0,0 +1,27 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_NET_CONNECTION_SECURITY_LEVEL_H
+#define BARRIER_LIB_NET_CONNECTION_SECURITY_LEVEL_H
+
+enum class ConnectionSecurityLevel {
+ PLAINTEXT,
+ ENCRYPTED,
+ ENCRYPTED_AUTHENTICATED
+};
+
+#endif // BARRIER_LIB_NET_CONNECTION_SECURITY_LEVEL_H
diff --git a/src/lib/net/FingerprintData.cpp b/src/lib/net/FingerprintData.cpp
new file mode 100644
index 0000000..460b39b
--- /dev/null
+++ b/src/lib/net/FingerprintData.cpp
@@ -0,0 +1,52 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 "base/String.h"
+#include "FingerprintDatabase.h"
+#include "io/filesystem.h"
+#include <algorithm>
+#include <fstream>
+
+namespace barrier {
+
+bool FingerprintData::operator==(const FingerprintData& other) const
+{
+ return algorithm == other.algorithm && data == other.data;
+}
+
+const char* fingerprint_type_to_string(FingerprintType type)
+{
+ switch (type) {
+ case FingerprintType::INVALID: return "invalid";
+ case FingerprintType::SHA1: return "sha1";
+ case FingerprintType::SHA256: return "sha256";
+ }
+ return "invalid";
+}
+
+FingerprintType fingerprint_type_from_string(const std::string& type)
+{
+ if (type == "sha1") {
+ return FingerprintType::SHA1;
+ }
+ if (type == "sha256") {
+ return FingerprintType::SHA256;
+ }
+ return FingerprintType::INVALID;
+}
+
+} // namespace barrier
diff --git a/src/lib/net/FingerprintData.h b/src/lib/net/FingerprintData.h
new file mode 100644
index 0000000..938a695
--- /dev/null
+++ b/src/lib/net/FingerprintData.h
@@ -0,0 +1,46 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_NET_FINGERPRINT_DATA_H
+#define BARRIER_LIB_NET_FINGERPRINT_DATA_H
+
+#include <string>
+#include <vector>
+
+namespace barrier {
+
+enum FingerprintType {
+ INVALID,
+ SHA1, // deprecated
+ SHA256,
+};
+
+struct FingerprintData {
+ std::string algorithm;
+ std::vector<std::uint8_t> data;
+
+ bool valid() const { return !algorithm.empty(); }
+
+ bool operator==(const FingerprintData& other) const;
+};
+
+const char* fingerprint_type_to_string(FingerprintType type);
+FingerprintType fingerprint_type_from_string(const std::string& type);
+
+} // namespace barrier
+
+#endif // BARRIER_LIB_NET_FINGERPRINT_TYPE_H
diff --git a/src/lib/net/FingerprintDatabase.cpp b/src/lib/net/FingerprintDatabase.cpp
new file mode 100644
index 0000000..def0de9
--- /dev/null
+++ b/src/lib/net/FingerprintDatabase.cpp
@@ -0,0 +1,135 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 "base/String.h"
+#include "FingerprintDatabase.h"
+#include "io/filesystem.h"
+#include <algorithm>
+#include <fstream>
+
+namespace barrier {
+
+void FingerprintDatabase::read(const fs::path& path)
+{
+ std::ifstream file;
+ open_utf8_path(file, path, std::ios_base::in);
+ read_stream(file);
+}
+
+void FingerprintDatabase::write(const fs::path& path)
+{
+ std::ofstream file;
+ open_utf8_path(file, path, std::ios_base::out);
+ write_stream(file);
+}
+
+void FingerprintDatabase::read_stream(std::istream& stream)
+{
+ if (!stream.good()) {
+ return;
+ }
+
+ std::string line;
+ while (std::getline(stream, line)) {
+ if (line.empty()) {
+ continue;
+ }
+
+ auto fingerprint = parse_db_line(line);
+ if (!fingerprint.valid()) {
+ continue;
+ }
+
+ fingerprints_.push_back(fingerprint);
+ }
+}
+
+void FingerprintDatabase::write_stream(std::ostream& stream)
+{
+ if (!stream.good()) {
+ return;
+ }
+
+ for (const auto& fingerprint : fingerprints_) {
+ stream << to_db_line(fingerprint) << "\n";
+ }
+}
+
+void FingerprintDatabase::clear()
+{
+ fingerprints_.clear();
+}
+
+void FingerprintDatabase::add_trusted(const FingerprintData& fingerprint)
+{
+ if (is_trusted(fingerprint)) {
+ return;
+ }
+ fingerprints_.push_back(fingerprint);
+}
+
+bool FingerprintDatabase::is_trusted(const FingerprintData& fingerprint)
+{
+ auto found_it = std::find(fingerprints_.begin(), fingerprints_.end(), fingerprint);
+ return found_it != fingerprints_.end();
+}
+
+FingerprintData FingerprintDatabase::parse_db_line(const std::string& line)
+{
+ FingerprintData result;
+
+ // legacy v1 certificate handling
+ if (std::count(line.begin(), line.end(), ':') == 19 && line.size() == 40 + 19) {
+ auto data = string::from_hex(line);
+ if (data.empty()) {
+ return result;
+ }
+ result.algorithm = fingerprint_type_to_string(FingerprintType::SHA1);
+ result.data = data;
+ return result;
+ }
+
+ auto version_end_pos = line.find(':');
+ if (version_end_pos == std::string::npos) {
+ return result;
+ }
+ if (line.substr(0, version_end_pos) != "v2") {
+ return result;
+ }
+ auto algo_start_pos = version_end_pos + 1;
+ auto algo_end_pos = line.find(':', algo_start_pos);
+ if (algo_end_pos == std::string::npos) {
+ return result;
+ }
+ auto algorithm = line.substr(algo_start_pos, algo_end_pos - algo_start_pos);
+ auto data = string::from_hex(line.substr(algo_end_pos + 1));
+
+ if (data.empty()) {
+ return result;
+ }
+
+ result.algorithm = algorithm;
+ result.data = data;
+ return result;
+}
+
+std::string FingerprintDatabase::to_db_line(const FingerprintData& fingerprint)
+{
+ return "v2:" + fingerprint.algorithm + ":" + string::to_hex(fingerprint.data, 2);
+}
+
+} // namespace barrier
diff --git a/src/lib/net/FingerprintDatabase.h b/src/lib/net/FingerprintDatabase.h
new file mode 100644
index 0000000..4927265
--- /dev/null
+++ b/src/lib/net/FingerprintDatabase.h
@@ -0,0 +1,53 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_NET_FINGERPRINT_DATABASE_H
+#define BARRIER_LIB_NET_FINGERPRINT_DATABASE_H
+
+#include "FingerprintData.h"
+#include "io/filesystem.h"
+#include <iosfwd>
+#include <string>
+#include <vector>
+
+namespace barrier {
+
+class FingerprintDatabase {
+public:
+ void read(const fs::path& path);
+ void write(const fs::path& path);
+
+ void read_stream(std::istream& stream);
+ void write_stream(std::ostream& stream);
+
+ void clear();
+ void add_trusted(const FingerprintData& fingerprint);
+ bool is_trusted(const FingerprintData& fingerprint);
+
+ const std::vector<FingerprintData>& fingerprints() const { return fingerprints_; }
+
+ static FingerprintData parse_db_line(const std::string& line);
+ static std::string to_db_line(const FingerprintData& fingerprint);
+
+private:
+
+ std::vector<FingerprintData> fingerprints_;
+};
+
+} // namespace barrier
+
+#endif // BARRIER_LIB_NET_FINGERPRINT_DATABASE_H
diff --git a/src/lib/net/IDataSocket.cpp b/src/lib/net/IDataSocket.cpp
index cc679c3..30e00f4 100644
--- a/src/lib/net/IDataSocket.cpp
+++ b/src/lib/net/IDataSocket.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/IDataSocket.h b/src/lib/net/IDataSocket.h
index c77a99c..0fc41bb 100644
--- a/src/lib/net/IDataSocket.h
+++ b/src/lib/net/IDataSocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/IListenSocket.h b/src/lib/net/IListenSocket.h
index 73dcc6e..5452a37 100644
--- a/src/lib/net/IListenSocket.h
+++ b/src/lib/net/IListenSocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -41,7 +41,7 @@ public:
*/
virtual IDataSocket*
accept() = 0;
-
+
//@}
// ISocket overrides
diff --git a/src/lib/net/ISocket.h b/src/lib/net/ISocket.h
index 0e9688b..f41fd55 100644
--- a/src/lib/net/ISocket.h
+++ b/src/lib/net/ISocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/ISocketFactory.h b/src/lib/net/ISocketFactory.h
index e440953..edfc8c9 100644
--- a/src/lib/net/ISocketFactory.h
+++ b/src/lib/net/ISocketFactory.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -20,6 +20,7 @@
#include "common/IInterface.h"
#include "arch/IArchNetwork.h"
+#include "net/ConnectionSecurityLevel.h"
class IDataSocket;
class IListenSocket;
@@ -35,14 +36,12 @@ public:
//@{
//! Create data socket
- virtual IDataSocket* create(
- IArchNetwork::EAddressFamily family,
- bool secure) const = 0;
+ virtual IDataSocket* create(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const = 0;
//! Create listen socket
- virtual IListenSocket* createListen(
- IArchNetwork::EAddressFamily family,
- bool secure) const = 0;
+ virtual IListenSocket* createListen(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const = 0;
//@}
};
diff --git a/src/lib/net/ISocketMultiplexerJob.h b/src/lib/net/ISocketMultiplexerJob.h
index c27fce2..2dab87e 100644
--- a/src/lib/net/ISocketMultiplexerJob.h
+++ b/src/lib/net/ISocketMultiplexerJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/NetworkAddress.cpp b/src/lib/net/NetworkAddress.cpp
index c8ea9c6..3526fc0 100644
--- a/src/lib/net/NetworkAddress.cpp
+++ b/src/lib/net/NetworkAddress.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/NetworkAddress.h b/src/lib/net/NetworkAddress.h
index 87dc1e4..3a006af 100644
--- a/src/lib/net/NetworkAddress.h
+++ b/src/lib/net/NetworkAddress.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -43,7 +43,7 @@ public:
If \c hostname can be parsed as a numerical address then that's how
it's used, otherwise it's used as a host name. If \c hostname ends
in ":[0-9]+" then that suffix is extracted and used as the port,
- overridding the port parameter. The resulting port must be a valid
+ overriding the port parameter. The resulting port must be a valid
port number (zero is not a valid port number) otherwise \c XSocketAddress
is thrown with an error of \c XSocketAddress::kBadPort. The hostname
is not resolved by the c'tor; use \c resolve to do that.
diff --git a/src/lib/net/SecureListenSocket.cpp b/src/lib/net/SecureListenSocket.cpp
index a137f39..11efc5c 100644
--- a/src/lib/net/SecureListenSocket.cpp
+++ b/src/lib/net/SecureListenSocket.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -20,23 +20,16 @@
#include "SecureSocket.h"
#include "net/NetworkAddress.h"
#include "net/SocketMultiplexer.h"
-#include "net/TSocketMultiplexerMethodJob.h"
+#include "arch/Arch.h"
#include "arch/XArch.h"
#include "common/DataDirectories.h"
#include "base/String.h"
-static const char s_certificateDir[] = { "SSL" };
-static const char s_certificateFilename[] = { "Barrier.pem" };
-
-//
-// SecureListenSocket
-//
-
-SecureListenSocket::SecureListenSocket(
- IEventQueue* events,
- SocketMultiplexer* socketMultiplexer,
- IArchNetwork::EAddressFamily family) :
- TCPListenSocket(events, socketMultiplexer, family)
+SecureListenSocket::SecureListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) :
+ TCPListenSocket(events, socketMultiplexer, family),
+ security_level_{security_level}
{
}
@@ -45,22 +38,15 @@ SecureListenSocket::accept()
{
SecureSocket* socket = NULL;
try {
- socket = new SecureSocket(
- m_events,
- m_socketMultiplexer,
- ARCH->acceptSocket(m_socket, NULL));
+ socket = new SecureSocket(m_events, m_socketMultiplexer,
+ ARCH->acceptSocket(m_socket, NULL), security_level_);
socket->initSsl(true);
if (socket != NULL) {
setListeningJob();
}
- std::string certificateFilename = barrier::string::sprintf("%s/%s/%s",
- DataDirectories::profile().c_str(),
- s_certificateDir,
- s_certificateFilename);
-
- bool loaded = socket->loadCertificates(certificateFilename);
+ bool loaded = socket->load_certificates(barrier::DataDirectories::ssl_certificate_path());
if (!loaded) {
delete socket;
return NULL;
diff --git a/src/lib/net/SecureListenSocket.h b/src/lib/net/SecureListenSocket.h
index d0c6e23..a0e792a 100644
--- a/src/lib/net/SecureListenSocket.h
+++ b/src/lib/net/SecureListenSocket.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -19,18 +19,21 @@
#include "net/TCPListenSocket.h"
#include "common/stdset.h"
+#include "ConnectionSecurityLevel.h"
class IEventQueue;
class SocketMultiplexer;
class IDataSocket;
-class SecureListenSocket : public TCPListenSocket{
+class SecureListenSocket : public TCPListenSocket {
public:
- SecureListenSocket(IEventQueue* events,
- SocketMultiplexer* socketMultiplexer,
- IArchNetwork::EAddressFamily family);
+ SecureListenSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level);
// IListenSocket overrides
virtual IDataSocket*
accept();
+private:
+ ConnectionSecurityLevel security_level_;
};
diff --git a/src/lib/net/SecureSocket.cpp b/src/lib/net/SecureSocket.cpp
index 855e16b..85e1d38 100644
--- a/src/lib/net/SecureSocket.cpp
+++ b/src/lib/net/SecureSocket.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -16,6 +16,7 @@
*/
#include "SecureSocket.h"
+#include "SecureUtils.h"
#include "net/TSocketMultiplexerMethodJob.h"
#include "base/TMethodEventJob.h"
@@ -25,6 +26,8 @@
#include "base/Log.h"
#include "base/String.h"
#include "common/DataDirectories.h"
+#include "io/filesystem.h"
+#include "net/FingerprintDatabase.h"
#include <openssl/ssl.h>
#include <openssl/err.h>
@@ -40,41 +43,36 @@
#define MAX_ERROR_SIZE 65535
+static const std::size_t MAX_INPUT_BUFFER_SIZE = 1024 * 1024;
static const float s_retryDelay = 0.01f;
enum {
kMsgSize = 128
};
-static const char kFingerprintDirName[] = "SSL/Fingerprints";
-//static const char kFingerprintLocalFilename[] = "Local.txt";
-static const char kFingerprintTrustedServersFilename[] = "TrustedServers.txt";
-//static const char kFingerprintTrustedClientsFilename[] = "TrustedClients.txt";
-
struct Ssl {
SSL_CTX* m_context;
SSL* m_ssl;
};
-SecureSocket::SecureSocket(
- IEventQueue* events,
- SocketMultiplexer* socketMultiplexer,
- IArchNetwork::EAddressFamily family) :
+SecureSocket::SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) :
TCPSocket(events, socketMultiplexer, family),
m_ssl(nullptr),
m_secureReady(false),
- m_fatal(false)
+ m_fatal(false),
+ security_level_{security_level}
{
}
-SecureSocket::SecureSocket(
- IEventQueue* events,
- SocketMultiplexer* socketMultiplexer,
- ArchSocket socket) :
+SecureSocket::SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ ArchSocket socket, ConnectionSecurityLevel security_level) :
TCPSocket(events, socketMultiplexer, socket),
m_ssl(nullptr),
m_secureReady(false),
- m_fatal(false)
+ m_fatal(false),
+ security_level_{security_level}
{
}
@@ -103,6 +101,8 @@ SecureSocket::close()
void SecureSocket::freeSSLResources()
{
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
if (m_ssl->m_ssl != NULL) {
SSL_shutdown(m_ssl->m_ssl);
SSL_free(m_ssl->m_ssl);
@@ -133,30 +133,30 @@ std::unique_ptr<ISocketMultiplexerJob> SecureSocket::newJob()
if (m_connected && !m_secureReady) {
return {};
}
-
+
return TCPSocket::newJob();
}
void
SecureSocket::secureConnect()
{
- setJob(std::make_unique<TSocketMultiplexerMethodJob<SecureSocket>>(
- this, &SecureSocket::serviceConnect,
- getSocket(), isReadable(), isWritable()));
+ setJob(std::make_unique<TSocketMultiplexerMethodJob>([this](auto j, auto r, auto w, auto e)
+ { return serviceConnect(j, r, w, e); },
+ getSocket(), isReadable(), isWritable()));
}
void
SecureSocket::secureAccept()
{
- setJob(std::make_unique<TSocketMultiplexerMethodJob<SecureSocket>>(
- this, &SecureSocket::serviceAccept,
- getSocket(), isReadable(), isWritable()));
+ setJob(std::make_unique<TSocketMultiplexerMethodJob>([this](auto j, auto r, auto w, auto e)
+ { return serviceAccept(j, r, w, e); },
+ getSocket(), isReadable(), isWritable()));
}
TCPSocket::EJobResult
SecureSocket::doRead()
{
- static UInt8 buffer[4096];
+ UInt8 buffer[4096];
memset(buffer, 0, sizeof(buffer));
int bytesRead = 0;
int status = 0;
@@ -173,20 +173,24 @@ SecureSocket::doRead()
else {
return kRetry;
}
-
+
if (bytesRead > 0) {
bool wasEmpty = (m_inputBuffer.getSize() == 0);
-
+
// slurp up as much as possible
do {
m_inputBuffer.write(buffer, bytesRead);
-
+
+ if (m_inputBuffer.getSize() > MAX_INPUT_BUFFER_SIZE) {
+ break;
+ }
+
status = secureRead(buffer, sizeof(buffer), bytesRead);
if (status < 0) {
return kBreak;
}
} while (bytesRead > 0 || status > 0);
-
+
// send input ready if input buffer was empty
if (wasEmpty) {
sendEvent(m_events->forIStream().inputReady());
@@ -204,18 +208,13 @@ SecureSocket::doRead()
m_readable = false;
return kNew;
}
-
+
return kRetry;
}
TCPSocket::EJobResult
SecureSocket::doWrite()
{
- static bool s_retry = false;
- static int s_retrySize = 0;
- static std::unique_ptr<char[]> s_staticBuffer;
- static std::size_t s_staticBufferSize = 0;
-
// write data
int bufferSize = 0;
int bytesWrote = 0;
@@ -224,34 +223,34 @@ SecureSocket::doWrite()
if (!isSecureReady())
return kRetry;
- if (s_retry) {
- bufferSize = s_retrySize;
+ if (do_write_retry_) {
+ bufferSize = do_write_retry_size_;
} else {
bufferSize = m_outputBuffer.getSize();
- if (bufferSize > s_staticBufferSize) {
- s_staticBuffer.reset(new char[bufferSize]);
- s_staticBufferSize = bufferSize;
+ if (bufferSize > do_write_retry_buffer_size_) {
+ do_write_retry_buffer_.reset(new char[bufferSize]);
+ do_write_retry_buffer_size_ = bufferSize;
}
if (bufferSize > 0) {
- memcpy(s_staticBuffer.get(), m_outputBuffer.peek(bufferSize), bufferSize);
+ std::memcpy(do_write_retry_buffer_.get(), m_outputBuffer.peek(bufferSize), bufferSize);
}
}
-
+
if (bufferSize == 0) {
return kRetry;
}
- status = secureWrite(s_staticBuffer.get(), bufferSize, bytesWrote);
+ status = secureWrite(do_write_retry_buffer_.get(), bufferSize, bytesWrote);
if (status > 0) {
- s_retry = false;
+ do_write_retry_ = false;
} else if (status < 0) {
return kBreak;
} else if (status == 0) {
- s_retry = true;
- s_retrySize = bufferSize;
+ do_write_retry_ = true;
+ do_write_retry_size_ = bufferSize;
return kNew;
}
-
+
if (bytesWrote > 0) {
discardWrittenData(bytesWrote);
return kNew;
@@ -263,16 +262,16 @@ SecureSocket::doWrite()
int
SecureSocket::secureRead(void* buffer, int size, int& read)
{
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
if (m_ssl->m_ssl != NULL) {
LOG((CLOG_DEBUG2 "reading secure socket"));
read = SSL_read(m_ssl->m_ssl, buffer, size);
-
- static int retry;
// Check result will cleanup the connection in the case of a fatal
- checkResult(read, retry);
-
- if (retry) {
+ checkResult(read, secure_read_retry_);
+
+ if (secure_read_retry_) {
return 0;
}
@@ -289,17 +288,17 @@ SecureSocket::secureRead(void* buffer, int size, int& read)
int
SecureSocket::secureWrite(const void* buffer, int size, int& wrote)
{
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
if (m_ssl->m_ssl != NULL) {
LOG((CLOG_DEBUG2 "writing secure socket:%p", this));
wrote = SSL_write(m_ssl->m_ssl, buffer, size);
-
- static int retry;
// Check result will cleanup the connection in the case of a fatal
- checkResult(wrote, retry);
+ checkResult(wrote, secure_write_retry_);
- if (retry) {
+ if (secure_write_retry_) {
return 0;
}
@@ -322,6 +321,8 @@ SecureSocket::isSecureReady()
void
SecureSocket::initSsl(bool server)
{
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
m_ssl = new Ssl();
m_ssl->m_context = NULL;
m_ssl->m_ssl = NULL;
@@ -329,54 +330,57 @@ SecureSocket::initSsl(bool server)
initContext(server);
}
-bool SecureSocket::loadCertificates(std::string& filename)
+bool SecureSocket::load_certificates(const barrier::fs::path& path)
{
- if (filename.empty()) {
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
+ if (path.empty()) {
showError("ssl certificate is not specified");
return false;
}
else {
- std::ifstream file(filename.c_str());
- bool exist = file.good();
- file.close();
-
- if (!exist) {
- std::string errorMsg("ssl certificate doesn't exist: ");
- errorMsg.append(filename);
- showError(errorMsg.c_str());
+ if (!barrier::fs::is_regular_file(path)) {
+ showError("ssl certificate doesn't exist: " + path.u8string());
return false;
}
}
int r = 0;
- r = SSL_CTX_use_certificate_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM);
+ r = SSL_CTX_use_certificate_file(m_ssl->m_context, path.u8string().c_str(), SSL_FILETYPE_PEM);
if (r <= 0) {
- showError("could not use ssl certificate");
+ showError("could not use ssl certificate: " + path.u8string());
return false;
}
- r = SSL_CTX_use_PrivateKey_file(m_ssl->m_context, filename.c_str(), SSL_FILETYPE_PEM);
+ r = SSL_CTX_use_PrivateKey_file(m_ssl->m_context, path.u8string().c_str(), SSL_FILETYPE_PEM);
if (r <= 0) {
- showError("could not use ssl private key");
+ showError("could not use ssl private key: " + path.u8string());
return false;
}
r = SSL_CTX_check_private_key(m_ssl->m_context);
if (!r) {
- showError("could not verify ssl private key");
+ showError("could not verify ssl private key: " + path.u8string());
return false;
}
return true;
}
+static int cert_verify_ignore_callback(X509_STORE_CTX*, void*)
+{
+ return 1;
+}
+
void
SecureSocket::initContext(bool server)
{
+ // ssl_mutex_ is assumed to be acquired
+
SSL_library_init();
const SSL_METHOD* method;
-
+
// load & register all cryptos, etc.
OpenSSL_add_all_algorithms();
@@ -394,7 +398,7 @@ SecureSocket::initContext(bool server)
else {
method = SSLv23_client_method();
}
-
+
// create new context from method
SSL_METHOD* m = const_cast<SSL_METHOD*>(method);
m_ssl->m_context = SSL_CTX_new(m);
@@ -403,13 +407,23 @@ SecureSocket::initContext(bool server)
SSL_CTX_set_options(m_ssl->m_context, SSL_OP_NO_SSLv3);
if (m_ssl->m_context == NULL) {
- showError();
+ showError("");
+ }
+
+ if (security_level_ == ConnectionSecurityLevel::ENCRYPTED_AUTHENTICATED) {
+ // We want to ask for peer certificate, but not verify it. If we don't ask for peer
+ // certificate, e.g. client won't send it.
+ SSL_CTX_set_verify(m_ssl->m_context, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
+ nullptr);
+ SSL_CTX_set_cert_verify_callback(m_ssl->m_context, cert_verify_ignore_callback, nullptr);
}
}
void
SecureSocket::createSSL()
{
+ // ssl_mutex_ is assumed to be acquired
+
// I assume just one instance is needed
// get new SSL state with context
if (m_ssl->m_ssl == NULL) {
@@ -421,17 +435,17 @@ SecureSocket::createSSL()
int
SecureSocket::secureAccept(int socket)
{
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
createSSL();
// set connection socket to SSL state
SSL_set_fd(m_ssl->m_ssl, socket);
-
+
LOG((CLOG_DEBUG2 "accepting secure socket"));
int r = SSL_accept(m_ssl->m_ssl);
-
- static int retry;
- checkResult(r, retry);
+ checkResult(r, secure_accept_retry_);
if (isFatal()) {
// tell user and sleep so the socket isn't hammered.
@@ -439,12 +453,30 @@ SecureSocket::secureAccept(int socket)
LOG((CLOG_INFO "client connection may not be secure"));
m_secureReady = false;
ARCH->sleep(1);
- retry = 0;
+ secure_accept_retry_ = 0;
return -1; // Failed, error out
}
// If not fatal and no retry, state is good
- if (retry == 0) {
+ if (secure_accept_retry_ == 0) {
+ if (security_level_ == ConnectionSecurityLevel::ENCRYPTED_AUTHENTICATED) {
+ if (verify_cert_fingerprint(
+ barrier::DataDirectories::trusted_clients_ssl_fingerprints_path())) {
+ LOG((CLOG_INFO "accepted secure socket"));
+ if (!ensure_peer_certificate()) {
+ secure_accept_retry_ = 0;
+ disconnect();
+ return -1;// Cert fail, error
+ }
+ }
+ else {
+ LOG((CLOG_ERR "failed to verify server certificate fingerprint"));
+ secure_accept_retry_ = 0;
+ disconnect();
+ return -1; // Fingerprint failed, error
+ }
+ }
+
m_secureReady = true;
LOG((CLOG_INFO "accepted secure socket"));
if (CLOG->getFilter() >= kDEBUG1) {
@@ -455,7 +487,7 @@ SecureSocket::secureAccept(int socket)
}
// If not fatal and retry is set, not ready, and return retry
- if (retry > 0) {
+ if (secure_accept_retry_ > 0) {
LOG((CLOG_DEBUG2 "retry accepting secure socket"));
m_secureReady = false;
ARCH->sleep(s_retryDelay);
@@ -470,38 +502,45 @@ SecureSocket::secureAccept(int socket)
int
SecureSocket::secureConnect(int socket)
{
+ // note that load_certificates acquires ssl_mutex_
+ if (!load_certificates(barrier::DataDirectories::ssl_certificate_path())) {
+ LOG((CLOG_ERR "could not load client certificates"));
+ // FIXME: this is fatal error, but we current don't disconnect because whole logic in this
+ // function needs to be cleaned up
+ }
+
+ std::lock_guard<std::mutex> ssl_lock{ssl_mutex_};
+
createSSL();
// attach the socket descriptor
SSL_set_fd(m_ssl->m_ssl, socket);
-
+
LOG((CLOG_DEBUG2 "connecting secure socket"));
int r = SSL_connect(m_ssl->m_ssl);
-
- static int retry;
- checkResult(r, retry);
+ checkResult(r, secure_connect_retry_);
if (isFatal()) {
LOG((CLOG_ERR "failed to connect secure socket"));
- retry = 0;
+ secure_connect_retry_ = 0;
return -1;
}
// If we should retry, not ready and return 0
- if (retry > 0) {
+ if (secure_connect_retry_ > 0) {
LOG((CLOG_DEBUG2 "retry connect secure socket"));
m_secureReady = false;
ARCH->sleep(s_retryDelay);
return 0;
}
- retry = 0;
+ secure_connect_retry_ = 0;
// No error, set ready, process and return ok
m_secureReady = true;
- if (verifyCertFingerprint()) {
+ if (verify_cert_fingerprint(barrier::DataDirectories::trusted_servers_ssl_fingerprints_path())) {
LOG((CLOG_INFO "connected to secure socket"));
- if (!showCertificate()) {
+ if (!ensure_peer_certificate()) {
disconnect();
return -1;// Cert fail, error
}
@@ -520,21 +559,22 @@ SecureSocket::secureConnect(int socket)
}
bool
-SecureSocket::showCertificate()
+SecureSocket::ensure_peer_certificate()
{
+ // ssl_mutex_ is assumed to be acquired
X509* cert;
char* line;
-
+
// get the server's certificate
cert = SSL_get_peer_certificate(m_ssl->m_ssl);
if (cert != NULL) {
line = X509_NAME_oneline(X509_get_subject_name(cert), 0, 0);
- LOG((CLOG_INFO "server ssl certificate info: %s", line));
+ LOG((CLOG_INFO "peer ssl certificate info: %s", line));
OPENSSL_free(line);
X509_free(cert);
}
else {
- showError("server has no ssl certificate");
+ showError("peer has no ssl certificate");
return false;
}
@@ -544,6 +584,8 @@ SecureSocket::showCertificate()
void
SecureSocket::checkResult(int status, int& retry)
{
+ // ssl_mutex_ is assumed to be acquired
+
// ssl errors are a little quirky. the "want" errors are normal and
// should result in a retry.
@@ -568,7 +610,7 @@ SecureSocket::checkResult(int status, int& retry)
case SSL_ERROR_WANT_WRITE:
// Need to make sure the socket is known to be writable so the impending
- // select action actually triggers on a write. This isn't necessary for
+ // select action actually triggers on a write. This isn't necessary for
// m_readable because the socket logic is always readable
m_writable = true;
retry++;
@@ -618,16 +660,15 @@ SecureSocket::checkResult(int status, int& retry)
if (isFatal()) {
retry = 0;
- showError();
+ showError("");
disconnect();
}
}
-void
-SecureSocket::showError(const char* reason)
+void SecureSocket::showError(const std::string& reason)
{
- if (reason != NULL) {
- LOG((CLOG_ERR "%s", reason));
+ if (!reason.empty()) {
+ LOG((CLOG_ERR "%s", reason.c_str()));
}
std::string error = getError();
@@ -658,83 +699,49 @@ SecureSocket::disconnect()
sendEvent(getEvents()->forIStream().inputShutdown());
}
-void SecureSocket::formatFingerprint(std::string& fingerprint, bool hex, bool separator)
+bool SecureSocket::verify_cert_fingerprint(const barrier::fs::path& fingerprint_db_path)
{
- if (hex) {
- // to hexidecimal
- barrier::string::toHex(fingerprint, 2);
- }
-
- // all uppercase
- barrier::string::uppercase(fingerprint);
+ // ssl_mutex_ is assumed to be acquired
- if (separator) {
- // add colon to separate each 2 charactors
- size_t separators = fingerprint.size() / 2;
- for (size_t i = 1; i < separators; i++) {
- fingerprint.insert(i * 3 - 1, ":");
- }
- }
-}
-
-bool
-SecureSocket::verifyCertFingerprint()
-{
// calculate received certificate fingerprint
- X509 *cert = cert = SSL_get_peer_certificate(m_ssl->m_ssl);
- EVP_MD* tempDigest;
- unsigned char tempFingerprint[EVP_MAX_MD_SIZE];
- unsigned int tempFingerprintLen;
- tempDigest = (EVP_MD*)EVP_sha1();
- int digestResult = X509_digest(cert, tempDigest, tempFingerprint, &tempFingerprintLen);
-
- if (digestResult <= 0) {
- LOG((CLOG_ERR "failed to calculate fingerprint, digest result: %d", digestResult));
+ barrier::FingerprintData fingerprint_sha1, fingerprint_sha256;
+ try {
+ auto* cert = SSL_get_peer_certificate(m_ssl->m_ssl);
+ fingerprint_sha1 = barrier::get_ssl_cert_fingerprint(cert,
+ barrier::FingerprintType::SHA1);
+ fingerprint_sha256 = barrier::get_ssl_cert_fingerprint(cert,
+ barrier::FingerprintType::SHA256);
+ } catch (const std::exception& e) {
+ LOG((CLOG_ERR "%s", e.what()));
return false;
}
- // format fingerprint into hexdecimal format with colon separator
- std::string fingerprint(reinterpret_cast<char*>(tempFingerprint), tempFingerprintLen);
- formatFingerprint(fingerprint);
- LOG((CLOG_NOTE "server fingerprint: %s", fingerprint.c_str()));
-
- std::string trustedServersFilename;
- trustedServersFilename = barrier::string::sprintf(
- "%s/%s/%s",
- DataDirectories::profile().c_str(),
- kFingerprintDirName,
- kFingerprintTrustedServersFilename);
+ // note: the GUI parses the following two lines of logs, don't change unnecessarily
+ LOG((CLOG_NOTE "peer fingerprint (SHA1): %s (SHA256): %s",
+ barrier::format_ssl_fingerprint(fingerprint_sha1.data).c_str(),
+ barrier::format_ssl_fingerprint(fingerprint_sha256.data).c_str()));
// Provide debug hint as to what file is being used to verify fingerprint trust
- LOG((CLOG_NOTE "trustedServersFilename: %s", trustedServersFilename.c_str() ));
+ LOG((CLOG_NOTE "fingerprint_db_path: %s", fingerprint_db_path.u8string().c_str()));
- // check if this fingerprint exist
- std::string fileLine;
- std::ifstream file;
- file.open(trustedServersFilename.c_str());
+ barrier::FingerprintDatabase db;
+ db.read(fingerprint_db_path);
- if (!file.is_open()) {
- LOG((CLOG_NOTE "Unable to open trustedServersFile: %s", trustedServersFilename.c_str() ));
+ if (!db.fingerprints().empty()) {
+ LOG((CLOG_NOTE "Read %d fingerprints from: %s", db.fingerprints().size(),
+ fingerprint_db_path.u8string().c_str()));
} else {
- LOG((CLOG_NOTE "Opened trustedServersFilename: %s", trustedServersFilename.c_str() ));
+ LOG((CLOG_NOTE "Could not read fingerprints from: %s",
+ fingerprint_db_path.u8string().c_str()));
}
- bool isValid = false;
- while (!file.eof() && file.is_open()) {
- getline(file,fileLine);
- if (!fileLine.empty()) {
- if (fileLine.compare(fingerprint) == 0) {
- LOG((CLOG_NOTE "Fingerprint matches trusted fingerprint"));
- isValid = true;
- break;
- } else {
- LOG((CLOG_NOTE "Fingerprint does not match trusted fingerprint"));
- }
- }
+ if (db.is_trusted(fingerprint_sha256)) {
+ LOG((CLOG_NOTE "Fingerprint matches trusted fingerprint"));
+ return true;
+ } else {
+ LOG((CLOG_NOTE "Fingerprint does not match trusted fingerprint"));
+ return false;
}
-
- file.close();
- return isValid;
}
MultiplexerJobStatus SecureSocket::serviceConnect(ISocketMultiplexerJob* job,
@@ -765,9 +772,9 @@ MultiplexerJobStatus SecureSocket::serviceConnect(ISocketMultiplexerJob* job,
// Retry case
return {
true,
- std::make_unique<TSocketMultiplexerMethodJob<SecureSocket>>(
- this, &SecureSocket::serviceConnect,
- getSocket(), isReadable(), isWritable())
+ std::make_unique<TSocketMultiplexerMethodJob>([this](auto j, auto r, auto w, auto e)
+ { return serviceConnect(j, r, w, e); },
+ getSocket(), isReadable(), isWritable())
};
}
@@ -795,9 +802,12 @@ MultiplexerJobStatus SecureSocket::serviceAccept(ISocketMultiplexerJob* job,
}
// Retry case
- return {true, std::make_unique<TSocketMultiplexerMethodJob<SecureSocket>>(
- this, &SecureSocket::serviceAccept,
- getSocket(), isReadable(), isWritable())};
+ return {
+ true,
+ std::make_unique<TSocketMultiplexerMethodJob>([this](auto j, auto r, auto w, auto e)
+ { return serviceAccept(j, r, w, e); },
+ getSocket(), isReadable(), isWritable())
+ };
}
void
@@ -822,6 +832,8 @@ showCipherStackDesc(STACK_OF(SSL_CIPHER) * stack) {
void
SecureSocket::showSecureCipherInfo()
{
+ // ssl_mutex_ is assumed to be acquired
+
STACK_OF(SSL_CIPHER) * sStack = SSL_get_ciphers(m_ssl->m_ssl);
if (sStack == NULL) {
@@ -832,8 +844,8 @@ SecureSocket::showSecureCipherInfo()
showCipherStackDesc(sStack);
}
-#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
- // m_ssl->m_ssl->session->ciphers is not forward compatable,
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+ // m_ssl->m_ssl->session->ciphers is not forward compatible,
// In future release of OpenSSL, it's not visible,
STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers;
#else
@@ -864,6 +876,8 @@ SecureSocket::showSecureLibInfo()
void
SecureSocket::showSecureConnectInfo()
{
+ // ssl_mutex_ is assumed to be acquired
+
const SSL_CIPHER* cipher = SSL_get_current_cipher(m_ssl->m_ssl);
if (cipher != NULL) {
diff --git a/src/lib/net/SecureSocket.h b/src/lib/net/SecureSocket.h
index c602e2d..be7dc0d 100644
--- a/src/lib/net/SecureSocket.h
+++ b/src/lib/net/SecureSocket.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -17,8 +17,11 @@
#pragma once
+#include "ConnectionSecurityLevel.h"
#include "net/TCPSocket.h"
#include "net/XSocket.h"
+#include "io/filesystem.h"
+#include <mutex>
class IEventQueue;
class SocketMultiplexer;
@@ -32,10 +35,10 @@ A secure socket using SSL.
*/
class SecureSocket : public TCPSocket {
public:
- SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family);
- SecureSocket(IEventQueue* events,
- SocketMultiplexer* socketMultiplexer,
- ArchSocket socket);
+ SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ IArchNetwork::EAddressFamily family, ConnectionSecurityLevel security_level);
+ SecureSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer,
+ ArchSocket socket, ConnectionSecurityLevel security_level);
~SecureSocket();
// ISocket overrides
@@ -43,7 +46,7 @@ public:
// IDataSocket overrides
virtual void connect(const NetworkAddress&) override;
-
+
std::unique_ptr<ISocketMultiplexerJob> newJob() override;
bool isFatal() const override { return m_fatal; }
void isFatal(bool b) { m_fatal = b; }
@@ -55,35 +58,56 @@ public:
EJobResult doRead() override;
EJobResult doWrite() override;
void initSsl(bool server);
- bool loadCertificates(std::string& CertFile);
+ bool load_certificates(const barrier::fs::path& path);
private:
// SSL
- void initContext(bool server);
- void createSSL();
+ void initContext(bool server); // may only be called with ssl_mutex_ acquired
+ void createSSL(); // may only be called with ssl_mutex_ acquired.
int secureAccept(int s);
int secureConnect(int s);
- bool showCertificate();
- void checkResult(int n, int& retry);
- void showError(const char* reason = NULL);
+ bool ensure_peer_certificate(); // may only be called with ssl_mutex_ acquired
+
+ void checkResult(int n, int& retry); // may only be called with m_ssl_mutex_ acquired.
+
+ void showError(const std::string& reason);
std::string getError();
void disconnect();
- void formatFingerprint(std::string& fingerprint, bool hex = true, bool separator = true);
- bool verifyCertFingerprint();
+
+ // may only be called with ssl_mutex_ acquired
+ bool verify_cert_fingerprint(const barrier::fs::path& fingerprint_db_path);
MultiplexerJobStatus serviceConnect(ISocketMultiplexerJob*, bool, bool, bool);
MultiplexerJobStatus serviceAccept(ISocketMultiplexerJob*, bool, bool, bool);
- void showSecureConnectInfo();
- void showSecureLibInfo();
- void showSecureCipherInfo();
-
+ void showSecureConnectInfo(); // may only be called with ssl_mutex_ acquired
+ void showSecureLibInfo();
+ void showSecureCipherInfo(); // may only be called with ssl_mutex_ acquired
+
void handleTCPConnected(const Event& event, void*);
void freeSSLResources();
private:
+ // all accesses to m_ssl must be protected by this mutex. The only function that is called
+ // from outside SocketMultiplexer thread is close(), so we mostly care about things accessed
+ // by it.
+ std::mutex ssl_mutex_;
+
Ssl* m_ssl;
bool m_secureReady;
bool m_fatal;
+ ConnectionSecurityLevel security_level_ = ConnectionSecurityLevel::ENCRYPTED;
+
+ int secure_accept_retry_ = 0; // used only in secureAccept()
+ int secure_connect_retry_ = 0; // used only in secureConnect()
+ int secure_read_retry_ = 0; // used only in secureRead()
+ int secure_write_retry_ = 0; // used only in secureWrite()
+
+ // The following are used only from doWrite()
+ // FIXME: using std::vector would simplify logic significantly.
+ bool do_write_retry_ = false;
+ int do_write_retry_size_ = 0;
+ std::unique_ptr<char[]> do_write_retry_buffer_;
+ std::size_t do_write_retry_buffer_size_ = 0;
};
diff --git a/src/lib/net/SecureUtils.cpp b/src/lib/net/SecureUtils.cpp
new file mode 100644
index 0000000..c581dd4
--- /dev/null
+++ b/src/lib/net/SecureUtils.cpp
@@ -0,0 +1,312 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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/>.
+
+ -----------------------------------------------------------------------
+ create_fingerprint_randomart() has been taken from the OpenSSH project.
+ Copyright information follows.
+
+ Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
+ Copyright (c) 2008 Alexander von Gernler. All rights reserved.
+ Copyright (c) 2010,2011 Damien Miller. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include "SecureUtils.h"
+#include "base/String.h"
+#include "base/finally.h"
+#include "io/filesystem.h"
+
+#include <openssl/evp.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/pem.h>
+#include <algorithm>
+#include <cstdio>
+#include <cstring>
+#include <stdexcept>
+
+#if SYSAPI_WIN32
+// Windows builds require a shim that makes it possible to link to different
+// versions of the Win32 C runtime. See OpenSSL FAQ.
+#include <openssl/applink.c>
+#endif
+
+namespace barrier {
+
+namespace {
+
+const EVP_MD* get_digest_for_type(FingerprintType type)
+{
+ switch (type) {
+ case FingerprintType::SHA1: return EVP_sha1();
+ case FingerprintType::SHA256: return EVP_sha256();
+ }
+ throw std::runtime_error("Unknown fingerprint type " + std::to_string(static_cast<int>(type)));
+}
+
+} // namespace
+
+std::string format_ssl_fingerprint(const std::vector<uint8_t>& fingerprint, bool separator)
+{
+ std::string result = barrier::string::to_hex(fingerprint, 2);
+
+ // all uppercase
+ barrier::string::uppercase(result);
+
+ if (separator) {
+ // add colon to separate each 2 characters
+ size_t separators = result.size() / 2;
+ for (size_t i = 1; i < separators; i++) {
+ result.insert(i * 3 - 1, ":");
+ }
+ }
+ return result;
+}
+
+std::string format_ssl_fingerprint_columns(const std::vector<uint8_t>& fingerprint)
+{
+ auto max_columns = 8;
+
+ std::string hex = barrier::string::to_hex(fingerprint, 2);
+ barrier::string::uppercase(hex);
+ if (hex.empty() || hex.size() % 2 != 0) {
+ return hex;
+ }
+
+ std::string separated;
+ for (std::size_t i = 0; i < hex.size(); i += max_columns * 2) {
+ for (std::size_t j = i; j < i + 16 && j < hex.size() - 1; j += 2) {
+ separated.push_back(hex[j]);
+ separated.push_back(hex[j + 1]);
+ separated.push_back(':');
+ }
+ separated.push_back('\n');
+ }
+ separated.pop_back(); // we don't need last newline character
+ return separated;
+}
+
+FingerprintData get_ssl_cert_fingerprint(X509* cert, FingerprintType type)
+{
+ if (!cert) {
+ throw std::runtime_error("certificate is null");
+ }
+
+ unsigned char digest[EVP_MAX_MD_SIZE];
+ unsigned int digest_length = 0;
+ int result = X509_digest(cert, get_digest_for_type(type), digest, &digest_length);
+
+ if (result <= 0) {
+ throw std::runtime_error("failed to calculate fingerprint, digest result: " +
+ std::to_string(result));
+ }
+
+ std::vector<std::uint8_t> digest_vec;
+ digest_vec.assign(reinterpret_cast<std::uint8_t*>(digest),
+ reinterpret_cast<std::uint8_t*>(digest) + digest_length);
+ return {fingerprint_type_to_string(type), digest_vec};
+}
+
+FingerprintData get_pem_file_cert_fingerprint(const std::string& path, FingerprintType type)
+{
+ auto fp = fopen_utf8_path(path, "r");
+ if (!fp) {
+ throw std::runtime_error("Could not open certificate path");
+ }
+ auto file_close = finally([fp]() { std::fclose(fp); });
+
+ X509* cert = PEM_read_X509(fp, nullptr, nullptr, nullptr);
+ if (!cert) {
+ throw std::runtime_error("Certificate could not be parsed");
+ }
+ auto cert_free = finally([cert]() { X509_free(cert); });
+
+ return get_ssl_cert_fingerprint(cert, type);
+}
+
+void generate_pem_self_signed_cert(const std::string& path)
+{
+ auto expiration_days = 365;
+
+ auto* private_key = EVP_PKEY_new();
+ if (!private_key) {
+ throw std::runtime_error("Could not allocate private key for certificate");
+ }
+ auto private_key_free = finally([private_key](){ EVP_PKEY_free(private_key); });
+
+ auto* rsa = RSA_generate_key(2048, RSA_F4, nullptr, nullptr);
+ if (!rsa) {
+ throw std::runtime_error("Failed to generate RSA key");
+ }
+ EVP_PKEY_assign_RSA(private_key, rsa);
+
+ auto* cert = X509_new();
+ if (!cert) {
+ throw std::runtime_error("Could not allocate certificate");
+ }
+ auto cert_free = finally([cert]() { X509_free(cert); });
+
+ ASN1_INTEGER_set(X509_get_serialNumber(cert), 1);
+ X509_gmtime_adj(X509_get_notBefore(cert), 0);
+ X509_gmtime_adj(X509_get_notAfter(cert), expiration_days * 24 * 3600);
+ X509_set_pubkey(cert, private_key);
+
+ auto* name = X509_get_subject_name(cert);
+ X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC,
+ reinterpret_cast<const unsigned char *>("Barrier"), -1, -1, 0);
+ X509_set_issuer_name(cert, name);
+
+ X509_sign(cert, private_key, EVP_sha256());
+
+ auto fp = fopen_utf8_path(path.c_str(), "r");
+ if (!fp) {
+ throw std::runtime_error("Could not open certificate output path");
+ }
+ auto file_close = finally([fp]() { std::fclose(fp); });
+
+ PEM_write_PrivateKey(fp, private_key, nullptr, nullptr, 0, nullptr, nullptr);
+ PEM_write_X509(fp, cert);
+}
+
+/*
+ Draw an ASCII-Art representing the fingerprint so human brain can
+ profit from its built-in pattern recognition ability.
+ This technique is called "random art" and can be found in some
+ scientific publications like this original paper:
+
+ "Hash Visualization: a New Technique to improve Real-World Security",
+ Perrig A. and Song D., 1999, International Workshop on Cryptographic
+ Techniques and E-Commerce (CrypTEC '99)
+ sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
+
+ The subject came up in a talk by Dan Kaminsky, too.
+
+ If you see the picture is different, the key is different.
+ If the picture looks the same, you still know nothing.
+
+ The algorithm used here is a worm crawling over a discrete plane,
+ leaving a trace (augmenting the field) everywhere it goes.
+ Movement is taken from dgst_raw 2bit-wise. Bumping into walls
+ makes the respective movement vector be ignored for this turn.
+ Graphs are not unambiguous, because circles in graphs can be
+walked in either direction.
+ */
+
+/*
+ Field sizes for the random art. Have to be odd, so the starting point
+ can be in the exact middle of the picture, and FLDBASE should be >=8 .
+ Else pictures would be too dense, and drawing the frame would
+ fail, too, because the key type would not fit in anymore.
+*/
+#define FLDBASE 8
+#define FLDSIZE_Y (FLDBASE + 1)
+#define FLDSIZE_X (FLDBASE * 2 + 1)
+
+std::string create_fingerprint_randomart(const std::vector<std::uint8_t>& dgst_raw)
+{
+ /*
+ * Chars to be used after each other every time the worm
+ * intersects with itself. Matter of taste.
+ */
+ const char* augmentation_string = " .o+=*BOX@%&#/^SE";
+ char *p;
+ std::uint8_t field[FLDSIZE_X][FLDSIZE_Y];
+ std::size_t i;
+ std::uint32_t b;
+ int x, y;
+ std::size_t len = strlen(augmentation_string) - 1;
+
+ std::vector<char> retval;
+ retval.reserve((FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
+
+ auto add_char = [&retval](char ch) { retval.push_back(ch); };
+
+ /* initialize field */
+ std::memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
+ x = FLDSIZE_X / 2;
+ y = FLDSIZE_Y / 2;
+
+ /* process raw key */
+ for (i = 0; i < dgst_raw.size(); i++) {
+ /* each byte conveys four 2-bit move commands */
+ int input = dgst_raw[i];
+ for (b = 0; b < 4; b++) {
+ /* evaluate 2 bit, rest is shifted later */
+ x += (input & 0x1) ? 1 : -1;
+ y += (input & 0x2) ? 1 : -1;
+
+ /* assure we are still in bounds */
+ x = std::max(x, 0);
+ y = std::max(y, 0);
+ x = std::min(x, FLDSIZE_X - 1);
+ y = std::min(y, FLDSIZE_Y - 1);
+
+ /* augment the field */
+ if (field[x][y] < len - 2)
+ field[x][y]++;
+ input = input >> 2;
+ }
+ }
+
+ /* mark starting point and end point*/
+ field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
+ field[x][y] = len;
+
+ /* output upper border */
+ add_char('+');
+ for (i = 0; i < FLDSIZE_X; i++)
+ add_char('-');
+ add_char('+');
+ add_char('\n');
+
+ /* output content */
+ for (y = 0; y < FLDSIZE_Y; y++) {
+ add_char('|');
+ for (x = 0; x < FLDSIZE_X; x++)
+ add_char(augmentation_string[std::min<int>(field[x][y], len)]);
+ add_char('|');
+ add_char('\n');
+ }
+
+ /* output lower border */
+ add_char('+');
+ for (i = 0; i < FLDSIZE_X; i++)
+ add_char('-');
+ add_char('+');
+
+ return std::string{retval.data(), retval.size()};
+}
+
+} // namespace barrier
diff --git a/src/lib/net/SecureUtils.h b/src/lib/net/SecureUtils.h
new file mode 100644
index 0000000..c4d51f3
--- /dev/null
+++ b/src/lib/net/SecureUtils.h
@@ -0,0 +1,43 @@
+/*
+ barrier -- mouse and keyboard sharing utility
+ Copyright (C) Barrier contributors
+
+ 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 BARRIER_LIB_NET_SECUREUTILS_H
+#define BARRIER_LIB_NET_SECUREUTILS_H
+
+#include "FingerprintData.h"
+#include <openssl/ossl_typ.h>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+namespace barrier {
+
+std::string format_ssl_fingerprint(const std::vector<std::uint8_t>& fingerprint,
+ bool separator = true);
+std::string format_ssl_fingerprint_columns(const std::vector<uint8_t>& fingerprint);
+
+FingerprintData get_ssl_cert_fingerprint(X509* cert, FingerprintType type);
+
+FingerprintData get_pem_file_cert_fingerprint(const std::string& path, FingerprintType type);
+
+void generate_pem_self_signed_cert(const std::string& path);
+
+std::string create_fingerprint_randomart(const std::vector<std::uint8_t>& dgst_raw);
+
+} // namespace barrier
+
+#endif // BARRIER_LIB_NET_SECUREUTILS_H
diff --git a/src/lib/net/SocketMultiplexer.cpp b/src/lib/net/SocketMultiplexer.cpp
index cdb9039..5a2328e 100644
--- a/src/lib/net/SocketMultiplexer.cpp
+++ b/src/lib/net/SocketMultiplexer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -26,7 +26,6 @@
#include "arch/Arch.h"
#include "arch/XArch.h"
#include "base/Log.h"
-#include "base/TMethodJob.h"
#include "common/stdvector.h"
//
@@ -58,8 +57,7 @@ SocketMultiplexer::SocketMultiplexer() :
m_jobListLockLocker(NULL)
{
// start thread
- m_thread = new Thread(new TMethodJob<SocketMultiplexer>(
- this, &SocketMultiplexer::serviceThread));
+ m_thread = new Thread([this](){ service_thread(); });
}
SocketMultiplexer::~SocketMultiplexer()
@@ -95,7 +93,7 @@ void SocketMultiplexer::addSocket(ISocket* socket, std::unique_ptr<ISocketMultip
if (i == m_socketJobMap.end()) {
// we *must* put the job at the end so the order of jobs in
// the list continue to match the order of jobs in pfds in
- // serviceThread().
+ // service_thread().
JobCursor j = m_socketJobs.insert(m_socketJobs.end(), std::move(job));
m_update = true;
m_socketJobMap.insert(std::make_pair(socket, j));
@@ -125,7 +123,7 @@ SocketMultiplexer::removeSocket(ISocket* socket)
// remove job. rather than removing it from the map we put NULL
// in the list instead so the order of jobs in the list continues
- // to match the order of jobs in pfds in serviceThread().
+ // to match the order of jobs in pfds in service_thread().
SocketJobMap::iterator i = m_socketJobMap.find(socket);
if (i != m_socketJobMap.end()) {
if (*(i->second)) {
@@ -138,8 +136,7 @@ SocketMultiplexer::removeSocket(ISocket* socket)
unlockJobList();
}
-void
-SocketMultiplexer::serviceThread(void*)
+void SocketMultiplexer::service_thread()
{
std::vector<IArchNetwork::PollEntry> pfds;
IArchNetwork::PollEntry pfd;
@@ -179,7 +176,7 @@ SocketMultiplexer::serviceThread(void*)
pfd.m_events |= IArchNetwork::kPOLLOUT;
}
pfds.push_back(pfd);
- }
+ }
jobCursor = nextCursor(cursor);
}
deleteCursor(cursor);
diff --git a/src/lib/net/SocketMultiplexer.h b/src/lib/net/SocketMultiplexer.h
index 9891558..b13c725 100644
--- a/src/lib/net/SocketMultiplexer.h
+++ b/src/lib/net/SocketMultiplexer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -67,7 +67,7 @@ private:
// and m_update while m_pollable and m_polling are true. all other
// threads must only modify these when m_pollable and m_polling are
// false. only the service thread sets m_polling.
- void serviceThread(void*);
+ void service_thread();
// create, iterate, and destroy a cursor. a cursor is used to
// safely iterate through the job list while other threads modify
diff --git a/src/lib/net/TCPListenSocket.cpp b/src/lib/net/TCPListenSocket.cpp
index 26f03b0..2c305fc 100644
--- a/src/lib/net/TCPListenSocket.cpp
+++ b/src/lib/net/TCPListenSocket.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -70,8 +70,10 @@ TCPListenSocket::bind(const NetworkAddress& addr)
ARCH->bindSocket(m_socket, addr.getAddress());
ARCH->listenOnSocket(m_socket);
- auto new_job = std::make_unique<TSocketMultiplexerMethodJob<TCPListenSocket>>(
- this, &TCPListenSocket::serviceListening, m_socket, true, false);
+ auto new_job = std::make_unique<TSocketMultiplexerMethodJob>(
+ [this](auto j, auto r, auto w, auto e)
+ { return serviceListening(j, r, w, e); },
+ m_socket, true, false);
m_socketMultiplexer->addSocket(this, std::move(new_job));
}
@@ -136,8 +138,10 @@ TCPListenSocket::accept()
void
TCPListenSocket::setListeningJob()
{
- auto new_job = std::make_unique<TSocketMultiplexerMethodJob<TCPListenSocket>>(
- this, &TCPListenSocket::serviceListening, m_socket, true, false);
+ auto new_job = std::make_unique<TSocketMultiplexerMethodJob>(
+ [this](auto j, auto r, auto w, auto e)
+ { return serviceListening(j, r, w, e); },
+ m_socket, true, false);
m_socketMultiplexer->addSocket(this, std::move(new_job));
}
diff --git a/src/lib/net/TCPListenSocket.h b/src/lib/net/TCPListenSocket.h
index f3ababc..109c1c3 100644
--- a/src/lib/net/TCPListenSocket.h
+++ b/src/lib/net/TCPListenSocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/net/TCPSocket.cpp b/src/lib/net/TCPSocket.cpp
index 09a8f17..fa7edcc 100644
--- a/src/lib/net/TCPSocket.cpp
+++ b/src/lib/net/TCPSocket.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -33,9 +33,7 @@
#include <cstdlib>
#include <memory>
-//
-// TCPSocket
-//
+static const std::size_t MAX_INPUT_BUFFER_SIZE = 1024 * 1024;
TCPSocket::TCPSocket(IEventQueue* events, SocketMultiplexer* socketMultiplexer, IArchNetwork::EAddressFamily family) :
IDataSocket(events),
@@ -335,19 +333,23 @@ TCPSocket::doRead()
UInt8 buffer[4096];
memset(buffer, 0, sizeof(buffer));
size_t bytesRead = 0;
-
+
bytesRead = ARCH->readSocket(m_socket, buffer, sizeof(buffer));
-
+
if (bytesRead > 0) {
bool wasEmpty = (m_inputBuffer.getSize() == 0);
-
+
// slurp up as much as possible
do {
m_inputBuffer.write(buffer, (UInt32)bytesRead);
+ if (m_inputBuffer.getSize() > MAX_INPUT_BUFFER_SIZE) {
+ break;
+ }
+
bytesRead = ARCH->readSocket(m_socket, buffer, sizeof(buffer));
} while (bytesRead > 0);
-
+
// send input ready if input buffer was empty
if (wasEmpty) {
sendEvent(m_events->forIStream().inputReady());
@@ -365,7 +367,7 @@ TCPSocket::doRead()
m_readable = false;
return kNew;
}
-
+
return kRetry;
}
@@ -384,7 +386,7 @@ TCPSocket::doWrite()
discardWrittenData(bytesWrote);
return kNew;
}
-
+
return kRetry;
}
@@ -424,18 +426,20 @@ std::unique_ptr<ISocketMultiplexerJob> TCPSocket::newJob()
if (!(m_readable || m_writable)) {
return {};
}
- return std::make_unique<TSocketMultiplexerMethodJob<TCPSocket>>(
- this, &TCPSocket::serviceConnecting,
- m_socket, m_readable, m_writable);
+ return std::make_unique<TSocketMultiplexerMethodJob>(
+ [this](auto j, auto r, auto w, auto e)
+ { return serviceConnecting(j, r, w, e); },
+ m_socket, m_readable, m_writable);
}
else {
- if (!(m_readable || (m_writable && (m_outputBuffer.getSize() > 0)))) {
+ auto writable = m_writable && (m_outputBuffer.getSize() > 0);
+ if (!(m_readable || writable)) {
return {};
}
- return std::make_unique<TSocketMultiplexerMethodJob<TCPSocket>>(
- this, &TCPSocket::serviceConnected,
- m_socket, m_readable,
- m_writable && (m_outputBuffer.getSize() > 0));
+ return std::make_unique<TSocketMultiplexerMethodJob>(
+ [this](auto j, auto r, auto w, auto e)
+ { return serviceConnected(j, r, w, e); },
+ m_socket, m_readable, writable);
}
}
diff --git a/src/lib/net/TCPSocket.h b/src/lib/net/TCPSocket.h
index 0b98888..45aed07 100644
--- a/src/lib/net/TCPSocket.h
+++ b/src/lib/net/TCPSocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -59,7 +59,7 @@ public:
// IDataSocket overrides
virtual void connect(const NetworkAddress&);
-
+
virtual std::unique_ptr<ISocketMultiplexerJob> newJob();
protected:
@@ -68,7 +68,7 @@ protected:
kRetry, //!< Retry the same job
kNew //!< Require a new job
};
-
+
ArchSocket getSocket() { return m_socket; }
IEventQueue* getEvents() { return m_events; }
virtual EJobResult doRead();
@@ -105,7 +105,7 @@ protected:
IEventQueue* m_events;
StreamBuffer m_inputBuffer;
StreamBuffer m_outputBuffer;
-
+
private:
Mutex m_mutex;
ArchSocket m_socket;
diff --git a/src/lib/net/TCPSocketFactory.cpp b/src/lib/net/TCPSocketFactory.cpp
index 6ff4ef8..30e930e 100644
--- a/src/lib/net/TCPSocketFactory.cpp
+++ b/src/lib/net/TCPSocketFactory.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -40,11 +40,12 @@ TCPSocketFactory::~TCPSocketFactory()
// do nothing
}
-IDataSocket*
-TCPSocketFactory::create(IArchNetwork::EAddressFamily family, bool secure) const
+IDataSocket* TCPSocketFactory::create(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const
{
- if (secure) {
- SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family);
+ if (security_level != ConnectionSecurityLevel::PLAINTEXT) {
+ SecureSocket* secureSocket = new SecureSocket(m_events, m_socketMultiplexer, family,
+ security_level);
secureSocket->initSsl (false);
return secureSocket;
}
@@ -53,12 +54,12 @@ TCPSocketFactory::create(IArchNetwork::EAddressFamily family, bool secure) const
}
}
-IListenSocket*
-TCPSocketFactory::createListen(IArchNetwork::EAddressFamily family, bool secure) const
+IListenSocket* TCPSocketFactory::createListen(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const
{
IListenSocket* socket = NULL;
- if (secure) {
- socket = new SecureListenSocket(m_events, m_socketMultiplexer, family);
+ if (security_level != ConnectionSecurityLevel::PLAINTEXT) {
+ socket = new SecureListenSocket(m_events, m_socketMultiplexer, family, security_level);
}
else {
socket = new TCPListenSocket(m_events, m_socketMultiplexer, family);
diff --git a/src/lib/net/TCPSocketFactory.h b/src/lib/net/TCPSocketFactory.h
index 0195ec4..ac21cab 100644
--- a/src/lib/net/TCPSocketFactory.h
+++ b/src/lib/net/TCPSocketFactory.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -31,12 +31,11 @@ public:
virtual ~TCPSocketFactory();
// ISocketFactory overrides
- virtual IDataSocket* create(
- IArchNetwork::EAddressFamily family,
- bool secure) const;
- virtual IListenSocket* createListen(
- IArchNetwork::EAddressFamily family,
- bool secure) const;
+ virtual IDataSocket* create(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const;
+
+ virtual IListenSocket* createListen(IArchNetwork::EAddressFamily family,
+ ConnectionSecurityLevel security_level) const;
private:
IEventQueue* m_events;
diff --git a/src/lib/net/TSocketMultiplexerMethodJob.h b/src/lib/net/TSocketMultiplexerMethodJob.h
index 9e74cdd..4b571ab 100644
--- a/src/lib/net/TSocketMultiplexerMethodJob.h
+++ b/src/lib/net/TSocketMultiplexerMethodJob.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -25,81 +25,43 @@
/*!
A socket multiplexer job class that invokes a member function.
*/
-template <class T>
class TSocketMultiplexerMethodJob : public ISocketMultiplexerJob {
public:
- using Method = MultiplexerJobStatus (T::*)(ISocketMultiplexerJob*, bool, bool, bool);
+ using RunFunction = std::function<MultiplexerJobStatus(ISocketMultiplexerJob*, bool, bool, bool)>;
//! run() invokes \c object->method(arg)
- TSocketMultiplexerMethodJob(T* object, Method method,
- ArchSocket socket, bool readable, bool writeable);
- virtual ~TSocketMultiplexerMethodJob();
+ TSocketMultiplexerMethodJob(const RunFunction& func,
+ ArchSocket socket, bool readable, bool writable) :
+ func_{func},
+ m_socket(ARCH->copySocket(socket)),
+ m_readable(readable),
+ m_writable(writable)
+ {
+ }
+
+ ~TSocketMultiplexerMethodJob() override
+ {
+ ARCH->closeSocket(m_socket);
+ }
// IJob overrides
- virtual MultiplexerJobStatus run(bool readable, bool writable, bool error) override;
- virtual ArchSocket getSocket() const override;
- virtual bool isReadable() const override;
- virtual bool isWritable() const override;
+ virtual MultiplexerJobStatus run(bool readable, bool writable, bool error) override
+ {
+ if (func_) {
+ return func_(this, readable, writable, error);
+ }
+ return {false, {}};
+ }
+
+ virtual ArchSocket getSocket() const override { return m_socket; }
+ virtual bool isReadable() const override { return m_readable; }
+ virtual bool isWritable() const override { return m_writable; }
private:
- T* m_object;
- Method m_method;
+ RunFunction func_;
ArchSocket m_socket;
bool m_readable;
bool m_writable;
- void* m_arg;
};
-template <class T>
-inline
-TSocketMultiplexerMethodJob<T>::TSocketMultiplexerMethodJob(T* object,
- Method method, ArchSocket socket,
- bool readable, bool writable) :
- m_object(object),
- m_method(method),
- m_socket(ARCH->copySocket(socket)),
- m_readable(readable),
- m_writable(writable)
-{
- // do nothing
-}
-
-template <class T>
-inline
-TSocketMultiplexerMethodJob<T>::~TSocketMultiplexerMethodJob()
-{
- ARCH->closeSocket(m_socket);
-}
-
-template <class T>
-inline MultiplexerJobStatus TSocketMultiplexerMethodJob<T>::run(bool read, bool write, bool error)
-{
- if (m_object != NULL) {
- return (m_object->*m_method)(this, read, write, error);
- }
- return {false, {}};
-}
-
-template <class T>
-inline
-ArchSocket
-TSocketMultiplexerMethodJob<T>::getSocket() const
-{
- return m_socket;
-}
-
-template <class T>
-inline
-bool
-TSocketMultiplexerMethodJob<T>::isReadable() const
-{
- return m_readable;
-}
-template <class T>
-inline
-bool
-TSocketMultiplexerMethodJob<T>::isWritable() const
-{
- return m_writable;
-}
diff --git a/src/lib/net/XSocket.cpp b/src/lib/net/XSocket.cpp
index eed7a26..6a50537 100644
--- a/src/lib/net/XSocket.cpp
+++ b/src/lib/net/XSocket.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -63,7 +63,7 @@ std::string XSocketAddress::getWhat() const noexcept
"invalid port" // m_port may not be set to the bad port
};
return format(s_errorID[m_error], s_errorMsg[m_error],
- m_hostname.c_str(),
+ m_hostname.c_str(),
barrier::string::sprintf("%d", m_port).c_str());
}
diff --git a/src/lib/net/XSocket.h b/src/lib/net/XSocket.h
index d12278e..cafe59c 100644
--- a/src/lib/net/XSocket.h
+++ b/src/lib/net/XSocket.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/CMakeLists.txt b/src/lib/platform/CMakeLists.txt
index a1718a1..75551b7 100644
--- a/src/lib/platform/CMakeLists.txt
+++ b/src/lib/platform/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/platform/IMSWindowsClipboardFacade.h b/src/lib/platform/IMSWindowsClipboardFacade.h
index 03c6248..d848184 100644
--- a/src/lib/platform/IMSWindowsClipboardFacade.h
+++ b/src/lib/platform/IMSWindowsClipboardFacade.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -33,4 +33,4 @@ public:
virtual ~IMSWindowsClipboardFacade() { }
};
-#endif \ No newline at end of file
+#endif
diff --git a/src/lib/platform/IOSXKeyResource.cpp b/src/lib/platform/IOSXKeyResource.cpp
index 0c5abe7..1866968 100644
--- a/src/lib/platform/IOSXKeyResource.cpp
+++ b/src/lib/platform/IOSXKeyResource.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 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
@@ -128,7 +128,7 @@ IOSXKeyResource::getKeyID(UInt8 c)
// encoding with char value 214). if it did then make no key,
// otherwise CFStringCreateMutableCopy() will crash.
if (cfString == NULL) {
- return kKeyNone;
+ return kKeyNone;
}
// convert to precomposed
diff --git a/src/lib/platform/IOSXKeyResource.h b/src/lib/platform/IOSXKeyResource.h
index fc190ef..b032bd9 100644
--- a/src/lib/platform/IOSXKeyResource.h
+++ b/src/lib/platform/IOSXKeyResource.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 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
@@ -27,10 +27,10 @@ public:
virtual UInt32 getNumButtons() const = 0;
virtual UInt32 getTableForModifier(UInt32 mask) const = 0;
virtual KeyID getKey(UInt32 table, UInt32 button) const = 0;
-
+
// Convert a character in the current script to the equivalent KeyID
static KeyID getKeyID(UInt8);
-
+
// Convert a unicode character to the equivalent KeyID.
static KeyID unicharToKeyID(UniChar);
};
diff --git a/src/lib/platform/IXWindowsImpl.h b/src/lib/platform/IXWindowsImpl.h
index ddcaf2f..37c59b2 100644
--- a/src/lib/platform/IXWindowsImpl.h
+++ b/src/lib/platform/IXWindowsImpl.h
@@ -3,39 +3,31 @@
#include "config.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/X.h>
-# include <X11/Xutil.h>
-# define XK_MISCELLANY
-# define XK_XKB_KEYS
-# include <X11/keysymdef.h>
-# if HAVE_X11_EXTENSIONS_DPMS_H
- extern "C" {
-# include <X11/extensions/dpms.h>
- }
-# endif
-# if HAVE_X11_EXTENSIONS_XTEST_H
-# include <X11/extensions/XTest.h>
-# else
-# error The XTest extension is required to build barrier
-# endif
-# if HAVE_X11_EXTENSIONS_XINERAMA_H
- // Xinerama.h may lack extern "C" for inclusion by C++
- extern "C" {
-# include <X11/extensions/Xinerama.h>
- }
-# endif
-# if HAVE_X11_EXTENSIONS_XRANDR_H
-# include <X11/extensions/Xrandr.h>
-# endif
-# if HAVE_XKB_EXTENSION
-# include <X11/XKBlib.h>
-# endif
-# ifdef HAVE_XI2
-# include <X11/extensions/XInput2.h>
-# endif
+#include <X11/X.h>
+#include <X11/Xutil.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+#if HAVE_X11_EXTENSIONS_DPMS_H
+ extern "C" {
+# include <X11/extensions/dpms.h>
+ }
+#endif
+#include <X11/extensions/XTest.h>
+#if HAVE_X11_EXTENSIONS_XINERAMA_H
+ // Xinerama.h may lack extern "C" for inclusion by C++
+ extern "C" {
+# include <X11/extensions/Xinerama.h>
+ }
+#endif
+#if HAVE_X11_EXTENSIONS_XRANDR_H
+# include <X11/extensions/Xrandr.h>
+#endif
+#if HAVE_XKB_EXTENSION
+# include <X11/XKBlib.h>
+#endif
+#ifdef HAVE_XI2
+# include <X11/extensions/XInput2.h>
#endif
class IXWindowsImpl {
diff --git a/src/lib/platform/ImmuneKeysReader.cpp b/src/lib/platform/ImmuneKeysReader.cpp
index 72baed3..eaeedc1 100644
--- a/src/lib/platform/ImmuneKeysReader.cpp
+++ b/src/lib/platform/ImmuneKeysReader.cpp
@@ -50,4 +50,4 @@ static void add_key(const char * const buffer, std::vector<DWORD> &keys)
}
}
return true;
-} \ No newline at end of file
+}
diff --git a/src/lib/platform/ImmuneKeysReader.h b/src/lib/platform/ImmuneKeysReader.h
index b46cbbe..536dd45 100644
--- a/src/lib/platform/ImmuneKeysReader.h
+++ b/src/lib/platform/ImmuneKeysReader.h
@@ -27,8 +27,4 @@ class ImmuneKeysReader
{
public:
static bool get_list(const char * const path, std::vector<DWORD> &keys, std::string &badLine);
-
-private:
- // static class
- explicit ImmuneKeysReader() {}
};
diff --git a/src/lib/platform/MSWindowsClipboard.cpp b/src/lib/platform/MSWindowsClipboard.cpp
index 20445d4..fa59c3e 100644
--- a/src/lib/platform/MSWindowsClipboard.cpp
+++ b/src/lib/platform/MSWindowsClipboard.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -70,7 +70,7 @@ MSWindowsClipboard::emptyUnowned()
// empty the clipboard (and take ownership)
if (!EmptyClipboard()) {
- // unable to cause this in integ tests, but this error has never
+ // unable to cause this in integ tests, but this error has never
// actually been reported by users.
LOG((CLOG_DEBUG "failed to grab clipboard"));
return false;
diff --git a/src/lib/platform/MSWindowsClipboard.h b/src/lib/platform/MSWindowsClipboard.h
index 35ccb56..415f31c 100644
--- a/src/lib/platform/MSWindowsClipboard.h
+++ b/src/lib/platform/MSWindowsClipboard.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp b/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp
index 85a7dbe..e46b1de 100644
--- a/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp
+++ b/src/lib/platform/MSWindowsClipboardAnyTextConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardAnyTextConverter.h b/src/lib/platform/MSWindowsClipboardAnyTextConverter.h
index 622d281..463a24a 100644
--- a/src/lib/platform/MSWindowsClipboardAnyTextConverter.h
+++ b/src/lib/platform/MSWindowsClipboardAnyTextConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp b/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp
index 7d38fda..bac8cb6 100644
--- a/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp
+++ b/src/lib/platform/MSWindowsClipboardBitmapConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardBitmapConverter.h b/src/lib/platform/MSWindowsClipboardBitmapConverter.h
index 2733884..9ca27ee 100644
--- a/src/lib/platform/MSWindowsClipboardBitmapConverter.h
+++ b/src/lib/platform/MSWindowsClipboardBitmapConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardFacade.cpp b/src/lib/platform/MSWindowsClipboardFacade.cpp
index 3b6478f..a6e1207 100644
--- a/src/lib/platform/MSWindowsClipboardFacade.cpp
+++ b/src/lib/platform/MSWindowsClipboardFacade.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardFacade.h b/src/lib/platform/MSWindowsClipboardFacade.h
index a95e835..cdbd796 100644
--- a/src/lib/platform/MSWindowsClipboardFacade.h
+++ b/src/lib/platform/MSWindowsClipboardFacade.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp b/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp
index a1f1212..d2ac3dd 100644
--- a/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp
+++ b/src/lib/platform/MSWindowsClipboardHTMLConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardHTMLConverter.h b/src/lib/platform/MSWindowsClipboardHTMLConverter.h
index 51607a7..87d7fda 100644
--- a/src/lib/platform/MSWindowsClipboardHTMLConverter.h
+++ b/src/lib/platform/MSWindowsClipboardHTMLConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardTextConverter.cpp b/src/lib/platform/MSWindowsClipboardTextConverter.cpp
index 1500e7e..15f2cc2 100644
--- a/src/lib/platform/MSWindowsClipboardTextConverter.cpp
+++ b/src/lib/platform/MSWindowsClipboardTextConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardTextConverter.h b/src/lib/platform/MSWindowsClipboardTextConverter.h
index 6e265a2..4ebfa36 100644
--- a/src/lib/platform/MSWindowsClipboardTextConverter.h
+++ b/src/lib/platform/MSWindowsClipboardTextConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp b/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp
index 4b72717..52c6d4c 100644
--- a/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp
+++ b/src/lib/platform/MSWindowsClipboardUTF16Converter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsClipboardUTF16Converter.h b/src/lib/platform/MSWindowsClipboardUTF16Converter.h
index 1a9d435..7314678 100644
--- a/src/lib/platform/MSWindowsClipboardUTF16Converter.h
+++ b/src/lib/platform/MSWindowsClipboardUTF16Converter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsDebugOutputter.cpp b/src/lib/platform/MSWindowsDebugOutputter.cpp
index 43c38ad..22442ad 100644
--- a/src/lib/platform/MSWindowsDebugOutputter.cpp
+++ b/src/lib/platform/MSWindowsDebugOutputter.cpp
@@ -2,11 +2,11 @@
* barrier -- 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
diff --git a/src/lib/platform/MSWindowsDebugOutputter.h b/src/lib/platform/MSWindowsDebugOutputter.h
index 01fd97e..e8ba5e6 100644
--- a/src/lib/platform/MSWindowsDebugOutputter.h
+++ b/src/lib/platform/MSWindowsDebugOutputter.h
@@ -2,11 +2,11 @@
* barrier -- 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
@@ -15,7 +15,7 @@
* 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 "base/ILogOutputter.h"
diff --git a/src/lib/platform/MSWindowsDesks.cpp b/src/lib/platform/MSWindowsDesks.cpp
index 768ccb4..d126e13 100644
--- a/src/lib/platform/MSWindowsDesks.cpp
+++ b/src/lib/platform/MSWindowsDesks.cpp
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -27,9 +27,7 @@
#include "arch/win32/ArchMiscWindows.h"
#include "base/Log.h"
#include "base/IEventQueue.h"
-#include "base/IJob.h"
#include "base/TMethodEventJob.h"
-#include "base/TMethodJob.h"
#include "base/IEventQueue.h"
#include <malloc.h>
@@ -97,10 +95,9 @@
// MSWindowsDesks
//
-MSWindowsDesks::MSWindowsDesks(
- bool isPrimary, bool noHooks,
+MSWindowsDesks::MSWindowsDesks(bool isPrimary, bool noHooks,
const IScreenSaver* screensaver, IEventQueue* events,
- IJob* updateKeys, bool stopOnDeskSwitch) :
+ const std::function<void()>& updateKeys, bool stopOnDeskSwitch) :
m_isPrimary(isPrimary),
m_noHooks(noHooks),
m_isOnScreen(m_isPrimary),
@@ -130,7 +127,6 @@ MSWindowsDesks::~MSWindowsDesks()
disable();
destroyClass(m_deskClass);
destroyCursor(m_cursor);
- delete m_updateKeys;
}
void
@@ -602,13 +598,11 @@ MSWindowsDesks::deskLeave(Desk* desk, HKL keyLayout)
}
}
-void
-MSWindowsDesks::deskThread(void* vdesk)
+void MSWindowsDesks::desk_thread(Desk* desk)
{
MSG msg;
// use given desktop for this thread
- Desk* desk = static_cast<Desk*>(vdesk);
desk->m_threadID = GetCurrentThreadId();
desk->m_window = NULL;
desk->m_foregroundWindow = NULL;
@@ -709,7 +703,7 @@ MSWindowsDesks::deskThread(void* vdesk)
}
case BARRIER_MSG_SYNC_KEYS:
- m_updateKeys->run();
+ m_updateKeys();
break;
case BARRIER_MSG_SCREENSAVER:
@@ -752,8 +746,7 @@ MSWindowsDesks::Desk* MSWindowsDesks::addDesk(const std::string& name, HDESK hde
desk->m_name = name;
desk->m_desk = hdesk;
desk->m_targetID = GetCurrentThreadId();
- desk->m_thread = new Thread(new TMethodJob<MSWindowsDesks>(
- this, &MSWindowsDesks::deskThread, desk));
+ desk->m_thread = new Thread([this, desk]() { desk_thread(desk); });
waitForDesk();
m_desks.insert(std::make_pair(name, desk));
return desk;
@@ -793,7 +786,7 @@ MSWindowsDesks::checkDesk()
desk = index->second;
}
- // if we are told to shut down on desk switch, and this is not the
+ // if we are told to shut down on desk switch, and this is not the
// first switch, then shut down.
if (m_stopOnDeskSwitch && m_activeDesk != NULL && name != m_activeDeskName) {
LOG((CLOG_DEBUG "shutting down because of desk switch to \"%s\"", name.c_str()));
@@ -803,7 +796,7 @@ MSWindowsDesks::checkDesk()
// if active desktop changed then tell the old and new desk threads
// about the change. don't switch desktops when the screensaver is
- // active becaue we'd most likely switch to the screensaver desktop
+ // active because we'd most likely switch to the screensaver desktop
// which would have the side effect of forcing the screensaver to
// stop.
if (name != m_activeDeskName && !m_screensaver->isActive()) {
diff --git a/src/lib/platform/MSWindowsDesks.h b/src/lib/platform/MSWindowsDesks.h
index 6e5e709..6292f98 100644
--- a/src/lib/platform/MSWindowsDesks.h
+++ b/src/lib/platform/MSWindowsDesks.h
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -26,15 +26,16 @@
#include "mt/CondVar.h"
#include "mt/Mutex.h"
#include "common/stdmap.h"
+#include <functional>
#include <string>
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
+
class Event;
class EventQueueTimer;
class Thread;
-class IJob;
class IScreenSaver;
class IEventQueue;
@@ -68,7 +69,7 @@ public:
MSWindowsDesks(
bool isPrimary, bool noHooks,
const IScreenSaver* screensaver, IEventQueue* events,
- IJob* updateKeys, bool stopOnDeskSwitch);
+ const std::function<void()>& updateKeys, bool stopOnDeskSwitch);
~MSWindowsDesks();
//! @name manipulators
@@ -219,7 +220,7 @@ private:
void deskMouseRelativeMove(SInt32 dx, SInt32 dy) const;
void deskEnter(Desk* desk);
void deskLeave(Desk* desk, HKL keyLayout);
- void deskThread(void* vdesk);
+ void desk_thread(Desk* desk);
// desk switch checking and handling
Desk* addDesk(const std::string& name, HDESK hdesk);
@@ -284,7 +285,7 @@ private:
Desks m_desks;
// keyboard stuff
- IJob* m_updateKeys;
+ std::function<void()> m_updateKeys;
HKL m_keyLayout;
// options
diff --git a/src/lib/platform/MSWindowsDropTarget.cpp b/src/lib/platform/MSWindowsDropTarget.cpp
index d647808..095ab53 100644
--- a/src/lib/platform/MSWindowsDropTarget.cpp
+++ b/src/lib/platform/MSWindowsDropTarget.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
@@ -53,7 +53,7 @@ MSWindowsDropTarget::DragEnter(IDataObject* dataObject, DWORD keyState, POINTL p
if (m_allowDrop) {
getDropData(dataObject);
}
-
+
*effect = DROPEFFECT_NONE;
return S_OK;
@@ -132,7 +132,7 @@ getDropData(IDataObject* dataObject)
wcstombs(filename, wcData, wcslen(wcData));
MSWindowsDropTarget::instance().setDraggingFilename(filename);
-
+
GlobalUnlock(stgMed.hGlobal);
// release the data using the COM API
@@ -167,7 +167,7 @@ ULONG __stdcall
MSWindowsDropTarget::Release(void)
{
LONG count = InterlockedDecrement(&m_refCount);
-
+
if (count == 0) {
delete this;
return 0;
diff --git a/src/lib/platform/MSWindowsDropTarget.h b/src/lib/platform/MSWindowsDropTarget.h
index 6d60845..6c3bf69 100644
--- a/src/lib/platform/MSWindowsDropTarget.h
+++ b/src/lib/platform/MSWindowsDropTarget.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2014-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
@@ -44,7 +44,7 @@ public:
std::string getDraggingFilename();
void clearDraggingFilename();
- static MSWindowsDropTarget&
+ static MSWindowsDropTarget&
instance();
private:
@@ -53,7 +53,7 @@ private:
long m_refCount;
bool m_allowDrop;
std::string m_dragFilename;
-
+
static MSWindowsDropTarget*
s_instance;
};
diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.cpp b/src/lib/platform/MSWindowsEventQueueBuffer.cpp
index 3111367..709d814 100644
--- a/src/lib/platform/MSWindowsEventQueueBuffer.cpp
+++ b/src/lib/platform/MSWindowsEventQueueBuffer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsEventQueueBuffer.h b/src/lib/platform/MSWindowsEventQueueBuffer.h
index bc9bde1..6f918d4 100644
--- a/src/lib/platform/MSWindowsEventQueueBuffer.h
+++ b/src/lib/platform/MSWindowsEventQueueBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsHook.cpp b/src/lib/platform/MSWindowsHook.cpp
index b9b9740..3230d24 100644
--- a/src/lib/platform/MSWindowsHook.cpp
+++ b/src/lib/platform/MSWindowsHook.cpp
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
@@ -56,14 +56,13 @@ static BYTE g_deadKeyState[256] = { 0 };
static BYTE g_keyState[256] = { 0 };
static bool g_fakeServerInput = false;
static std::vector<DWORD> g_immuneKeys;
-
-static const std::string ImmuneKeysPath = DataDirectories::profile() + "\\ImmuneKeys.txt";
+static std::string g_immuneKeysPath;
static std::vector<DWORD> immune_keys_list()
{
std::vector<DWORD> keys;
std::string badLine;
- if (!ImmuneKeysReader::get_list(ImmuneKeysPath.c_str(), keys, badLine))
+ if (!ImmuneKeysReader::get_list(g_immuneKeysPath.c_str(), keys, badLine))
LOG((CLOG_ERR "Reading immune keys stopped at: %s", badLine.c_str()));
return keys;
}
@@ -144,9 +143,9 @@ keyboardGetState(BYTE keys[256], DWORD vkCode, bool kf_up)
static
WPARAM
-makeKeyMsg(UINT virtKey, char c, bool noAltGr)
+makeKeyMsg(UINT virtKey, WCHAR wc, bool noAltGr)
{
- return MAKEWPARAM(MAKEWORD(virtKey & 0xff, (BYTE)c), noAltGr ? 1 : 0);
+ return MAKEWPARAM((WORD)wc, MAKEWORD(virtKey & 0xff, noAltGr ? 1 : 0));
}
static
@@ -193,7 +192,7 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
(lParam & 0x80000000u) != 0) {
g_deadRelease = 0;
PostThreadMessage(g_threadID, BARRIER_MSG_DEBUG,
- wParam | 0x04000000, lParam);
+ wParam | 0x40000000, lParam);
return false;
}
@@ -245,19 +244,19 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
}
}
- WORD c = 0;
+ WCHAR wc[2] = { 0, 0 };
// map the key event to a character. we have to put the dead
// key back first and this has the side effect of removing it.
if (g_deadVirtKey != 0) {
- if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
- g_deadKeyState, &c, flags) == 2) {
- // If ToAscii returned 2, it means that we accidentally removed
+ if (ToUnicode((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
+ g_deadKeyState, wc, 2, flags) == 2) {
+ // If ToUnicode returned 2, it means that we accidentally removed
// a double dead key instead of restoring it. Thus, we call
- // ToAscii again with the same parameters to restore the
+ // ToUnicode again with the same parameters to restore the
// internal dead key state.
- ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
- g_deadKeyState, &c, flags);
+ ToUnicode((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
+ g_deadKeyState, wc, 2, flags);
// We need to keep track of this because g_deadVirtKey will be
// cleared later on; this would cause the dead key release to
@@ -267,7 +266,7 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
}
UINT scanCode = ((lParam & 0x10ff0000u) >> 16);
- int n = ToAscii((UINT)wParam, scanCode, keys, &c, flags);
+ int n = ToUnicode((UINT)wParam, scanCode, keys, wc, 2, flags);
// if mapping failed and ctrl and alt are pressed then try again
// with both not pressed. this handles the case where ctrl and
@@ -279,12 +278,12 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
if (n == 0 && (control & 0x80) != 0 && (menu & 0x80) != 0) {
noAltGr = true;
PostThreadMessage(g_threadID, BARRIER_MSG_DEBUG,
- wParam | 0x05000000, lParam);
+ wParam | 0x50000000, lParam);
if (g_deadVirtKey != 0) {
- if (ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
- g_deadKeyState, &c, flags) == 2) {
- ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
- g_deadKeyState, &c, flags);
+ if (ToUnicode((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
+ g_deadKeyState, wc, 2, flags) == 2) {
+ ToUnicode((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
+ g_deadKeyState, wc, 2, flags);
g_deadRelease = g_deadVirtKey;
}
}
@@ -298,12 +297,12 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
keys2[VK_LMENU] = 0;
keys2[VK_RMENU] = 0;
keys2[VK_MENU] = 0;
- n = ToAscii((UINT)wParam, scanCode, keys2, &c, flags);
+ n = ToUnicode((UINT)wParam, scanCode, keys2, wc, 2, flags);
}
PostThreadMessage(g_threadID, BARRIER_MSG_DEBUG,
- wParam | ((c & 0xff) << 8) |
- ((n & 0xff) << 16) | 0x06000000,
+ (wc[0] & 0xffff) | ((wParam & 0xff) << 16) |
+ ((n & 0xf) << 24) | 0x60000000,
lParam);
WPARAM charAndVirtKey = 0;
bool clearDeadKey = false;
@@ -329,12 +328,12 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
case 0:
// key doesn't map to a character. this can happen if
// non-character keys are pressed after a dead key.
- charAndVirtKey = makeKeyMsg((UINT)wParam, (char)0, noAltGr);
+ charAndVirtKey = makeKeyMsg((UINT)wParam, (WCHAR)0, noAltGr);
break;
case 1:
// key maps to a character composed with dead key
- charAndVirtKey = makeKeyMsg((UINT)wParam, (char)LOBYTE(c), noAltGr);
+ charAndVirtKey = makeKeyMsg((UINT)wParam, wc[0], noAltGr);
clearDeadKey = true;
break;
@@ -342,14 +341,14 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
// previous dead key not composed. send a fake key press
// and release for the dead key to our window.
WPARAM deadCharAndVirtKey =
- makeKeyMsg((UINT)g_deadVirtKey, (char)LOBYTE(c), noAltGr);
+ makeKeyMsg((UINT)g_deadVirtKey, wc[0], noAltGr);
PostThreadMessage(g_threadID, BARRIER_MSG_KEY,
deadCharAndVirtKey, g_deadLParam & 0x7fffffffu);
PostThreadMessage(g_threadID, BARRIER_MSG_KEY,
deadCharAndVirtKey, g_deadLParam | 0x80000000u);
// use uncomposed character
- charAndVirtKey = makeKeyMsg((UINT)wParam, (char)HIBYTE(c), noAltGr);
+ charAndVirtKey = makeKeyMsg((UINT)wParam, wc[1], noAltGr);
clearDeadKey = true;
break;
}
@@ -357,8 +356,8 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
// put back the dead key, if any, for the application to use
if (g_deadVirtKey != 0) {
- ToAscii((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
- g_deadKeyState, &c, flags);
+ ToUnicode((UINT)g_deadVirtKey, (g_deadLParam & 0x10ff0000u) >> 16,
+ g_deadKeyState, wc, 2, flags);
}
// clear out old dead key state
@@ -375,7 +374,7 @@ keyboardHookHandler(WPARAM wParam, LPARAM lParam)
// forwarding.
if (charAndVirtKey != 0) {
PostThreadMessage(g_threadID, BARRIER_MSG_DEBUG,
- charAndVirtKey | 0x07000000, lParam);
+ charAndVirtKey | 0x70000000, lParam);
PostThreadMessage(g_threadID, BARRIER_MSG_KEY, charAndVirtKey, lParam);
}
@@ -575,8 +574,9 @@ MSWindowsHook::install()
g_fakeServerInput = false;
// setup immune keys
+ g_immuneKeysPath = (barrier::DataDirectories::profile() / "ImmuneKeys.txt").u8string();
g_immuneKeys = immune_keys_list();
- LOG((CLOG_DEBUG "Found %u immune keys in %s", g_immuneKeys.size(), ImmuneKeysPath.c_str()));
+ LOG((CLOG_DEBUG "Found %u immune keys in %s", g_immuneKeys.size(), g_immuneKeysPath.c_str()));
#if NO_GRAB_KEYBOARD
// we only need the mouse hook
@@ -638,4 +638,4 @@ void
MSWindowsHook::uninstallScreenSaver()
{
g_hkMessage.unset();
-} \ No newline at end of file
+}
diff --git a/src/lib/platform/MSWindowsHook.h b/src/lib/platform/MSWindowsHook.h
index 7b2121c..c6d91a2 100644
--- a/src/lib/platform/MSWindowsHook.h
+++ b/src/lib/platform/MSWindowsHook.h
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsHookResource.cpp b/src/lib/platform/MSWindowsHookResource.cpp
index ced5ff1..c6349ab 100644
--- a/src/lib/platform/MSWindowsHookResource.cpp
+++ b/src/lib/platform/MSWindowsHookResource.cpp
@@ -30,4 +30,4 @@ bool WindowsHookResource::unset()
}
bool WindowsHookResource::is_set() const { return _hook != NULL; }
-WindowsHookResource::operator HHOOK() const { return _hook; } \ No newline at end of file
+WindowsHookResource::operator HHOOK() const { return _hook; }
diff --git a/src/lib/platform/MSWindowsHookResource.h b/src/lib/platform/MSWindowsHookResource.h
index b66c4b8..a3c9d83 100644
--- a/src/lib/platform/MSWindowsHookResource.h
+++ b/src/lib/platform/MSWindowsHookResource.h
@@ -17,4 +17,4 @@ public:
private:
HHOOK _hook;
-}; \ No newline at end of file
+};
diff --git a/src/lib/platform/MSWindowsKeyState.cpp b/src/lib/platform/MSWindowsKeyState.cpp
index 2f29f72..c723d19 100644
--- a/src/lib/platform/MSWindowsKeyState.cpp
+++ b/src/lib/platform/MSWindowsKeyState.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -21,7 +21,6 @@
#include "platform/MSWindowsDesks.h"
#include "mt/Thread.h"
#include "arch/win32/ArchMiscWindows.h"
-#include "base/FunctionJob.h"
#include "base/Log.h"
#include "base/String.h"
#include "base/IEventQueue.h"
@@ -61,17 +60,17 @@ const KeyID MSWindowsKeyState::s_virtualKey[] =
/* 0x012 */ { kKeyAlt_L }, // VK_MENU
/* 0x013 */ { kKeyPause }, // VK_PAUSE
/* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL
- /* 0x015 */ { kKeyKana }, // VK_HANGUL, VK_KANA
- /* 0x016 */ { kKeyNone }, // undefined
+ /* 0x015 */ { kKeyNone }, // undefined
+ /* 0x016 */ { kKeyKana }, // VK_HANGUL, VK_KANA, VK_IME_ON
/* 0x017 */ { kKeyNone }, // VK_JUNJA
/* 0x018 */ { kKeyNone }, // VK_FINAL
/* 0x019 */ { kKeyKanzi }, // VK_HANJA, VK_KANJI
- /* 0x01a */ { kKeyNone }, // undefined
+ /* 0x01a */ { kKeyEisuToggle }, // VK_IME_OFF
/* 0x01b */ { kKeyEscape }, // VK_ESCAPE
- /* 0x01c */ { kKeyHenkan }, // VK_CONVERT
- /* 0x01d */ { kKeyNone }, // VK_NONCONVERT
- /* 0x01e */ { kKeyNone }, // VK_ACCEPT
- /* 0x01f */ { kKeyNone }, // VK_MODECHANGE
+ /* 0x01c */ { kKeyHenkan }, // VK_CONVERT
+ /* 0x01d */ { kKeyMuhenkan }, // VK_NONCONVERT
+ /* 0x01e */ { kKeyNone }, // VK_ACCEPT
+ /* 0x01f */ { kKeyNone }, // VK_MODECHANGE
/* 0x020 */ { kKeyNone }, // VK_SPACE
/* 0x021 */ { kKeyKP_PageUp }, // VK_PRIOR
/* 0x022 */ { kKeyKP_PageDown },// VK_NEXT
@@ -286,15 +285,15 @@ const KeyID MSWindowsKeyState::s_virtualKey[] =
/* 0x0f3 */ { kKeyZenkaku }, // VK_OEM_AUTO
/* 0x0f4 */ { kKeyZenkaku }, // VK_OEM_ENLW
/* 0x0f5 */ { kKeyNone }, // OEM specific
- /* 0x0f6 */ { kKeyNone }, // VK_ATTN
- /* 0x0f7 */ { kKeyNone }, // VK_CRSEL
- /* 0x0f8 */ { kKeyNone }, // VK_EXSEL
- /* 0x0f9 */ { kKeyNone }, // VK_EREOF
- /* 0x0fa */ { kKeyNone }, // VK_PLAY
- /* 0x0fb */ { kKeyNone }, // VK_ZOOM
+ /* 0x0f6 */ { kKeyNone }, // VK_ATTN
+ /* 0x0f7 */ { kKeyNone }, // VK_CRSEL
+ /* 0x0f8 */ { kKeyNone }, // VK_EXSEL
+ /* 0x0f9 */ { kKeyNone }, // VK_EREOF
+ /* 0x0fa */ { kKeyNone }, // VK_PLAY
+ /* 0x0fb */ { kKeyNone }, // VK_ZOOM
/* 0x0fc */ { kKeyNone }, // reserved
- /* 0x0fd */ { kKeyNone }, // VK_PA1
- /* 0x0fe */ { kKeyNone }, // VK_OEM_CLEAR
+ /* 0x0fd */ { kKeyNone }, // VK_PA1
+ /* 0x0fe */ { kKeyNone }, // VK_OEM_CLEAR
/* 0x0ff */ { kKeyNone }, // reserved
/* 0x100 */ { kKeyNone }, // reserved
@@ -320,15 +319,15 @@ const KeyID MSWindowsKeyState::s_virtualKey[] =
/* 0x114 */ { kKeyNone }, // VK_CAPITAL
/* 0x115 */ { kKeyHangul }, // VK_HANGUL
/* 0x116 */ { kKeyNone }, // undefined
- /* 0x117 */ { kKeyNone }, // VK_JUNJA
- /* 0x118 */ { kKeyNone }, // VK_FINAL
+ /* 0x117 */ { kKeyNone }, // VK_JUNJA
+ /* 0x118 */ { kKeyNone }, // VK_FINAL
/* 0x119 */ { kKeyHanja }, // VK_HANJA
/* 0x11a */ { kKeyNone }, // undefined
/* 0x11b */ { kKeyNone }, // VK_ESCAPE
- /* 0x11c */ { kKeyNone }, // VK_CONVERT
- /* 0x11d */ { kKeyNone }, // VK_NONCONVERT
- /* 0x11e */ { kKeyNone }, // VK_ACCEPT
- /* 0x11f */ { kKeyNone }, // VK_MODECHANGE
+ /* 0x11c */ { kKeyNone }, // VK_CONVERT
+ /* 0x11d */ { kKeyNone }, // VK_NONCONVERT
+ /* 0x11e */ { kKeyNone }, // VK_ACCEPT
+ /* 0x11f */ { kKeyNone }, // VK_MODECHANGE
/* 0x120 */ { kKeyNone }, // VK_SPACE
/* 0x121 */ { kKeyPageUp }, // VK_PRIOR
/* 0x122 */ { kKeyPageDown }, // VK_NEXT
@@ -543,15 +542,15 @@ const KeyID MSWindowsKeyState::s_virtualKey[] =
/* 0x1f3 */ { kKeyNone }, // VK_OEM_AUTO
/* 0x1f4 */ { kKeyNone }, // VK_OEM_ENLW
/* 0x1f5 */ { kKeyNone }, // OEM specific
- /* 0x1f6 */ { kKeyNone }, // VK_ATTN
- /* 0x1f7 */ { kKeyNone }, // VK_CRSEL
- /* 0x1f8 */ { kKeyNone }, // VK_EXSEL
- /* 0x1f9 */ { kKeyNone }, // VK_EREOF
- /* 0x1fa */ { kKeyNone }, // VK_PLAY
- /* 0x1fb */ { kKeyNone }, // VK_ZOOM
+ /* 0x1f6 */ { kKeyNone }, // VK_ATTN
+ /* 0x1f7 */ { kKeyNone }, // VK_CRSEL
+ /* 0x1f8 */ { kKeyNone }, // VK_EXSEL
+ /* 0x1f9 */ { kKeyNone }, // VK_EREOF
+ /* 0x1fa */ { kKeyNone }, // VK_PLAY
+ /* 0x1fb */ { kKeyNone }, // VK_ZOOM
/* 0x1fc */ { kKeyNone }, // reserved
- /* 0x1fd */ { kKeyNone }, // VK_PA1
- /* 0x1fe */ { kKeyNone }, // VK_OEM_CLEAR
+ /* 0x1fd */ { kKeyNone }, // VK_PA1
+ /* 0x1fe */ { kKeyNone }, // VK_OEM_CLEAR
/* 0x1ff */ { kKeyNone } // reserved
};
@@ -688,34 +687,17 @@ MSWindowsKeyState::mapKeyFromEvent(WPARAM charAndVirtKey,
KeyModifierControl | KeyModifierAlt;
// extract character, virtual key, and if we didn't use AltGr
- char c = (char)((charAndVirtKey & 0xff00u) >> 8);
- UINT vkCode = (charAndVirtKey & 0xffu);
- bool noAltGr = ((charAndVirtKey & 0xff0000u) != 0);
+ WCHAR wc = (WCHAR)(charAndVirtKey & 0xffffu);
+ UINT vkCode = ((charAndVirtKey >> 16) & 0xffu);
+ bool noAltGr = ((charAndVirtKey & 0xff000000u) != 0);
// handle some keys via table lookup
KeyID id = getKeyID(vkCode, (KeyButton)((info >> 16) & 0x1ffu));
// check if not in table; map character to key id
- if (id == kKeyNone && c != 0) {
- if ((c & 0x80u) == 0) {
- // ASCII
- id = static_cast<KeyID>(c) & 0xffu;
- }
- else {
- // character is not really ASCII. instead it's some
- // character in the current ANSI code page. try to
- // convert that to a Unicode character. if we fail
- // then use the single byte character as is.
- char src = c;
- wchar_t unicode;
- if (MultiByteToWideChar(CP_THREAD_ACP, MB_PRECOMPOSED,
- &src, 1, &unicode, 1) > 0) {
- id = static_cast<KeyID>(unicode);
- }
- else {
- id = static_cast<KeyID>(c) & 0xffu;
- }
- }
+ if (id == kKeyNone && wc != 0) {
+ // UTF16
+ id = static_cast<KeyID>(wc) & 0xffffu;
}
// set modifier mask
@@ -821,15 +803,14 @@ MSWindowsKeyState::fakeCtrlAltDel()
CloseHandle(hEvtSendSas);
}
else {
- Thread cad(new FunctionJob(&MSWindowsKeyState::ctrlAltDelThread));
+ Thread cad([this](){ ctrl_alt_del_thread(); });
cad.wait();
}
return true;
}
-void
-MSWindowsKeyState::ctrlAltDelThread(void*)
+void MSWindowsKeyState::ctrl_alt_del_thread()
{
// get the Winlogon desktop at whatever privilege we can
HDESK desk = OpenDesktop("Winlogon", 0, FALSE, MAXIMUM_ALLOWED);
@@ -959,7 +940,7 @@ MSWindowsKeyState::getKeyMap(barrier::KeyMap& keyMap)
// deal with certain virtual keys specially
switch (vk) {
case VK_SHIFT:
- // this is important for sending the correct modifier to the
+ // this is important for sending the correct modifier to the
// client, a patch from bug #242 (right shift broken for ms
// remote desktop) removed this to just use left shift, which
// caused bug #2799 (right shift broken for osx).
@@ -1176,7 +1157,7 @@ MSWindowsKeyState::getKeyMap(barrier::KeyMap& keyMap)
}
}
}
-
+
// save each key. the map will automatically discard
// duplicates, like an unshift and shifted version of
// a key that's insensitive to shift.
@@ -1347,7 +1328,7 @@ MSWindowsKeyState::getKeyID(UINT virtualKey, KeyButton button) const
if ((LOWORD(m_keyLayout) & 0xffffu) == 0x0412u) { // 0x0412 : Korean Locale ID
if (virtualKey == VK_HANGUL || virtualKey == VK_HANJA) {
// If shift-space is used to change the input mode,
- // the extented bit is not set. So add it to get right key id.
+ // the extended bit is not set. So add it to get right key id.
button |= 0x100u;
}
}
@@ -1374,7 +1355,7 @@ MSWindowsKeyState::getIDForKey(barrier::KeyMap::KeyItem& item,
virtualKey, button, keyState, unicode,
sizeof(unicode) / sizeof(unicode[0]), 0, hkl);
KeyID id = static_cast<KeyID>(unicode[0]);
-
+
switch (n) {
case -1:
return barrier::KeyMap::getDeadKey(id);
diff --git a/src/lib/platform/MSWindowsKeyState.h b/src/lib/platform/MSWindowsKeyState.h
index 3c5fa40..eedcd85 100644
--- a/src/lib/platform/MSWindowsKeyState.h
+++ b/src/lib/platform/MSWindowsKeyState.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -169,7 +169,7 @@ private:
typedef std::vector<HKL> GroupList;
// send ctrl+alt+del hotkey event on NT family
- static void ctrlAltDelThread(void*);
+ static void ctrl_alt_del_thread();
bool getGroups(GroupList&) const;
void setWindowGroup(SInt32 group);
diff --git a/src/lib/platform/MSWindowsScreen.cpp b/src/lib/platform/MSWindowsScreen.cpp
index df10270..c995a40 100644
--- a/src/lib/platform/MSWindowsScreen.cpp
+++ b/src/lib/platform/MSWindowsScreen.cpp
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -36,11 +36,9 @@
#include "mt/Thread.h"
#include "arch/win32/ArchMiscWindows.h"
#include "arch/Arch.h"
-#include "base/FunctionJob.h"
#include "base/Log.h"
#include "base/IEventQueue.h"
#include "base/TMethodEventJob.h"
-#include "base/TMethodJob.h"
#include <string.h>
#include <Shlobj.h>
@@ -134,8 +132,7 @@ MSWindowsScreen::MSWindowsScreen(
m_noHooks,
m_screensaver,
m_events,
- new TMethodJob<MSWindowsScreen>(
- this, &MSWindowsScreen::updateKeysCB),
+ [this]() { updateKeysCB(); },
stopOnDeskSwitch);
m_keyState = new MSWindowsKeyState(m_desks, getEventTarget(), m_events);
@@ -145,16 +142,6 @@ MSWindowsScreen::MSWindowsScreen(
forceShowCursor();
LOG((CLOG_DEBUG "screen shape: %d,%d %dx%d %s", m_x, m_y, m_w, m_h, m_multimon ? "(multi-monitor)" : ""));
LOG((CLOG_DEBUG "window is 0x%08x", m_window));
-
- // SHGetFolderPath is deprecated in vista, but use it for xp support.
- char desktopPath[MAX_PATH];
- if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) {
- m_desktopPath = std::string(desktopPath);
- LOG((CLOG_DEBUG "using desktop for drop target: %s", m_desktopPath.c_str()));
- }
- else {
- LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError()));
- }
OleInitialize(0);
m_dropWindow = createDropWindow(m_class, "DropWindow");
@@ -365,17 +352,13 @@ MSWindowsScreen::leave()
forceShowCursor();
if (isDraggingStarted() && !m_isPrimary) {
- m_sendDragThread = new Thread(
- new TMethodJob<MSWindowsScreen>(
- this,
- &MSWindowsScreen::sendDragThread));
+ m_sendDragThread = new Thread([this](){ send_drag_thread(); });
}
return true;
}
-void
-MSWindowsScreen::sendDragThread(void*)
+void MSWindowsScreen::send_drag_thread()
{
std::string& draggingFilename = getDraggingFilename();
size_t size = draggingFilename.size();
@@ -389,7 +372,7 @@ MSWindowsScreen::sendDragThread(void*)
LOG((CLOG_DEBUG "send dragging file to server"));
client->sendFileToServer(draggingFilename.c_str());
}
-
+
m_draggingStarted = false;
}
@@ -636,7 +619,7 @@ MSWindowsScreen::registerHotKey(KeyID key, KeyModifierMask mask)
LOG((CLOG_WARN "failed to register hotkey %s (id=%04x mask=%04x)", barrier::KeyMap::formatKey(key, mask).c_str(), key, mask));
return 0;
}
-
+
LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", barrier::KeyMap::formatKey(key, mask).c_str(), key, mask, id));
return id;
}
@@ -1114,7 +1097,7 @@ MSWindowsScreen::onKey(WPARAM wParam, LPARAM lParam)
static const KeyModifierMask s_ctrlAlt =
KeyModifierControl | KeyModifierAlt;
- LOG((CLOG_DEBUG1 "event: Key char=%d, vk=0x%02x, nagr=%d, lParam=0x%08x", (wParam & 0xff00u) >> 8, wParam & 0xffu, (wParam & 0x10000u) ? 1 : 0, lParam));
+ LOG((CLOG_DEBUG1 "event: Key char=%d, vk=0x%02x, nagr=%d, lParam=0x%08x", wParam & 0xffffu, (wParam >> 16) & 0xffu, (wParam & 0x1000000u) ? 1 : 0, lParam));
// get event info
KeyButton button = (KeyButton)((lParam & 0x01ff0000) >> 16);
@@ -1132,7 +1115,7 @@ MSWindowsScreen::onKey(WPARAM wParam, LPARAM lParam)
// that maps mouse buttons to keys is known to do this.
// alternatively, we could just throw these events out.
if (button == 0) {
- button = m_keyState->virtualKeyToButton(wParam & 0xffu);
+ button = m_keyState->virtualKeyToButton((wParam >> 16) & 0xffu);
if (button == 0) {
return true;
}
@@ -1198,7 +1181,7 @@ MSWindowsScreen::onKey(WPARAM wParam, LPARAM lParam)
if (!ignore()) {
// check for ctrl+alt+del. we do not want to pass that to the
// client. the user can use ctrl+alt+pause to emulate it.
- UINT virtKey = (wParam & 0xffu);
+ UINT virtKey = (wParam >> 16) & 0xffu;
if (virtKey == VK_DELETE && (state & s_ctrlAlt) == s_ctrlAlt) {
LOG((CLOG_DEBUG "discard ctrl+alt+del"));
return true;
@@ -1212,9 +1195,9 @@ MSWindowsScreen::onKey(WPARAM wParam, LPARAM lParam)
// pressed or released. when mapping the key we require that
// we not use AltGr (the 0x10000 flag in wParam) and we not
// use the keypad delete key (the 0x01000000 flag in lParam).
- wParam = VK_DELETE | 0x00010000u;
+ wParam = (VK_DELETE << 16) | 0x01000000u;
lParam &= 0xfe000000;
- lParam |= m_keyState->virtualKeyToButton(wParam & 0xffu) << 16;
+ lParam |= m_keyState->virtualKeyToButton(VK_DELETE) << 16;
lParam |= 0x01000001;
}
@@ -1242,7 +1225,7 @@ MSWindowsScreen::onHotKey(WPARAM wParam, LPARAM lParam)
{
// get the key info
KeyModifierMask state = getActiveModifiers();
- UINT virtKey = (wParam & 0xffu);
+ UINT virtKey = (wParam >> 16) & 0xffu;
UINT modifiers = 0;
if ((state & KeyModifierShift) != 0) {
modifiers |= MOD_SHIFT;
@@ -1360,7 +1343,7 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
saveMousePosition(mx, my);
if (m_isOnScreen) {
-
+
// motion on primary screen
sendEvent(
m_events->forIPrimaryScreen().motionOnPrimary(),
@@ -1370,15 +1353,15 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
m_draggingStarted = true;
}
}
- else
+ else
{
// the motion is on the secondary screen, so we warp mouse back to
- // center on the server screen. if we don't do this, then the mouse
- // will always try to return to the original entry point on the
+ // center on the server screen. if we don't do this, then the mouse
+ // will always try to return to the original entry point on the
// secondary screen.
LOG((CLOG_DEBUG5 "warping server cursor to center: %+d,%+d", m_xCenter, m_yCenter));
warpCursorNoFlush(m_xCenter, m_yCenter);
-
+
// examine the motion. if it's about the distance
// from the center of the screen to an edge then
// it's probably a bogus motion that we want to
@@ -1389,7 +1372,7 @@ MSWindowsScreen::onMouseMove(SInt32 mx, SInt32 my)
x + bogusZoneSize > m_x + m_w - m_xCenter ||
-y + bogusZoneSize > m_yCenter - m_y ||
y + bogusZoneSize > m_y + m_h - m_yCenter) {
-
+
LOG((CLOG_DEBUG "dropped bogus delta motion: %+d,%+d", x, y));
}
else {
@@ -1521,8 +1504,8 @@ MSWindowsScreen::warpCursorNoFlush(SInt32 x, SInt32 y)
POINT cursorPos;
GetCursorPos(&cursorPos);
- // there is a bug or round error in SetCursorPos and GetCursorPos on
- // a high DPI setting. The check here is for Vista/7 login screen.
+ // there is a bug or round error in SetCursorPos and GetCursorPos on
+ // a high DPI setting. The check here is for Vista/7 login screen.
// since this feature is mainly for client, so only check on client.
if (!isPrimary()) {
if ((cursorPos.x != x) && (cursorPos.y != y)) {
@@ -1531,7 +1514,7 @@ MSWindowsScreen::warpCursorNoFlush(SInt32 x, SInt32 y)
// when at Vista/7 login screen, SetCursorPos does not work (which could be
// an MS security feature). instead we can use fakeMouseMove, which calls
// mouse_event.
- // IMPORTANT: as of implementing this function, it has an annoying side
+ // IMPORTANT: as of implementing this function, it has an annoying side
// effect; instead of the mouse returning to the correct exit point, it
// returns to the center of the screen. this could have something to do with
// the center screen warping technique used (see comments for onMouseMove
@@ -1723,7 +1706,7 @@ MSWindowsScreen::mapPressFromEvent(WPARAM msg, LPARAM) const
}
void
-MSWindowsScreen::updateKeysCB(void*)
+MSWindowsScreen::updateKeysCB()
{
// record which keys we think are down
bool down[IKeyState::kNumButtons];
@@ -1888,6 +1871,7 @@ std::string& MSWindowsScreen::getDraggingFilename()
SWP_SHOWWINDOW);
// TODO: fake these keys properly
+ ARCH->sleep(.05f); // A tiny sleep here makes the DragEnter event on m_dropWindow trigger much more consistently
fakeKeyDown(kKeyEscape, 8192, 1);
fakeKeyUp(1);
fakeMouseButton(kButtonLeft, false);
@@ -1909,21 +1893,39 @@ std::string& MSWindowsScreen::getDraggingFilename()
m_draggingFilename = filename;
}
else {
- LOG((CLOG_DEBUG "drag file name is invalid: %s", filename.c_str()));
+ LOG((CLOG_ERR "drag file name is invalid: %s", filename.c_str()));
}
}
if (m_draggingFilename.empty()) {
- LOG((CLOG_DEBUG "failed to get drag file name from OLE"));
+ LOG((CLOG_ERR "failed to get drag file name from OLE"));
}
}
return m_draggingFilename;
}
-const std::string& MSWindowsScreen::getDropTarget() const
+const std::string&
+MSWindowsScreen::getDropTarget() const
+{
+ if (m_dropTargetPath.empty()) {
+ // SHGetFolderPath is deprecated in vista, but use it for xp support.
+ char desktopPath[MAX_PATH];
+ if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, 0, desktopPath))) {
+ m_dropTargetPath = std::string(desktopPath);
+ LOG((CLOG_INFO "using desktop for drop target: %s", m_dropTargetPath.c_str()));
+ }
+ else {
+ LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError()));
+ }
+ }
+ return m_dropTargetPath;
+}
+
+void
+MSWindowsScreen::setDropTarget(const std::string& target)
{
- return m_desktopPath;
+ m_dropTargetPath = target;
}
bool
@@ -1932,7 +1934,7 @@ MSWindowsScreen::isModifierRepeat(KeyModifierMask oldState, KeyModifierMask stat
bool result = false;
if (oldState == state && state != 0) {
- UINT virtKey = (wParam & 0xffu);
+ UINT virtKey = (wParam >> 16) & 0xffu;
if ((state & KeyModifierShift) != 0
&& (virtKey == VK_LSHIFT || virtKey == VK_RSHIFT)) {
result = true;
diff --git a/src/lib/platform/MSWindowsScreen.h b/src/lib/platform/MSWindowsScreen.h
index 49e09df..eaa7b88 100644
--- a/src/lib/platform/MSWindowsScreen.h
+++ b/src/lib/platform/MSWindowsScreen.h
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -120,6 +120,7 @@ public:
virtual void fakeDraggingFiles(DragFileList fileList);
virtual std::string& getDraggingFilename();
virtual const std::string& getDropTarget() const;
+ virtual void setDropTarget(const std::string&);
protected:
// IPlatformScreen overrides
@@ -198,7 +199,7 @@ private: // HACK
bool mapPressFromEvent(WPARAM msg, LPARAM button) const;
// job to update the key state
- void updateKeysCB(void*);
+ void updateKeysCB();
// determine whether the mouse is hidden by the system and force
// it to be displayed if user has entered this secondary screen.
@@ -212,16 +213,16 @@ private: // HACK
// our window proc
static LRESULT CALLBACK wndProc(HWND, UINT, WPARAM, LPARAM);
-
+
// save last position of mouse to compute next delta movement
void saveMousePosition(SInt32 x, SInt32 y);
// check if it is a modifier key repeating message
- bool isModifierRepeat(KeyModifierMask oldState,
+ bool isModifierRepeat(KeyModifierMask oldState,
KeyModifierMask state, WPARAM wParam) const;
// send drag info and data back to server
- void sendDragThread(void*);
+ void send_drag_thread();
private:
struct HotKeyItem {
@@ -324,15 +325,15 @@ private:
bool m_gotOldMouseKeys;
MOUSEKEYS m_mouseKeys;
MOUSEKEYS m_oldMouseKeys;
-
+
MSWindowsHook m_hook;
static MSWindowsScreen*
s_screen;
-
+
IEventQueue* m_events;
- std::string m_desktopPath;
+ mutable std::string m_dropTargetPath;
MSWindowsDropTarget*
m_dropTarget;
diff --git a/src/lib/platform/MSWindowsScreenSaver.cpp b/src/lib/platform/MSWindowsScreenSaver.cpp
index f9c15fb..9f93792 100644
--- a/src/lib/platform/MSWindowsScreenSaver.cpp
+++ b/src/lib/platform/MSWindowsScreenSaver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -23,7 +23,6 @@
#include "arch/Arch.h"
#include "arch/win32/ArchMiscWindows.h"
#include "base/Log.h"
-#include "base/TMethodJob.h"
#include <malloc.h>
#include <tchar.h>
@@ -223,8 +222,7 @@ MSWindowsScreenSaver::watchDesktop()
// watch desktop in another thread
LOG((CLOG_DEBUG "watching screen saver desktop"));
m_active = true;
- m_watch = new Thread(new TMethodJob<MSWindowsScreenSaver>(this,
- &MSWindowsScreenSaver::watchDesktopThread));
+ m_watch = new Thread([this](){ watch_desktop_thread(); });
}
void
@@ -238,8 +236,7 @@ MSWindowsScreenSaver::watchProcess(HANDLE process)
LOG((CLOG_DEBUG "watching screen saver process"));
m_process = process;
m_active = true;
- m_watch = new Thread(new TMethodJob<MSWindowsScreenSaver>(this,
- &MSWindowsScreenSaver::watchProcessThread));
+ m_watch = new Thread([this](){ watch_process_thread(); });
}
}
@@ -260,8 +257,7 @@ MSWindowsScreenSaver::unwatchProcess()
}
}
-void
-MSWindowsScreenSaver::watchDesktopThread(void*)
+void MSWindowsScreenSaver::watch_desktop_thread()
{
DWORD reserved = 0;
TCHAR* name = NULL;
@@ -283,8 +279,7 @@ MSWindowsScreenSaver::watchDesktopThread(void*)
}
}
-void
-MSWindowsScreenSaver::watchProcessThread(void*)
+void MSWindowsScreenSaver::watch_process_thread()
{
for (;;) {
Thread::testCancel();
diff --git a/src/lib/platform/MSWindowsScreenSaver.h b/src/lib/platform/MSWindowsScreenSaver.h
index a117370..4f1dd5f 100644
--- a/src/lib/platform/MSWindowsScreenSaver.h
+++ b/src/lib/platform/MSWindowsScreenSaver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -64,8 +64,8 @@ private:
void watchDesktop();
void watchProcess(HANDLE process);
void unwatchProcess();
- void watchDesktopThread(void*);
- void watchProcessThread(void*);
+ void watch_desktop_thread();
+ void watch_process_thread();
void setSecure(bool secure, bool saveSecureAsInt);
bool isSecure(bool* wasSecureAnInt) const;
diff --git a/src/lib/platform/MSWindowsSession.cpp b/src/lib/platform/MSWindowsSession.cpp
index 8d4f8ce..daa9276 100644
--- a/src/lib/platform/MSWindowsSession.cpp
+++ b/src/lib/platform/MSWindowsSession.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -45,7 +45,7 @@ MSWindowsSession::isProcessInSession(const char* name, PHANDLE process = NULL)
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
- // get the first process, and if we can't do that then it's
+ // get the first process, and if we can't do that then it's
// unlikely we can go any further
BOOL gotEntry = Process32First(snapshot, &entry);
if (!gotEntry) {
@@ -94,7 +94,7 @@ MSWindowsSession::isProcessInSession(const char* name, PHANDLE process = NULL)
}
std::string nameListJoin;
- for(std::list<std::string>::iterator it = nameList.begin();
+ for (std::list<std::string>::iterator it = nameList.begin();
it != nameList.end(); it++) {
nameListJoin.append(*it);
nameListJoin.append(", ");
@@ -119,7 +119,7 @@ MSWindowsSession::isProcessInSession(const char* name, PHANDLE process = NULL)
}
}
-HANDLE
+HANDLE
MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security)
{
HANDLE sourceToken;
@@ -127,7 +127,7 @@ MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security)
LOG((CLOG_ERR "could not get token from session %d", m_activeSessionId));
throw XArch(new XArchEvalWindows);
}
-
+
HANDLE newToken;
if (!DuplicateTokenEx(
sourceToken, TOKEN_ASSIGN_PRIMARY | TOKEN_ALL_ACCESS, security,
@@ -136,7 +136,7 @@ MSWindowsSession::getUserToken(LPSECURITY_ATTRIBUTES security)
LOG((CLOG_ERR "could not duplicate token"));
throw XArch(new XArchEvalWindows);
}
-
+
LOG((CLOG_DEBUG "duplicated, new token: %i", newToken));
return newToken;
}
diff --git a/src/lib/platform/MSWindowsSession.h b/src/lib/platform/MSWindowsSession.h
index e14d7e2..c3fff9d 100644
--- a/src/lib/platform/MSWindowsSession.h
+++ b/src/lib/platform/MSWindowsSession.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -33,7 +33,7 @@ public:
Returns true if the session ID has changed since updateActiveSession was called.
*/
BOOL hasChanged();
-
+
bool isProcessInSession(const char* name, PHANDLE process);
HANDLE getUserToken(LPSECURITY_ATTRIBUTES security);
diff --git a/src/lib/platform/MSWindowsUtil.cpp b/src/lib/platform/MSWindowsUtil.cpp
index b6b809f..5a0778e 100644
--- a/src/lib/platform/MSWindowsUtil.cpp
+++ b/src/lib/platform/MSWindowsUtil.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsUtil.h b/src/lib/platform/MSWindowsUtil.h
index 59f2eac..df80f3f 100644
--- a/src/lib/platform/MSWindowsUtil.h
+++ b/src/lib/platform/MSWindowsUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp
index 0aa5505..2d9a61c 100644
--- a/src/lib/platform/MSWindowsWatchdog.cpp
+++ b/src/lib/platform/MSWindowsWatchdog.cpp
@@ -6,7 +6,7 @@
* 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
@@ -29,7 +29,6 @@
#include "arch/win32/XArchWindows.h"
#include "arch/Arch.h"
#include "base/log_outputters.h"
-#include "base/TMethodJob.h"
#include "base/Log.h"
#include "common/Version.h"
@@ -81,21 +80,18 @@ MSWindowsWatchdog::MSWindowsWatchdog(
{
}
-void
+void
MSWindowsWatchdog::startAsync()
{
- m_thread = new Thread(new TMethodJob<MSWindowsWatchdog>(
- this, &MSWindowsWatchdog::mainLoop, nullptr));
-
- m_outputThread = new Thread(new TMethodJob<MSWindowsWatchdog>(
- this, &MSWindowsWatchdog::outputLoop, nullptr));
+ m_thread = new Thread([this](){ main_loop(); });
+ m_outputThread = new Thread([this](){ output_loop(); });
}
void
MSWindowsWatchdog::stop()
{
m_monitoring = false;
-
+
m_thread->wait(5);
delete m_thread;
@@ -117,7 +113,7 @@ MSWindowsWatchdog::duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES s
LOG((CLOG_ERR "could not open token, process handle: %d", process));
throw XArch(new XArchEvalWindows());
}
-
+
LOG((CLOG_DEBUG "got token %i, duplicating", sourceToken));
HANDLE newToken;
@@ -129,22 +125,22 @@ MSWindowsWatchdog::duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES s
LOG((CLOG_ERR "could not duplicate token %i", sourceToken));
throw XArch(new XArchEvalWindows());
}
-
+
LOG((CLOG_DEBUG "duplicated, new token: %i", newToken));
return newToken;
}
-HANDLE
+HANDLE
MSWindowsWatchdog::getUserToken(LPSECURITY_ATTRIBUTES security)
{
- // always elevate if we are at the vista/7 login screen. we could also
+ // always elevate if we are at the vista/7 login screen. we could also
// elevate for the uac dialog (consent.exe) but this would be pointless,
// since barrier would re-launch as non-elevated after the desk switch,
// and so would be unusable with the new elevated process taking focus.
if (m_elevateProcess || m_autoElevated) {
LOG((CLOG_DEBUG "getting elevated token, %s",
(m_elevateProcess ? "elevation required" : "at login screen")));
-
+
HANDLE process;
if (!m_session.isProcessInSession("winlogon.exe", &process)) {
throw XMSWindowsWatchdogError("cannot get user token without winlogon.exe");
@@ -157,8 +153,7 @@ MSWindowsWatchdog::getUserToken(LPSECURITY_ATTRIBUTES security)
}
}
-void
-MSWindowsWatchdog::mainLoop(void*)
+void MSWindowsWatchdog::main_loop()
{
shutdownExistingProcesses();
@@ -169,10 +164,10 @@ MSWindowsWatchdog::mainLoop(void*)
sendSasFunc = (SendSas)GetProcAddress(sasLib, "SendSAS");
}
- SECURITY_ATTRIBUTES saAttr;
- saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
- saAttr.bInheritHandle = TRUE;
- saAttr.lpSecurityDescriptor = NULL;
+ SECURITY_ATTRIBUTES saAttr;
+ saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
+ saAttr.bInheritHandle = TRUE;
+ saAttr.lpSecurityDescriptor = NULL;
if (!CreatePipe(&m_stdOutRead, &m_stdOutWrite, &saAttr, 0)) {
throw XArch(new XArchEvalWindows());
@@ -196,7 +191,7 @@ MSWindowsWatchdog::mainLoop(void*)
LOG((CLOG_INFO "backing off, wait=%ds, failures=%d", timeout, m_processFailures));
ARCH->sleep(timeout);
}
-
+
if (!getCommand().empty() && ((m_processFailures != 0) || m_session.hasChanged() || m_commandChanged)) {
startProcess();
}
@@ -205,7 +200,7 @@ MSWindowsWatchdog::mainLoop(void*)
m_processFailures++;
m_processRunning = false;
-
+
LOG((CLOG_WARN "detected application not running, pid=%d",
m_processInfo.dwProcessId));
}
@@ -228,7 +223,7 @@ MSWindowsWatchdog::mainLoop(void*)
// if the sas event failed, wait by sleeping.
ARCH->sleep(1);
-
+
}
catch (std::exception& e) {
LOG((CLOG_ERR "failed to launch, error: %s", e.what()));
@@ -248,7 +243,7 @@ MSWindowsWatchdog::mainLoop(void*)
LOG((CLOG_DEBUG "terminated running process on exit"));
shutdownProcess(m_processInfo.hProcess, m_processInfo.dwProcessId, 20);
}
-
+
LOG((CLOG_DEBUG "watchdog main thread finished"));
}
@@ -260,7 +255,7 @@ MSWindowsWatchdog::isProcessActive()
return exitCode == STILL_ACTIVE;
}
-void
+void
MSWindowsWatchdog::setFileLogOutputter(FileLogOutputter* outputter)
{
m_fileLogOutputter = outputter;
@@ -367,7 +362,7 @@ BOOL MSWindowsWatchdog::doStartProcessAsUser(std::string& command, HANDLE userTo
throw XArch(new XArchEvalWindows);
}
- DWORD creationFlags =
+ DWORD creationFlags =
NORMAL_PRIORITY_CLASS |
CREATE_NO_WINDOW |
CREATE_UNICODE_ENVIRONMENT;
@@ -421,14 +416,13 @@ MSWindowsWatchdog::getCommand() const
return cmd;
}
-void
-MSWindowsWatchdog::outputLoop(void*)
+void MSWindowsWatchdog::output_loop()
{
// +1 char for \0
CHAR buffer[kOutputBufferSize + 1];
while (m_monitoring) {
-
+
DWORD bytesRead;
BOOL success = ReadFile(m_stdOutRead, buffer, kOutputBufferSize, &bytesRead, NULL);
@@ -443,7 +437,7 @@ MSWindowsWatchdog::outputLoop(void*)
if (m_fileLogOutputter != NULL) {
m_fileLogOutputter->write(kINFO, buffer);
}
- }
+ }
}
}
@@ -470,7 +464,7 @@ MSWindowsWatchdog::shutdownProcess(HANDLE handle, DWORD pid, int timeout)
break;
}
else {
-
+
double elapsed = (ARCH->time() - start);
if (elapsed > timeout) {
// if timeout reached, kill forcefully.
@@ -500,7 +494,7 @@ MSWindowsWatchdog::shutdownExistingProcesses()
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
- // get the first process, and if we can't do that then it's
+ // get the first process, and if we can't do that then it's
// unlikely we can go any further
BOOL gotEntry = Process32First(snapshot, &entry);
if (!gotEntry) {
@@ -517,7 +511,7 @@ MSWindowsWatchdog::shutdownExistingProcesses()
if (_stricmp(entry.szExeFile, "barrierc.exe") == 0 ||
_stricmp(entry.szExeFile, "barriers.exe") == 0) {
-
+
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
shutdownProcess(handle, entry.th32ProcessID, 10);
}
diff --git a/src/lib/platform/MSWindowsWatchdog.h b/src/lib/platform/MSWindowsWatchdog.h
index 0a81521..0595ca0 100644
--- a/src/lib/platform/MSWindowsWatchdog.h
+++ b/src/lib/platform/MSWindowsWatchdog.h
@@ -6,7 +6,7 @@
* 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
@@ -48,8 +48,8 @@ public:
void setFileLogOutputter(FileLogOutputter* outputter);
private:
- void mainLoop(void*);
- void outputLoop(void*);
+ void main_loop();
+ void output_loop();
void shutdownProcess(HANDLE handle, DWORD pid, int timeout);
void shutdownExistingProcesses();
HANDLE duplicateProcessToken(HANDLE process, LPSECURITY_ATTRIBUTES security);
@@ -81,7 +81,7 @@ private:
//! Relauncher error
/*!
-An error occured in the process watchdog.
+An error occurred in the process watchdog.
*/
class XMSWindowsWatchdogError : public XBarrier {
public:
diff --git a/src/lib/platform/OSXClipboard.cpp b/src/lib/platform/OSXClipboard.cpp
index e55c8e0..ff1779c 100644
--- a/src/lib/platform/OSXClipboard.cpp
+++ b/src/lib/platform/OSXClipboard.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -52,7 +52,7 @@ OSXClipboard::OSXClipboard() :
OSStatus syncErr = PasteboardSynchronize(m_pboard);
if (syncErr != noErr) {
- LOG((CLOG_DEBUG "failed to syncronize clipboard: error %i", syncErr));
+ LOG((CLOG_DEBUG "failed to synchronize clipboard: error %i", syncErr));
}
}
@@ -90,7 +90,7 @@ OSXClipboard::synchronize()
return true;
}
return false;
-}
+}
void OSXClipboard::add(EFormat format, const std::string& data)
{
@@ -126,15 +126,15 @@ void OSXClipboard::add(EFormat format, const std::string& data)
flavorType,
dataRef,
kPasteboardFlavorNoFlags);
-
+
LOG((CLOG_DEBUG "added %d bytes to clipboard format: %d", data.size(), format));
}
-
+
}
}
bool
-OSXClipboard::open(Time time) const
+OSXClipboard::open(Time time) const
{
if (m_pboard == NULL)
return false;
diff --git a/src/lib/platform/OSXClipboard.h b/src/lib/platform/OSXClipboard.h
index b1f9801..9d66600 100644
--- a/src/lib/platform/OSXClipboard.h
+++ b/src/lib/platform/OSXClipboard.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXClipboardAnyTextConverter.cpp b/src/lib/platform/OSXClipboardAnyTextConverter.cpp
index ae8dc4a..2513db5 100644
--- a/src/lib/platform/OSXClipboardAnyTextConverter.cpp
+++ b/src/lib/platform/OSXClipboardAnyTextConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXClipboardAnyTextConverter.h b/src/lib/platform/OSXClipboardAnyTextConverter.h
index f057bae..987f2c5 100644
--- a/src/lib/platform/OSXClipboardAnyTextConverter.h
+++ b/src/lib/platform/OSXClipboardAnyTextConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXClipboardHTMLConverter.cpp b/src/lib/platform/OSXClipboardHTMLConverter.cpp
index 46a3d0f..0a2f5ec 100644
--- a/src/lib/platform/OSXClipboardHTMLConverter.cpp
+++ b/src/lib/platform/OSXClipboardHTMLConverter.cpp
@@ -66,7 +66,7 @@ std::string OSXClipboardHTMLConverter::convertString(const std::string& data,
CFRelease(stringRef);
return {};
}
-
+
CFStringGetBytes(stringRef, entireString, toEncoding,
0, false, (UInt8*)buffer, buffSize, NULL);
diff --git a/src/lib/platform/OSXClipboardTextConverter.cpp b/src/lib/platform/OSXClipboardTextConverter.cpp
index a68258d..a4fb6ae 100644
--- a/src/lib/platform/OSXClipboardTextConverter.cpp
+++ b/src/lib/platform/OSXClipboardTextConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -24,7 +24,7 @@
// OSXClipboardTextConverter
//
-OSXClipboardTextConverter::OSXClipboardTextConverter()
+OSXClipboardTextConverter::OSXClipboardTextConverter()
{
// do nothing
}
@@ -59,12 +59,12 @@ std::string OSXClipboardTextConverter::convertString(const std::string& data,
0, false, NULL, 0, &buffSize);
char* buffer = new char[buffSize];
-
+
if (buffer == NULL) {
CFRelease(stringRef);
return {};
}
-
+
CFStringGetBytes(stringRef, entireString, toEncoding,
0, false, (UInt8*)buffer, buffSize, NULL);
@@ -72,7 +72,7 @@ std::string OSXClipboardTextConverter::convertString(const std::string& data,
delete[] buffer;
CFRelease(stringRef);
-
+
return result;
}
diff --git a/src/lib/platform/OSXClipboardTextConverter.h b/src/lib/platform/OSXClipboardTextConverter.h
index 8211f1e..5a4b51f 100644
--- a/src/lib/platform/OSXClipboardTextConverter.h
+++ b/src/lib/platform/OSXClipboardTextConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXClipboardUTF16Converter.cpp b/src/lib/platform/OSXClipboardUTF16Converter.cpp
index 8411e92..4f13cc0 100644
--- a/src/lib/platform/OSXClipboardUTF16Converter.cpp
+++ b/src/lib/platform/OSXClipboardUTF16Converter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXClipboardUTF16Converter.h b/src/lib/platform/OSXClipboardUTF16Converter.h
index b279c99..5e448df 100644
--- a/src/lib/platform/OSXClipboardUTF16Converter.h
+++ b/src/lib/platform/OSXClipboardUTF16Converter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXDragSimulator.h b/src/lib/platform/OSXDragSimulator.h
index cb361ca..6dd73f4 100644
--- a/src/lib/platform/OSXDragSimulator.h
+++ b/src/lib/platform/OSXDragSimulator.h
@@ -28,7 +28,7 @@ void runCocoaApp();
void stopCocoaLoop();
void fakeDragging(const char* str, int cursorX, int cursorY);
CFStringRef getCocoaDropTarget();
-
+
#if defined(__cplusplus)
}
#endif
diff --git a/src/lib/platform/OSXDragSimulator.m b/src/lib/platform/OSXDragSimulator.mm
index affed38..735aa4a 100644
--- a/src/lib/platform/OSXDragSimulator.m
+++ b/src/lib/platform/OSXDragSimulator.mm
@@ -30,9 +30,9 @@ void
runCocoaApp()
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
-
+
[NSApplication sharedApplication];
-
+
NSWindow* window = [[NSWindow alloc]
initWithContentRect: NSMakeRect(0, 0, 3, 3)
styleMask: NSBorderlessWindowMask
@@ -41,16 +41,16 @@ runCocoaApp()
[window setTitle: @""];
[window setAlphaValue:0.1];
[window makeKeyAndOrderFront:nil];
-
+
OSXDragView* dragView = [[OSXDragView alloc] initWithFrame:NSMakeRect(0, 0, 3, 3)];
-
+
g_dragWindow = window;
g_dragView = dragView;
[window setContentView: dragView];
-
+
NSLog(@"starting cocoa loop");
[NSApp run];
-
+
NSLog(@"cocoa: release");
[pool release];
}
@@ -65,25 +65,25 @@ void
fakeDragging(const char* str, int cursorX, int cursorY)
{
g_ext = [NSString stringWithUTF8String:str];
-
+
dispatch_async(dispatch_get_main_queue(), ^{
NSRect screen = [[NSScreen mainScreen] frame];
- NSLog ( @"screen size: witdh = %f height = %f", screen.size.width, screen.size.height);
+ NSLog ( @"screen size: width = %f height = %f", screen.size.width, screen.size.height);
NSLog ( @"mouseLocation: %d %d", cursorX, cursorY);
-
+
int newPosX = 0;
int newPosY = 0;
newPosX = cursorX - 1;
newPosY = screen.size.height - cursorY - 1;
-
+
NSRect rect = NSMakeRect(newPosX, newPosY, 3, 3);
NSLog ( @"newPosX: %d", newPosX);
NSLog ( @"newPosY: %d", newPosY);
-
+
[g_dragWindow setFrame:rect display:NO];
[g_dragWindow makeKeyAndOrderFront:nil];
[NSApp activateIgnoringOtherApps:YES];
-
+
[g_dragView setFileExt:g_ext];
CGEventRef down = CGEventCreateMouseEvent(CGEventSourceCreate(kCGEventSourceStateHIDSystemState), kCGEventLeftMouseDown, CGPointMake(cursorX, cursorY), kCGMouseButtonLeft);
diff --git a/src/lib/platform/OSXDragView.m b/src/lib/platform/OSXDragView.mm
index 67dac56..67dac56 100644
--- a/src/lib/platform/OSXDragView.m
+++ b/src/lib/platform/OSXDragView.mm
diff --git a/src/lib/platform/OSXEventQueueBuffer.cpp b/src/lib/platform/OSXEventQueueBuffer.cpp
index 8e18afc..e012c89 100644
--- a/src/lib/platform/OSXEventQueueBuffer.cpp
+++ b/src/lib/platform/OSXEventQueueBuffer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -83,11 +83,11 @@ OSXEventQueueBuffer::getEvent(Event& event, UInt32& dataID)
else {
UInt32 eventClass = GetEventClass(m_event);
switch (eventClass) {
- case 'Syne':
+ case 'Syne':
dataID = GetEventKind(m_event);
return kUser;
- default:
+ default:
event = Event(Event::kSystem,
m_eventQueue->getSystemTarget(), &m_event);
return kSystem;
@@ -101,24 +101,24 @@ OSXEventQueueBuffer::addEvent(UInt32 dataID)
EventRef event;
OSStatus error = CreateEvent(
kCFAllocatorDefault,
- 'Syne',
+ 'Syne',
dataID,
0,
kEventAttributeNone,
&event);
if (error == noErr) {
-
+
assert(m_carbonEventQueue != NULL);
-
+
error = PostEventToQueue(
m_carbonEventQueue,
event,
kEventPriorityStandard);
-
+
ReleaseEvent(event);
}
-
+
return (error == noErr);
}
diff --git a/src/lib/platform/OSXEventQueueBuffer.h b/src/lib/platform/OSXEventQueueBuffer.h
index 28c4a5d..8e0c903 100644
--- a/src/lib/platform/OSXEventQueueBuffer.h
+++ b/src/lib/platform/OSXEventQueueBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXKeyState.cpp b/src/lib/platform/OSXKeyState.cpp
index 9db3c5d..aad2072 100644
--- a/src/lib/platform/OSXKeyState.cpp
+++ b/src/lib/platform/OSXKeyState.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -43,6 +43,9 @@ static const UInt32 s_launchpadVK = 131;
static const UInt32 s_osxNumLock = 1 << 16;
+static const UInt32 s_int4VK = 0x8a; // international4
+static const UInt32 s_int5VK = 0x8b; // international5
+
struct KeyEntry {
public:
KeyID m_keyID;
@@ -97,7 +100,7 @@ static const KeyEntry s_controlKeys[] = {
{ kKeyKP_Divide, kVK_ANSI_KeypadDivide },
{ kKeyKP_Subtract, kVK_ANSI_KeypadMinus },
{ kKeyKP_Enter, kVK_ANSI_KeypadEnter },
-
+
// virtual key 110 is fn+enter and i have no idea what that's supposed
// to map to. also the enter key with numlock on is a modifier but i
// don't know which.
@@ -118,11 +121,18 @@ static const KeyEntry s_controlKeys[] = {
// toggle modifiers
{ kKeyNumLock, s_numLockVK },
{ kKeyCapsLock, s_capsLockVK },
-
+
{ kKeyMissionControl, s_missionControlVK },
{ kKeyLaunchpad, s_launchpadVK },
{ kKeyBrightnessUp, s_brightnessUp },
- { kKeyBrightnessDown, s_brightnessDown }
+ { kKeyBrightnessDown, s_brightnessDown },
+
+ // JIS keyboards only
+ { kKeyEisuToggle, kVK_JIS_Eisu },
+ { kKeyKana, kVK_JIS_Kana },
+ { kKeyMuhenkan, s_int5VK },
+ { kKeyHenkan, s_int4VK },
+ { kKeyZenkaku, kVK_ANSI_Grave }
};
@@ -159,7 +169,7 @@ OSXKeyState::init()
// build virtual key map
for (size_t i = 0; i < sizeof(s_controlKeys) / sizeof(s_controlKeys[0]);
++i) {
-
+
m_virtualKeyMap[s_controlKeys[i].m_virtualKey] =
s_controlKeys[i].m_keyID;
}
@@ -214,11 +224,11 @@ OSXKeyState::mapModifiersToCarbon(UInt32 mask) const
if ((mask & kCGEventFlagMaskNumericPad) != 0) {
outMask |= s_osxNumLock;
}
-
+
return outMask;
}
-KeyButton
+KeyButton
OSXKeyState::mapKeyFromEvent(KeyIDs& ids,
KeyModifierMask* maskOut, CGEventRef event) const
{
@@ -253,7 +263,7 @@ OSXKeyState::mapKeyFromEvent(KeyIDs& ids,
}
// get keyboard info
- TISInputSourceRef currentKeyboardLayout = TISCopyCurrentKeyboardLayoutInputSource();
+ TISInputSourceRef currentKeyboardLayout = TISCopyCurrentKeyboardLayoutInputSource();
if (currentKeyboardLayout == NULL) {
return kKeyNone;
@@ -338,27 +348,27 @@ CGEventFlags
OSXKeyState::getModifierStateAsOSXFlags()
{
CGEventFlags modifiers = CGEventFlags(0);
-
+
if (m_shiftPressed) {
modifiers |= CGEventFlags(kCGEventFlagMaskShift);
}
-
+
if (m_controlPressed) {
modifiers |= CGEventFlags(kCGEventFlagMaskControl);
}
-
+
if (m_altPressed) {
modifiers |= CGEventFlags(kCGEventFlagMaskAlternate);
}
-
+
if (m_superPressed) {
modifiers |= CGEventFlags(kCGEventFlagMaskCommand);
}
-
+
if (m_capsPressed) {
modifiers |= CGEventFlags(kCGEventFlagMaskAlphaShift);
}
-
+
return modifiers;
}
@@ -400,12 +410,12 @@ OSXKeyState::pollActiveGroup() const
TISInputSourceRef keyboardLayout = TISCopyCurrentKeyboardLayoutInputSource();
CFDataRef id = (CFDataRef)TISGetInputSourceProperty(
keyboardLayout, kTISPropertyInputSourceID);
-
+
GroupMap::const_iterator i = m_groupMap.find(id);
if (i != m_groupMap.end()) {
return i->second;
}
-
+
LOG((CLOG_DEBUG "can't get the active group, use the first group instead"));
return 0;
@@ -447,7 +457,7 @@ OSXKeyState::getKeyMap(barrier::KeyMap& keyMap)
const void* resource;
bool layoutValid = false;
-
+
// add regular keys
// try uchr resource first
CFDataRef resourceRef = (CFDataRef)TISGetInputSourceProperty(
@@ -475,19 +485,19 @@ static io_connect_t getEventDriver(void)
static mach_port_t sEventDrvrRef = 0;
mach_port_t masterPort, service, iter;
kern_return_t kr;
-
+
if (!sEventDrvrRef) {
// Get master device port
kr = IOMasterPort(bootstrap_port, &masterPort);
assert(KERN_SUCCESS == kr);
-
+
kr = IOServiceGetMatchingServices(masterPort,
IOServiceMatching(kIOHIDSystemClass), &iter);
assert(KERN_SUCCESS == kr);
-
+
service = IOIteratorNext(iter);
assert(service);
-
+
kr = IOServiceOpen(service, mach_task_self(),
kIOHIDParamConnectType, &sEventDrvrRef);
assert(KERN_SUCCESS == kr);
@@ -495,7 +505,7 @@ static io_connect_t getEventDriver(void)
IOObjectRelease(service);
IOObjectRelease(iter);
}
-
+
return sEventDrvrRef;
}
@@ -504,7 +514,7 @@ OSXKeyState::postHIDVirtualKey(const UInt8 virtualKeyCode,
const bool postDown)
{
static UInt32 modifiers = 0;
-
+
NXEventData event;
IOGPoint loc = { 0, 0 };
UInt32 modifiersDelta = 0;
@@ -541,7 +551,7 @@ OSXKeyState::postHIDVirtualKey(const UInt8 virtualKeyCode,
m_capsPressed = postDown;
break;
}
-
+
// update the modifier bit
if (postDown) {
modifiers |= modifiersDelta;
@@ -549,7 +559,7 @@ OSXKeyState::postHIDVirtualKey(const UInt8 virtualKeyCode,
else {
modifiers &= ~modifiersDelta;
}
-
+
kern_return_t kr;
event.key.keyCode = virtualKeyCode;
kr = IOHIDPostEvent(getEventDriver(), NX_FLAGSCHANGED, loc,
@@ -575,11 +585,11 @@ OSXKeyState::fakeKey(const Keystroke& keystroke)
{
switch (keystroke.m_type) {
case Keystroke::kButton: {
-
+
KeyButton button = keystroke.m_data.m_button.m_button;
bool keyDown = keystroke.m_data.m_button.m_press;
CGKeyCode virtualKey = mapKeyButtonToVirtualKey(button);
-
+
LOG((CLOG_DEBUG1
" button=0x%04x virtualKey=0x%04x keyDown=%s",
button, virtualKey, keyDown ? "down" : "up"));
@@ -763,7 +773,7 @@ OSXKeyState::mapBarrierHotKeyToMac(KeyID key, KeyModifierMask mask,
return false;
}
macVirtualKey = mapKeyButtonToVirtualKey(button);
-
+
// calculate modifier mask
macModifierMask = 0;
if ((mask & KeyModifierShift) != 0) {
@@ -784,10 +794,10 @@ OSXKeyState::mapBarrierHotKeyToMac(KeyID key, KeyModifierMask mask,
if ((mask & KeyModifierNumLock) != 0) {
macModifierMask |= s_osxNumLock;
}
-
+
return true;
}
-
+
void
OSXKeyState::handleModifierKeys(void* target,
KeyModifierMask oldMask, KeyModifierMask newMask)
@@ -855,7 +865,7 @@ OSXKeyState::getGroups(GroupList& groups) const
groups.clear();
for (CFIndex i = 0; i < n; ++i) {
bool addToGroups = true;
- TISInputSourceRef keyboardLayout =
+ TISInputSourceRef keyboardLayout =
(TISInputSourceRef)CFArrayGetValueAtIndex(kbds, i);
if (addToGroups)
diff --git a/src/lib/platform/OSXKeyState.h b/src/lib/platform/OSXKeyState.h
index 4d92860..e688394 100644
--- a/src/lib/platform/OSXKeyState.h
+++ b/src/lib/platform/OSXKeyState.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -67,7 +67,7 @@ public:
Still required in a few places for translation calls.
*/
KeyModifierMask mapModifiersToCarbon(UInt32 mask) const;
-
+
//! Map key event to keys
/*!
Converts a key event into a sequence of KeyIDs and the shadow modifier
@@ -149,7 +149,7 @@ private:
static UInt32 mapKeyButtonToVirtualKey(KeyButton keyButton);
void init();
-
+
// Post a key event to HID manager. It posts an event to HID client, a
// much lower level than window manager which's the target from carbon
// CGEventPost
diff --git a/src/lib/platform/OSXMediaKeySimulator.m b/src/lib/platform/OSXMediaKeySimulator.mm
index 5aacd10..efc4251 100644
--- a/src/lib/platform/OSXMediaKeySimulator.m
+++ b/src/lib/platform/OSXMediaKeySimulator.mm
@@ -85,8 +85,8 @@ fakeNativeMediaKey(KeyID id)
data2:-1];
CGEventRef upEvent = [upRef CGEvent];
- CGEventPost(0, downEvent);
- CGEventPost(0, upEvent);
+ CGEventPost(kCGHIDEventTap, downEvent);
+ CGEventPost(kCGHIDEventTap, upEvent);
return true;
}
diff --git a/src/lib/platform/OSXMediaKeySupport.m b/src/lib/platform/OSXMediaKeySupport.mm
index 9c9dbc3..a4d5767 100644
--- a/src/lib/platform/OSXMediaKeySupport.m
+++ b/src/lib/platform/OSXMediaKeySupport.mm
@@ -147,8 +147,8 @@ fakeNativeMediaKey(KeyID id)
data2:-1];
CGEventRef upEvent = [upRef CGEvent];
- CGEventPost(0, downEvent);
- CGEventPost(0, upEvent);
+ CGEventPost(kCGHIDEventTap, downEvent);
+ CGEventPost(kCGHIDEventTap, upEvent);
return true;
}
diff --git a/src/lib/platform/OSXPasteboardPeeker.h b/src/lib/platform/OSXPasteboardPeeker.h
index 5105262..b69dba8 100644
--- a/src/lib/platform/OSXPasteboardPeeker.h
+++ b/src/lib/platform/OSXPasteboardPeeker.h
@@ -26,7 +26,7 @@ extern "C" {
#endif
CFStringRef getDraggedFileURL();
-
+
#if defined(__cplusplus)
}
#endif
diff --git a/src/lib/platform/OSXPasteboardPeeker.m b/src/lib/platform/OSXPasteboardPeeker.mm
index ab39e26..ab39e26 100644
--- a/src/lib/platform/OSXPasteboardPeeker.m
+++ b/src/lib/platform/OSXPasteboardPeeker.mm
diff --git a/src/lib/platform/OSXScreen.h b/src/lib/platform/OSXScreen.h
index 68c7c68..691b74c 100644
--- a/src/lib/platform/OSXScreen.h
+++ b/src/lib/platform/OSXScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -37,7 +37,7 @@ extern "C" {
typedef int CGSConnectionID;
CGError CGSSetConnectionProperty(CGSConnectionID cid, CGSConnectionID targetCID, CFStringRef key, CFTypeRef value);
int _CGSDefaultConnection();
-}
+}
template <class T>
@@ -98,10 +98,10 @@ public:
virtual bool isPrimary() const;
virtual void fakeDraggingFiles(DragFileList fileList);
virtual std::string& getDraggingFilename();
-
+
const std::string& getDropTarget() const { return m_dropTarget; }
void waitForCarbonLoop() const;
-
+
protected:
// IPlatformScreen overrides
virtual void handleSystemEvent(const Event&, void*);
@@ -112,7 +112,7 @@ private:
void updateScreenShape();
void updateScreenShape(const CGDirectDisplayID, const CGDisplayChangeSummaryFlags);
void postMouseEvent(CGPoint&) const;
-
+
// convenience function to send events
void sendEvent(Event::Type type, void* = NULL) const;
void sendClipboardEvent(Event::Type type, ClipboardID id) const;
@@ -124,16 +124,16 @@ private:
// of the button pressed using the mac button mapping.
bool onMouseButton(bool pressed, UInt16 macButton);
bool onMouseWheel(SInt32 xDelta, SInt32 yDelta) const;
-
+
void constructMouseButtonEventMap();
bool onKey(CGEventRef event);
void onMediaKey(CGEventRef event);
-
+
bool onHotKey(EventRef event) const;
-
- // Added here to allow the carbon cursor hack to be called.
+
+ // Added here to allow the carbon cursor hack to be called.
void showCursor();
void hideCursor();
@@ -172,9 +172,9 @@ private:
static pascal OSStatus
userSwitchCallback(EventHandlerCallRef nextHandler,
EventRef theEvent, void* inUserData);
-
+
// sleep / wakeup support
- void watchSystemPowerThread(void*);
+ void watchSystemPowerThread();
static void testCanceled(CFRunLoopTimerRef timer, void*info);
static void powerChangeCallback(void* refcon, io_service_t service,
natural_t messageType, void* messageArgument);
@@ -182,12 +182,12 @@ private:
void* messageArgument);
void handleConfirmSleep(const Event& event, void*);
-
+
// global hotkey operating mode
static bool isGlobalHotKeyOperatingModeAvailable();
static void setGlobalHotKeysEnabled(bool enabled);
static bool getGlobalHotKeysEnabled();
-
+
// Quartz event tap support
static CGEventRef handleCGInputEvent(CGEventTapProxy proxy,
CGEventType type,
@@ -197,12 +197,12 @@ private:
CGEventType type,
CGEventRef event,
void* refcon);
-
+
// convert CFString to char*
static char* CFStringRefToUTF8String(CFStringRef aString);
-
- void getDropTargetThread(void*);
-
+
+ void get_drop_target_thread();
+
private:
struct HotKeyItem {
public:
@@ -225,13 +225,13 @@ private:
kMouseButtonDown,
kMouseButtonStateMax
};
-
+
class MouseButtonState {
public:
void set(UInt32 button, EMouseButtonState state);
bool any();
- void reset();
+ void reset();
void overwrite(UInt32 buttons);
bool test(UInt32 button) const;
@@ -262,7 +262,7 @@ private:
// mouse state
mutable SInt32 m_xCursor, m_yCursor;
mutable bool m_cursorPosValid;
-
+
/* FIXME: this data structure is explicitly marked mutable due
to a need to track the state of buttons since the remote
side only lets us know of change events, and because the
@@ -321,7 +321,7 @@ private:
// global hotkey operating mode
static bool s_testedForGHOM;
static bool s_hasGHOM;
-
+
// Quartz input event support
CFMachPortRef m_eventTapPort;
CFRunLoopSourceRef m_eventTapRLSR;
@@ -336,10 +336,10 @@ private:
bool m_autoShowHideCursor;
IEventQueue* m_events;
-
+
Thread* m_getDropTargetThread;
std::string m_dropTarget;
-
+
#if defined(MAC_OS_X_VERSION_10_7)
Mutex* m_carbonLoopMutex;
CondVar<bool>* m_carbonLoopReady;
diff --git a/src/lib/platform/OSXScreen.mm b/src/lib/platform/OSXScreen.mm
index 2b4594f..d41e321 100644
--- a/src/lib/platform/OSXScreen.mm
+++ b/src/lib/platform/OSXScreen.mm
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -38,7 +38,6 @@
#include "base/Log.h"
#include "base/IEventQueue.h"
#include "base/TMethodEventJob.h"
-#include "base/TMethodJob.h"
#include <math.h>
#include <mach-o/dyld.h>
@@ -110,10 +109,10 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
updateScreenShape(m_displayID, 0);
m_screensaver = new OSXScreenSaver(m_events, getEventTarget());
m_keyState = new OSXKeyState(m_events);
-
+
// only needed when running as a server.
if (m_isPrimary) {
-
+
#if defined(MAC_OS_X_VERSION_10_9)
// we can't pass options to show the dialog, this must be done by the gui.
if (!AXIsProcessTrusted()) {
@@ -126,7 +125,7 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
}
#endif
}
-
+
// install display manager notification handler
CGDisplayRegisterReconfigurationCallback(displayReconfigurationCallback, this);
@@ -157,8 +156,7 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
m_carbonLoopReady = new CondVar<bool>(m_carbonLoopMutex, false);
#endif
LOG((CLOG_DEBUG "starting watchSystemPowerThread"));
- m_pmWatchThread = new Thread(new TMethodJob<OSXScreen>
- (this, &OSXScreen::watchSystemPowerThread));
+ m_pmWatchThread = new Thread([this](){ watchSystemPowerThread(); });
}
catch (...) {
m_events->removeHandler(m_events->forOSXScreen().confirmSleep(),
@@ -166,7 +164,7 @@ OSXScreen::OSXScreen(IEventQueue* events, bool isPrimary, bool autoShowHideCurso
if (m_switchEventHandlerRef != 0) {
RemoveEventHandler(m_switchEventHandlerRef);
}
-
+
CGDisplayRemoveReconfigurationCallback(displayReconfigurationCallback, this);
delete m_keyState;
@@ -217,7 +215,7 @@ OSXScreen::~OSXScreen()
delete m_keyState;
delete m_screensaver;
-
+
#if defined(MAC_OS_X_VERSION_10_7)
delete m_carbonLoopMutex;
delete m_carbonLoopReady;
@@ -273,7 +271,7 @@ OSXScreen::warpCursor(SInt32 x, SInt32 y)
pos.x = x;
pos.y = y;
CGWarpMouseCursorPosition(pos);
-
+
// save new cursor position
m_xCursor = x;
m_yCursor = y;
@@ -325,7 +323,7 @@ OSXScreen::registerHotKey(KeyID key, KeyModifierMask mask)
LOG((CLOG_DEBUG "could not map hotkey id=%04x mask=%04x", key, mask));
return 0;
}
-
+
// choose hotkey id
UInt32 id;
if (!m_oldHotKeyIDs.empty()) {
@@ -351,7 +349,7 @@ OSXScreen::registerHotKey(KeyID key, KeyModifierMask mask)
}
else {
EventHotKeyID hkid = { 'SNRG', (UInt32)id };
- OSStatus status = RegisterEventHotKey(macKey, macMask, hkid,
+ OSStatus status = RegisterEventHotKey(macKey, macMask, hkid,
GetApplicationEventTarget(), 0,
&ref);
okay = (status == noErr);
@@ -366,7 +364,7 @@ OSXScreen::registerHotKey(KeyID key, KeyModifierMask mask)
}
m_hotKeys.insert(std::make_pair(id, HotKeyItem(ref, macKey, macMask)));
-
+
LOG((CLOG_DEBUG "registered hotkey %s (id=%04x mask=%04x) as id=%d", barrier::KeyMap::formatKey(key, mask).c_str(), key, mask, id));
return id;
}
@@ -468,7 +466,7 @@ OSXScreen::postMouseEvent(CGPoint& pos) const
}
}
}
-
+
CGEventType type = kCGEventMouseMoved;
SInt8 button = m_buttonState.getFirstButtonDown();
@@ -478,10 +476,10 @@ OSXScreen::postMouseEvent(CGPoint& pos) const
}
CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, static_cast<CGMouseButton>(button));
-
+
// Dragging events also need the click state
CGEventSetIntegerValueField(event, kCGMouseEventClickState, m_clickState);
-
+
// Fix for sticky keys
CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags();
CGEventSetFlags(event, modifiers);
@@ -503,7 +501,7 @@ OSXScreen::postMouseEvent(CGPoint& pos) const
CGEventSetDoubleValueField(event, kCGMouseEventDeltaY, deltaFY);
CGEventPost(kCGHIDEventTap, event);
-
+
CFRelease(event);
}
@@ -515,7 +513,7 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
if (index >= NumButtonIDs) {
return;
}
-
+
CGPoint pos;
if (!m_cursorPosValid) {
SInt32 x, y;
@@ -533,79 +531,77 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
// since we don't have double click distance in NX APIs
// we define our own defaults.
const double maxDiff = sqrt(2) + 0.0001;
-
+
double clickTime = [NSEvent doubleClickInterval];
-
+
// As long as the click is within the time window and distance window
// increase clickState (double click, triple click, etc)
- // This will allow for higher than triple click but the quartz documenation
+ // This will allow for higher than triple click but the quartz documentation
// does not specify that this should be limited to triple click
if (press) {
- if ((ARCH->time() - m_lastClickTime) <= clickTime && diff <= maxDiff){
+ if ((ARCH->time() - m_lastClickTime) <= clickTime && diff <= maxDiff) {
m_clickState++;
}
else {
m_clickState = 1;
}
-
+
m_lastClickTime = ARCH->time();
}
-
- if (m_clickState == 1){
+
+ if (m_clickState == 1) {
m_lastSingleClickXCursor = m_xCursor;
m_lastSingleClickYCursor = m_yCursor;
}
-
+
EMouseButtonState state = press ? kMouseButtonDown : kMouseButtonUp;
-
+
LOG((CLOG_DEBUG1 "faking mouse button id: %d press: %s", index, press ? "pressed" : "released"));
-
+
MouseButtonEventMapType thisButtonMap = MouseButtonEventMap[index];
CGEventType type = thisButtonMap[state];
CGEventRef event = CGEventCreateMouseEvent(NULL, type, pos, static_cast<CGMouseButton>(index));
-
+
CGEventSetIntegerValueField(event, kCGMouseEventClickState, m_clickState);
-
+
// Fix for sticky keys
CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags();
CGEventSetFlags(event, modifiers);
-
+
m_buttonState.set(index, state);
CGEventPost(kCGHIDEventTap, event);
-
+
CFRelease(event);
-
+
if (!press && (id == kButtonLeft)) {
if (m_fakeDraggingStarted) {
- m_getDropTargetThread = new Thread(new TMethodJob<OSXScreen>(
- this, &OSXScreen::getDropTargetThread));
+ m_getDropTargetThread = new Thread([this](){ get_drop_target_thread(); });
}
-
+
m_draggingStarted = false;
}
}
-void
-OSXScreen::getDropTargetThread(void*)
+void OSXScreen::get_drop_target_thread()
{
#if defined(MAC_OS_X_VERSION_10_7)
char* cstr = NULL;
-
+
// wait for 5 secs for the drop destinaiton string to be filled.
UInt32 timeout = ARCH->time() + 5;
-
+
while (ARCH->time() < timeout) {
CFStringRef cfstr = getCocoaDropTarget();
cstr = CFStringRefToUTF8String(cfstr);
CFRelease(cfstr);
-
+
if (cstr != NULL) {
break;
}
ARCH->sleep(.1f);
}
-
+
if (cstr != NULL) {
LOG((CLOG_DEBUG "drop target: %s", cstr));
m_dropTarget = cstr;
@@ -626,12 +622,12 @@ OSXScreen::fakeMouseMove(SInt32 x, SInt32 y)
if (m_fakeDraggingStarted) {
m_buttonState.set(0, kMouseButtonDown);
}
-
+
// index 0 means left mouse button
if (m_buttonState.test(0)) {
m_draggingStarted = true;
}
-
+
// synthesize event
CGPoint pos;
pos.x = x;
@@ -679,11 +675,11 @@ OSXScreen::fakeMouseWheel(SInt32 xDelta, SInt32 yDelta) const
NULL, kCGScrollEventUnitLine, 2,
mapScrollWheelFromBarrier(yDelta),
-mapScrollWheelFromBarrier(xDelta));
-
+
// Fix for sticky keys
CGEventFlags modifiers = m_keyState->getModifierStateAsOSXFlags();
CGEventSetFlags(scrollEvent, modifiers);
-
+
CGEventPost(kCGHIDEventTap, scrollEvent);
CFRelease(scrollEvent);
}
@@ -754,11 +750,11 @@ OSXScreen::enable()
if (m_isPrimary) {
// FIXME -- start watching jump zones
-
+
// kCGEventTapOptionDefault = 0x00000000 (Missing in 10.4, so specified literally)
m_eventTapPort = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault,
- kCGEventMaskForAllEvents,
- handleCGInputEvent,
+ kCGEventMaskForAllEvents,
+ handleCGInputEvent,
this);
}
else {
@@ -773,10 +769,10 @@ OSXScreen::enable()
// there may be a better way to do this, but we register an event handler even if we're
// not on the primary display (acting as a client). This way, if a local event comes in
- // (either keyboard or mouse), we can make sure to show the cursor if we've hidden it.
+ // (either keyboard or mouse), we can make sure to show the cursor if we've hidden it.
m_eventTapPort = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault,
- kCGEventMaskForAllEvents,
- handleCGInputEventSecondary,
+ kCGEventMaskForAllEvents,
+ handleCGInputEventSecondary,
this);
}
@@ -798,9 +794,9 @@ OSXScreen::disable()
if (m_autoShowHideCursor) {
showCursor();
}
-
+
// FIXME -- stop watching jump zones, stop capturing input
-
+
if (m_eventTapRLSR) {
CFRunLoopRemoveSource(CFRunLoopGetCurrent(), m_eventTapRLSR, kCFRunLoopDefaultMode);
CFRelease(m_eventTapRLSR);
@@ -846,7 +842,7 @@ OSXScreen::enter()
io_registry_entry_t entry = IORegistryEntryFromPath(
kIOMasterPortDefault,
"IOService:/IOResources/IODisplayWrangler");
-
+
if (entry != MACH_PORT_NULL) {
IORegistryEntrySetCFProperty(entry, CFSTR("IORequestIdle"), kCFBooleanFalse);
IOObjectRelease(entry);
@@ -863,15 +859,15 @@ bool
OSXScreen::leave()
{
hideCursor();
-
+
if (isDraggingStarted()) {
String& fileList = getDraggingFilename();
-
+
if (!m_isPrimary) {
if (fileList.empty() == false) {
ClientApp& app = ClientApp::instance();
Client* client = app.getClientPtr();
-
+
DragInformation di;
di.setFilename(fileList);
DragFileList dragFileList;
@@ -881,7 +877,7 @@ OSXScreen::leave()
dragFileList, info);
client->sendDragInfo(fileCount, info, info.size());
LOG((CLOG_DEBUG "send dragging file to server"));
-
+
// TODO: what to do with multiple file or even
// a folder
client->sendFileToServer(fileList.c_str());
@@ -889,7 +885,7 @@ OSXScreen::leave()
}
m_draggingStarted = false;
}
-
+
if (m_isPrimary) {
avoidHesitatingCursor();
@@ -906,8 +902,8 @@ OSXScreen::setClipboard(ClipboardID, const IClipboard* src)
{
if (src != NULL) {
LOG((CLOG_DEBUG "setting clipboard"));
- Clipboard::copy(&m_pasteboard, src);
- }
+ Clipboard::copy(&m_pasteboard, src);
+ }
return true;
}
@@ -1036,16 +1032,16 @@ OSXScreen::handleSystemEvent(const Event& event, void*)
}
break;
- case kEventClassKeyboard:
+ case kEventClassKeyboard:
switch (GetEventKind(*carbonEvent)) {
case kEventHotKeyPressed:
case kEventHotKeyReleased:
onHotKey(*carbonEvent);
break;
}
-
+
break;
-
+
case kEventClassWindow:
// 2nd param was formerly GetWindowEventTarget(m_userInputWindow) which is 32-bit only,
// however as m_userInputWindow is never initialized to anything we can take advantage of
@@ -1076,7 +1072,7 @@ OSXScreen::handleSystemEvent(const Event& event, void*)
}
}
-bool
+bool
OSXScreen::onMouseMove(CGFloat mx, CGFloat my)
{
LOG((CLOG_DEBUG2 "mouse move %+f,%+f", mx, my));
@@ -1140,7 +1136,7 @@ OSXScreen::onMouseMove(CGFloat mx, CGFloat my)
return true;
}
-bool
+bool
OSXScreen::onMouseButton(bool pressed, UInt16 macButton)
{
// Buttons 2 and 3 are inverted on the mac
@@ -1176,7 +1172,7 @@ OSXScreen::onMouseButton(bool pressed, UInt16 macButton)
}
}
}
-
+
if (macButton == kButtonLeft) {
EMouseButtonState state = pressed ? kMouseButtonDown : kMouseButtonUp;
m_buttonState.set(kButtonLeft - 1, state);
@@ -1186,10 +1182,9 @@ OSXScreen::onMouseButton(bool pressed, UInt16 macButton)
}
else {
if (m_fakeDraggingStarted) {
- m_getDropTargetThread = new Thread(new TMethodJob<OSXScreen>(
- this, &OSXScreen::getDropTargetThread));
+ m_getDropTargetThread = new Thread([this](){ get_drop_target_thread(); });
}
-
+
m_draggingStarted = false;
}
}
@@ -1218,16 +1213,16 @@ OSXScreen::displayReconfigurationCallback(CGDirectDisplayID displayID, CGDisplay
// Closing or opening the lid when an external monitor is
// connected causes an kCGDisplayBeginConfigurationFlag event
- CGDisplayChangeSummaryFlags mask = kCGDisplayBeginConfigurationFlag | kCGDisplayMovedFlag |
- kCGDisplaySetModeFlag | kCGDisplayAddFlag | kCGDisplayRemoveFlag |
- kCGDisplayEnabledFlag | kCGDisplayDisabledFlag |
- kCGDisplayMirrorFlag | kCGDisplayUnMirrorFlag |
+ CGDisplayChangeSummaryFlags mask = kCGDisplayBeginConfigurationFlag | kCGDisplayMovedFlag |
+ kCGDisplaySetModeFlag | kCGDisplayAddFlag | kCGDisplayRemoveFlag |
+ kCGDisplayEnabledFlag | kCGDisplayDisabledFlag |
+ kCGDisplayMirrorFlag | kCGDisplayUnMirrorFlag |
kCGDisplayDesktopShapeChangedFlag;
-
+
LOG((CLOG_DEBUG1 "event: display was reconfigured: %x %x %x", flags, mask, flags & mask));
if (flags & mask) { /* Something actually did change */
-
+
LOG((CLOG_DEBUG1 "event: screen changed shape; refreshing dimensions"));
screen->updateScreenShape(displayID, flags);
}
@@ -1274,7 +1269,7 @@ OSXScreen::onKey(CGEventRef event)
m_activeModifierHotKeyMask = 0;
}
}
-
+
return true;
}
@@ -1342,7 +1337,7 @@ OSXScreen::onKey(CGEventRef event)
}
void
-OSXScreen::onMediaKey(CGEventRef event)
+OSXScreen::onMediaKey(CGEventRef event)
{
KeyID keyID;
bool down;
@@ -1405,7 +1400,7 @@ OSXScreen::mapBarrierButtonToMac(UInt16 button) const
return static_cast<ButtonID>(button);
}
-ButtonID
+ButtonID
OSXScreen::mapMacButtonToBarrier(UInt16 macButton) const
{
switch (macButton) {
@@ -1418,7 +1413,7 @@ OSXScreen::mapMacButtonToBarrier(UInt16 macButton) const
case 3:
return kButtonMiddle;
}
-
+
return static_cast<ButtonID>(macButton);
}
@@ -1445,8 +1440,8 @@ OSXScreen::getScrollSpeed() const
double scaling = 0.0;
CFPropertyListRef pref = ::CFPreferencesCopyValue(
- CFSTR("com.apple.scrollwheel.scaling") ,
- kCFPreferencesAnyApplication,
+ CFSTR("com.apple.scrollwheel.scaling") ,
+ kCFPreferencesAnyApplication,
kCFPreferencesCurrentUser,
kCFPreferencesAnyHost);
if (pref != NULL) {
@@ -1535,7 +1530,7 @@ OSXScreen::updateScreenShape()
if (CGGetActiveDisplayList(0, NULL, &displayCount) != CGDisplayNoErr) {
return;
}
-
+
if (displayCount == 0) {
return;
}
@@ -1579,13 +1574,13 @@ OSXScreen::updateScreenShape()
(displayCount == 1) ? "display" : "displays"));
}
-#pragma mark -
+#pragma mark -
//
// FAST USER SWITCH NOTIFICATION SUPPORT
//
// OSXScreen::userSwitchCallback(void*)
-//
+//
// gets called if a fast user switch occurs
//
@@ -1611,18 +1606,17 @@ OSXScreen::userSwitchCallback(EventHandlerCallRef nextHandler,
return (CallNextEventHandler(nextHandler, theEvent));
}
-#pragma mark -
+#pragma mark -
//
// SLEEP/WAKEUP NOTIFICATION SUPPORT
//
// OSXScreen::watchSystemPowerThread(void*)
-//
-// main of thread monitoring system power (sleep/wakup) using a CFRunLoop
+//
+// main of thread monitoring system power (sleep/wakeup) using a CFRunLoop
//
-void
-OSXScreen::watchSystemPowerThread(void*)
+void OSXScreen::watchSystemPowerThread()
{
io_object_t notifier;
IONotificationPortRef notificationPortRef;
@@ -1641,7 +1635,7 @@ OSXScreen::watchSystemPowerThread(void*)
CFRunLoopAddSource(m_pmRunloop, runloopSourceRef,
kCFRunLoopCommonModes);
}
-
+
// thread is ready
{
Lock lock(m_pmMutex);
@@ -1658,15 +1652,15 @@ OSXScreen::watchSystemPowerThread(void*)
}
LOG((CLOG_DEBUG "started watchSystemPowerThread"));
-
+
LOG((CLOG_DEBUG "waiting for event loop"));
m_events->waitForReady();
-
+
#if defined(MAC_OS_X_VERSION_10_7)
{
Lock lockCarbon(m_carbonLoopMutex);
if (*m_carbonLoopReady == false) {
-
+
// we signalling carbon loop ready before starting
// unless we know how to do it within the loop
LOG((CLOG_DEBUG "signalling carbon loop ready"));
@@ -1676,12 +1670,12 @@ OSXScreen::watchSystemPowerThread(void*)
}
}
#endif
-
+
// start the run loop
LOG((CLOG_DEBUG "starting carbon loop"));
CFRunLoopRun();
LOG((CLOG_DEBUG "carbon loop has stopped"));
-
+
// cleanup
if (notificationPortRef) {
CFRunLoopRemoveSource(m_pmRunloop,
@@ -1716,7 +1710,7 @@ OSXScreen::handlePowerChangeRequest(natural_t messageType, void* messageArg)
getEventTarget(), messageArg,
Event::kDontFreeData));
return;
-
+
case kIOMessageSystemHasPoweredOn:
LOG((CLOG_DEBUG "system wakeup"));
m_events->addEvent(Event(m_events->forIScreen().resume(),
@@ -1742,16 +1736,16 @@ OSXScreen::handleConfirmSleep(const Event& event, void*)
if (m_pmRootPort != 0) {
// deliver suspend event immediately.
m_events->addEvent(Event(m_events->forIScreen().suspend(),
- getEventTarget(), NULL,
+ getEventTarget(), NULL,
Event::kDeliverImmediately));
-
+
LOG((CLOG_DEBUG "system will sleep"));
IOAllowPowerChange(m_pmRootPort, messageArg);
}
}
}
-#pragma mark -
+#pragma mark -
//
// GLOBAL HOTKEY OPERATING MODE SUPPORT (10.3)
@@ -1941,7 +1935,7 @@ OSXScreen::handleCGInputEvent(CGEventTapProxy proxy,
case kCGEventMouseMoved:
pos = CGEventGetLocation(event);
screen->onMouseMove(pos.x, pos.y);
-
+
// The system ignores our cursor-centering calls if
// we don't return the event. This should be harmless,
// but might register as slight movement to other apps
@@ -1980,10 +1974,10 @@ OSXScreen::handleCGInputEvent(CGEventTapProxy proxy,
}
break;
}
-
+
LOG((CLOG_DEBUG3 "unknown quartz event type: 0x%02x", type));
}
-
+
if (screen->m_isOnScreen) {
return event;
} else {
@@ -1992,38 +1986,38 @@ OSXScreen::handleCGInputEvent(CGEventTapProxy proxy,
}
void
-OSXScreen::MouseButtonState::set(UInt32 button, EMouseButtonState state)
+OSXScreen::MouseButtonState::set(UInt32 button, EMouseButtonState state)
{
bool newState = (state == kMouseButtonDown);
m_buttons.set(button, newState);
}
bool
-OSXScreen::MouseButtonState::any()
+OSXScreen::MouseButtonState::any()
{
return m_buttons.any();
}
void
-OSXScreen::MouseButtonState::reset()
+OSXScreen::MouseButtonState::reset()
{
m_buttons.reset();
}
void
-OSXScreen::MouseButtonState::overwrite(UInt32 buttons)
+OSXScreen::MouseButtonState::overwrite(UInt32 buttons)
{
m_buttons = std::bitset<NumButtonIDs>(buttons);
}
bool
-OSXScreen::MouseButtonState::test(UInt32 button) const
+OSXScreen::MouseButtonState::test(UInt32 button) const
{
return m_buttons.test(button);
}
SInt8
-OSXScreen::MouseButtonState::getFirstButtonDown() const
+OSXScreen::MouseButtonState::getFirstButtonDown() const
{
if (m_buttons.any()) {
for (unsigned short button = 0; button < m_buttons.size(); button++) {
@@ -2041,7 +2035,7 @@ OSXScreen::CFStringRefToUTF8String(CFStringRef aString)
if (aString == NULL) {
return NULL;
}
-
+
CFIndex length = CFStringGetLength(aString);
CFIndex maxSize = CFStringGetMaximumSizeForEncoding(
length,
diff --git a/src/lib/platform/OSXScreenSaver.cpp b/src/lib/platform/OSXScreenSaver.cpp
index a0282d9..4af761a 100644
--- a/src/lib/platform/OSXScreenSaver.cpp
+++ b/src/lib/platform/OSXScreenSaver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -48,17 +48,17 @@ OSXScreenSaver::OSXScreenSaver(IEventQueue* events, void* eventTarget) :
launchEventTypes[0].eventKind = kEventAppLaunched;
launchEventTypes[1].eventClass = kEventClassApplication;
launchEventTypes[1].eventKind = kEventAppTerminated;
-
+
EventHandlerUPP launchTerminationEventHandler =
NewEventHandlerUPP(launchTerminationCallback);
InstallApplicationEventHandler(launchTerminationEventHandler, 2,
launchEventTypes, this,
&m_launchTerminationEventHandlerRef);
DisposeEventHandlerUPP(launchTerminationEventHandler);
-
+
m_screenSaverPSN.highLongOfPSN = 0;
m_screenSaverPSN.lowLongOfPSN = 0;
-
+
if (isActive()) {
getProcessSerialNumber("ScreenSaverEngine", m_screenSaverPSN);
}
@@ -128,7 +128,7 @@ OSXScreenSaver::processTerminated(ProcessSerialNumber psn)
Event(m_events->forIPrimaryScreen().screensaverDeactivated(),
m_eventTarget));
}
-
+
m_screenSaverPSN.highLongOfPSN = 0;
m_screenSaverPSN.lowLongOfPSN = 0;
}
@@ -140,7 +140,7 @@ OSXScreenSaver::launchTerminationCallback(
EventRef theEvent, void* userData)
{
OSStatus result;
- ProcessSerialNumber psn;
+ ProcessSerialNumber psn;
EventParamType actualType;
ByteCount actualSize;
diff --git a/src/lib/platform/OSXScreenSaver.h b/src/lib/platform/OSXScreenSaver.h
index 07f2a7b..9a040a7 100644
--- a/src/lib/platform/OSXScreenSaver.h
+++ b/src/lib/platform/OSXScreenSaver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -36,11 +36,11 @@ public:
virtual void activate();
virtual void deactivate();
virtual bool isActive() const;
-
+
private:
void processLaunched(ProcessSerialNumber psn);
void processTerminated(ProcessSerialNumber psn);
-
+
static pascal OSStatus
launchTerminationCallback(
EventHandlerCallRef nextHandler,
diff --git a/src/lib/platform/OSXScreenSaverControl.h b/src/lib/platform/OSXScreenSaverControl.h
index 76f8875..ff9d4f0 100644
--- a/src/lib/platform/OSXScreenSaverControl.h
+++ b/src/lib/platform/OSXScreenSaverControl.h
@@ -6,7 +6,7 @@
* 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
diff --git a/src/lib/platform/OSXScreenSaverUtil.h b/src/lib/platform/OSXScreenSaverUtil.h
index 045553d..2ccb3c0 100644
--- a/src/lib/platform/OSXScreenSaverUtil.h
+++ b/src/lib/platform/OSXScreenSaverUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/OSXScreenSaverUtil.m b/src/lib/platform/OSXScreenSaverUtil.mm
index 6d82f10..6d82f10 100644
--- a/src/lib/platform/OSXScreenSaverUtil.m
+++ b/src/lib/platform/OSXScreenSaverUtil.mm
diff --git a/src/lib/platform/OSXUchrKeyResource.cpp b/src/lib/platform/OSXUchrKeyResource.cpp
index e0230e9..8d16bfb 100644
--- a/src/lib/platform/OSXUchrKeyResource.cpp
+++ b/src/lib/platform/OSXUchrKeyResource.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 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
diff --git a/src/lib/platform/OSXUchrKeyResource.h b/src/lib/platform/OSXUchrKeyResource.h
index 47b63c9..8e1a813 100644
--- a/src/lib/platform/OSXUchrKeyResource.h
+++ b/src/lib/platform/OSXUchrKeyResource.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 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
@@ -27,7 +27,7 @@ typedef TISInputSourceRef KeyLayout;
class OSXUchrKeyResource : public IOSXKeyResource {
public:
OSXUchrKeyResource(const void*, UInt32 keyboardType);
-
+
// KeyResource overrides
virtual bool isValid() const;
virtual UInt32 getNumModifierCombinations() const;
@@ -35,15 +35,15 @@ public:
virtual UInt32 getNumButtons() const;
virtual UInt32 getTableForModifier(UInt32 mask) const;
virtual KeyID getKey(UInt32 table, UInt32 button) const;
-
+
private:
typedef std::vector<KeyID> KeySequence;
-
+
bool getDeadKey(KeySequence& keys, UInt16 index) const;
bool getKeyRecord(KeySequence& keys,
UInt16 index, UInt16& state) const;
bool addSequence(KeySequence& keys, UCKeyCharSeq c) const;
-
+
private:
const UCKeyboardLayout* m_resource;
const UCKeyModifiersToTableNum* m_m;
diff --git a/src/lib/platform/XWindowsClipboard.cpp b/src/lib/platform/XWindowsClipboard.cpp
index b0da695..27321e5 100644
--- a/src/lib/platform/XWindowsClipboard.cpp
+++ b/src/lib/platform/XWindowsClipboard.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -84,10 +84,14 @@ XWindowsClipboard::XWindowsClipboard(IXWindowsImpl* impl, Display* display,
// add converters, most desired first
m_converters.push_back(new XWindowsClipboardHTMLConverter(m_display,
"text/html"));
+ m_converters.push_back(new XWindowsClipboardHTMLConverter(m_display,
+ "application/x-moz-nativehtml"));
m_converters.push_back(new XWindowsClipboardBMPConverter(m_display));
m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
"text/plain;charset=UTF-8"));
m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
+ "text/plain;charset=utf-8"));
+ m_converters.push_back(new XWindowsClipboardUTF8Converter(m_display,
"UTF8_STRING"));
m_converters.push_back(new XWindowsClipboardUCS2Converter(m_display,
"text/plain;charset=ISO-10646-UCS-2"));
diff --git a/src/lib/platform/XWindowsClipboard.h b/src/lib/platform/XWindowsClipboard.h
index 091036e..5f1b6cb 100644
--- a/src/lib/platform/XWindowsClipboard.h
+++ b/src/lib/platform/XWindowsClipboard.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -25,11 +25,7 @@
#include "common/stdvector.h"
#include "XWindowsImpl.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-#endif
+#include <X11/Xlib.h>
class IXWindowsClipboardConverter;
diff --git a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp
index f6fed1c..0190f1d 100644
--- a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp
+++ b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h
index 861b1b6..375d8cc 100644
--- a/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h
+++ b/src/lib/platform/XWindowsClipboardAnyBitmapConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardBMPConverter.cpp b/src/lib/platform/XWindowsClipboardBMPConverter.cpp
index fcfdc69..fd3325e 100644
--- a/src/lib/platform/XWindowsClipboardBMPConverter.cpp
+++ b/src/lib/platform/XWindowsClipboardBMPConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardBMPConverter.h b/src/lib/platform/XWindowsClipboardBMPConverter.h
index 4afa788..12716d1 100644
--- a/src/lib/platform/XWindowsClipboardBMPConverter.h
+++ b/src/lib/platform/XWindowsClipboardBMPConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardHTMLConverter.cpp b/src/lib/platform/XWindowsClipboardHTMLConverter.cpp
index 6ae98a7..a13e80e 100644
--- a/src/lib/platform/XWindowsClipboardHTMLConverter.cpp
+++ b/src/lib/platform/XWindowsClipboardHTMLConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardHTMLConverter.h b/src/lib/platform/XWindowsClipboardHTMLConverter.h
index 9a4ce61..b2a1a1e 100644
--- a/src/lib/platform/XWindowsClipboardHTMLConverter.h
+++ b/src/lib/platform/XWindowsClipboardHTMLConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardTextConverter.cpp b/src/lib/platform/XWindowsClipboardTextConverter.cpp
index 2e18d91..ee34f13 100644
--- a/src/lib/platform/XWindowsClipboardTextConverter.cpp
+++ b/src/lib/platform/XWindowsClipboardTextConverter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardTextConverter.h b/src/lib/platform/XWindowsClipboardTextConverter.h
index 99cdbcb..14e6c0f 100644
--- a/src/lib/platform/XWindowsClipboardTextConverter.h
+++ b/src/lib/platform/XWindowsClipboardTextConverter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardUCS2Converter.cpp b/src/lib/platform/XWindowsClipboardUCS2Converter.cpp
index d3d5e04..75dd70e 100644
--- a/src/lib/platform/XWindowsClipboardUCS2Converter.cpp
+++ b/src/lib/platform/XWindowsClipboardUCS2Converter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardUCS2Converter.h b/src/lib/platform/XWindowsClipboardUCS2Converter.h
index 16d880a..0bedb7a 100644
--- a/src/lib/platform/XWindowsClipboardUCS2Converter.h
+++ b/src/lib/platform/XWindowsClipboardUCS2Converter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardUTF8Converter.cpp b/src/lib/platform/XWindowsClipboardUTF8Converter.cpp
index f470cf1..a452706 100644
--- a/src/lib/platform/XWindowsClipboardUTF8Converter.cpp
+++ b/src/lib/platform/XWindowsClipboardUTF8Converter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsClipboardUTF8Converter.h b/src/lib/platform/XWindowsClipboardUTF8Converter.h
index 2219ed2..bb6cafb 100644
--- a/src/lib/platform/XWindowsClipboardUTF8Converter.h
+++ b/src/lib/platform/XWindowsClipboardUTF8Converter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/platform/XWindowsEventQueueBuffer.cpp b/src/lib/platform/XWindowsEventQueueBuffer.cpp
index 8b8c3b5..397973f 100644
--- a/src/lib/platform/XWindowsEventQueueBuffer.cpp
+++ b/src/lib/platform/XWindowsEventQueueBuffer.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -104,7 +104,7 @@ XWindowsEventQueueBuffer::waitForEvent(double dtimeout)
char buf[16];
ssize_t read_response = read(m_pipefd[0], buf, 15);
-
+
// with linux automake, warnings are treated as errors by default
if (read_response < 0)
{
@@ -181,7 +181,7 @@ XWindowsEventQueueBuffer::waitForEvent(double dtimeout)
retval = poll(pfds, 2, TIMEOUT_DELAY); //16ms = 60hz, but we make it > to play nicely with the cpu
if (pfds[1].revents & POLLIN) {
ssize_t read_response = read(m_pipefd[0], buf, 15);
-
+
// with linux automake, warnings are treated as errors by default
if (read_response < 0)
{
diff --git a/src/lib/platform/XWindowsEventQueueBuffer.h b/src/lib/platform/XWindowsEventQueueBuffer.h
index 13f6b16..dc35bf0 100644
--- a/src/lib/platform/XWindowsEventQueueBuffer.h
+++ b/src/lib/platform/XWindowsEventQueueBuffer.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -23,11 +23,7 @@
#include "common/stdvector.h"
#include "XWindowsImpl.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-#endif
+#include <X11/Xlib.h>
class IEventQueue;
diff --git a/src/lib/platform/XWindowsKeyState.cpp b/src/lib/platform/XWindowsKeyState.cpp
index 9fb71ca..088adc6 100644
--- a/src/lib/platform/XWindowsKeyState.cpp
+++ b/src/lib/platform/XWindowsKeyState.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -24,18 +24,14 @@
#include <cstddef>
#include <algorithm>
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/X.h>
-# include <X11/Xutil.h>
-# define XK_MISCELLANY
-# define XK_XKB_KEYS
-# include <X11/keysymdef.h>
+#include <X11/X.h>
+#include <X11/Xutil.h>
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
#if HAVE_XKB_EXTENSION
# include <X11/XKBlib.h>
#endif
-#endif
static const size_t ModifiersFromXDefaultSize = 32;
@@ -348,7 +344,7 @@ XWindowsKeyState::updateKeysymMap(barrier::KeyMap& keyMap)
else {
tmpKeysyms[maxKeysyms * i + j] = NoSymbol;
}
- }
+ }
}
m_impl->XFree(allKeysyms);
allKeysyms = tmpKeysyms;
diff --git a/src/lib/platform/XWindowsKeyState.h b/src/lib/platform/XWindowsKeyState.h
index f790390..ef35dd4 100644
--- a/src/lib/platform/XWindowsKeyState.h
+++ b/src/lib/platform/XWindowsKeyState.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2003 Chris Schoeneman
- *
+ *
* 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
@@ -23,18 +23,10 @@
#include "common/stdvector.h"
#include "XWindowsImpl.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-# if HAVE_X11_EXTENSIONS_XTEST_H
-# include <X11/extensions/XTest.h>
-# else
-# error The XTest extension is required to build barrier
-# endif
-# if HAVE_XKB_EXTENSION
-# include <X11/extensions/XKBstr.h>
-# endif
+#include <X11/Xlib.h>
+#include <X11/extensions/XTest.h>
+#if HAVE_XKB_EXTENSION
+# include <X11/extensions/XKBstr.h>
#endif
class IEventQueue;
@@ -136,7 +128,7 @@ private:
bool m_lock;
};
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
public: // yuck
#endif
typedef std::vector<KeyModifierMask> KeyModifierMaskList;
@@ -169,7 +161,7 @@ private:
// autorepeat state
XKeyboardState m_keyboardState;
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
public:
SInt32 group() const { return m_group; }
void group(const SInt32& group) { m_group = group; }
diff --git a/src/lib/platform/XWindowsScreen.cpp b/src/lib/platform/XWindowsScreen.cpp
index 5f1724c..8fb3569 100644
--- a/src/lib/platform/XWindowsScreen.cpp
+++ b/src/lib/platform/XWindowsScreen.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -97,7 +97,7 @@ XWindowsScreen::XWindowsScreen(
if (mouseScrollDelta==0) m_mouseScrollDelta=120;
s_screen = this;
-
+
if (!disableXInitThreads) {
// initializes Xlib support for concurrent threads.
if (m_impl->XInitThreads() == 0)
@@ -266,14 +266,14 @@ XWindowsScreen::enter()
m_impl->DPMSForceLevel(m_display, DPMSModeOn);
}
#endif
-
+
// unmap the hider/grab window. this also ungrabs the mouse and
// keyboard if they're grabbed.
m_impl->XUnmapWindow(m_display, m_window);
/* maybe call this if entering for the screensaver
// set keyboard focus to root window. the screensaver should then
- // pick up key events for when the user enters a password to unlock.
+ // pick up key events for when the user enters a password to unlock.
XSetInputFocus(m_display, PointerRoot, PointerRoot, CurrentTime);
*/
@@ -877,7 +877,7 @@ XWindowsScreen::openDisplay(const char* displayName)
{
// get the DISPLAY
if (displayName == NULL) {
- displayName = getenv("DISPLAY");
+ displayName = std::getenv("DISPLAY");
if (displayName == NULL) {
displayName = ":0.0";
}
diff --git a/src/lib/platform/XWindowsScreen.h b/src/lib/platform/XWindowsScreen.h
index 5573839..581e91f 100644
--- a/src/lib/platform/XWindowsScreen.h
+++ b/src/lib/platform/XWindowsScreen.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -24,11 +24,7 @@
#include "common/stdvector.h"
#include "XWindowsImpl.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-#endif
+#include <X11/Xlib.h>
class XWindowsClipboard;
class XWindowsKeyState;
diff --git a/src/lib/platform/XWindowsScreenSaver.cpp b/src/lib/platform/XWindowsScreenSaver.cpp
index 5c4ef91..d8787ab 100644
--- a/src/lib/platform/XWindowsScreenSaver.cpp
+++ b/src/lib/platform/XWindowsScreenSaver.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -26,31 +26,11 @@
#include "base/TMethodEventJob.h"
#include <X11/Xatom.h>
-#if HAVE_X11_EXTENSIONS_XTEST_H
-# include <X11/extensions/XTest.h>
-#else
-# error The XTest extension is required to build barrier
-#endif
+#include <X11/extensions/XTest.h>
#if HAVE_X11_EXTENSIONS_DPMS_H
extern "C" {
# include <X11/Xmd.h>
# include <X11/extensions/dpms.h>
-# if !HAVE_DPMS_PROTOTYPES
-# undef DPMSModeOn
-# undef DPMSModeStandby
-# undef DPMSModeSuspend
-# undef DPMSModeOff
-# define DPMSModeOn 0
-# define DPMSModeStandby 1
-# define DPMSModeSuspend 2
-# define DPMSModeOff 3
-extern Bool DPMSQueryExtension(Display *, int *, int *);
-extern Bool DPMSCapable(Display *);
-extern Status DPMSEnable(Display *);
-extern Status DPMSDisable(Display *);
-extern Status DPMSForceLevel(Display *, CARD16);
-extern Status DPMSInfo(Display *, CARD16 *, BOOL *);
-# endif
}
#endif
@@ -490,7 +470,7 @@ XWindowsScreenSaver::addWatchXScreenSaver(Window window)
}
// if successful and window uses override_redirect (like xscreensaver
- // does) then watch it for property changes.
+ // does) then watch it for property changes.
if (!error && attr.override_redirect == True) {
error = false;
{
diff --git a/src/lib/platform/XWindowsScreenSaver.h b/src/lib/platform/XWindowsScreenSaver.h
index 1761db2..00285ec 100644
--- a/src/lib/platform/XWindowsScreenSaver.h
+++ b/src/lib/platform/XWindowsScreenSaver.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -23,11 +23,7 @@
#include "common/stdmap.h"
#include "XWindowsImpl.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-#endif
+#include <X11/Xlib.h>
class Event;
class EventQueueTimer;
@@ -119,7 +115,7 @@ private:
// the X display
Display* m_display;
- // window to receive xscreensaver repsonses
+ // window to receive xscreensaver responses
Window m_xscreensaverSink;
// the target for the events we generate
diff --git a/src/lib/platform/XWindowsUtil.cpp b/src/lib/platform/XWindowsUtil.cpp
index 3c90bd6..7d4bb63 100644
--- a/src/lib/platform/XWindowsUtil.cpp
+++ b/src/lib/platform/XWindowsUtil.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -1250,7 +1250,7 @@ XK_uhorn
// map "Internet" keys to KeyIDs
static const KeySym s_map1008FF[] =
{
- /* 0x00 */ 0, 0, kKeyBrightnessUp, kKeyBrightnessDown, 0, 0, 0, 0,
+ /* 0x00 */ 0, 0, kKeyBrightnessUp, kKeyBrightnessDown, 0, kKeyKbdBrightnessUp, kKeyKbdBrightnessDown, 0,
/* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp,
/* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext,
@@ -1285,6 +1285,45 @@ static const KeySym s_map1008FF[] =
/* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0
};
+// map Sun keyboard keys to KeyIDs
+// This is based on the the "Internet" keymap plus the missing keys
+// Copy/Cut/Open/Paste/Props/Front
+static const KeySym s_map1009FF[] =
+{
+ /* 0x00 */ 0, 0, kKeyBrightnessUp, kKeyBrightnessDown, 0, 0, 0, 0,
+ /* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp,
+ /* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext,
+ /* 0x18 */ kKeyWWWHome, kKeyAppMail, 0, kKeyWWWSearch, 0, 0, 0, 0,
+ /* 0x20 */ 0, 0, 0, 0, 0, 0, kKeyWWWBack, kKeyWWWForward,
+ /* 0x28 */ kKeyWWWStop, kKeyWWWRefresh, 0, 0, kKeyEject, 0, 0, 0,
+ /* 0x30 */ kKeyWWWFavorites, 0, kKeyAppMedia, 0, 0, 0, 0, 0,
+ /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x40 */ kKeyAppUser1, kKeyAppUser2, 0, 0, 0, 0, 0, 0,
+ /* 0x48 */ 0, 0, kKeyMissionControl, kKeyLaunchpad, 0, 0, 0, 0,
+ /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, kKeyCopy,
+ /* 0x58 */ kKeyCut, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x68 */ 0, 0, 0, kKeyOpen, 0, kKeyPaste, 0, 0,
+ /* 0x70 */ kKeyProps, kKeyFront, 0, 0, 0, 0, 0, 0,
+ /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x88 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0x98 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xa8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xb8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xc8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xd8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xe8 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0
+};
//
// XWindowsUtil
@@ -1546,6 +1585,10 @@ XWindowsUtil::mapKeySymToKeyID(KeySym k)
// "Internet" keys
return s_map1008FF[k & 0xff];
+ case 0x1009ff00:
+ // Additional Left-side keys provided by Sun Microsystems USB keyboards
+ return s_map1009FF[k & 0xff];
+
default: {
// lookup character in table
KeySymMap::const_iterator index = s_keySymToUCS4.find(k);
diff --git a/src/lib/platform/XWindowsUtil.h b/src/lib/platform/XWindowsUtil.h
index f5b3ea8..938c332 100644
--- a/src/lib/platform/XWindowsUtil.h
+++ b/src/lib/platform/XWindowsUtil.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -22,11 +22,7 @@
#include "common/stdmap.h"
#include "common/stdvector.h"
-#if X_DISPLAY_MISSING
-# error X11 is required to build barrier
-#else
-# include <X11/Xlib.h>
-#endif
+#include <X11/Xlib.h>
#include <string>
@@ -123,7 +119,7 @@ public:
This class sets an X error handler in the c'tor and restores the
previous error handler in the d'tor. A lock should only be
installed while the display is locked by the thread.
-
+
ErrorLock() ignores errors
ErrorLock(bool* flag) sets *flag to true if any error occurs
*/
diff --git a/src/lib/platform/synwinhk.h b/src/lib/platform/synwinhk.h
index 4b2d8e3..8fc4290 100644
--- a/src/lib/platform/synwinhk.h
+++ b/src/lib/platform/synwinhk.h
@@ -3,11 +3,11 @@
* Copyright (C) 2018 Debauchee Open Source Group
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/BaseClientProxy.cpp b/src/lib/server/BaseClientProxy.cpp
index 6ccd251..78c4220 100644
--- a/src/lib/server/BaseClientProxy.cpp
+++ b/src/lib/server/BaseClientProxy.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2006 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/BaseClientProxy.h b/src/lib/server/BaseClientProxy.h
index a2c9459..5d5dc06 100644
--- a/src/lib/server/BaseClientProxy.h
+++ b/src/lib/server/BaseClientProxy.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/CMakeLists.txt b/src/lib/server/CMakeLists.txt
index 5242d6d..e1ed692 100644
--- a/src/lib/server/CMakeLists.txt
+++ b/src/lib/server/CMakeLists.txt
@@ -1,11 +1,11 @@
# barrier -- mouse and keyboard sharing utility
# Copyright (C) 2012-2016 Symless Ltd.
# Copyright (C) 2009 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
diff --git a/src/lib/server/ClientListener.cpp b/src/lib/server/ClientListener.cpp
index 00067ba..75724bc 100644
--- a/src/lib/server/ClientListener.cpp
+++ b/src/lib/server/ClientListener.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -36,25 +36,24 @@
ClientListener::ClientListener(const NetworkAddress& address,
ISocketFactory* socketFactory,
IEventQueue* events,
- bool enableCrypto) :
+ ConnectionSecurityLevel security_level) :
m_socketFactory(socketFactory),
m_server(NULL),
m_events(events),
- m_useSecureNetwork(enableCrypto)
+ security_level_{security_level}
{
assert(m_socketFactory != NULL);
try {
- m_listen = m_socketFactory->createListen(
- ARCH->getAddrFamily(address.getAddress()),
- m_useSecureNetwork);
+ m_listen = m_socketFactory->createListen(ARCH->getAddrFamily(address.getAddress()),
+ security_level);
// setup event handler
m_events->adoptHandler(m_events->forIListenSocket().connecting(),
m_listen,
new TMethodEventJob<ClientListener>(this,
&ClientListener::handleClientConnecting));
-
+
// bind listen address
LOG((CLOG_DEBUG1 "binding listen socket"));
m_listen->bind(address);
@@ -130,17 +129,17 @@ ClientListener::handleClientConnecting(const Event&, void*)
if (socket == NULL) {
return;
}
-
+
m_clientSockets.insert(socket);
m_events->adoptHandler(m_events->forClientListener().accepted(),
socket->getEventTarget(),
new TMethodEventJob<ClientListener>(this,
&ClientListener::handleClientAccepted, socket));
-
+
// When using non SSL, server accepts clients immediately, while SSL
// has to call secure accept which may require retry
- if (!m_useSecureNetwork) {
+ if (security_level_ == ConnectionSecurityLevel::PLAINTEXT) {
m_events->addEvent(Event(m_events->forClientListener().accepted(),
socket->getEventTarget()));
}
@@ -152,7 +151,7 @@ ClientListener::handleClientAccepted(const Event&, void* vsocket)
LOG((CLOG_NOTE "accepted client connection"));
IDataSocket* socket = static_cast<IDataSocket*>(vsocket);
-
+
// filter socket messages, including a packetizing filter
barrier::IStream* stream = new PacketStreamFilter(m_events, socket, false);
assert(m_server != NULL);
@@ -184,7 +183,6 @@ ClientListener::handleUnknownClient(const Event&, void* vclient)
// get the real client proxy and install it
ClientProxy* client = unknownClient->orphanClientProxy();
- bool handshakeOk = true;
if (client != NULL) {
// handshake was successful
m_waitingClients.push_back(client);
@@ -196,20 +194,17 @@ ClientListener::handleUnknownClient(const Event&, void* vclient)
new TMethodEventJob<ClientListener>(this,
&ClientListener::handleClientDisconnected,
client));
- }
- else {
- handshakeOk = false;
+ } else {
+ auto* stream = unknownClient->getStream();
+ if (stream) {
+ stream->close();
+ }
}
// now finished with unknown client
m_events->removeHandler(m_events->forClientProxyUnknown().success(), client);
m_events->removeHandler(m_events->forClientProxyUnknown().failure(), client);
m_newClients.erase(unknownClient);
- PacketStreamFilter* streamFileter = dynamic_cast<PacketStreamFilter*>(unknownClient->getStream());
- IDataSocket* socket = NULL;
- if (streamFileter != NULL) {
- socket = dynamic_cast<IDataSocket*>(streamFileter->getStream());
- }
delete unknownClient;
}
diff --git a/src/lib/server/ClientListener.h b/src/lib/server/ClientListener.h
index b02cbb1..1debc2b 100644
--- a/src/lib/server/ClientListener.h
+++ b/src/lib/server/ClientListener.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -23,6 +23,7 @@
#include "base/Event.h"
#include "common/stddeque.h"
#include "common/stdset.h"
+#include "net/ConnectionSecurityLevel.h"
class ClientProxy;
class ClientProxyUnknown;
@@ -36,10 +37,8 @@ class IDataSocket;
class ClientListener {
public:
// The factories are adopted.
- ClientListener(const NetworkAddress&,
- ISocketFactory*,
- IEventQueue* events,
- bool enableCrypto);
+ ClientListener(const NetworkAddress&, ISocketFactory*, IEventQueue* events,
+ ConnectionSecurityLevel security_level);
~ClientListener();
//! @name manipulators
@@ -86,6 +85,6 @@ private:
WaitingClients m_waitingClients;
Server* m_server;
IEventQueue* m_events;
- bool m_useSecureNetwork;
+ ConnectionSecurityLevel security_level_;
ClientSockets m_clientSockets;
};
diff --git a/src/lib/server/ClientProxy.cpp b/src/lib/server/ClientProxy.cpp
index d91e186..76cdfa6 100644
--- a/src/lib/server/ClientProxy.cpp
+++ b/src/lib/server/ClientProxy.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy.h b/src/lib/server/ClientProxy.h
index a3d87cb..b641011 100644
--- a/src/lib/server/ClientProxy.h
+++ b/src/lib/server/ClientProxy.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_0.cpp b/src/lib/server/ClientProxy1_0.cpp
index 5cbaac2..33b0f15 100644
--- a/src/lib/server/ClientProxy1_0.cpp
+++ b/src/lib/server/ClientProxy1_0.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -51,6 +51,10 @@ ClientProxy1_0::ClientProxy1_0(const std::string& name, barrier::IStream* stream
stream->getEventTarget(),
new TMethodEventJob<ClientProxy1_0>(this,
&ClientProxy1_0::handleDisconnect, NULL));
+ m_events->adoptHandler(m_events->forIStream().inputFormatError(),
+ stream->getEventTarget(),
+ new TMethodEventJob<ClientProxy1_0>(this,
+ &ClientProxy1_0::handleDisconnect, NULL));
m_events->adoptHandler(m_events->forIStream().outputShutdown(),
stream->getEventTarget(),
new TMethodEventJob<ClientProxy1_0>(this,
@@ -90,6 +94,8 @@ ClientProxy1_0::removeHandlers()
getStream()->getEventTarget());
m_events->removeHandler(m_events->forIStream().outputShutdown(),
getStream()->getEventTarget());
+ m_events->removeHandler(m_events->forIStream().inputFormatError(),
+ getStream()->getEventTarget());
m_events->removeHandler(Event::kTimer, this);
// remove timer
@@ -148,9 +154,18 @@ ClientProxy1_0::handleData(const Event&, void*)
}
// parse message
- LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
- if (!(this->*m_parser)(code)) {
- LOG((CLOG_ERR "invalid message from client \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
+ try {
+ LOG((CLOG_DEBUG2 "msg from \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
+ if (!(this->*m_parser)(code)) {
+ LOG((CLOG_ERR "invalid message from client \"%s\": %c%c%c%c", getName().c_str(), code[0], code[1], code[2], code[3]));
+ disconnect();
+ return;
+ }
+ } catch (const XBadClient& e) {
+ // TODO: disconnect handling is currently dispersed across both parseMessage() and
+ // handleData() functions, we should collect that to a single place
+
+ LOG((CLOG_ERR "protocol error from client: %s", e.what()));
disconnect();
return;
}
@@ -173,6 +188,8 @@ ClientProxy1_0::parseHandshakeMessage(const UInt8* code)
}
else if (memcmp(code, kMsgDInfo, 4) == 0) {
// future messages get parsed by parseMessage
+ // NOTE: we're taking address of virtual function here,
+ // not ClientProxy1_0 implementation of it.
m_parser = &ClientProxy1_0::parseMessage;
if (recvInfo()) {
m_events->addEvent(Event(m_events->forClientProxy().ready(), getEventTarget()));
diff --git a/src/lib/server/ClientProxy1_0.h b/src/lib/server/ClientProxy1_0.h
index 98c68f3..45d7541 100644
--- a/src/lib/server/ClientProxy1_0.h
+++ b/src/lib/server/ClientProxy1_0.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_1.cpp b/src/lib/server/ClientProxy1_1.cpp
index bb33ac1..6d2e007 100644
--- a/src/lib/server/ClientProxy1_1.cpp
+++ b/src/lib/server/ClientProxy1_1.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_1.h b/src/lib/server/ClientProxy1_1.h
index ada4dcc..38fda52 100644
--- a/src/lib/server/ClientProxy1_1.h
+++ b/src/lib/server/ClientProxy1_1.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_2.cpp b/src/lib/server/ClientProxy1_2.cpp
index e9527ef..5457dc0 100644
--- a/src/lib/server/ClientProxy1_2.cpp
+++ b/src/lib/server/ClientProxy1_2.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_2.h b/src/lib/server/ClientProxy1_2.h
index 12d6b92..08b32fb 100644
--- a/src/lib/server/ClientProxy1_2.h
+++ b/src/lib/server/ClientProxy1_2.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_3.cpp b/src/lib/server/ClientProxy1_3.cpp
index d0031ce..5012a4e 100644
--- a/src/lib/server/ClientProxy1_3.cpp
+++ b/src/lib/server/ClientProxy1_3.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2006 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_3.h b/src/lib/server/ClientProxy1_3.h
index ad46cea..a459e1e 100644
--- a/src/lib/server/ClientProxy1_3.h
+++ b/src/lib/server/ClientProxy1_3.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2006 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_4.cpp b/src/lib/server/ClientProxy1_4.cpp
index 9b12976..bc58626 100644
--- a/src/lib/server/ClientProxy1_4.cpp
+++ b/src/lib/server/ClientProxy1_4.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_4.h b/src/lib/server/ClientProxy1_4.h
index cda090b..fa88234 100644
--- a/src/lib/server/ClientProxy1_4.h
+++ b/src/lib/server/ClientProxy1_4.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2011 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/ClientProxy1_5.cpp b/src/lib/server/ClientProxy1_5.cpp
index 40bba08..72c0bf8 100644
--- a/src/lib/server/ClientProxy1_5.cpp
+++ b/src/lib/server/ClientProxy1_5.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
@@ -86,7 +86,7 @@ ClientProxy1_5::fileChunkReceived()
getStream(),
server->getReceivedFileData(),
server->getExpectedFileSize());
-
+
if (result == kFinish) {
m_events->addEvent(Event(m_events->forFile().fileRecieveCompleted(), server));
@@ -106,6 +106,6 @@ ClientProxy1_5::dragInfoReceived()
UInt32 fileNum = 0;
std::string content;
ProtocolUtil::readf(getStream(), kMsgDDragInfo + 4, &fileNum, &content);
-
+
m_server->dragInfoReceived(fileNum, content);
}
diff --git a/src/lib/server/ClientProxy1_5.h b/src/lib/server/ClientProxy1_5.h
index 4087730..2051f3c 100644
--- a/src/lib/server/ClientProxy1_5.h
+++ b/src/lib/server/ClientProxy1_5.h
@@ -1,11 +1,11 @@
/*
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2013-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
diff --git a/src/lib/server/ClientProxy1_6.cpp b/src/lib/server/ClientProxy1_6.cpp
index c829e84..29f3ce4 100644
--- a/src/lib/server/ClientProxy1_6.cpp
+++ b/src/lib/server/ClientProxy1_6.cpp
@@ -1,11 +1,11 @@
/*
* barrier -- 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
@@ -88,7 +88,7 @@ ClientProxy1_6::recvClipboard()
// save clipboard
m_clipboard[id].m_clipboard.unmarshall(dataCached, 0);
m_clipboard[id].m_sequenceNumber = seq;
-
+
// notify
ClipboardInfo* info = new ClipboardInfo;
info->m_id = id;
diff --git a/src/lib/server/ClientProxy1_6.h b/src/lib/server/ClientProxy1_6.h
index 830696a..a4c2e5d 100644
--- a/src/lib/server/ClientProxy1_6.h
+++ b/src/lib/server/ClientProxy1_6.h
@@ -1,11 +1,11 @@
/*
* barrier -- 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
diff --git a/src/lib/server/ClientProxyUnknown.cpp b/src/lib/server/ClientProxyUnknown.cpp
index dc79da7..f9da361 100644
--- a/src/lib/server/ClientProxyUnknown.cpp
+++ b/src/lib/server/ClientProxyUnknown.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
@@ -118,6 +118,10 @@ ClientProxyUnknown::addStreamHandlers()
m_stream->getEventTarget(),
new TMethodEventJob<ClientProxyUnknown>(this,
&ClientProxyUnknown::handleDisconnect));
+ m_events->adoptHandler(m_events->forIStream().inputFormatError(),
+ m_stream->getEventTarget(),
+ new TMethodEventJob<ClientProxyUnknown>(this,
+ &ClientProxyUnknown::handleDisconnect));
m_events->adoptHandler(m_events->forIStream().outputShutdown(),
m_stream->getEventTarget(),
new TMethodEventJob<ClientProxyUnknown>(this,
@@ -149,6 +153,8 @@ ClientProxyUnknown::removeHandlers()
m_stream->getEventTarget());
m_events->removeHandler(m_events->forIStream().inputShutdown(),
m_stream->getEventTarget());
+ m_events->removeHandler(m_events->forIStream().inputFormatError(),
+ m_stream->getEventTarget());
m_events->removeHandler(m_events->forIStream().outputShutdown(),
m_stream->getEventTarget());
}
diff --git a/src/lib/server/ClientProxyUnknown.h b/src/lib/server/ClientProxyUnknown.h
index 5d59402..efb1b2b 100644
--- a/src/lib/server/ClientProxyUnknown.h
+++ b/src/lib/server/ClientProxyUnknown.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2004 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/Config.cpp b/src/lib/server/Config.cpp
index a47a391..bcdb88c 100644
--- a/src/lib/server/Config.cpp
+++ b/src/lib/server/Config.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -1748,10 +1748,10 @@ std::ostream&
operator<<(std::ostream& s, const Config& config)
{
// screens section
- s << "section: screens" << std::endl;
+ s << "section: screens\n";
for (Config::const_iterator screen = config.begin();
screen != config.end(); ++screen) {
- s << "\t" << screen->c_str() << ":" << std::endl;
+ s << "\t" << screen->c_str() << ":\n";
const Config::ScreenOptions* options = config.getOptions(*screen);
if (options != NULL && options->size() > 0) {
for (Config::ScreenOptions::const_iterator
@@ -1760,31 +1760,31 @@ operator<<(std::ostream& s, const Config& config)
const char* name = Config::getOptionName(option->first);
std::string value = Config::getOptionValue(option->first, option->second);
if (name != NULL && !value.empty()) {
- s << "\t\t" << name << " = " << value << std::endl;
+ s << "\t\t" << name << " = " << value << "\n";
}
}
}
}
- s << "end" << std::endl;
+ s << "end\n";
// links section
std::string neighbor;
- s << "section: links" << std::endl;
+ s << "section: links\n";
for (Config::const_iterator screen = config.begin();
screen != config.end(); ++screen) {
- s << "\t" << screen->c_str() << ":" << std::endl;
+ s << "\t" << screen->c_str() << ":\n";
for (Config::link_const_iterator
link = config.beginNeighbor(*screen),
- nend = config.endNeighbor(*screen); link != nend; ++link) {
+ nend = config.endNeighbor(*screen); link != nend; ++link) {
s << "\t\t" << Config::dirName(link->first.getSide()) <<
Config::formatInterval(link->first.getInterval()) <<
" = " << link->second.getName().c_str() <<
Config::formatInterval(link->second.getInterval()) <<
- std::endl;
+ "\n";
}
}
- s << "end" << std::endl;
+ s << "end\n";
// aliases section (if there are any)
if (config.m_map.size() != config.m_nameToCanonicalName.size()) {
@@ -1802,20 +1802,20 @@ operator<<(std::ostream& s, const Config& config)
// dump it
std::string screen;
- s << "section: aliases" << std::endl;
+ s << "section: aliases\n";
for (CMNameMap::const_iterator index = aliases.begin();
index != aliases.end(); ++index) {
if (index->first != screen) {
screen = index->first;
- s << "\t" << screen.c_str() << ":" << std::endl;
+ s << "\t" << screen.c_str() << ":\n";
}
- s << "\t\t" << index->second.c_str() << std::endl;
+ s << "\t\t" << index->second.c_str() << "\n";
}
- s << "end" << std::endl;
+ s << "end\n";
}
// options section
- s << "section: options" << std::endl;
+ s << "section: options\n";
const Config::ScreenOptions* options = config.getOptions("");
if (options != NULL && options->size() > 0) {
for (Config::ScreenOptions::const_iterator
@@ -1824,16 +1824,16 @@ operator<<(std::ostream& s, const Config& config)
const char* name = Config::getOptionName(option->first);
std::string value = Config::getOptionValue(option->first, option->second);
if (name != NULL && !value.empty()) {
- s << "\t" << name << " = " << value << std::endl;
+ s << "\t" << name << " = " << value << "\n";
}
}
}
if (config.m_barrierAddress.isValid()) {
s << "\taddress = " <<
- config.m_barrierAddress.getHostname().c_str() << std::endl;
+ config.m_barrierAddress.getHostname().c_str() << "\n";
}
s << config.m_inputFilter.format("\t");
- s << "end" << std::endl;
+ s << "end\n";
return s;
}
diff --git a/src/lib/server/Config.h b/src/lib/server/Config.h
index c459393..17756a0 100644
--- a/src/lib/server/Config.h
+++ b/src/lib/server/Config.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -174,7 +174,7 @@ public:
Config(IEventQueue* events);
virtual ~Config();
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
Config() : m_inputFilter(NULL) { }
#endif
diff --git a/src/lib/server/InputFilter.cpp b/src/lib/server/InputFilter.cpp
index 38d9a84..a0dce17 100644
--- a/src/lib/server/InputFilter.cpp
+++ b/src/lib/server/InputFilter.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2005 Chris Schoeneman
- *
+ *
* 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
@@ -191,7 +191,7 @@ std::string InputFilter::MouseButtonCondition::format() const
return barrier::string::sprintf("mousebutton(%s%d)", key.c_str(), m_button);
}
-InputFilter::EFilterStatus
+InputFilter::EFilterStatus
InputFilter::MouseButtonCondition::match(const Event& event)
{
static const KeyModifierMask s_ignoreMask =
@@ -252,7 +252,7 @@ InputFilter::EFilterStatus
InputFilter::ScreenConnectedCondition::match(const Event& event)
{
if (event.getType() == m_events->forServer().connected()) {
- Server::ScreenConnectedInfo* info =
+ Server::ScreenConnectedInfo* info =
static_cast<Server::ScreenConnectedInfo*>(event.getData());
if (m_screen == info->m_screen || m_screen.empty()) {
return kActivate;
@@ -312,7 +312,7 @@ InputFilter::LockCursorToScreenAction::perform(const Event& event)
};
// send event
- Server::LockCursorToScreenInfo* info =
+ Server::LockCursorToScreenInfo* info =
Server::LockCursorToScreenInfo::alloc(s_state[m_mode]);
m_events->addEvent(Event(m_events->forServer().lockCursorToScreen(),
event.getTarget(), info,
@@ -350,7 +350,7 @@ InputFilter::SwitchToScreenAction::perform(const Event& event)
// event if it has one.
std::string screen = m_screen;
if (screen.empty() && event.getType() == m_events->forServer().connected()) {
- Server::ScreenConnectedInfo* info =
+ Server::ScreenConnectedInfo* info =
static_cast<Server::ScreenConnectedInfo*>(event.getData());
screen = info->m_screen;
}
@@ -493,7 +493,7 @@ InputFilter::KeyboardBroadcastAction::perform(const Event& event)
};
// send event
- Server::KeyboardBroadcastInfo* info =
+ Server::KeyboardBroadcastInfo* info =
Server::KeyboardBroadcastInfo::alloc(s_state[m_mode], m_screens);
m_events->addEvent(Event(m_events->forServer().keyboardBroadcast(),
event.getTarget(), info,
@@ -569,7 +569,7 @@ InputFilter::KeystrokeAction::perform(const Event& event)
Event::Type type = m_press ?
m_events->forIKeyState().keyDown() :
m_events->forIKeyState().keyUp();
-
+
m_events->addEvent(Event(m_events->forIPrimaryScreen().fakeInputBegin(),
event.getTarget(), NULL,
Event::kDeliverImmediately));
diff --git a/src/lib/server/InputFilter.h b/src/lib/server/InputFilter.h
index 0cb99da..5e6ef9c 100644
--- a/src/lib/server/InputFilter.h
+++ b/src/lib/server/InputFilter.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2005 Chris Schoeneman
- *
+ *
* 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
@@ -53,7 +53,7 @@ public:
virtual void enablePrimary(PrimaryClient*);
virtual void disablePrimary(PrimaryClient*);
};
-
+
// KeystrokeCondition
class KeystrokeCondition : public Condition {
public:
@@ -118,7 +118,7 @@ public:
// -------------------------------------------------------------------------
// Input Filter Action Classes
// -------------------------------------------------------------------------
-
+
class Action {
public:
Action();
@@ -129,7 +129,7 @@ public:
virtual void perform(const Event&) = 0;
};
-
+
// LockCursorToScreenAction
class LockCursorToScreenAction : public Action {
public:
@@ -148,7 +148,7 @@ public:
Mode m_mode;
IEventQueue* m_events;
};
-
+
// SwitchToScreenAction
class SwitchToScreenAction : public Action {
public:
@@ -165,7 +165,7 @@ public:
std::string m_screen;
IEventQueue* m_events;
};
-
+
// ToggleScreenAction
class ToggleScreenAction : public Action {
public:
@@ -196,7 +196,7 @@ public:
EDirection m_direction;
IEventQueue* m_events;
};
-
+
// KeyboardBroadcastAction
class KeyboardBroadcastAction : public Action {
public:
@@ -333,7 +333,7 @@ public:
InputFilter(const InputFilter&);
virtual ~InputFilter();
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
InputFilter() : m_primaryClient(NULL) { }
#endif
diff --git a/src/lib/server/PrimaryClient.cpp b/src/lib/server/PrimaryClient.cpp
index 04ae86c..6583e5d 100644
--- a/src/lib/server/PrimaryClient.cpp
+++ b/src/lib/server/PrimaryClient.cpp
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
diff --git a/src/lib/server/PrimaryClient.h b/src/lib/server/PrimaryClient.h
index 68b91e3..13be838 100644
--- a/src/lib/server/PrimaryClient.h
+++ b/src/lib/server/PrimaryClient.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -37,7 +37,7 @@ public:
PrimaryClient(const std::string& name, barrier::Screen* screen);
~PrimaryClient();
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
PrimaryClient() : BaseClientProxy("") { }
#endif
@@ -96,12 +96,12 @@ public:
the edges of the screen, typically the center.
*/
void getCursorCenter(SInt32& x, SInt32& y) const;
-
+
//! Get toggle key state
/*!
Returns the primary screen's current toggle modifier key state.
*/
- virtual KeyModifierMask
+ virtual KeyModifierMask
getToggleMask() const;
//! Get screen lock state
diff --git a/src/lib/server/Server.cpp b/src/lib/server/Server.cpp
index 334049c..a169db1 100644
--- a/src/lib/server/Server.cpp
+++ b/src/lib/server/Server.cpp
@@ -39,7 +39,6 @@
#include "net/XSocket.h"
#include "mt/Thread.h"
#include "arch/Arch.h"
-#include "base/TMethodJob.h"
#include "base/IEventQueue.h"
#include "base/Log.h"
#include "base/TMethodEventJob.h"
@@ -1136,9 +1135,9 @@ Server::processOptions()
return;
}
- m_switchNeedsShift = false; // it seems if i don't add these
+ m_switchNeedsShift = false; // it seems if I don't add these
m_switchNeedsControl = false; // lines, the 'reload config' option
- m_switchNeedsAlt = false; // doesnt' work correct.
+ m_switchNeedsAlt = false; // doesn't work correct.
bool newRelativeMoves = m_relativeMoves;
for (Config::ScreenOptions::const_iterator index = options->begin();
@@ -1824,10 +1823,8 @@ Server::onMouseMovePrimary(SInt32 x, SInt32 y)
&& m_active != newScreen
&& m_waitDragInfoThread) {
if (m_sendDragInfoThread == NULL) {
- m_sendDragInfoThread = new Thread(
- new TMethodJob<Server>(
- this,
- &Server::sendDragInfoThread, newScreen));
+ m_sendDragInfoThread = new Thread([this, newScreen]()
+ { send_drag_info_thread(newScreen); });
}
return false;
@@ -1843,11 +1840,8 @@ Server::onMouseMovePrimary(SInt32 x, SInt32 y)
return false;
}
-void
-Server::sendDragInfoThread(void* arg)
+void Server::send_drag_info_thread(BaseClientProxy* newScreen)
{
- BaseClientProxy* newScreen = static_cast<BaseClientProxy*>(arg);
-
m_dragFileList.clear();
std::string& dragFileList = m_screen->getDraggingFilename();
if (!dragFileList.empty()) {
@@ -2087,14 +2081,11 @@ void
Server::onFileRecieveCompleted()
{
if (isReceivedFileSizeValid()) {
- m_writeToDropDirThread = new Thread(
- new TMethodJob<Server>(
- this, &Server::writeToDropDirThread));
+ m_writeToDropDirThread = new Thread([this]() { write_to_drop_dir_thread(); });
}
}
-void
-Server::writeToDropDirThread(void*)
+void Server::write_to_drop_dir_thread()
{
LOG((CLOG_DEBUG "starting write to drop dir thread"));
@@ -2394,17 +2385,12 @@ Server::sendFileToClient(const char* filename)
StreamChunker::interruptFile();
}
- m_sendFileThread = new Thread(
- new TMethodJob<Server>(
- this, &Server::sendFileThread,
- static_cast<void*>(const_cast<char*>(filename))));
+ m_sendFileThread = new Thread([this, filename]() { send_file_thread(filename); });
}
-void
-Server::sendFileThread(void* data)
+void Server::send_file_thread(const char* filename)
{
try {
- char* filename = static_cast<char*>(data);
LOG((CLOG_DEBUG "sending file to client, filename=%s", filename));
StreamChunker::sendFile(filename, m_events, this);
}
diff --git a/src/lib/server/Server.h b/src/lib/server/Server.h
index bfd0a7d..ae8b2bd 100644
--- a/src/lib/server/Server.h
+++ b/src/lib/server/Server.h
@@ -2,11 +2,11 @@
* barrier -- mouse and keyboard sharing utility
* Copyright (C) 2012-2016 Symless Ltd.
* Copyright (C) 2002 Chris Schoeneman
- *
+ *
* 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
@@ -110,7 +110,7 @@ public:
barrier::Screen* screen, IEventQueue* events, ServerArgs const& args);
~Server();
-#ifdef TEST_ENV
+#ifdef BARRIER_TEST_ENV
Server() : m_mock(true), m_config(NULL) { }
void setActive(BaseClientProxy* active) { m_active = active; }
#endif
@@ -150,7 +150,7 @@ public:
//! Store ClientListener pointer
void setListener(ClientListener* p) { m_clientListener = p; }
-
+
//@}
//! @name accessors
//@{
@@ -166,8 +166,8 @@ public:
Set the \c list to the names of the currently connected clients.
*/
void getClients(std::vector<std::string>& list) const;
-
- //! Return true if recieved file size is valid
+
+ //! Return true if received file size is valid
bool isReceivedFileSizeValid();
//! Return expected file data size
@@ -356,15 +356,15 @@ private:
// force the cursor off of \p client
void forceLeaveClient(BaseClientProxy* client);
-
- // thread funciton for sending file
- void sendFileThread(void*);
-
+
+ // thread function for sending file
+ void send_file_thread(const char* filename);
+
// thread function for writing file to drop directory
- void writeToDropDirThread(void*);
+ void write_to_drop_dir_thread();
// thread function for sending drag information
- void sendDragInfoThread(void*);
+ void send_drag_info_thread(BaseClientProxy* newScreen);
// send drag info to new client screen
void sendDragInfo(BaseClientProxy* newScreen);
@@ -448,7 +448,7 @@ private:
bool m_switchNeedsShift;
bool m_switchNeedsControl;
bool m_switchNeedsAlt;
-
+
// relative mouse move option
bool m_relativeMoves;