Merge branch 'master' into testing/pr/Absolucy/macos
This merges #1162 into Barrier. Thanks! Signed-off-by: Dom Rodriguez <shymega@shymega.org.uk>
This commit is contained in:
commit
fca18b63c5
|
@ -1,36 +0,0 @@
|
||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Please fill in this template as much as you can, to help us, help you.
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
Please do not link to image hosting sites, as these can be ephemeral. Instead, attach them to the issue.
|
|
||||||
|
|
||||||
**Desktop (please complete the following information):**
|
|
||||||
|
|
||||||
- OS: [e.g. Windows]
|
|
||||||
- Barrier version [e.g 2.3.3]
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
|
|
||||||
Add any other context about the problem here.
|
|
|
@ -0,0 +1,79 @@
|
||||||
|
name: Bug Report
|
||||||
|
description: File a bug report (for questions, ideas & support, use the Discussions tab, or IRC for quick answers, but make sure to stay on the channel!)
|
||||||
|
labels: [bug, triage]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this bug report!
|
||||||
|
- type: textarea
|
||||||
|
id: what-happened
|
||||||
|
attributes:
|
||||||
|
label: What happened?
|
||||||
|
description: Also tell us, what did you expect to happen?
|
||||||
|
placeholder: Tell us what you see! Screenshots are also helpful - please attach to the issue (when created), rather than linking to image hosting sites.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: Version
|
||||||
|
description: What version of Barrier are you running?
|
||||||
|
options:
|
||||||
|
- v2.0.0-RC1
|
||||||
|
- v2.0.0-RC2
|
||||||
|
- v2.0.0
|
||||||
|
- v2.1.1
|
||||||
|
- v2.1.2
|
||||||
|
- v2.3.0
|
||||||
|
- v2.3.1
|
||||||
|
- v2.3.2-alpha
|
||||||
|
- v2.3.2
|
||||||
|
- v2.3.3
|
||||||
|
- From Git HEAD or commit (specify below)
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: git-commit-if
|
||||||
|
attributes:
|
||||||
|
label: Git commit hash (if applicable)
|
||||||
|
description: "When building Barrier from Git, what commit hash did you checkout from?"
|
||||||
|
placeholder: b0c0b42b
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
id: pkg-mgr-origin
|
||||||
|
attributes:
|
||||||
|
label: If applicable, where did you install Barrier from?
|
||||||
|
description: This includes Snaps, Flatpaks, and self-built executables.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: dropdown
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: What OSes are you seeing the problem on? (Check all that apply)
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Linux
|
||||||
|
- Windows
|
||||||
|
- macOS
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: os-version
|
||||||
|
attributes:
|
||||||
|
label: What OS versions are you using?
|
||||||
|
description: This applies to both client(s) and the server.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: logs
|
||||||
|
attributes:
|
||||||
|
label: Relevant log output
|
||||||
|
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||||
|
render: shell
|
||||||
|
- type: textarea
|
||||||
|
id: misc-info
|
||||||
|
attributes:
|
||||||
|
label: Any other information
|
||||||
|
description: Please enter any other information we should know, if applicable.
|
|
@ -0,0 +1 @@
|
||||||
|
blank_issues_enabled: false
|
|
@ -292,6 +292,8 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
list (APPEND libs Wtsapi32 Userenv Wininet comsuppw Shlwapi)
|
list (APPEND libs Wtsapi32 Userenv Wininet comsuppw Shlwapi)
|
||||||
|
|
||||||
add_definitions (
|
add_definitions (
|
||||||
|
/DSYSAPI_WIN32=1
|
||||||
|
/DWINAPI_MSWINDOWS=1
|
||||||
/DWIN32
|
/DWIN32
|
||||||
/D_WINDOWS
|
/D_WINDOWS
|
||||||
/D_CRT_SECURE_NO_WARNINGS
|
/D_CRT_SECURE_NO_WARNINGS
|
||||||
|
|
59
LICENSE
59
LICENSE
|
@ -286,3 +286,62 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope 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, write to the Free Software Foundation, Inc.,
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
|
Public License instead of this License.
|
||||||
|
|
|
@ -8,7 +8,7 @@ and a [snap](https://snapcraft.io/barrier).
|
||||||
|
|
||||||
### Contact info:
|
### Contact info:
|
||||||
|
|
||||||
- `#barrier` on libera IRC network
|
- `#barrier` on LiberaChat IRC network
|
||||||
|
|
||||||
#### CI Build Status
|
#### CI Build Status
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ Note that if the keyboard's Scroll Lock is active then this will prevent the mou
|
||||||
|
|
||||||
Please be aware that the *only* way to draw our attention to a bug is to create a new issue in [the issue tracker](https://github.com/debauchee/barrier/issues). Write a clear, concise, detailed report and you will get a clear, concise, detailed response. Priority is always given to issues that affect a wider range of users.
|
Please be aware that the *only* way to draw our attention to a bug is to create a new issue in [the issue tracker](https://github.com/debauchee/barrier/issues). Write a clear, concise, detailed report and you will get a clear, concise, detailed response. Priority is always given to issues that affect a wider range of users.
|
||||||
|
|
||||||
For short and simple questions or to just say hello find us on the Freenode IRC network in the #barrier channel.
|
For short and simple questions or to just say hello find us on the LiberaChat IRC network in the #barrier channel.
|
||||||
|
|
||||||
### Contributions
|
### Contributions
|
||||||
|
|
||||||
|
@ -107,7 +107,8 @@ A: Start the binary with the argument `--config <path_to_saved_configuration>`
|
||||||
|
|
||||||
Q: After loading my configuration on the client the field 'Server IP' is still empty!
|
Q: After loading my configuration on the client the field 'Server IP' is still empty!
|
||||||
|
|
||||||
A: Edit your configuration to include the servers ip adress manually with
|
A: Edit your configuration to include the server's ip address manually with
|
||||||
|
|
||||||
(...)
|
(...)
|
||||||
section: options
|
section: options
|
||||||
serverhostname=<AAA.BBB.CCC.DDD>
|
serverhostname=<AAA.BBB.CCC.DDD>
|
||||||
|
|
|
@ -63,9 +63,15 @@ jobs:
|
||||||
artifactName: Windows Release Installer
|
artifactName: Windows Release Installer
|
||||||
|
|
||||||
- job: LinuxBuild
|
- job: LinuxBuild
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
ubuntu-18.04:
|
||||||
|
imageName: 'ubuntu-18.04'
|
||||||
|
ubuntu-20.04:
|
||||||
|
imageName: 'ubuntu-20.04'
|
||||||
displayName: Linux Build
|
displayName: Linux Build
|
||||||
pool:
|
pool:
|
||||||
vmImage: 'ubuntu-16.04'
|
vmImage: $(imageName)
|
||||||
steps:
|
steps:
|
||||||
- script: sudo apt-get update -y
|
- script: sudo apt-get update -y
|
||||||
- script: sudo apt-get install -y libxtst-dev qtdeclarative5-dev libavahi-compat-libdnssd-dev libcurl4-openssl-dev
|
- script: sudo apt-get install -y libxtst-dev qtdeclarative5-dev libavahi-compat-libdnssd-dev libcurl4-openssl-dev
|
||||||
|
@ -75,13 +81,22 @@ jobs:
|
||||||
|
|
||||||
- job: MacBuild
|
- job: MacBuild
|
||||||
displayName: Mac Build
|
displayName: Mac Build
|
||||||
pool:
|
|
||||||
vmImage: 'macOS-10.14'
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
Release:
|
big-sur-Release:
|
||||||
|
imageName: "macOS-11"
|
||||||
B_BUILD_TYPE: Release
|
B_BUILD_TYPE: Release
|
||||||
BARRIER_VERSION_STAGE: Release
|
BARRIER_VERSION_STAGE: Release
|
||||||
|
catalina-Release:
|
||||||
|
imageName: "macOS-10.15"
|
||||||
|
B_BUILD_TYPE: Release
|
||||||
|
BARRIER_VERSION_STAGE: Release
|
||||||
|
mojave-Release:
|
||||||
|
imageName: "macOS-10.14"
|
||||||
|
B_BUILD_TYPE: Release
|
||||||
|
BARRIER_VERSION_STAGE: Release
|
||||||
|
pool:
|
||||||
|
vmImage: $(imageName)
|
||||||
variables:
|
variables:
|
||||||
VERBOSE: 1
|
VERBOSE: 1
|
||||||
TERM: xterm-256color
|
TERM: xterm-256color
|
||||||
|
|
|
@ -65,7 +65,7 @@ if exist bin\Debug (
|
||||||
mkdir bin\Release\platforms
|
mkdir bin\Release\platforms
|
||||||
copy %B_QT_FULLPATH%\plugins\platforms\qwindows.dll bin\Release\platforms\ > NUL
|
copy %B_QT_FULLPATH%\plugins\platforms\qwindows.dll bin\Release\platforms\ > NUL
|
||||||
) else (
|
) else (
|
||||||
echo Remember to copy supporting binaries and confiuration files!
|
echo Remember to copy supporting binaries and configuration files!
|
||||||
)
|
)
|
||||||
|
|
||||||
echo Build completed successfully
|
echo Build completed successfully
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
cd "$(dirname $0)" || exit 1
|
cd "$(dirname "$0")" || exit 1
|
||||||
# some environments have cmake v2 as 'cmake' and v3 as 'cmake3'
|
# some environments have cmake v2 as 'cmake' and v3 as 'cmake3'
|
||||||
# check for cmake3 first then fallback to just cmake
|
# check for cmake3 first then fallback to just cmake
|
||||||
B_CMAKE=`type cmake3 2>/dev/null`
|
B_CMAKE=`type cmake3 2>/dev/null`
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
B_CMAKE=`echo $B_CMAKE | cut -d' ' -f3`
|
B_CMAKE=`echo "$B_CMAKE" | cut -d' ' -f3`
|
||||||
else
|
else
|
||||||
B_CMAKE=cmake
|
B_CMAKE=cmake
|
||||||
fi
|
fi
|
||||||
|
@ -26,7 +26,7 @@ B_CMAKE_FLAGS="-DCMAKE_BUILD_TYPE=$B_BUILD_TYPE $B_CMAKE_FLAGS"
|
||||||
rm -rf build
|
rm -rf build
|
||||||
mkdir build || exit 1
|
mkdir build || exit 1
|
||||||
cd build || exit 1
|
cd build || exit 1
|
||||||
echo Starting Barrier $B_BUILD_TYPE build...
|
echo "Starting Barrier $B_BUILD_TYPE build..."
|
||||||
$B_CMAKE $B_CMAKE_FLAGS .. || exit 1
|
$B_CMAKE $B_CMAKE_FLAGS .. || exit 1
|
||||||
make || exit 1
|
make || exit 1
|
||||||
echo "Build completed successfully"
|
echo "Build completed successfully"
|
||||||
|
|
|
@ -54,7 +54,7 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks:
|
||||||
; to avoid duplicate entries remove the existing rule (fails if it doesn't exist) before adding
|
; to avoid duplicate entries remove the existing rule (fails if it doesn't exist) before adding
|
||||||
Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#MyAppListenerDesc}"""; Flags: runhidden
|
Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall delete rule name=""{#MyAppListenerDesc}"""; Flags: runhidden
|
||||||
Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall add rule name=""{#MyAppListenerDesc}"" protocol=TCP dir=in localport=24800 action=allow"; Flags: runhidden
|
Filename: {sys}\netsh.exe; Parameters: "advfirewall firewall add rule name=""{#MyAppListenerDesc}"" protocol=TCP dir=in localport=24800 action=allow"; Flags: runhidden
|
||||||
Filename: {sys}\sc.exe; Parameters: "create {#MyAppServiceName} start= auto binPath= ""{app}\{#MyAppServiceExe}"""; Flags: runhidden
|
Filename: {sys}\sc.exe; Parameters: "create {#MyAppServiceName} start= auto binPath= ""\""{app}\{#MyAppServiceExe}\"""""; Flags: runhidden
|
||||||
Filename: {sys}\sc.exe; Parameters: "description {#MyAppServiceName} ""{#MyAppServiceDesc}"""; Flags: runhidden
|
Filename: {sys}\sc.exe; Parameters: "description {#MyAppServiceName} ""{#MyAppServiceDesc}"""; Flags: runhidden
|
||||||
Filename: {sys}\sc.exe; Parameters: "start {#MyAppServiceName}"; Flags: runhidden
|
Filename: {sys}\sc.exe; Parameters: "start {#MyAppServiceName}"; Flags: runhidden
|
||||||
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# Use the same verbose variable as CMake
|
# Use the same verbose variable as CMake
|
||||||
[ "$VERBOSE" == "1" ] && set -x
|
[ "$VERBOSE" = "1" ] && set -x
|
||||||
|
|
||||||
# Exit on unset variables or pipe errors
|
# Exit on unset variables or pipe errors
|
||||||
set -uo pipefail
|
set -uo pipefail
|
||||||
|
@ -14,10 +14,10 @@ B_BARRIERC="Barrier.app/Contents/MacOS/barrierc"
|
||||||
B_BARRIERS="Barrier.app/Contents/MacOS/barriers"
|
B_BARRIERS="Barrier.app/Contents/MacOS/barriers"
|
||||||
|
|
||||||
# Colorized output
|
# Colorized output
|
||||||
function info() { tput bold; echo "$@" ; tput sgr0 ;}
|
info() { tput bold; echo "$@"; tput sgr0 ; }
|
||||||
function error() { tput bold; tput setaf 1; echo "$@"; tput sgr0 ; }
|
error() { tput bold; tput setaf 1; echo "$@"; tput sgr0 ; }
|
||||||
function success() { tput bold; tput setaf 2; echo "$@"; tput sgr0 ; }
|
success() { tput bold; tput setaf 2; echo "$@"; tput sgr0 ; }
|
||||||
function warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
||||||
|
|
||||||
info "Checking for bundle contents"
|
info "Checking for bundle contents"
|
||||||
if [ ! -d "Barrier.app/Contents" ]; then
|
if [ ! -d "Barrier.app/Contents" ]; then
|
||||||
|
@ -40,7 +40,7 @@ if which -s port ; then
|
||||||
info "MacPorts found, searching for macdeployqt"
|
info "MacPorts found, searching for macdeployqt"
|
||||||
DEPLOYQT="$(port contents qt5-qttools | grep --only --max-count 1 '/.*macdeployqt')"
|
DEPLOYQT="$(port contents qt5-qttools | grep --only --max-count 1 '/.*macdeployqt')"
|
||||||
if [ ! -x "$DEPLOYQT" ]; then
|
if [ ! -x "$DEPLOYQT" ]; then
|
||||||
error Please install package qt5-qttools
|
error "Please install package qt5-qttools"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
@ -50,13 +50,13 @@ if which -s brew ; then
|
||||||
info "Homebrew found, searching for macdeployqt"
|
info "Homebrew found, searching for macdeployqt"
|
||||||
DEPLOYQT="$(brew list qt@5 | grep --only '/.*macdeployqt' | head -1)"
|
DEPLOYQT="$(brew list qt@5 | grep --only '/.*macdeployqt' | head -1)"
|
||||||
if [ ! -x "$DEPLOYQT" ]; then
|
if [ ! -x "$DEPLOYQT" ]; then
|
||||||
error Please install package qt
|
error "Please install package qt"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Use macdeployqt to include libraries and create dmg
|
# Use macdeployqt to include libraries and create dmg
|
||||||
if [ "$B_BUILDTYPE" == "Release" ]; then
|
if [ "$B_BUILDTYPE" = "Release" ]; then
|
||||||
info "Building Release disk image (dmg)"
|
info "Building Release disk image (dmg)"
|
||||||
"$DEPLOYQT" Barrier.app -dmg \
|
"$DEPLOYQT" Barrier.app -dmg \
|
||||||
-executable="$B_BARRIERC" \
|
-executable="$B_BARRIERC" \
|
||||||
|
|
|
@ -1,30 +1,30 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
# add warning for users running manually
|
# add warning for users running manually
|
||||||
function warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
||||||
warn "The scripts build_installer.sh and reref_dylibs.sh have been deprecated."
|
warn "The scripts build_installer.sh and reref_dylibs.sh have been deprecated."
|
||||||
warn "Please use build_dist.sh instead to deploy using macdeployqt"
|
warn "Please use build_dist.sh instead to deploy using macdeployqt"
|
||||||
|
|
||||||
# change this to rename the installer package
|
# change this to rename the installer package
|
||||||
B_DMG="Barrier-@BARRIER_VERSION@.dmg"
|
B_DMG="Barrier-@BARRIER_VERSION@.dmg"
|
||||||
|
|
||||||
cd "$( dirname '$0' )"
|
cd "$( dirname "$0" )"
|
||||||
OWNDIR="$( pwd )"
|
OWNDIR="$( pwd )"
|
||||||
|
|
||||||
B_REREF_SCRIPT="$OWNDIR/reref_dylibs.sh"
|
B_REREF_SCRIPT="$OWNDIR/reref_dylibs.sh"
|
||||||
if [ ! -x $B_REREF_SCRIPT ]; then
|
if [ ! -x "$B_REREF_SCRIPT" ]; then
|
||||||
echo Missing script: $B_REREF_SCRIPT
|
echo "Missing script: $B_REREF_SCRIPT"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# remove any old copies so there's no confusion about whether this
|
# remove any old copies so there's no confusion about whether this
|
||||||
# process completes successfully or not
|
# process completes successfully or not
|
||||||
rm -rf temp.dmg $B_DMG
|
rm -rf temp.dmg "$B_DMG"
|
||||||
|
|
||||||
cd Barrier.app/Contents 2>/dev/null
|
cd Barrier.app/Contents 2>/dev/null
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo Please make sure that the build completed successfully
|
echo "Please make sure that the build completed successfully"
|
||||||
echo before trying to create the installer.
|
echo "before trying to create the installer."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ hdiutil create -size 64m -fs HFS+ -volname "Barrier" temp.dmg || exit 1
|
||||||
hdiutil attach temp.dmg -mountpoint mnt || exit 1
|
hdiutil attach temp.dmg -mountpoint mnt || exit 1
|
||||||
cp -r Barrier.app mnt/ || exit 1
|
cp -r Barrier.app mnt/ || exit 1
|
||||||
hdiutil detach mnt || exit 1
|
hdiutil detach mnt || exit 1
|
||||||
hdiutil convert temp.dmg -format UDZO -o $B_DMG || exit 1
|
hdiutil convert temp.dmg -format UDZO -o "$B_DMG" || exit 1
|
||||||
rm temp.dmg
|
rm temp.dmg
|
||||||
|
|
||||||
echo "dmg $B_DMB created successfully"
|
echo "dmg $B_DMG created successfully"
|
||||||
|
|
|
@ -5,28 +5,28 @@ B_TARGET=$1
|
||||||
if [ "x$B_TARGET" = "x" ]; then
|
if [ "x$B_TARGET" = "x" ]; then
|
||||||
|
|
||||||
# add warning for users running manually
|
# add warning for users running manually
|
||||||
function warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
warn() { tput bold; tput setaf 3; echo "$@"; tput sgr0 ; }
|
||||||
warn "The scripts build_installer.sh and reref_dylibs.sh have been deprecated."
|
warn "The scripts build_installer.sh and reref_dylibs.sh have been deprecated."
|
||||||
warn "Please use build_dist.sh instead to deploy using macdeployqt"
|
warn "Please use build_dist.sh instead to deploy using macdeployqt"
|
||||||
|
|
||||||
echo Which binary needs to be re-referenced?
|
echo "Which binary needs to be re-referenced?"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd $(dirname $B_TARGET) || exit 1
|
cd "$(dirname "$B_TARGET")" || exit 1
|
||||||
|
|
||||||
# where to find non-system libraries relative to target's directory.
|
# where to find non-system libraries relative to target's directory.
|
||||||
# the vast majority of the time this should be empty
|
# the vast majority of the time this should be empty
|
||||||
B_REL_PATH=$2
|
B_REL_PATH=$2
|
||||||
|
|
||||||
# we're in target's directory now. trim off the path
|
# we're in target's directory now. trim off the path
|
||||||
B_TARGET=$(basename $B_TARGET)
|
B_TARGET=$(basename "$B_TARGET")
|
||||||
|
|
||||||
# get a list of non-system libraries and make local copies
|
# get a list of non-system libraries and make local copies
|
||||||
B_LIBS=$(otool -XL $B_TARGET | awk '{ print $1 }' | grep -Ev '^(/usr/lib|/System)')
|
B_LIBS=$(otool -XL "$B_TARGET" | awk '{ print $1 }' | grep -Ev '^(/usr/lib|/System)')
|
||||||
[ $? -ne 0 ] && exit 1
|
[ $? -ne 0 ] && exit 1
|
||||||
for B_LIB in $B_LIBS; do
|
for B_LIB in $B_LIBS; do
|
||||||
B_LIB_NAME=$(basename $B_LIB)
|
B_LIB_NAME=$(basename "$B_LIB")
|
||||||
# otool reports barrier as "barrier:" which fails self-reference test below
|
# otool reports barrier as "barrier:" which fails self-reference test below
|
||||||
B_LIB_NAME=${B_LIB_NAME//:}
|
B_LIB_NAME=${B_LIB_NAME//:}
|
||||||
|
|
||||||
|
@ -34,16 +34,16 @@ for B_LIB in $B_LIBS; do
|
||||||
[ "$B_TARGET" = "$B_LIB_NAME" ] && continue
|
[ "$B_TARGET" = "$B_LIB_NAME" ] && continue
|
||||||
|
|
||||||
B_DST=${B_REL_PATH}${B_LIB_NAME}
|
B_DST=${B_REL_PATH}${B_LIB_NAME}
|
||||||
if [ ! -e $B_DST ]; then
|
if [ ! -e "$B_DST" ]; then
|
||||||
cp $B_LIB $B_DST || exit 1
|
cp "$B_LIB" "$B_DST" || exit 1
|
||||||
chmod u+rw $B_DST || exit 1
|
chmod u+rw "$B_DST" || exit 1
|
||||||
# recursively call this script on libraries purposefully not passing
|
# recursively call this script on libraries purposefully not passing
|
||||||
# $B_REL_PATH so that it is only used explicitly
|
# $B_REL_PATH so that it is only used explicitly
|
||||||
$0 $B_DST
|
$0 "$B_DST"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# adjust the target's metadata to point to the local copy
|
# adjust the target's metadata to point to the local copy
|
||||||
# rather than the system-wide copy which would only exist on
|
# rather than the system-wide copy which would only exist on
|
||||||
# a development machine
|
# a development machine
|
||||||
install_name_tool -change $B_LIB @loader_path/$B_DST $B_TARGET || exit 1
|
install_name_tool -change "$B_LIB" "@loader_path/$B_DST" "$B_TARGET" || exit 1
|
||||||
done
|
done
|
||||||
|
|
|
@ -47,7 +47,7 @@ section: links
|
||||||
end
|
end
|
||||||
|
|
||||||
# The aliases section is to map the full names of the computers to their logical names used in the screens section
|
# The aliases section is to map the full names of the computers to their logical names used in the screens section
|
||||||
# One way to find the actual name of a comptuer is to run hostname from a command window
|
# One way to find the actual name of a computer is to run hostname from a command window
|
||||||
section: aliases
|
section: aliases
|
||||||
# Laptop is actually known as John-Smiths-MacBook-3.local
|
# Laptop is actually known as John-Smiths-MacBook-3.local
|
||||||
John-Smiths-MacBook-3.local:
|
John-Smiths-MacBook-3.local:
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fixed incorrect setup of Barrier service path on Windows.
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Checks if directory exists, otherwise asks to install package.
|
# Checks if directory exists, otherwise asks to install package.
|
||||||
function check_dir_exists() {
|
check_dir_exists() {
|
||||||
local path=$1
|
local path=$1
|
||||||
local package=$2
|
local package=$2
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ function check_dir_exists() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
if [ ! $BARRIER_BUILD_ENV ]; then
|
if [ -z "$BARRIER_BUILD_ENV" ]; then
|
||||||
check_dir_exists '/Applications/Xcode.app' 'Xcode'
|
check_dir_exists '/Applications/Xcode.app' 'Xcode'
|
||||||
|
|
||||||
printf "Modifying environment for Barrier build...\n"
|
printf "Modifying environment for Barrier build...\n"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
Thank you for chosing Barrier!
|
Thank you for choosing Barrier!
|
||||||
https://github.com/debauchee/barrier/
|
https://github.com/debauchee/barrier/
|
||||||
|
|
||||||
Barrier allows you to share your keyboard and mouse between computers over a network.
|
Barrier allows you to share your keyboard and mouse between computers over a network.
|
||||||
|
|
|
@ -5,6 +5,5 @@ Comment=Keyboard and mouse sharing solution
|
||||||
Exec=barrier
|
Exec=barrier
|
||||||
Icon=barrier
|
Icon=barrier
|
||||||
Terminal=false
|
Terminal=false
|
||||||
Categories=Utility;DesktopUtility;
|
Categories=Utility;RemoteAccess;
|
||||||
Keywords=keyboard;mouse;sharing;network;share;
|
Keywords=keyboard;mouse;sharing;network;share;
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
ICNS_BASE=../dist/macos/bundle/Barrier.app/Contents/Resources
|
ICNS_BASE=../dist/macos/bundle/Barrier.app/Contents/Resources
|
||||||
if ! which magick >/dev/null 2>&1; then
|
if ! which magick >/dev/null 2>&1; then
|
||||||
echo "Need ImageMagic for this"
|
echo "Need ImageMagick for this"
|
||||||
exit 10
|
exit 10
|
||||||
fi
|
fi
|
||||||
cd $(dirname $0) || exit $?
|
cd "$(dirname "$0")" || exit $?
|
||||||
if [ ! -r barrier.png ]; then
|
if [ ! -r barrier.png ]; then
|
||||||
echo "Use inkscape (or another vector graphics editor) to create barrier.png from barrier.svg first"
|
echo "Use inkscape (or another vector graphics editor) to create barrier.png from barrier.svg first"
|
||||||
exit 10
|
exit 10
|
||||||
|
@ -12,11 +12,11 @@ fi
|
||||||
rm -rf work || exit $?
|
rm -rf work || exit $?
|
||||||
mkdir -p work || exit $?
|
mkdir -p work || exit $?
|
||||||
for s in 16 24 32 48 64 128 256 512 1024; do
|
for s in 16 24 32 48 64 128 256 512 1024; do
|
||||||
magick convert barrier.png -resize ${s}x${s} -depth 8 work/${s}.png || exit $?
|
magick convert barrier.png -resize "${s}x${s}" -depth 8 "work/${s}.png" || exit $?
|
||||||
done
|
done
|
||||||
# windows icon
|
# windows icon
|
||||||
magick convert work/{16,24,32,48,64,128}.png barrier.png barrier.ico || exit $?
|
magick convert work/{16,24,32,48,64,128}.png barrier.png barrier.ico || exit $?
|
||||||
# macos icon
|
# macos icon
|
||||||
png2icns $ICNS_BASE/Barrier.icns work/{16,32,256,512,1024}.png || exit $?
|
png2icns "$ICNS_BASE/Barrier.icns" work/{16,32,256,512,1024}.png || exit $?
|
||||||
rm -rf work
|
rm -rf work
|
||||||
echo Done
|
echo Done
|
||||||
|
|
|
@ -20,4 +20,3 @@ add_subdirectory(barriers)
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
add_subdirectory(barrierd)
|
add_subdirectory(barrierd)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -46,4 +46,3 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
install (TARGETS barrierc DESTINATION bin)
|
install (TARGETS barrierc DESTINATION bin)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
|
@ -66,4 +66,3 @@ createTaskBarReceiver(const BufferedLogOutputter* logBuffer, IEventQueue* events
|
||||||
{
|
{
|
||||||
return new OSXClientTaskBarReceiver(logBuffer, events);
|
return new OSXClientTaskBarReceiver(logBuffer, events);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ BEGIN
|
||||||
VALUE "ProductName", "Barrier"
|
VALUE "ProductName", "Barrier"
|
||||||
VALUE "ProductVersion", BARRIER_VERSION
|
VALUE "ProductVersion", BARRIER_VERSION
|
||||||
VALUE "OriginalFilename", "barrierd.exe"
|
VALUE "OriginalFilename", "barrierd.exe"
|
||||||
VALUE "FileDescription", "Open source KVM software deamon"
|
VALUE "FileDescription", "Open source KVM software daemon"
|
||||||
VALUE "InternalName", "barrierd"
|
VALUE "InternalName", "barrierd"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|
|
@ -46,5 +46,3 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
install (TARGETS barriers DESTINATION bin)
|
install (TARGETS barriers DESTINATION bin)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -40,4 +40,3 @@ class AboutDialog : public QDialog, public Ui::AboutDialogBase
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -164,4 +164,3 @@ QTextStream& operator<<(QTextStream& outStream, const Action& action)
|
||||||
|
|
||||||
return outStream;
|
return outStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -44,4 +44,3 @@ const char* BaseConfig::m_SwitchCornerNames[] =
|
||||||
"bottom-left",
|
"bottom-left",
|
||||||
"bottom-right"
|
"bottom-right"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,35 +30,34 @@ CommandProcess::CommandProcess(QString cmd, QStringList arguments, QString input
|
||||||
QString CommandProcess::run()
|
QString CommandProcess::run()
|
||||||
{
|
{
|
||||||
QProcess process;
|
QProcess process;
|
||||||
QString standardOutput, standardError;
|
|
||||||
process.setReadChannel(QProcess::StandardOutput);
|
process.setReadChannel(QProcess::StandardOutput);
|
||||||
process.start(m_Command, m_Arguments);
|
process.start(m_Command, m_Arguments);
|
||||||
bool success = process.waitForStarted();
|
bool success = process.waitForStarted();
|
||||||
|
|
||||||
|
QString output, error;
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
if (!m_Input.isEmpty()) {
|
if (!m_Input.isEmpty()) {
|
||||||
process.write(m_Input.toLocal8Bit());
|
process.write(m_Input.toStdString().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (process.waitForFinished()) {
|
if (process.waitForFinished()) {
|
||||||
standardOutput = QString::fromLocal8Bit(process.readAllStandardOutput().trimmed());
|
output = process.readAllStandardOutput().trimmed();
|
||||||
standardError = QString::fromLocal8Bit(process.readAllStandardError().trimmed());
|
error = process.readAllStandardError().trimmed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int code = process.exitCode();
|
int code = process.exitCode();
|
||||||
if (!standardError.isEmpty() || !success || code != 0)
|
if (!error.isEmpty() || !success || code != 0)
|
||||||
{
|
{
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
std::string(
|
|
||||||
QString("Code: %1\nError: %2")
|
QString("Code: %1\nError: %2")
|
||||||
.arg(process.exitCode())
|
.arg(process.exitCode())
|
||||||
.arg(standardError.isEmpty() ? "Unknown" : standardError)
|
.arg(error.isEmpty() ? "Unknown" : error)
|
||||||
.toLocal8Bit().constData()));
|
.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
emit finished();
|
emit finished();
|
||||||
|
|
||||||
return standardOutput;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Fingerprint.h"
|
#include "Fingerprint.h"
|
||||||
#include "QUtility.h"
|
|
||||||
|
#include "common/DataDirectories.h"
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
@ -123,8 +124,10 @@ void Fingerprint::persistDirectory()
|
||||||
|
|
||||||
QString Fingerprint::directoryPath()
|
QString Fingerprint::directoryPath()
|
||||||
{
|
{
|
||||||
|
auto profileDir = QString::fromStdString(DataDirectories::profile());
|
||||||
|
|
||||||
return QString("%1/%2")
|
return QString("%1/%2")
|
||||||
.arg(profilePath())
|
.arg(profileDir)
|
||||||
.arg(kDirName);
|
.arg(kDirName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,12 +104,14 @@ void IpcClient::sendCommand(const QString& command, ElevateMode const elevate)
|
||||||
|
|
||||||
stream.writeRawData(kIpcMsgCommand, 4);
|
stream.writeRawData(kIpcMsgCommand, 4);
|
||||||
|
|
||||||
QByteArray utf8Command = command.toUtf8();
|
std::string stdStringCommand = command.toStdString();
|
||||||
|
const char* charCommand = stdStringCommand.c_str();
|
||||||
|
int length = (int)strlen(charCommand);
|
||||||
|
|
||||||
char lenBuf[4];
|
char lenBuf[4];
|
||||||
intToBytes(utf8Command.size(), lenBuf, 4);
|
intToBytes(length, lenBuf, 4);
|
||||||
stream.writeRawData(lenBuf, 4);
|
stream.writeRawData(lenBuf, 4);
|
||||||
stream.writeRawData(utf8Command.constData(), utf8Command.size());
|
stream.writeRawData(charCommand, length);
|
||||||
|
|
||||||
char elevateBuf[1];
|
char elevateBuf[1];
|
||||||
// Refer to enum ElevateMode documentation for why this flag is mapped this way
|
// Refer to enum ElevateMode documentation for why this flag is mapped this way
|
||||||
|
|
|
@ -54,4 +54,3 @@ class KeySequence
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -78,4 +78,3 @@ class KeySequenceWidget : public QPushButton
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "ProcessorArch.h"
|
#include "ProcessorArch.h"
|
||||||
#include "SslCertificate.h"
|
#include "SslCertificate.h"
|
||||||
#include "ShutdownCh.h"
|
#include "ShutdownCh.h"
|
||||||
|
#include "common/DataDirectories.h"
|
||||||
|
|
||||||
#include <QtCore>
|
#include <QtCore>
|
||||||
#include <QtGui>
|
#include <QtGui>
|
||||||
|
@ -524,7 +525,7 @@ void MainWindow::startBarrier()
|
||||||
// launched the process (e.g. when launched with elevation). setting the
|
// launched the process (e.g. when launched with elevation). setting the
|
||||||
// profile dir on launch ensures it uses the same profile dir is used
|
// profile dir on launch ensures it uses the same profile dir is used
|
||||||
// no matter how its relaunched.
|
// no matter how its relaunched.
|
||||||
args << "--profile-dir" << QString("\"%1\"").arg(profilePath());
|
args << "--profile-dir" << QString::fromStdString("\"" + DataDirectories::profile() + "\"");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((barrierType() == barrierClient && !clientArgs(args, app))
|
if ((barrierType() == barrierClient && !clientArgs(args, app))
|
||||||
|
@ -624,7 +625,7 @@ QString MainWindow::configFilename()
|
||||||
if (m_pRadioInternalConfig->isChecked())
|
if (m_pRadioInternalConfig->isChecked())
|
||||||
{
|
{
|
||||||
// TODO: no need to use a temporary file, since we need it to
|
// TODO: no need to use a temporary file, since we need it to
|
||||||
// be permenant (since it'll be used for Windows services, etc).
|
// be permanent (since it'll be used for Windows services, etc).
|
||||||
m_pTempConfigFile = new QTemporaryFile();
|
m_pTempConfigFile = new QTemporaryFile();
|
||||||
if (!m_pTempConfigFile->open())
|
if (!m_pTempConfigFile->open())
|
||||||
{
|
{
|
||||||
|
@ -729,7 +730,7 @@ void MainWindow::stopBarrier()
|
||||||
|
|
||||||
void MainWindow::stopService()
|
void MainWindow::stopService()
|
||||||
{
|
{
|
||||||
// send empty command to stop service from laucning anything.
|
// send empty command to stop service from launching anything.
|
||||||
m_IpcClient.sendCommand("", appConfig().elevateMode());
|
m_IpcClient.sendCommand("", appConfig().elevateMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -211,4 +211,3 @@ private slots:
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* barrier -- mouse and keyboard sharing utility
|
* barrier -- mouse and keyboard sharing utility
|
||||||
* Copyright (C) 2012-2016 Symless Ltd.
|
* Copyright (C) 2012-2016 Symless Ltd.
|
||||||
* Copyright (C) 2008 Volker Lanz (vl@fidra.de)
|
* Copyright (C) 2008 Volker Lanz (vl@fidra.de)
|
||||||
|
@ -45,4 +45,3 @@ void NewScreenWidget::mousePressEvent(QMouseEvent* event)
|
||||||
|
|
||||||
pDrag->exec(Qt::CopyAction, Qt::CopyAction);
|
pDrag->exec(Qt::CopyAction, Qt::CopyAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,4 +37,3 @@ class NewScreenWidget : public QLabel
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -44,4 +44,3 @@ class QBarrierApplication : public QApplication
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
|
|
||||||
#include "ProcessorArch.h"
|
#include "ProcessorArch.h"
|
||||||
#include "CommandProcess.h"
|
#include "CommandProcess.h"
|
||||||
#include "common/DataDirectories.h"
|
|
||||||
|
|
||||||
#if defined(Q_OS_LINUX)
|
#if defined(Q_OS_LINUX)
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
|
@ -113,11 +112,3 @@ QString getOSInformation()
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString profilePath()
|
|
||||||
{
|
|
||||||
// Get path to current profile directory, properly converted
|
|
||||||
// from an OS locale std::string to Unicode QString.
|
|
||||||
auto localePath = DataDirectories::profile();
|
|
||||||
return QString::fromLocal8Bit(localePath.c_str(), localePath.size());
|
|
||||||
}
|
|
||||||
|
|
|
@ -29,4 +29,3 @@ QString hash(const QString& string);
|
||||||
QString getFirstMacAddress();
|
QString getFirstMacAddress();
|
||||||
qProcessorArch getProcessorArch();
|
qProcessorArch getProcessorArch();
|
||||||
QString getOSInformation();
|
QString getOSInformation();
|
||||||
QString profilePath();
|
|
||||||
|
|
|
@ -105,4 +105,3 @@ QDataStream& operator<<(QDataStream& outStream, const Screen& screen);
|
||||||
QDataStream& operator>>(QDataStream& inStream, Screen& screen);
|
QDataStream& operator>>(QDataStream& inStream, Screen& screen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -152,4 +152,3 @@ void ScreenSettingsDialog::on_m_pListAliases_itemSelectionChanged()
|
||||||
{
|
{
|
||||||
m_pButtonRemoveAlias->setEnabled(!m_pListAliases->selectedItems().isEmpty());
|
m_pButtonRemoveAlias->setEnabled(!m_pListAliases->selectedItems().isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,4 +50,3 @@ class ScreenSettingsDialog : public QDialog, public Ui::ScreenSettingsDialogBase
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -141,4 +141,3 @@ bool ScreenSetupModel::dropMimeData(const QMimeData* data, Qt::DropAction action
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,4 +68,3 @@ class ScreenSetupModel : public QAbstractTableModel
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -225,4 +225,3 @@ QStyleOptionViewItem ScreenSetupView::viewOptions() const
|
||||||
option.textElideMode = Qt::ElideMiddle;
|
option.textElideMode = Qt::ElideMiddle;
|
||||||
return option;
|
return option;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,4 +58,3 @@ class ScreenSetupView : public QTableView
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -138,4 +138,3 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ void ServerConfigDialog::showEvent(QShowEvent* event)
|
||||||
|
|
||||||
if (!m_Message.isEmpty())
|
if (!m_Message.isEmpty())
|
||||||
{
|
{
|
||||||
// TODO: ideally this massage box should pop up after the dialog is shown
|
// TODO: ideally this message box should pop up after the dialog is shown
|
||||||
QMessageBox::information(this, tr("Configure server"), m_Message);
|
QMessageBox::information(this, tr("Configure server"), m_Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,4 +63,3 @@ class ServerConfigDialog : public QDialog, public Ui::ServerConfigDialogBase
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ SetupWizard::SetupWizard(MainWindow& mainWindow, bool startMain) :
|
||||||
|
|
||||||
#elif defined(Q_OS_WIN)
|
#elif defined(Q_OS_WIN)
|
||||||
|
|
||||||
// when areo is disabled on windows, the next/back buttons
|
// when aero is disabled on windows, the next/back buttons
|
||||||
// are hidden (must be a qt bug) -- resizing the window
|
// are hidden (must be a qt bug) -- resizing the window
|
||||||
// to +1 of the original height seems to fix this.
|
// to +1 of the original height seems to fix this.
|
||||||
// NOTE: calling setMinimumSize after this will break
|
// NOTE: calling setMinimumSize after this will break
|
||||||
|
|
|
@ -19,4 +19,3 @@
|
||||||
|
|
||||||
// included in both the GUI and the child apps (server & client)
|
// included in both the GUI and the child apps (server & client)
|
||||||
const char ShutdownCh = 'S';
|
const char ShutdownCh = 'S';
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "SslCertificate.h"
|
#include "SslCertificate.h"
|
||||||
#include "Fingerprint.h"
|
#include "Fingerprint.h"
|
||||||
#include "QUtility.h"
|
#include "common/DataDirectories.h"
|
||||||
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
@ -43,13 +43,13 @@ static const char kConfigFile[] = "barrier.conf";
|
||||||
SslCertificate::SslCertificate(QObject *parent) :
|
SslCertificate::SslCertificate(QObject *parent) :
|
||||||
QObject(parent)
|
QObject(parent)
|
||||||
{
|
{
|
||||||
m_ProfileDir = profilePath();
|
m_ProfileDir = DataDirectories::profile();
|
||||||
if (m_ProfileDir.isEmpty()) {
|
if (m_ProfileDir.empty()) {
|
||||||
emit error(tr("Failed to get profile directory."));
|
emit error(tr("Failed to get profile directory."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::pair<bool, QString> SslCertificate::runTool(const QStringList& args)
|
std::pair<bool, std::string> SslCertificate::runTool(const QStringList& args)
|
||||||
{
|
{
|
||||||
QString program;
|
QString program;
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
|
@ -68,15 +68,17 @@ std::pair<bool, QString> SslCertificate::runTool(const QStringList& args)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
QProcess process;
|
QProcess process;
|
||||||
QString standardOutput, standardError;
|
|
||||||
process.setEnvironment(environment);
|
process.setEnvironment(environment);
|
||||||
process.start(program, args);
|
process.start(program, args);
|
||||||
bool success = process.waitForStarted();
|
|
||||||
|
|
||||||
|
bool success = process.waitForStarted();
|
||||||
|
std::string output;
|
||||||
|
|
||||||
|
QString standardError;
|
||||||
if (success && process.waitForFinished())
|
if (success && process.waitForFinished())
|
||||||
{
|
{
|
||||||
standardOutput = QString::fromLocal8Bit(process.readAllStandardOutput().trimmed());
|
output = process.readAllStandardOutput().trimmed().toStdString();
|
||||||
standardError = QString::fromLocal8Bit(process.readAllStandardError().trimmed());
|
standardError = process.readAllStandardError().trimmed();
|
||||||
}
|
}
|
||||||
|
|
||||||
int code = process.exitCode();
|
int code = process.exitCode();
|
||||||
|
@ -87,15 +89,15 @@ std::pair<bool, QString> SslCertificate::runTool(const QStringList& args)
|
||||||
.arg(program)
|
.arg(program)
|
||||||
.arg(process.exitCode())
|
.arg(process.exitCode())
|
||||||
.arg(standardError.isEmpty() ? "Unknown" : standardError));
|
.arg(standardError.isEmpty() ? "Unknown" : standardError));
|
||||||
return {false, standardOutput};
|
return {false, output};
|
||||||
}
|
}
|
||||||
|
|
||||||
return {true, standardOutput};
|
return {true, output};
|
||||||
}
|
}
|
||||||
|
|
||||||
void SslCertificate::generateCertificate()
|
void SslCertificate::generateCertificate()
|
||||||
{
|
{
|
||||||
auto filename = getCertificatePath();
|
auto filename = QString::fromStdString(getCertificatePath());
|
||||||
|
|
||||||
QFile file(filename);
|
QFile file(filename);
|
||||||
if (!file.exists() || !isCertificateValid(filename)) {
|
if (!file.exists() || !isCertificateValid(filename)) {
|
||||||
|
@ -106,7 +108,7 @@ void SslCertificate::generateCertificate()
|
||||||
arguments.append("-x509");
|
arguments.append("-x509");
|
||||||
arguments.append("-nodes");
|
arguments.append("-nodes");
|
||||||
|
|
||||||
// valide duration
|
// valid duration
|
||||||
arguments.append("-days");
|
arguments.append("-days");
|
||||||
arguments.append(kCertificateLifetime);
|
arguments.append(kCertificateLifetime);
|
||||||
|
|
||||||
|
@ -120,7 +122,7 @@ void SslCertificate::generateCertificate()
|
||||||
arguments.append("-newkey");
|
arguments.append("-newkey");
|
||||||
arguments.append("rsa:2048");
|
arguments.append("rsa:2048");
|
||||||
|
|
||||||
QDir sslDir(getCertificateDirectory());
|
QDir sslDir(QString::fromStdString(getCertificateDirectory()));
|
||||||
if (!sslDir.exists()) {
|
if (!sslDir.exists()) {
|
||||||
sslDir.mkpath(".");
|
sslDir.mkpath(".");
|
||||||
}
|
}
|
||||||
|
@ -157,17 +159,20 @@ void SslCertificate::generateFingerprint(const QString& certificateFilename)
|
||||||
|
|
||||||
auto ret = runTool(arguments);
|
auto ret = runTool(arguments);
|
||||||
bool success = ret.first;
|
bool success = ret.first;
|
||||||
|
std::string output = ret.second;
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// find the fingerprint from the tool output
|
// find the fingerprint from the tool output
|
||||||
QString fingerprint = ret.second;
|
auto i = output.find_first_of('=');
|
||||||
auto i = fingerprint.indexOf('=');
|
if (i != std::string::npos) {
|
||||||
if (i != -1) {
|
i++;
|
||||||
fingerprint.remove(0, i+1);
|
auto fingerprint = output.substr(
|
||||||
|
i, output.size() - i);
|
||||||
|
|
||||||
Fingerprint::local().trust(fingerprint, false);
|
Fingerprint::local().trust(QString::fromStdString(fingerprint), false);
|
||||||
emit info(tr("SSL fingerprint generated."));
|
emit info(tr("SSL fingerprint generated."));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -175,14 +180,14 @@ void SslCertificate::generateFingerprint(const QString& certificateFilename)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SslCertificate::getCertificatePath()
|
std::string SslCertificate::getCertificatePath()
|
||||||
{
|
{
|
||||||
return getCertificateDirectory() + QDir::separator() + kCertificateFilename;
|
return getCertificateDirectory() + QDir::separator().toLatin1() + kCertificateFilename;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SslCertificate::getCertificateDirectory()
|
std::string SslCertificate::getCertificateDirectory()
|
||||||
{
|
{
|
||||||
return m_ProfileDir + QDir::separator() + kSslDir;
|
return m_ProfileDir + QDir::separator().toLatin1() + kSslDir;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SslCertificate::isCertificateValid(const QString& path)
|
bool SslCertificate::isCertificateValid(const QString& path)
|
||||||
|
@ -193,7 +198,7 @@ bool SslCertificate::isCertificateValid(const QString& path)
|
||||||
|
|
||||||
BIO* bio = BIO_new(BIO_s_file());
|
BIO* bio = BIO_new(BIO_s_file());
|
||||||
|
|
||||||
auto ret = BIO_read_filename(bio, path.toLocal8Bit().constData());
|
auto ret = BIO_read_filename(bio, path.toStdString().c_str());
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
emit info(tr("Could not read from default certificate file."));
|
emit info(tr("Could not read from default certificate file."));
|
||||||
BIO_free_all(bio);
|
BIO_free_all(bio);
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
class SslCertificate : public QObject
|
class SslCertificate : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit SslCertificate(QObject *parent = 0);
|
explicit SslCertificate(QObject *parent = 0);
|
||||||
|
@ -36,13 +36,13 @@ signals:
|
||||||
void generateFinished();
|
void generateFinished();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::pair<bool, QString> runTool(const QStringList& args);
|
std::pair<bool, std::string> runTool(const QStringList& args);
|
||||||
void generateFingerprint(const QString& certificateFilename);
|
void generateFingerprint(const QString& certificateFilename);
|
||||||
|
|
||||||
QString getCertificatePath();
|
std::string getCertificatePath();
|
||||||
QString getCertificateDirectory();
|
std::string getCertificateDirectory();
|
||||||
|
|
||||||
bool isCertificateValid(const QString& path);
|
bool isCertificateValid(const QString& path);
|
||||||
private:
|
private:
|
||||||
QString m_ProfileDir;
|
std::string m_ProfileDir;
|
||||||
};
|
};
|
||||||
|
|
|
@ -40,4 +40,3 @@ void TrashScreenWidget::dropEvent(QDropEvent* event)
|
||||||
else
|
else
|
||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,4 +39,3 @@ class TrashScreenWidget : public QLabel
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,12 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
QApplication::setQuitOnLastWindowClosed(false);
|
QApplication::setQuitOnLastWindowClosed(false);
|
||||||
|
|
||||||
|
if (QGuiApplication::platformName() == "wayland") {
|
||||||
|
QMessageBox::warning(
|
||||||
|
NULL, "Barrier",
|
||||||
|
"You are using wayland session, which is currently not fully supported by Barrier.");
|
||||||
|
}
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
AppConfig appConfig (&settings);
|
AppConfig appConfig (&settings);
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ std::string ArchInternetWindows::urlEncode(const std::string& url)
|
||||||
|
|
||||||
std::string result(buffer);
|
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
|
// escape "unsafe" chars, but not + or =, so we need to replace these
|
||||||
// manually (and probably many other chars).
|
// manually (and probably many other chars).
|
||||||
barrier::string::findReplaceAll(result, "+", "%2B");
|
barrier::string::findReplaceAll(result, "+", "%2B");
|
||||||
|
|
|
@ -443,7 +443,7 @@ ArchMiscWindows::wasLaunchedAsService()
|
||||||
bool ArchMiscWindows::getParentProcessName(std::string &name)
|
bool ArchMiscWindows::getParentProcessName(std::string &name)
|
||||||
{
|
{
|
||||||
PROCESSENTRY32 parentEntry;
|
PROCESSENTRY32 parentEntry;
|
||||||
if (!getParentProcessEntry(parentEntry)){
|
if (!getParentProcessEntry(parentEntry)) {
|
||||||
LOG((CLOG_ERR "could not get entry for parent process"));
|
LOG((CLOG_ERR "could not get entry for parent process"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,8 +71,8 @@ XArchEvalWinsock::eval() const noexcept
|
||||||
/* 10040 */{WSAEMSGSIZE, "The datagram was too large to fit into the specified buffer and was truncated"},
|
/* 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"},
|
/* 10041 */{WSAEPROTOTYPE, "The specified protocol is the wrong type for this socket"},
|
||||||
/* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"},
|
/* 10042 */{WSAENOPROTOOPT, "The option is unknown or unsupported"},
|
||||||
/* 10043 */{WSAEPROTONOSUPPORT,"The specified protocol is not supported"},
|
/* 10043 */{WSAEPROTONOSUPPORT, "The specified protocol is not supported"},
|
||||||
/* 10044 */{WSAESOCKTNOSUPPORT,"The specified socket type is not supported by this address family"},
|
/* 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"},
|
/* 10045 */{WSAEOPNOTSUPP, "The referenced socket is not a type that supports that operation"},
|
||||||
/* 10046 */{WSAEPFNOSUPPORT, "BSD: Protocol family not supported"},
|
/* 10046 */{WSAEPFNOSUPPORT, "BSD: Protocol family not supported"},
|
||||||
/* 10047 */{WSAEAFNOSUPPORT, "The specified address family is not supported"},
|
/* 10047 */{WSAEAFNOSUPPORT, "The specified address family is not supported"},
|
||||||
|
@ -83,7 +83,7 @@ XArchEvalWinsock::eval() const noexcept
|
||||||
/* 10052 */{WSAENETRESET, "The connection must be reset because the Windows Sockets implementation dropped it"},
|
/* 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"},
|
/* 10053 */{WSAECONNABORTED, "The virtual circuit was aborted due to timeout or other failure"},
|
||||||
/* 10054 */{WSAECONNRESET, "The virtual circuit was reset by the remote side"},
|
/* 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"},
|
/* 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"},
|
/* 10056 */{WSAEISCONN, "The socket is already connected"},
|
||||||
/* 10057 */{WSAENOTCONN, "The socket is not connected"},
|
/* 10057 */{WSAENOTCONN, "The socket is not connected"},
|
||||||
/* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"},
|
/* 10058 */{WSAESHUTDOWN, "The socket has been shutdown"},
|
||||||
|
@ -100,7 +100,7 @@ XArchEvalWinsock::eval() const noexcept
|
||||||
/* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"},
|
/* 10069 */{WSAEDQUOT, "Undocumented WinSock error code"},
|
||||||
/* 10070 */{WSAESTALE, "Undocumented WinSock error code"},
|
/* 10070 */{WSAESTALE, "Undocumented WinSock error code"},
|
||||||
/* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"},
|
/* 10071 */{WSAEREMOTE, "Undocumented WinSock error code"},
|
||||||
/* 10091 */{WSASYSNOTREADY, "Underlying network subsytem is not ready for network communication"},
|
/* 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"},
|
/* 10092 */{WSAVERNOTSUPPORTED, "The version of WinSock API support requested is not provided in this implementation"},
|
||||||
/* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"},
|
/* 10093 */{WSANOTINITIALISED, "WinSock subsystem not properly initialized"},
|
||||||
/* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"},
|
/* 10101 */{WSAEDISCON, "Virtual circuit has gracefully terminated connection"},
|
||||||
|
|
|
@ -133,10 +133,10 @@ ArgParser::parseClientArgs(ClientArgs& args, int argc, const char* const* argv)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
|
|
||||||
{
|
|
||||||
#if WINAPI_MSWINDOWS
|
#if WINAPI_MSWINDOWS
|
||||||
|
bool
|
||||||
|
ArgParser::parseMSWindowsArg(ArgsBase& argsBase, const int& argc, const char* const* argv, int& i)
|
||||||
|
{
|
||||||
if (isArg(i, argc, argv, NULL, "--service")) {
|
if (isArg(i, argc, argv, NULL, "--service")) {
|
||||||
LOG((CLOG_WARN "obsolete argument --service, use barrierd instead."));
|
LOG((CLOG_WARN "obsolete argument --service, use barrierd instead."));
|
||||||
argsBase.m_shouldExit = true;
|
argsBase.m_shouldExit = true;
|
||||||
|
@ -153,25 +153,46 @@ ArgParser::parsePlatformArg(ArgsBase& argsBase, const int& argc, const char* con
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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)) {
|
if (isArg(i, argc, argv, "-display", "--display", 1)) {
|
||||||
// use alternative display
|
// use alternative display
|
||||||
argsBase.m_display = argv[++i];
|
argsBase.m_display = argv[++i];
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (isArg(i, argc, argv, NULL, "--no-xinitthreads")) {
|
else if (isArg(i, argc, argv, NULL, "--no-xinitthreads")) {
|
||||||
argsBase.m_disableXInitThreads = true;
|
argsBase.m_disableXInitThreads = true;
|
||||||
}
|
} else {
|
||||||
|
|
||||||
else {
|
|
||||||
// option not supported here
|
// option not supported here
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
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
|
#elif WINAPI_CARBON
|
||||||
// no options for carbon
|
return parseCarbonArg(argsBase, argc, argv, i);
|
||||||
return false;
|
#elif WINAPI_XWINDOWS
|
||||||
|
return parseXWindowsArg(argsBase, argc, argv, i);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -352,7 +373,7 @@ ArgParser::splitCommandString(String& command, std::vector<String>& argv)
|
||||||
if (space > leftDoubleQuote && space < rightDoubleQuote) {
|
if (space > leftDoubleQuote && space < rightDoubleQuote) {
|
||||||
ignoreThisSpace = true;
|
ignoreThisSpace = true;
|
||||||
}
|
}
|
||||||
else if (space > rightDoubleQuote){
|
else if (space > rightDoubleQuote) {
|
||||||
searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1);
|
searchDoubleQuotes(command, leftDoubleQuote, rightDoubleQuote, rightDoubleQuote + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,9 @@ private:
|
||||||
bool checkUnexpectedArgs();
|
bool checkUnexpectedArgs();
|
||||||
|
|
||||||
static ArgsBase& argsBase() { return *m_argsBase; }
|
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:
|
private:
|
||||||
App* m_app;
|
App* m_app;
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "barrier/DropHelper.h"
|
#include "barrier/DropHelper.h"
|
||||||
|
|
||||||
#include "base/Log.h"
|
#include "base/Log.h"
|
||||||
|
#include "io/fstream.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ DropHelper::writeToDir(const String& destination, DragFileList& fileList, String
|
||||||
dropTarget.append("/");
|
dropTarget.append("/");
|
||||||
#endif
|
#endif
|
||||||
dropTarget.append(fileList.at(0).getFilename());
|
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()) {
|
if (!file.is_open()) {
|
||||||
LOG((CLOG_ERR "drop file failed: can not open %s", dropTarget.c_str()));
|
LOG((CLOG_ERR "drop file failed: can not open %s", dropTarget.c_str()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public:
|
||||||
|
|
||||||
//! Deactivate screen saver
|
//! 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.
|
timer.
|
||||||
*/
|
*/
|
||||||
virtual void deactivate() = 0;
|
virtual void deactivate() = 0;
|
||||||
|
|
|
@ -267,8 +267,8 @@ extern const char* kMsgDSetOptions;
|
||||||
// 2 means the file transfer is finished.
|
// 2 means the file transfer is finished.
|
||||||
extern const char* kMsgDFileTransfer;
|
extern const char* kMsgDFileTransfer;
|
||||||
|
|
||||||
// drag infomation: primary <-> secondary
|
// drag information: primary <-> secondary
|
||||||
// transfer drag infomation. The first 2 bytes are used for storing
|
// transfer drag information. The first 2 bytes are used for storing
|
||||||
// the number of dragging objects. Then the following string consists
|
// the number of dragging objects. Then the following string consists
|
||||||
// of each object's directory.
|
// of each object's directory.
|
||||||
extern const char* kMsgDDragInfo;
|
extern const char* kMsgDDragInfo;
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
#include "base/log_outputters.h"
|
#include "base/log_outputters.h"
|
||||||
#include "base/Log.h"
|
#include "base/Log.h"
|
||||||
#include "common/DataDirectories.h"
|
#include "common/DataDirectories.h"
|
||||||
#include "base/Unicode.h"
|
|
||||||
|
|
||||||
#include "arch/win32/ArchMiscWindows.h"
|
#include "arch/win32/ArchMiscWindows.h"
|
||||||
#include "arch/win32/XArchWindows.h"
|
#include "arch/win32/XArchWindows.h"
|
||||||
|
@ -258,7 +257,7 @@ DaemonApp::handleIpcMessage(const Event& e, void*)
|
||||||
switch (m->type()) {
|
switch (m->type()) {
|
||||||
case kIpcCommand: {
|
case kIpcCommand: {
|
||||||
IpcCommandMessage* cm = static_cast<IpcCommandMessage*>(m);
|
IpcCommandMessage* cm = static_cast<IpcCommandMessage*>(m);
|
||||||
String command = Unicode::UTF8ToText(cm->command());
|
String command = cm->command();
|
||||||
|
|
||||||
// if empty quotes, clear.
|
// if empty quotes, clear.
|
||||||
if (command == "\"\"") {
|
if (command == "\"\"") {
|
||||||
|
|
|
@ -62,7 +62,7 @@ Log::Log()
|
||||||
{
|
{
|
||||||
assert(s_log == NULL);
|
assert(s_log == NULL);
|
||||||
|
|
||||||
// other initalization
|
// other initialization
|
||||||
m_maxPriority = g_defaultMaxPriority;
|
m_maxPriority = g_defaultMaxPriority;
|
||||||
m_maxNewlineLength = 0;
|
m_maxNewlineLength = 0;
|
||||||
insert(new ConsoleLogOutputter);
|
insert(new ConsoleLogOutputter);
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
#include "base/TMethodJob.h"
|
#include "base/TMethodJob.h"
|
||||||
#include "arch/Arch.h"
|
#include "arch/Arch.h"
|
||||||
#include "base/String.h"
|
#include "base/String.h"
|
||||||
|
#include "io/fstream.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
enum EFileLogOutputter {
|
enum EFileLogOutputter {
|
||||||
|
@ -260,7 +260,7 @@ FileLogOutputter::write(ELevel level, const char *message)
|
||||||
bool moveFile = false;
|
bool moveFile = false;
|
||||||
|
|
||||||
std::ofstream m_handle;
|
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) {
|
if (m_handle.is_open() && m_handle.fail() != true) {
|
||||||
m_handle << message << std::endl;
|
m_handle << message << std::endl;
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,7 @@ public:
|
||||||
*/
|
*/
|
||||||
NetworkAddress getServerAddress() const;
|
NetworkAddress getServerAddress() const;
|
||||||
|
|
||||||
//! Return true if recieved file size is valid
|
//! Return true if received file size is valid
|
||||||
bool isReceivedFileSizeValid();
|
bool isReceivedFileSizeValid();
|
||||||
|
|
||||||
//! Return expected file size
|
//! Return expected file size
|
||||||
|
|
|
@ -18,13 +18,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#if defined(_WIN32)
|
#if HAVE_CONFIG_H
|
||||||
# define SYSAPI_WIN32 1
|
|
||||||
# define WINAPI_MSWINDOWS 1
|
|
||||||
#elif HAVE_CONFIG_H
|
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#else
|
|
||||||
# error "config.h missing"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// VC++ has built-in sized types
|
// VC++ has built-in sized types
|
||||||
|
|
|
@ -16,12 +16,26 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "../DataDirectories.h"
|
#include "../DataDirectories.h"
|
||||||
#include "KnownFolderPaths.h"
|
#include "encoding_utilities.h"
|
||||||
|
|
||||||
|
#include <Shlobj.h>
|
||||||
|
|
||||||
|
std::string known_folder_path(const KNOWNFOLDERID& id)
|
||||||
|
{
|
||||||
|
std::string path;
|
||||||
|
WCHAR* buffer;
|
||||||
|
HRESULT result = SHGetKnownFolderPath(id, 0, NULL, &buffer);
|
||||||
|
if (result == S_OK) {
|
||||||
|
path = win_wchar_to_utf8(buffer);
|
||||||
|
CoTaskMemFree(buffer);
|
||||||
|
}
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& DataDirectories::profile()
|
const std::string& DataDirectories::profile()
|
||||||
{
|
{
|
||||||
if (_profile.empty())
|
if (_profile.empty())
|
||||||
_profile = localAppDataPath() + "\\Barrier";
|
_profile = known_folder_path(FOLDERID_LocalAppData) + "\\Barrier";
|
||||||
return _profile;
|
return _profile;
|
||||||
}
|
}
|
||||||
const std::string& DataDirectories::profile(const std::string& path)
|
const std::string& DataDirectories::profile(const std::string& path)
|
||||||
|
@ -33,7 +47,7 @@ const std::string& DataDirectories::profile(const std::string& path)
|
||||||
const std::string& DataDirectories::global()
|
const std::string& DataDirectories::global()
|
||||||
{
|
{
|
||||||
if (_global.empty())
|
if (_global.empty())
|
||||||
_global = programDataPath() + "\\Barrier";
|
_global = known_folder_path(FOLDERID_ProgramData) + "\\Barrier";
|
||||||
return _global;
|
return _global;
|
||||||
}
|
}
|
||||||
const std::string& DataDirectories::global(const std::string& path)
|
const std::string& DataDirectories::global(const std::string& path)
|
||||||
|
@ -45,7 +59,7 @@ const std::string& DataDirectories::global(const std::string& path)
|
||||||
const std::string& DataDirectories::systemconfig()
|
const std::string& DataDirectories::systemconfig()
|
||||||
{
|
{
|
||||||
// systemconfig() is a special case in that it will track the current value
|
// 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!
|
// previously it would default to the windows folder which was horrible!
|
||||||
if (_systemconfig.empty())
|
if (_systemconfig.empty())
|
||||||
return global();
|
return global();
|
||||||
|
|
|
@ -1,63 +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/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "KnownFolderPaths.h"
|
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <Shlobj.h>
|
|
||||||
|
|
||||||
static std::string wide_to_mb(const wchar_t* source, int length)
|
|
||||||
{
|
|
||||||
int ansiLength = WideCharToMultiByte(CP_ACP, 0, source, length, NULL, 0, NULL, NULL);
|
|
||||||
if (ansiLength > 0) {
|
|
||||||
std::string ansiString(ansiLength, 0);
|
|
||||||
ansiLength = WideCharToMultiByte(CP_ACP, 0, source, length, &ansiString[0], ansiLength, NULL, NULL);
|
|
||||||
if (ansiLength > 0) {
|
|
||||||
return ansiString;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
static std::string known_folder_path(const KNOWNFOLDERID& id)
|
|
||||||
{
|
|
||||||
std::string path;
|
|
||||||
WCHAR* buffer;
|
|
||||||
HRESULT result = SHGetKnownFolderPath(id, 0, NULL, &buffer);
|
|
||||||
if (result == S_OK) {
|
|
||||||
auto length = lstrlenW(buffer);
|
|
||||||
path = wide_to_mb(buffer, length);
|
|
||||||
CoTaskMemFree(buffer);
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string desktopPath()
|
|
||||||
{
|
|
||||||
return known_folder_path(FOLDERID_Desktop);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string localAppDataPath()
|
|
||||||
{
|
|
||||||
return known_folder_path(FOLDERID_LocalAppData);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string programDataPath()
|
|
||||||
{
|
|
||||||
return known_folder_path(FOLDERID_ProgramData);
|
|
||||||
}
|
|
|
@ -1,24 +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>
|
|
||||||
|
|
||||||
std::string desktopPath();
|
|
||||||
std::string localAppDataPath();
|
|
||||||
std::string programDataPath();
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
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 "fstream.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 std::string& path, std::ios_base::openmode mode)
|
||||||
|
{
|
||||||
|
#if SYSAPI_WIN32
|
||||||
|
// on Windows we need to use a private constructor from wchar_t* string.
|
||||||
|
auto wchar_path = utf8_to_win_char(path);
|
||||||
|
stream.open(wchar_path.data(), mode);
|
||||||
|
#else
|
||||||
|
stream.open(path.c_str(), mode);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void open_utf8_path(std::ifstream& stream, const std::string& path, std::ios_base::openmode mode)
|
||||||
|
{
|
||||||
|
open_utf8_path_impl(stream, path, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void open_utf8_path(std::ofstream& stream, const std::string& path, std::ios_base::openmode mode)
|
||||||
|
{
|
||||||
|
open_utf8_path_impl(stream, path, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void open_utf8_path(std::fstream& stream, const std::string& path, std::ios_base::openmode mode)
|
||||||
|
{
|
||||||
|
open_utf8_path_impl(stream, path, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace barrier
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
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_FSTREAM_H
|
||||||
|
#define BARRIER_LIB_IO_FSTREAM_H
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <ios>
|
||||||
|
|
||||||
|
namespace barrier {
|
||||||
|
|
||||||
|
void open_utf8_path(std::ifstream& stream, const std::string& path,
|
||||||
|
std::ios_base::openmode mode = std::ios_base::in);
|
||||||
|
void open_utf8_path(std::ofstream& stream, const std::string& path,
|
||||||
|
std::ios_base::openmode mode = std::ios_base::out);
|
||||||
|
void open_utf8_path(std::fstream& stream, const std::string& path,
|
||||||
|
std::ios_base::openmode mode = std::ios_base::in | std::ios_base::out);
|
||||||
|
|
||||||
|
} // namespace barrier
|
||||||
|
|
||||||
|
#endif
|
|
@ -29,7 +29,6 @@
|
||||||
#include "base/EventQueue.h"
|
#include "base/EventQueue.h"
|
||||||
#include "base/TMethodEventJob.h"
|
#include "base/TMethodEventJob.h"
|
||||||
#include "base/TMethodJob.h"
|
#include "base/TMethodJob.h"
|
||||||
#include "base/Unicode.h"
|
|
||||||
|
|
||||||
enum EIpcLogOutputter {
|
enum EIpcLogOutputter {
|
||||||
kBufferMaxSize = 1000,
|
kBufferMaxSize = 1000,
|
||||||
|
@ -197,7 +196,7 @@ IpcLogOutputter::sendBuffer()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IpcLogLineMessage message(Unicode::textToUTF8(getChunk(kMaxSendLines)));
|
IpcLogLineMessage message(getChunk(kMaxSendLines));
|
||||||
m_sending = true;
|
m_sending = true;
|
||||||
m_ipcServer.send(message, kIpcClientGui);
|
m_ipcServer.send(message, kIpcClientGui);
|
||||||
m_sending = false;
|
m_sending = false;
|
||||||
|
|
|
@ -25,7 +25,7 @@ class IJob;
|
||||||
//! Thread handle
|
//! Thread handle
|
||||||
/*!
|
/*!
|
||||||
Creating a Thread creates a new context of execution (i.e. thread) that
|
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
|
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.
|
refers to and multiple Thread objects can refer to the same thread.
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ public:
|
||||||
/*!
|
/*!
|
||||||
Change the priority of the thread. Normal priority is 0, 1 is
|
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 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);
|
void setPriority(int n);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ public:
|
||||||
If \c hostname can be parsed as a numerical address then that's how
|
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
|
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,
|
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
|
port number (zero is not a valid port number) otherwise \c XSocketAddress
|
||||||
is thrown with an error of \c XSocketAddress::kBadPort. The hostname
|
is thrown with an error of \c XSocketAddress::kBadPort. The hostname
|
||||||
is not resolved by the c'tor; use \c resolve to do that.
|
is not resolved by the c'tor; use \c resolve to do that.
|
||||||
|
|
|
@ -24,7 +24,7 @@ class IEventQueue;
|
||||||
class SocketMultiplexer;
|
class SocketMultiplexer;
|
||||||
class IDataSocket;
|
class IDataSocket;
|
||||||
|
|
||||||
class SecureListenSocket : public TCPListenSocket{
|
class SecureListenSocket : public TCPListenSocket {
|
||||||
public:
|
public:
|
||||||
SecureListenSocket(IEventQueue* events,
|
SecureListenSocket(IEventQueue* events,
|
||||||
SocketMultiplexer* socketMultiplexer,
|
SocketMultiplexer* socketMultiplexer,
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "base/Log.h"
|
#include "base/Log.h"
|
||||||
#include "base/String.h"
|
#include "base/String.h"
|
||||||
#include "common/DataDirectories.h"
|
#include "common/DataDirectories.h"
|
||||||
|
#include "io/fstream.h"
|
||||||
|
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
|
@ -658,7 +659,7 @@ SecureSocket::disconnect()
|
||||||
void SecureSocket::formatFingerprint(std::string& fingerprint, bool hex, bool separator)
|
void SecureSocket::formatFingerprint(std::string& fingerprint, bool hex, bool separator)
|
||||||
{
|
{
|
||||||
if (hex) {
|
if (hex) {
|
||||||
// to hexidecimal
|
// to hexadecimal
|
||||||
barrier::string::toHex(fingerprint, 2);
|
barrier::string::toHex(fingerprint, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,7 +667,7 @@ void SecureSocket::formatFingerprint(std::string& fingerprint, bool hex, bool se
|
||||||
barrier::string::uppercase(fingerprint);
|
barrier::string::uppercase(fingerprint);
|
||||||
|
|
||||||
if (separator) {
|
if (separator) {
|
||||||
// add colon to separate each 2 charactors
|
// add colon to separate each 2 characters
|
||||||
size_t separators = fingerprint.size() / 2;
|
size_t separators = fingerprint.size() / 2;
|
||||||
for (size_t i = 1; i < separators; i++) {
|
for (size_t i = 1; i < separators; i++) {
|
||||||
fingerprint.insert(i * 3 - 1, ":");
|
fingerprint.insert(i * 3 - 1, ":");
|
||||||
|
@ -708,7 +709,7 @@ SecureSocket::verifyCertFingerprint()
|
||||||
// check if this fingerprint exist
|
// check if this fingerprint exist
|
||||||
std::string fileLine;
|
std::string fileLine;
|
||||||
std::ifstream file;
|
std::ifstream file;
|
||||||
file.open(trustedServersFilename.c_str());
|
barrier::open_utf8_path(file, trustedServersFilename);
|
||||||
|
|
||||||
if (!file.is_open()) {
|
if (!file.is_open()) {
|
||||||
LOG((CLOG_NOTE "Unable to open trustedServersFile: %s", trustedServersFilename.c_str() ));
|
LOG((CLOG_NOTE "Unable to open trustedServersFile: %s", trustedServersFilename.c_str() ));
|
||||||
|
@ -830,7 +831,7 @@ SecureSocket::showSecureCipherInfo()
|
||||||
}
|
}
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
// m_ssl->m_ssl->session->ciphers is not forward compatable,
|
// m_ssl->m_ssl->session->ciphers is not forward compatible,
|
||||||
// In future release of OpenSSL, it's not visible,
|
// In future release of OpenSSL, it's not visible,
|
||||||
STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers;
|
STACK_OF(SSL_CIPHER) * cStack = m_ssl->m_ssl->session->ciphers;
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -803,7 +803,7 @@ MSWindowsDesks::checkDesk()
|
||||||
|
|
||||||
// if active desktop changed then tell the old and new desk threads
|
// if active desktop changed then tell the old and new desk threads
|
||||||
// about the change. don't switch desktops when the screensaver is
|
// 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
|
// which would have the side effect of forcing the screensaver to
|
||||||
// stop.
|
// stop.
|
||||||
if (name != m_activeDeskName && !m_screensaver->isActive()) {
|
if (name != m_activeDeskName && !m_screensaver->isActive()) {
|
||||||
|
|
|
@ -61,12 +61,12 @@ const KeyID MSWindowsKeyState::s_virtualKey[] =
|
||||||
/* 0x012 */ { kKeyAlt_L }, // VK_MENU
|
/* 0x012 */ { kKeyAlt_L }, // VK_MENU
|
||||||
/* 0x013 */ { kKeyPause }, // VK_PAUSE
|
/* 0x013 */ { kKeyPause }, // VK_PAUSE
|
||||||
/* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL
|
/* 0x014 */ { kKeyCapsLock }, // VK_CAPITAL
|
||||||
/* 0x015 */ { kKeyKana }, // VK_HANGUL, VK_KANA
|
/* 0x015 */ { kKeyNone }, // undefined
|
||||||
/* 0x016 */ { kKeyNone }, // undefined
|
/* 0x016 */ { kKeyKana }, // VK_HANGUL, VK_KANA, VK_IME_ON
|
||||||
/* 0x017 */ { kKeyNone }, // VK_JUNJA
|
/* 0x017 */ { kKeyNone }, // VK_JUNJA
|
||||||
/* 0x018 */ { kKeyNone }, // VK_FINAL
|
/* 0x018 */ { kKeyNone }, // VK_FINAL
|
||||||
/* 0x019 */ { kKeyKanzi }, // VK_HANJA, VK_KANJI
|
/* 0x019 */ { kKeyKanzi }, // VK_HANJA, VK_KANJI
|
||||||
/* 0x01a */ { kKeyNone }, // undefined
|
/* 0x01a */ { kKeyEisuToggle }, // VK_IME_OFF
|
||||||
/* 0x01b */ { kKeyEscape }, // VK_ESCAPE
|
/* 0x01b */ { kKeyEscape }, // VK_ESCAPE
|
||||||
/* 0x01c */ { kKeyHenkan }, // VK_CONVERT
|
/* 0x01c */ { kKeyHenkan }, // VK_CONVERT
|
||||||
/* 0x01d */ { kKeyMuhenkan }, // VK_NONCONVERT
|
/* 0x01d */ { kKeyMuhenkan }, // VK_NONCONVERT
|
||||||
|
@ -1330,7 +1330,7 @@ MSWindowsKeyState::getKeyID(UINT virtualKey, KeyButton button) const
|
||||||
if ((LOWORD(m_keyLayout) & 0xffffu) == 0x0412u) { // 0x0412 : Korean Locale ID
|
if ((LOWORD(m_keyLayout) & 0xffffu) == 0x0412u) { // 0x0412 : Korean Locale ID
|
||||||
if (virtualKey == VK_HANGUL || virtualKey == VK_HANJA) {
|
if (virtualKey == VK_HANGUL || virtualKey == VK_HANJA) {
|
||||||
// If shift-space is used to change the input mode,
|
// 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;
|
button |= 0x100u;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,9 +41,9 @@
|
||||||
#include "base/IEventQueue.h"
|
#include "base/IEventQueue.h"
|
||||||
#include "base/TMethodEventJob.h"
|
#include "base/TMethodEventJob.h"
|
||||||
#include "base/TMethodJob.h"
|
#include "base/TMethodJob.h"
|
||||||
#include "common/win32/KnownFolderPaths.h"
|
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <Shlobj.h>
|
||||||
#include <comutil.h>
|
#include <comutil.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
|
@ -1916,12 +1916,14 @@ const std::string&
|
||||||
MSWindowsScreen::getDropTarget() const
|
MSWindowsScreen::getDropTarget() const
|
||||||
{
|
{
|
||||||
if (m_dropTargetPath.empty()) {
|
if (m_dropTargetPath.empty()) {
|
||||||
m_dropTargetPath = desktopPath();
|
// SHGetFolderPath is deprecated in vista, but use it for xp support.
|
||||||
if (!m_dropTargetPath.empty()) {
|
char desktopPath[MAX_PATH];
|
||||||
LOG((CLOG_DEBUG "using desktop for drop target: %s", m_dropTargetPath.c_str()));
|
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 {
|
else {
|
||||||
LOG((CLOG_ERR "failed to get desktop path, no drop target available"));
|
LOG((CLOG_ERR "failed to get desktop path, no drop target available, error=%d", GetLastError()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return m_dropTargetPath;
|
return m_dropTargetPath;
|
||||||
|
|
|
@ -94,7 +94,7 @@ MSWindowsSession::isProcessInSession(const char* name, PHANDLE process = NULL)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string nameListJoin;
|
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++) {
|
it != nameList.end(); it++) {
|
||||||
nameListJoin.append(*it);
|
nameListJoin.append(*it);
|
||||||
nameListJoin.append(", ");
|
nameListJoin.append(", ");
|
||||||
|
|
|
@ -81,7 +81,7 @@ private:
|
||||||
|
|
||||||
//! Relauncher error
|
//! Relauncher error
|
||||||
/*!
|
/*!
|
||||||
An error occured in the process watchdog.
|
An error occurred in the process watchdog.
|
||||||
*/
|
*/
|
||||||
class XMSWindowsWatchdogError : public XBarrier {
|
class XMSWindowsWatchdogError : public XBarrier {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -52,7 +52,7 @@ OSXClipboard::OSXClipboard() :
|
||||||
|
|
||||||
OSStatus syncErr = PasteboardSynchronize(m_pboard);
|
OSStatus syncErr = PasteboardSynchronize(m_pboard);
|
||||||
if (syncErr != noErr) {
|
if (syncErr != noErr) {
|
||||||
LOG((CLOG_DEBUG "failed to syncronize clipboard: error %i", syncErr));
|
LOG((CLOG_DEBUG "failed to synchronize clipboard: error %i", syncErr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ fakeDragging(const char* str, int cursorX, int cursorY)
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
NSRect screen = [[NSScreen mainScreen] frame];
|
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);
|
NSLog ( @"mouseLocation: %d %d", cursorX, cursorY);
|
||||||
|
|
||||||
int newPosX = 0;
|
int newPosX = 0;
|
||||||
|
|
|
@ -43,6 +43,9 @@ static const UInt32 s_launchpadVK = 131;
|
||||||
|
|
||||||
static const UInt32 s_osxNumLock = 1 << 16;
|
static const UInt32 s_osxNumLock = 1 << 16;
|
||||||
|
|
||||||
|
static const UInt32 s_int4VK = 0x8a; // international4
|
||||||
|
static const UInt32 s_int5VK = 0x8b; // international5
|
||||||
|
|
||||||
struct KeyEntry {
|
struct KeyEntry {
|
||||||
public:
|
public:
|
||||||
KeyID m_keyID;
|
KeyID m_keyID;
|
||||||
|
@ -126,7 +129,10 @@ static const KeyEntry s_controlKeys[] = {
|
||||||
|
|
||||||
// JIS keyboards only
|
// JIS keyboards only
|
||||||
{ kKeyEisuToggle, kVK_JIS_Eisu },
|
{ kKeyEisuToggle, kVK_JIS_Eisu },
|
||||||
{ kKeyKana, kVK_JIS_Kana }
|
{ kKeyKana, kVK_JIS_Kana },
|
||||||
|
{ kKeyMuhenkan, s_int5VK },
|
||||||
|
{ kKeyHenkan, s_int4VK },
|
||||||
|
{ kKeyZenkaku, kVK_ANSI_Grave }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -538,10 +538,10 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
|
||||||
|
|
||||||
// As long as the click is within the time window and distance window
|
// As long as the click is within the time window and distance window
|
||||||
// increase clickState (double click, triple click, etc)
|
// 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
|
// does not specify that this should be limited to triple click
|
||||||
if (press) {
|
if (press) {
|
||||||
if ((ARCH->time() - m_lastClickTime) <= clickTime && diff <= maxDiff){
|
if ((ARCH->time() - m_lastClickTime) <= clickTime && diff <= maxDiff) {
|
||||||
m_clickState++;
|
m_clickState++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -551,7 +551,7 @@ OSXScreen::fakeMouseButton(ButtonID id, bool press)
|
||||||
m_lastClickTime = ARCH->time();
|
m_lastClickTime = ARCH->time();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_clickState == 1){
|
if (m_clickState == 1) {
|
||||||
m_lastSingleClickXCursor = m_xCursor;
|
m_lastSingleClickXCursor = m_xCursor;
|
||||||
m_lastSingleClickYCursor = m_yCursor;
|
m_lastSingleClickYCursor = m_yCursor;
|
||||||
}
|
}
|
||||||
|
@ -1618,7 +1618,7 @@ OSXScreen::userSwitchCallback(EventHandlerCallRef nextHandler,
|
||||||
//
|
//
|
||||||
// OSXScreen::watchSystemPowerThread(void*)
|
// 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
|
void
|
||||||
|
|
|
@ -115,7 +115,7 @@ private:
|
||||||
// the X display
|
// the X display
|
||||||
Display* m_display;
|
Display* m_display;
|
||||||
|
|
||||||
// window to receive xscreensaver repsonses
|
// window to receive xscreensaver responses
|
||||||
Window m_xscreensaverSink;
|
Window m_xscreensaverSink;
|
||||||
|
|
||||||
// the target for the events we generate
|
// the target for the events we generate
|
||||||
|
|
|
@ -1136,9 +1136,9 @@ Server::processOptions()
|
||||||
return;
|
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_switchNeedsControl = false; // lines, the 'reload config' option
|
||||||
m_switchNeedsAlt = false; // doesnt' work correct.
|
m_switchNeedsAlt = false; // doesn't work correct.
|
||||||
|
|
||||||
bool newRelativeMoves = m_relativeMoves;
|
bool newRelativeMoves = m_relativeMoves;
|
||||||
for (Config::ScreenOptions::const_iterator index = options->begin();
|
for (Config::ScreenOptions::const_iterator index = options->begin();
|
||||||
|
|
|
@ -167,7 +167,7 @@ public:
|
||||||
*/
|
*/
|
||||||
void getClients(std::vector<std::string>& list) const;
|
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();
|
bool isReceivedFileSizeValid();
|
||||||
|
|
||||||
//! Return expected file data size
|
//! Return expected file data size
|
||||||
|
@ -357,7 +357,7 @@ private:
|
||||||
// force the cursor off of \p client
|
// force the cursor off of \p client
|
||||||
void forceLeaveClient(BaseClientProxy* client);
|
void forceLeaveClient(BaseClientProxy* client);
|
||||||
|
|
||||||
// thread funciton for sending file
|
// thread function for sending file
|
||||||
void sendFileThread(void*);
|
void sendFileThread(void*);
|
||||||
|
|
||||||
// thread function for writing file to drop directory
|
// thread function for writing file to drop directory
|
||||||
|
|
Loading…
Reference in New Issue