Revert "adding headers for minizip"

This reverts commit f799d08289.
This commit is contained in:
Julien Wadel 2020-01-29 14:55:30 +01:00
parent 4a43f00e31
commit ea680e4e77
68 changed files with 3020 additions and 2732 deletions

View file

@ -0,0 +1,80 @@
job-archlinux-latest-makefile-gcc:
tags: [ "docker-archlinux-latest" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-archlinux:latest
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-archlinux-latest-makefile-clang:
tags: [ "docker-archlinux-latest" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-archlinux:latest
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
job-archlinux-latest-ninja-gcc:
tags: [ "docker-archlinux-latest" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-archlinux:latest
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Ninja
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-archlinux-latest-ninja-gcc-novideo:
tags: [ "docker-archlinux-latest" ]
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-archlinux-latest-ninja-gcc
job-archlinux-latest-ninja-clang:
tags: [ "docker-archlinux-latest" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-archlinux:latest
variables:
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
extends: .job-linux-desktop
job-archlinux-latest-ninja-clang-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-archlinux-latest-ninja-clang

View file

@ -0,0 +1,80 @@
job-centos7-makefile-gcc:
tags: [ "docker-centos7" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-centos:7
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-centos7-makefile-clang:
tags: [ "docker-centos7" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-centos:7
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
job-centos7-ninja-gcc:
tags: [ "docker-centos7" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-centos:7
variables:
CMAKE_GENERATOR: Ninja
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-centos7-ninja-gcc-novideo:
tags: [ "docker-centos7" ]
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-centos7-ninja-gcc
job-centos7-ninja-clang:
tags: [ "docker-centos7" ]
only:
variables:
- $NIGHTLY_MASTER
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-centos:7
variables:
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
CMAKE_OPTIONS: -DENABLE_LIME=ON
extends: .job-linux-desktop
job-centos7-ninja-clang-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-centos7-ninja-clang

View file

@ -0,0 +1,100 @@
#################################################
# Makefile
#################################################
job-debian10-makefile-gcc:
tags: [ "docker-debian10" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:10
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
job-debian10-makefile-clang:
tags: [ "docker-debian10" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:10
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
job-debian10-ninja-gcc:
tags: [ "docker-debian10" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:10
variables:
CMAKE_GENERATOR: Ninja
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-debian10-ninja-gcc-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-debian10-ninja-gcc
job-debian10-ninja-gcc-smallsdk:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO -DENABLE_ADVANCED_IM=NO -DENABLE_DB_STORAGE=NO
extends: job-debian10-ninja-gcc
job-debian10-ninja-clang:
tags: [ "docker-debian10" ]
only:
variables:
- $NIGHTLY_MASTER
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:10
variables:
CMAKE_OPTIONS: -DENABLE_DOC=ON
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
extends: .job-linux-desktop
job-debian10-ninja-clang-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-debian10-ninja-clang
#################################################
# TESTS
#################################################

View file

@ -0,0 +1,57 @@
#################################################
# Makefile
#################################################
job-debian8-makefile-gcc:
tags: [ "docker-debian8" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:8
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
LBC_NODEBUG_OPTIONS: -- -j$MAKEFILE_JOBS
extends: .job-linux-desktop
job-debian8-makefile-clang:
tags: [ "docker-debian8" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:8
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
LBC_NODEBUG_OPTIONS: -- -j$MAKEFILE_JOBS
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
#job-debian8-ninja-gcc:
#
# tags: [ "docker-debian8" ]
# image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:8
# variables:
# CMAKE_GENERATOR: Ninja
# CC: gcc
# CXX: g++
# extends: .job-linux-desktop
#job-debian8-ninja-clang:
#
# tags: [ "docker-debian8" ]
# image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:8
# variables:
# CMAKE_GENERATOR: Ninja
# CC: clang
# CXX: clang++
# extends: .job-linux-desktop

View file

@ -0,0 +1,87 @@
job-debian9-makefile-gcc:
tags: [ "docker-debian9" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:9
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
job-debian9-makefile-clang:
tags: [ "docker-debian9" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:9
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
job-debian9-ninja-gcc:
tags: [ "docker-debian9" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:9
variables:
CMAKE_GENERATOR: Ninja
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-debian9-ninja-gcc-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-debian9-ninja-gcc
job-debian9-ninja-gcc-smallsdk:
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO -DENABLE_ADVANCED_IM=NO -DENABLE_DB_STORAGE=NO
extends: job-debian9-ninja-gcc
job-debian9-ninja-clang:
tags: [ "docker-debian9" ]
only:
variables:
- $NIGHTLY_MASTER
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-debian:9
variables:
CMAKE_OPTIONS: -DENABLE_DOC=ON
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
extends: .job-linux-desktop
job-debian9-ninja-clang-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-debian9-ninja-clang

View file

@ -0,0 +1,82 @@
#################################################
# Makefile
#################################################
job-ubuntu-rolling-makefile-gcc:
tags: [ "docker-ubuntu-rolling" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:rolling
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: gcc
CXX: g++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
job-ubuntu-rolling-makefile-clang:
tags: [ "docker-ubuntu-rolling" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:rolling
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
CC: clang
CXX: clang++
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-linux-desktop
#################################################
# Ninja
#################################################
job-ubuntu-rolling-ninja-gcc:
tags: [ "docker-ubuntu-rolling" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:rolling
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Ninja
CC: gcc
CXX: g++
extends: .job-linux-desktop
job-ubuntu-rolling-ninja-gcc-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-ubuntu-rolling-ninja-gcc
job-ubuntu-rolling-ninja-clang:
tags: [ "docker-ubuntu-rolling" ]
image: gitlab.linphone.org:4567/bc/public/linphone-sdk/bc-dev-ubuntu:rolling
variables:
CMAKE_GENERATOR: Ninja
CC: clang
CXX: clang++
extends: .job-linux-desktop
job-ubuntu-rolling-ninja-clang-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-ubuntu-rolling-ninja-clang

View file

@ -0,0 +1,43 @@
#################################################
# BUILD
#################################################
.job-linux-desktop:
stage: build
extends: .linux-prepare
script:
- export CC=$CC
- export CXX=$CXX
- mkdir -p build-desktop/OUTPUT
- export
- echo $CMAKE_GENERATOR
- echo $DEFAULT_LINUX_CMAKE_OPTIONS
- echo $CMAKE_OPTIONS
- echo $CMAKE_SANITIZER_OPTIONS
# SDK Building
- mkdir -p linphone-sdk/build-sdk
- cd linphone-sdk/build-sdk
- cmake .. -G "$CMAKE_GENERATOR" -DLINPHONESDK_PLATFORM=Desktop $DEFAULT_LINUX_CMAKE_OPTIONS $CMAKE_OPTIONS $SCHEDULE_CMAKE_OPTIONS $CMAKE_SANITIZER_OPTIONS
- cmake --build . --target sdk $LBC_NODEBUG_OPTIONS
- cd ../../submodules/externals/minizip
# Minizip submodule Building
- mkdir -p build-minizip
- cd build-minizip
- cmake .. -G "$CMAKE_GENERATOR" $DEFAULT_LINUX_CMAKE_OPTIONS $CMAKE_OPTIONS $SCHEDULE_CMAKE_OPTIONS $CMAKE_SANITIZER_OPTIONS -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="../../../linphone-sdk/build-sdk/linphone-sdk/desktop"
- cmake --build . --target all $LBC_NODEBUG_OPTIONS
- cmake --build . --target install
# Desktop Building
- cd ../../../../build-desktop
- cmake .. -G "$CMAKE_GENERATOR" $DEFAULT_LINUX_CMAKE_OPTIONS $CMAKE_OPTIONS $SCHEDULE_CMAKE_OPTIONS $CMAKE_SANITIZER_OPTIONS -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="linphone-sdk/build-sdk/linphone-sdk/desktop;submodules/externals/minizip/build-minizip/OUTPUT"
- cmake --build . --target all -- $ADDITIONAL_BUILD_OPTIONS
- cmake --build . --target install -- $ADDITIONAL_BUILD_OPTIONS
artifacts:
paths:
- build-desktop/OUTPUT
- linphone-sdk/build-sdk/linphone-sdk/desktop
- submodules/externals/minizip/build-minizip/OUTPUT
expire_in: 1 week

View file

@ -0,0 +1,34 @@
.linux-prepare:
cache:
key: $CI_JOB_NAME
paths:
- ccache/
extends: .job-prepare
before_script:
##
## If a TUNNEL_USER_KEY is defined then start ssh-agent and add the key
##
- if ! [ -z ${TUNNEL_USER_KEY+x} ]; then eval $(ssh-agent -s); fi
- if ! [ -z ${TUNNEL_USER_KEY+x} ]; then echo "$TUNNEL_USER_KEY" | tr -d '\r' | ssh-add - > /dev/null; fi
- if ! [ -z ${TUNNEL_USER_KEY+x} ]; then mkdir -p ~/.ssh && chmod 700 ~/.ssh; fi
- if ! [ -z ${TUNNEL_USER_KEY+x} ]; then echo -e "Host gitlab.linphone.org\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config; fi
##
## Then configure ccache
##
- mkdir -p ccache
- echo "max_size = $CCACHE_SIZE" > ccache/ccache.conf
- echo $CCACHE_SIZE
- echo ${PWD}/ccache
- export CCACHE_BASEDIR=${PWD}
- export CCACHE_DIR=${PWD}/ccache
- ccache -s
after_script:
- if ! [ -z ${TUNNEL_USER_KEY+x} ]; then rm -rf ~/.ssh || true; fi
- export CCACHE_DIR=${PWD}/ccache
- ccache -s

View file

@ -0,0 +1,105 @@
.job-macosx-desktop:
stage: build
tags: [ "macosx" ]
script:
- ccache -s
- export Qt5_DIR=/usr/local/opt/qt/lib/cmake
- export PATH=$PATH:/usr/local/opt/qt/bin
- if [ -d "build-desktop" ]; then rm -rf build-desktop; fi;
- mkdir -p build-desktop/OUTPUT
- cd linphone-sdk
#SDK Building
- if [ -d "build-sdk" ]; then rm -rf build-sdk; fi;
- mkdir -p build-sdk
- cd build-sdk
- echo $CMAKE_GENERATOR
- echo $DEFAULT_MACOS_CMAKE_OPTIONS
- echo $CMAKE_OPTIONS
- echo $ADDITIONAL_BUILD_OPTIONS
- cmake .. -G "$CMAKE_GENERATOR" -DLINPHONESDK_PLATFORM=Desktop $DEFAULT_MACOS_CMAKE_OPTIONS $XCODE_OPTIONS $CMAKE_OPTIONS
- cmake --build . $LBC_NODEBUG_OPTIONS
- cd ../../submodules/externals/minizip
# Minizip submodule Building
- if [ -d "build-minizip" ]; then rm -rf build-minizip; fi;
- mkdir -p build-minizip
- cd build-minizip
- cmake .. -G "$CMAKE_GENERATOR" $DEFAULT_MACOS_CMAKE_OPTIONS $XCODE_OPTIONS $CMAKE_OPTIONS -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="../../../linphone-sdk/build-sdk/linphone-sdk/desktop"
- cmake --build . --target all $LBC_NODEBUG_OPTIONS
- cmake --build . --target install
# Desktop Building
- cd ../../../../build-desktop
- cmake .. -G "$CMAKE_GENERATOR" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 $DEFAULT_MACOS_CMAKE_OPTIONS $XCODE_OPTIONS $CMAKE_OPTIONS -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="linphone-sdk/build-sdk/linphone-sdk/desktop;submodules/externals/minizip/build-minizip/OUTPUT"
- cmake --build . --target all -- $ADDITIONAL_BUILD_OPTIONS
# - codesign --verbose -s "$MACOS_SIGNING_IDENTITY" WORK/desktop/Build/linphone_package/Linphone-*.dmg
# - cmake --build . --target install -- $ADDITIONAL_BUILD_OPTIONS
- ccache -s
artifacts:
paths:
- build-desktop/OUTPUT
- linphone-sdk/build-sdk/linphone-sdk/desktop
- submodules/externals/minizip/build-minizip/OUTPUT
expire_in: 1 week
#################################################
# Makefile
#################################################
job-macosx-makefile:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_GENERATOR: Unix Makefiles
ADDITIONAL_BUILD_OPTIONS: -j$MAKEFILE_JOBS
extends: .job-macosx-desktop
#################################################
# Ninja
#################################################
job-macosx-ninja:
variables:
CMAKE_GENERATOR: Ninja
CMAKE_OPTIONS: -DENABLE_UNIT_TESTS=ON
extends: .job-macosx-desktop
job-macosx-ninja-novideo:
only:
variables:
- $NIGHTLY_MASTER
variables:
CMAKE_OPTIONS: -DENABLE_VIDEO=NO
extends: job-macosx-ninja
#################################################
# XCode
#################################################
job-macosx-xcode:
extends: .job-macosx-desktop
variables:
XCODE_OPTIONS: -DLINPHONESDK_MACOS_BASE_URL=$MACOS_SNAPSHOTS_URL
CMAKE_GENERATOR: Xcode
ADDITIONAL_BUILD_OPTIONS: -IDEBuildOperationMaxNumberOfConcurrentCompileTasks=$MAX_NUMBER_TASK
only:
variables:
- $NIGHTLY_MASTER
- $DEPLOY_RUN_MACOSX

View file

@ -0,0 +1,174 @@
#################################################
# BUILD
#################################################
#################################################
# VS2015
#################################################
#Wedo not need vs2015 anymore
#job-windows-vs2015:
#
# extends: .job-prepare
# stage: build
# tags: [ "windows" ]
# except:
# refs:
# - feature/peioMergeCi
#
# except:
# variables:
# - $DEPLOY_RUN_ANDROID
# - $DEPLOY_RUN_IOS
# variables:
# CMAKE_OPTIONS: -DENABLE_LIME_X3DH=NO
#
# script:
# - mkdir build-desktop
# - cd build-desktop
# - cmake .. -G "Visual Studio 14 2015" -DLINPHONESDK_PLATFORM=Desktop -DCMAKE_BUILD_TYPE=Release %DEFAULT_CMAKE_OPTIONS% %CMAKE_OPTIONS%
# - cmake --build . --target sdk --config Release -- /maxcpucount
#job-windows-vs2015-novideo:
#
# only:
# - schedules
# except:
# variables:
# - $DEPLOY_RUN_ANDROID
# - $FAST_LINUX_TESTS
# variables:
# CMAKE_OPTIONS: -DENABLE_VIDEO=NO
# extends: job-windows-vs2015
.job-windows-vs2017:
extends: .job-prepare
stage: build
tags: [ "windows" ]
variables:
CMAKE_OPTIONS: -DENABLE_LIME_X3DH=NO -DENABLE_UNIT_TESTS=ON
script:
- SET Qt5_DIR=C:\Qt\5.12.6\msvc2017\lib\cmake
- IF EXIST build-desktop RMDIR /S /Q build-desktop
- mkdir build-desktop
- cd build-desktop
- mkdir OUTPUT
#SDK Building
- cd ../linphone-sdk
#handling the case of previous job cancellation
- IF EXIST build-sdkdesktop RMDIR /S /Q build-sdkdesktop
- mkdir build-sdk
- cd build-sdk
#we launch the msvc-cl wrapper located in python scripts folder
#this wrapper relays only needed calls to the real compiler
#cache stats display
- C:\PROGRA~1\Python37\Scripts\cl -s
- cmake .. -G "Visual Studio 15 2017" -DLINPHONESDK_PLATFORM=Desktop -DENABLE_CSHARP_WRAPPER=YES -DCMAKE_BUILD_TYPE=Release %DEFAULT_WINDOWS_CMAKE_OPTIONS% %CMAKE_OPTIONS%
- cmake --build . --target sdk --config Release %LBC_NODEBUG_OPTIONS% -- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false
- cd ../../submodules/externals/minizip
# Minizip submodule Building
- IF EXIST build-minizip RMDIR /S /Q build-minizip
- mkdir build-minizip
- cd build-minizip
- cmake .. -G "Visual Studio 15 2017" -DCMAKE_BUILD_TYPE=Release %DEFAULT_WINDOWS_CMAKE_OPTIONS% %CMAKE_OPTIONS% -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="../../../linphone-sdk/build-sdk/linphone-sdk/desktop"
- cmake --build . --target all_build --config Release %LBC_NODEBUG_OPTIONS% -- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false
- cmake --build . --target install --config Release %LBC_NODEBUG_OPTIONS% -- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false
# Desktop Building
- cd ../../../../build-desktop
- cmake .. -G "Visual Studio 15 2017" -DENABLE_CSHARP_WRAPPER=YES -DCMAKE_BUILD_TYPE=Release %DEFAULT_WINDOWS_CMAKE_OPTIONS% %CMAKE_OPTIONS% -DCMAKE_INSTALL_PREFIX=OUTPUT -DCMAKE_PREFIX_PATH="linphone-sdk/build-sdk/linphone-sdk/desktop;submodules/externals/minizip/build-minizip/OUTPUT"
- cmake --build . --target all_build --config Release -- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false
- cmake --build . --target install --config Release -- /maxcpucount /nodeReuse:true /p:TrackFileAccess=false
- C:\PROGRA~1\Python37\Scripts\cl -s
artifacts:
paths:
- build-desktop\OUTPUT
- linphone-sdk\build-sdk\linphone-sdk\desktop
- submodules\externals\minizip\build-minizip\OUTPUT
expire_in: 1 week
.job-windows-vs2017-scheduled:
extends: .job-windows-vs2017
only:
variables:
- $NIGHTLY_MASTER
- $NIGHTLY_RELEASE
- $PACKAGE_RUN_WINDOWS
before_script:
#cache disabled on scheduled builds since we dot not need the fastest build
- set "CLCACHE_DISABLE=1"
job-windows-vs2017:
extends: .job-windows-vs2017
except:
refs:
- schedules
job-windows-vs2017-scheduled:
extends: .job-windows-vs2017-scheduled
job-windows-vs2017-novideo:
extends: .job-windows-vs2017-scheduled
variables:
CMAKE_OPTIONS: -DENABLE_LIME_X3DH=NO -DENABLE_VIDEO=NO
#################################################
# PACKAGE
#################################################
#Remove . when packaging process is ready to use
.job-windows-vs2017-package:
stage: package
tags: [ "windows" ]
dependencies:
- job-windows-vs2017-scheduled
only:
variables:
- $NIGHTLY_MASTER
- $PACKAGE_RUN_WINDOWS
script:
- cd build-desktop/OUTPUT
- IF EXIST deploy RMDIR /S /Q deploy
- mkdir deploy
- copy bin\linphone.exe deploy /Y
- xcopy ..\..\linphone-sdk\build-sdk\linphone-sdk\desktop\bin\*.dll deploy /C /Y
- xcopy ..\..\submodules\externals\minizip\build-minizip\OUTPUT\bin\*.dll deploy /C /Y
- call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\VsDevCmd.bat"
- cd build-desktop
- chdir > chdir_sdk.temp
- set /p OUTPUT_SDK_BUILD=<chdir_sdk.temp
- cd ..\cmake\Windows\wrapper\
- chdir > chdir_wrapper.temp
- set /p OUTPUT_WRAPPER_BUILD=<chdir_wrapper.temp
- msbuild -t:restore CsWrapper.csproj
- msbuild CsWrapper.csproj /p:MDILCompile=true /p:Platform="x86" /t:build /p:Configuration=Release /p:OutputSdkBuild=%OUTPUT_SDK_BUILD%
- cd ..\nuget
- git describe > describe.temp
- set /p DESCRIBE=<describe.temp
- msbuild NuGetLinphoneSDK.vcxproj /p:VersionNumber=%DESCRIBE% /p:OutputSdkBuild=%OUTPUT_SDK_BUILD% /p:OutputWrapperBuild=%OUTPUT_WRAPPER_BUILD%
after_script:
- mkdir "%CI_PROJECT_DIR%/results/windows-nugget"
- dir
- cd cmake/Windows/nuget/
- copy /B *.nupkg "%CI_PROJECT_DIR%/results/windows-nugget"
artifacts:
paths:
- results/*
when: always
expire_in: 1 week

View file

@ -6,27 +6,54 @@ variables:
GIT_SUBMODULE_STRATEGY: recursive
MAKEFILE_JOBS: 5
CCACHE_SIZE: 2G
DEFAULT_LINUX_CMAKE_OPTIONS: -DENABLE_NON_FREE_CODECS=YES -DENABLE_OPENH264=YES
DEFAULT_MACOS_CMAKE_OPTIONS: -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 -DENABLE_UPDATE_CHECK=YES
DEFAULT_WINDOWS_CMAKE_OPTIONS: -DENABLE_NON_FREE_CODECS=YES -DENABLE_OPENH264=YES -DENABLE_UPDATE_CHECK=YES
#this option is used to speedup submodule building times, when we don't need to trace debug (like SDK where it is already tested in its project)
LBC_NODEBUG_OPTIONS : --parallel $MAKEFILE_JOBS
DEFAULT_LINUX_CMAKE_OPTIONS : -DENABLE_TOOLS=OFF
DEFAULT_MACOS_CMAKE_OPTIONS : -DENABLE_TOOLS=OFF
DEFAULT_WINDOWS_CMAKE_OPTIONS : -DENABLE_TOOLS=OFF
# DEFAULT_LINUX_CMAKE_OPTIONS: -DENABLE_NON_FREE_CODECS=YES -DENABLE_OPENH264=YES
# DEFAULT_MACOS_CMAKE_OPTIONS: -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 -DENABLE_UPDATE_CHECK=YES
# DEFAULT_WINDOWS_CMAKE_OPTIONS: -DENABLE_NON_FREE_CODECS=YES -DENABLE_OPENH264=YES -DENABLE_UPDATE_CHECK=YES
#activated by default, if there is a problem, see the default
#build options in CMakeBuilder
#CMAKE_OPTIONS: -DENABLE_LIME_X3DH=YES
#################################################
# Platforms to test
# Platforms to test
#################################################
.job-prepare:
variables:
ALL_JOB_VARIABLE: ""
include:
- '.gitlab-ci-files/job-linux.yml'
- '.gitlab-ci-files/job-linux-archlinux.yml'
- '.gitlab-ci-files/job-linux-centos7.yml'
- '.gitlab-ci-files/job-linux-debian8.yml'
- '.gitlab-ci-files/job-linux-debian9.yml'
- '.gitlab-ci-files/job-linux-ubuntu.yml'
- '.gitlab-ci-files/job-macosx.yml'
- '.gitlab-ci-files/job-windows.yml'
- '.gitlab-ci-files/job-linux-prepare.yml'
- '.gitlab-ci-files/job-linux-desktop.yml'
- '.gitlab-ci-files/job-linux-desktop-debian8.yml'
- '.gitlab-ci-files/job-linux-desktop-debian9.yml'
## - '.gitlab-ci-files/job-linux-desktop-debian10.yml'
- '.gitlab-ci-files/job-linux-desktop-ubuntu-rolling.yml'
- '.gitlab-ci-files/job-linux-desktop-archlinux-latest.yml'
- '.gitlab-ci-files/job-linux-desktop-centos7.yml'
- '.gitlab-ci-files/job-windows-desktop.yml'
- '.gitlab-ci-files/job-macosx-desktop.yml'
# - '.gitlab-ci-files/job-linux.yml'
# - '.gitlab-ci-files/job-linux-archlinux.yml'
# - '.gitlab-ci-files/job-linux-centos7.yml'
# - '.gitlab-ci-files/job-linux-debian8.yml'
# - '.gitlab-ci-files/job-linux-debian9.yml'
# - '.gitlab-ci-files/job-macosx.yml'
# - '.gitlab-ci-files/job-windows.yml'
stages:
- build
- package
- deploy
# - deploy

4
.gitmodules vendored
View file

@ -1,6 +1,6 @@
[submodule "submodules/externals/minizip"]
path = submodules/externals/minizip
url = https://gitlab.linphone.org/BC/public/external/minizip.git
url = ../../public/external/minizip.git
[submodule "linphone-sdk"]
path = linphone-sdk
url = https://gitlab.linphone.org/BC/public/linphone-sdk.git
url = ../../public/linphone-sdk.git

View file

@ -1,6 +1,6 @@
################################################################################
# CMakeLists.txt
# Copyright (C) 2017-2018 Belledonne Communications, Grenoble France
# Copyright (C) 2017-2020 Belledonne Communications, Grenoble France
#
################################################################################
#
@ -97,19 +97,19 @@ set(QT5_PACKAGES_OPTIONAL TextToSpeech)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
if (LINPHONE_BUILDER_GROUP_EXTERNAL_SOURCE_PATH_BUILDERS)
include("${EP_linphone_CONFIG_DIR}/wrappers/cpp/LinphoneCxxConfig.cmake")
include("${EP_bctoolbox_CONFIG_DIR}/BcToolboxConfig.cmake")
include("${EP_belcard_CONFIG_DIR}/BelcardConfig.cmake")
include("${EP_ms2_CONFIG_DIR}/Mediastreamer2Config.cmake")
else ()
find_package(LinphoneCxx REQUIRED)
find_package(BcToolbox REQUIRED)
find_package(Belcard REQUIRED)
find_package(Mediastreamer2 REQUIRED)
endif ()
find_package(LinphoneCxx CONFIG REQUIRED)
find_package(Linphone CONFIG REQUIRED)
find_package(bctoolbox CONFIG REQUIRED)
find_package(belcard CONFIG REQUIRED)
find_package(Mediastreamer2 CONFIG REQUIRED)
find_package(ortp CONFIG REQUIRED)
find_package(Minizip REQUIRED)
message("INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} FRAMEWORK_PATH=${CMAKE_FRAMEWORK_PATH}")
message("LINPHONE : ${LINPHONE_INCLUDE_DIRS} => ${LINPHONE_LIBRARIES}")
message("LINPHONECXX : ${LINPHONECXX_INCLUDE_DIRS} => ${LINPHONECXX_LIBRARIES}")
set(SOURCES
src/app/App.cpp
src/app/AppController.cpp
@ -162,6 +162,7 @@ set(SOURCES
src/components/timeline/TimelineModel.cpp
src/components/url-handlers/UrlHandlers.cpp
src/utils/LinphoneUtils.cpp
src/utils/MediastreamerUtils.cpp
src/utils/QExifImageHeader.cpp
src/utils/Utils.cpp
)
@ -221,6 +222,7 @@ set(HEADERS
src/components/timeline/TimelineModel.hpp
src/components/url-handlers/UrlHandlers.hpp
src/utils/LinphoneUtils.hpp
src/utils/MediastreamerUtils.hpp
src/utils/QExifImageHeader.hpp
src/utils/Utils.hpp
)
@ -288,7 +290,6 @@ endfunction ()
# Force absolute paths.
PREPEND(SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/")
PREPEND(HEADERS "${CMAKE_CURRENT_SOURCE_DIR}/")
PREPEND(QRC_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/")
# ------------------------------------------------------------------------------
# Compute QML files list.
@ -319,7 +320,7 @@ if (NOT WIN32)
check_qml DEPENDS ${QML_SOURCES}
COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tools/check_qml_syntax"
)
endif ()
endif()
execute_process(COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/tools/private/pre-commit"
@ -343,23 +344,26 @@ find_package(Qt5 COMPONENTS ${QT5_PACKAGES} REQUIRED)
find_package(Qt5 COMPONENTS ${QT5_PACKAGES_OPTIONAL} QUIET)
if (CMAKE_INSTALL_RPATH)
#Retrieve lib path from a know QT executable
get_target_property(LUPDATE_PATH Qt5::lupdate LOCATION)
get_filename_component(LUPDATE_PATH "${LUPDATE_PATH}" DIRECTORY)
get_filename_component(QT_PATH "${LUPDATE_PATH}/../lib" ABSOLUTE)
list(APPEND CMAKE_INSTALL_RPATH "${QT_PATH}")
endif ()
# Add languages support.
add_subdirectory(${LANGUAGES_DIRECTORY})
list(APPEND QRC_RESOURCES "${CMAKE_CURRENT_BINARY_DIR}/${LANGUAGES_DIRECTORY}/${I18N_FILENAME}")
# Add qrc. (images, qml, translations...)
qt5_add_resources(RESOURCES ${QRC_RESOURCES})
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/${LANGUAGES_DIRECTORY}/${I18N_FILENAME}")
# Build.
add_library(${APP_LIBRARY} OBJECT ${SOURCES} ${HEADERS} ${RESOURCES} ${QML_SOURCES})
#add_library(${APP_LIBRARY} OBJECT ${SOURCES} ${HEADERS} ${RESOURCES} ${QML_SOURCES})
add_library(${APP_LIBRARY} OBJECT ${SOURCES} ${HEADERS} ${QML_SOURCES} ${QRC_RESOURCES})
set_property(TARGET ${APP_LIBRARY} PROPERTY POSITION_INDEPENDENT_CODE ON)
#Turn on automatic resources compilation by cmake
#Instead of excplicitely calling qt5_add_resources
set_property(TARGET ${APP_LIBRARY} PROPERTY AUTORCC ON)
bc_git_version(${TARGET_NAME} ${PROJECT_VERSION})
add_dependencies(${APP_LIBRARY} ${TARGET_NAME}-git-version)
add_dependencies(${APP_LIBRARY} update_translations)
@ -370,13 +374,9 @@ else ()
add_executable(${TARGET_NAME} $<TARGET_OBJECTS:${APP_LIBRARY}> ${MAIN_FILE})
endif ()
if (NOT WIN32)
add_dependencies(update_translations check_qml)
endif ()
set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME "${EXECUTABLE_NAME}")
set(INCLUDED_DIRECTORIES "${LINPHONECXX_INCLUDE_DIRS}" "${BELCARD_INCLUDE_DIRS}" "${BCTOOLBOX_INCLUDE_DIRS}" "${MEDIASTREAMER2_INCLUDE_DIRS}" "${MINIZIP_INCLUDE_DIRS}")
set(LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BELCARD_LIBRARIES} ${LINPHONECXX_LIBRARIES} ${MINIZIP_LIBRARIES})
set(INCLUDED_DIRECTORIES "${LINPHONECXX_INCLUDE_DIRS}" "${LINPHONE_INCLUDE_DIRS}" "${BELCARD_INCLUDE_DIRS}" "${BCTOOLBOX_INCLUDE_DIRS}" "${MEDIASTREAMER2_INCLUDE_DIRS}" "${MINIZIP_INCLUDE_DIRS}")
set(LIBRARIES ${BCTOOLBOX_CORE_LIBRARIES} ${BELCARD_LIBRARIES} ${LINPHONE_LIBRARIES} ${LINPHONECXX_LIBRARIES} ${MEDIASTREAMER2_LIBRARIES} ${ORTP_LIBRARIES} ${MINIZIP_LIBRARIES} ${OPUS_LIBRARIES})
foreach (package ${QT5_PACKAGES})
list(APPEND INCLUDED_DIRECTORIES "${Qt5${package}_INCLUDE_DIRS}")
@ -402,6 +402,7 @@ endforeach ()
if (APPLE)
list(APPEND LIBRARIES "-framework Cocoa -framework IOKit")
# -framework linphone") #This doesn't work yet
endif ()
target_include_directories(${APP_LIBRARY} SYSTEM PRIVATE ${INCLUDED_DIRECTORIES})
@ -409,6 +410,7 @@ target_include_directories(${TARGET_NAME} SYSTEM PRIVATE ${INCLUDED_DIRECTORIES}
target_link_libraries(${TARGET_NAME} ${LIBRARIES})
foreach (target ${TARGET_NAME})
install(TARGETS ${target}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

View file

@ -8,6 +8,12 @@ Linphone is a free VoIP and video softphone based on the SIP protocol.
## Getting started
Installing dependencies:
apt-get install libqt53dcore5:amd64 libqt53dextras5:amd64 libqt53dinput5:amd64 libqt53dlogic5:amd64 libqt53dquick5:amd64 libqt53dquickextras5:amd64 libqt53dquickinput5:amd64 libqt53dquickrender5:amd64 libqt53drender5:amd64 libqt5concurrent5:amd64 libqt5core5a:amd64 libqt5dbus5:amd64 libqt5designer5:amd64 libqt5designercomponents5:amd64 libqt5gui5:amd64 libqt5help5:amd64 libqt5multimedia5:amd64 libqt5multimedia5-plugins:amd64 libqt5multimediawidgets5:amd64 libqt5network5:amd64 libqt5opengl5:amd64 libqt5opengl5-dev:amd64 libqt5positioning5:amd64 libqt5printsupport5:amd64 libqt5qml5:amd64 libqt5quick5:amd64 libqt5quickcontrols2-5:amd64 libqt5quickparticles5:amd64 libqt5quicktemplates2-5:amd64 libqt5quicktest5:amd64 libqt5quickwidgets5:amd64 libqt5script5:amd64 libqt5scripttools5:amd64 libqt5sensors5:amd64 libqt5serialport5:amd64 libqt5sql5:amd64 libqt5sql5-sqlite:amd64 libqt5svg5:amd64 libqt5svg5-dev:amd64 libqt5test5:amd64 libqt5webchannel5:amd64 libqt5webengine-data libqt5webenginecore5:amd64 libqt5webenginewidgets5:amd64 libqt5webkit5:amd64 libqt5widgets5:amd64 libqt5x11extras5:amd64 libqt5xml5:amd64 libqt5xmlpatterns5:amd64 qt5-default:amd64 qt5-doc qt5-gtk-platformtheme:amd64 qt5-qmake:amd64 qt5-qmltooling-plugins:amd64
Here are the general instructions to build linphone for desktop. The specific instructions for each build platform is described just below.
1. Install some build tools: `CMake`, `Python` and `Qt5` (_5.9 or newer_). `C++11` support is required!
@ -68,7 +74,7 @@ Before you install packages with Brew, you may have to change directories permis
3. Open a Windows command line (cmd.exe) in the current directory and run:
python prepare.py -G "Visual Studio 14 2015" -DENABLE_DOC=OFF
python prepare.py -G "Visual Studio 15 2017" -DENABLE_DOC=OFF
4. Run the following command in the root directory of linphone-desktop:

90
assets/images/warning.svg Normal file
View file

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="28"
height="28"
viewBox="0 0 28 28"
version="1.1"
id="svg15"
sodipodi:docname="chat_error.svg"
inkscape:version="0.92.1 r">
<metadata
id="metadata19">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>chat_error</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1149"
id="namedview17"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg15" />
<!-- Generator: Sketch 42 (36781) - http://www.bohemiancoding.com/sketch -->
<title
id="title2">chat_error</title>
<desc
id="desc4">Created with Sketch.</desc>
<defs
id="defs6" />
<g
id="Symbols"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
transform="translate(2,2)">
<g
id="chat_error">
<g
id="Group-3">
<circle
id="Oval"
cx="12"
cy="12"
r="12"
class="color-error-style-fill"
style="fill:#FF0000" />
<g
id="Group-2"
transform="translate(10,4.6)"
style="fill:#ffffff;stroke:#ffffff">
<polygon
id="Path-1067"
transform="rotate(-180,2,4.880676)"
points="2,1.7763568e-15 0.5,9.7613525 3.5,9.7613525 "
style="stroke-width:0.80000001;stroke-linejoin:round" />
<circle
id="Oval-24"
cx="2.0000005"
cy="13.4"
r="1.4"
style="stroke-width:0.5" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View file

@ -11,40 +11,75 @@ set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true)
# Build languages resource file.
set(TS_FILES)
set(I18N_CONTENT "<!DOCTYPE RCC>\n<RCC version=\"1.0\">\n <qresource prefix=\"/\">\n")
foreach (lang ${LANGUAGES})
list(APPEND TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${lang}.ts")
set(QM_FILES)
set(QM_FILES_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}")
set(I18N_CONTENT "<!DOCTYPE RCC>\n<RCC version=\"1.0\">\n <qresource>\n")
foreach (lang ${LANGUAGES})
# Note: the below `languages/` path is not the same as the `${LANGUAGES_DIRECTORY}` value.
# It's the symbolic path used by the linphone binary in the qrc model.
# This path is used in `app.cpp`.
set(I18N_CONTENT "${I18N_CONTENT} <file alias=\"languages/${lang}\">${lang}.qm</file>\n")
endforeach ()
list(APPEND TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${lang}.ts")
list(APPEND TARGET_TS_FILES "${CMAKE_CURRENT_BINARY_DIR}/${lang}.ts")
list(APPEND QM_FILES "${CMAKE_CURRENT_BINARY_DIR}/${lang}.qm")
endforeach()
set(I18N_CONTENT "${I18N_CONTENT} </qresource>\n</RCC>\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${I18N_FILENAME}" "${I18N_CONTENT}")
# Create `qm` files from `ts` files.
qt5_create_translation(QM_FILES ${TS_FILES} ${SOURCES} ${HEADERS} ${QML_SOURCES} OPTIONS -no-obsolete)
#Files or directories to inspect for translations references
set(TRANSLATION_SOURCES)
list(APPEND TRANSLATION_SOURCES "${PROJECT_SOURCE_DIR}/src")
list(APPEND TRANSLATION_SOURCES "${PROJECT_SOURCE_DIR}/ui")
# Workaround: Create empty files for some cmake versions. Otherwise, the qm rules can't be used.
foreach (qm ${QM_FILES})
if (NOT EXISTS "${qm}")
file(GENERATE OUTPUT "${qm}" CONTENT "")
endif ()
endforeach ()
if (WIN32)
foreach (lang ${LANGUAGES})
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/${lang}.ts" content)
set(cleanedContent)
string(REPLACE "\r" "" cleanedContent "${content}")
file(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/${lang}.ts" "${cleanedContent}")
endforeach()
endif()
# Update translations.
set(LUPDATE_OPTIONS "-no-obsolete")
set(LRELEASE_OPTIONS "")
#Clean existing generated file to force re-creation
file(REMOVE ${QM_FILES})
file(REMOVE ${TARGET_TS_FILES})
add_custom_command(OUTPUT ${TARGET_TS_FILES}
COMMAND ${Qt5_LUPDATE_EXECUTABLE}
ARGS ${LUPDATE_OPTIONS} ${TRANSLATION_SOURCES} -ts ${TS_FILES}
COMMAND ${CMAKE_COMMAND} -E copy ${TS_FILES} ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "Updating translation source files (ts)..."
)
add_custom_command(OUTPUT ${QM_FILES}
COMMAND ${Qt5_LRELEASE_EXECUTABLE}
ARGS ${TARGET_TS_FILES} ${LRELEASE_OPTIONS}
DEPENDS ${TARGET_TS_FILES}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM
COMMENT "Creating compiled translation files (qm)..."
)
#The dependency on custom_command Output is important
add_custom_target(update_translations
COMMAND ${CMAKE_COMMAND} "-DLANGUAGES=\"${LANGUAGES}\"" -P "${CMAKE_CURRENT_SOURCE_DIR}/clean_translations.cmake"
DEPENDS ${QM_FILES}
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
# Remove `*.qm` when `clean` is called.
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${QM_FILES}")
# Command to just remove `.qm` files.
add_custom_target(remove_qm_files
COMMAND ${CMAKE_COMMAND} -E remove ${QM_FILES}
)
# Workaround: Create empty files for some cmake versions. Otherwise, the qm rules can't be used.
# foreach (qm ${QM_FILES})
# if (NOT EXISTS "${qm}")
# file(GENERATE OUTPUT "${qm}" CONTENT "")
# endif()
# endforeach()

View file

@ -1,12 +0,0 @@
# ==============================================================================
# assets/languages/clean_translations.cmake
# ==============================================================================
if (WIN32)
foreach (lang ${LANGUAGES})
file(READ "${lang}.ts" content)
set(cleanedContent)
string(REPLACE "\r" "" cleanedContent "${content}")
file(WRITE "${lang}.ts" "${cleanedContent}")
endforeach ()
endif ()

View file

@ -615,6 +615,10 @@ Server URL ist nicht konfiguriert.</translation>
<source>abortEditDescriptionText</source>
<translation>Möchten Sie die Änderungen an diesem Kontakt verwerfen?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Server URL ist nicht konfiguriert.</translation>
<source>removeAllEntriesDescription</source>
<translation>Möchten Sie diese Historie wirklich löschen?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -958,6 +974,10 @@ Server URL ist nicht konfiguriert.</translation>
<source>smartSearchBarTooltip</source>
<translation>Verwenden das intelligente Suchfeld um Audio- und Videocalls zu starten, Nachrichten zu senden oder Kontakt hinzuzufügen. Geben Sie die SIP-Adresse oder Username Ihres Kontaktes ein.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1152,6 +1172,22 @@ Server URL ist nicht konfiguriert.</translation>
<source>showAudioCodecsLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1255,6 +1291,10 @@ Server URL ist nicht konfiguriert.</translation>
<source>callPauseEnabledLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@ Server url not configured.</translation>
<source>abortEditDescriptionText</source>
<translation>Are you sure you want to cancel the contact modification?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation>Show conversation</translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Server url not configured.</translation>
<source>removeAllEntriesDescription</source>
<translation>Are you sure you want to clean this history?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation>Edit contact</translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation>Add contact</translation>
</message>
<message>
<source>cleanHistory</source>
<translation>Delete history</translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Click here: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
calls, send a message or add a new contact. Just enter
your friend&apos;s SIP address or username.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation>Start conference call</translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ your friend&apos;s SIP address or username.</translation>
<source>showAudioCodecsLabel</source>
<translation>Show audio codecs</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation>Playback gain</translation>
</message>
<message>
<source>captureGainLabel</source>
<translation>Capture gain</translation>
</message>
<message>
<source>audioTestLabel</source>
<translation>Capture level</translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation>Audio call in progress: some settings are not available.</translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1260,6 +1296,10 @@ your friend&apos;s SIP address or username.</translation>
<source>callPauseEnabledLabel</source>
<translation>Call pause enabled</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation>Encrytion is mandatory</translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

File diff suppressed because it is too large Load diff

View file

@ -615,6 +615,10 @@ Url du serveur non configurée.</translation>
<source>abortEditDescriptionText</source>
<translation>Êtes-vous sûr de vouloir annuler l&apos;édition du contact ?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation>Allez à la conversation</translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Url du serveur non configurée.</translation>
<source>removeAllEntriesDescription</source>
<translation>Êtes-vous sûr de vouloir supprimer cet historique ?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation>Editer le contact</translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation>Ajouter le contact</translation>
</message>
<message>
<source>cleanHistory</source>
<translation>Supprimer l&apos;historique</translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>smartSearchBarTooltip</source>
<translation>Utilisez la barre de recherche intelligente pour lancer des appels audio et vidéo, envoyer un message ou ajouter un contact. Entrez simplement l&apos;adresse SIP ou le nom d&apos;utilisateur de votre contact.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation>Démarrer une conférence</translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>showAudioCodecsLabel</source>
<translation>Afficher les codecs audio</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation>Gain de lecture</translation>
</message>
<message>
<source>captureGainLabel</source>
<translation>Gain de capture</translation>
</message>
<message>
<source>audioTestLabel</source>
<translation>Niveau micro</translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation>Appel en cours: certains paramètres sont inaccessibles</translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1258,6 +1294,10 @@ Cliquez ici : &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>callPauseEnabledLabel</source>
<translation>Autoriser la mise en pause</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation>Chiffrement obligatoire</translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@
<source>abortEditDescriptionText</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@
<source>removeAllEntriesDescription</source>
<translation></translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -958,6 +974,10 @@
<source>smartSearchBarTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1152,6 +1172,22 @@
<source>showAudioCodecsLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1255,6 +1291,10 @@
<source>callPauseEnabledLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@ Nesukonfigūruotas serverio url.</translation>
<source>abortEditDescriptionText</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Nesukonfigūruotas serverio url.</translation>
<source>removeAllEntriesDescription</source>
<translation>Ar tikrai norite išvalyti š istoriją?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Spustelėkite čia: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
garso ir vaizdo skambučius, siųsti žinutę ar pridėti naują kontaktą.
Tiesiog, įveskite savo draugo SIP adresą ar naudotojo vardą.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ Tiesiog, įveskite savo draugo SIP adresą ar naudotojo vardą.</translation>
<source>showAudioCodecsLabel</source>
<translation>Rodyti garso kodekus</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1260,6 +1296,10 @@ Tiesiog, įveskite savo draugo SIP adresą ar naudotojo vardą.</translation>
<source>callPauseEnabledLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@ URL do servidor não configurado.</translation>
<source>abortEditDescriptionText</source>
<translation>Tem certeza de que deseja cancelar a modificação do contato?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ URL do servidor não configurado.</translation>
<source>removeAllEntriesDescription</source>
<translation>Tem certeza de que deseja limpar este histórico?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Click aqui: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
enviar uma mensagem ou adicionar um novo contato. Basta entrar
o endereço SIP ou nome de usuário do seu amigo.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ o endereço SIP ou nome de usuário do seu amigo.</translation>
<source>showAudioCodecsLabel</source>
<translation>Mostrar codecs de áudio</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1260,6 +1296,10 @@ o endereço SIP ou nome de usuário do seu amigo.</translation>
<source>callPauseEnabledLabel</source>
<translation>Habilitada pausa na chamada.</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@
<source>abortEditDescriptionText</source>
<translation>Вы уверены, что хотите отменить изменение контакта?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@
<source>removeAllEntriesDescription</source>
<translation>Вы уверены, что хотите очистить эту историю?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@
<source>smartSearchBarTooltip</source>
<translation>Используйте умную поисковую строку, чтобы сразу начать аудио или видео вызов, отправить сообщение или добавить новый контакт. Просто введите SIP адрес или имя пользователя вашего контакта.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@
<source>showAudioCodecsLabel</source>
<translation>Показать Аудио кодаки</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1258,6 +1294,10 @@
<source>callPauseEnabledLabel</source>
<translation>Вызов поставлен на паузу</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@ Serverwebbadressen är inte konfigurerad.</translation>
<source>abortEditDescriptionText</source>
<translation>Är du säker att du vill avbryta kontaktändringen?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Serverwebbadressen är inte konfigurerad.</translation>
<source>removeAllEntriesDescription</source>
<translation>Är du säker att du vill rensa den här historiken?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -961,6 +977,10 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>smartSearchBarTooltip</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1155,6 +1175,22 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>showAudioCodecsLabel</source>
<translation>Visa ljudkodek</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1258,6 +1294,10 @@ Klicka här: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
<source>callPauseEnabledLabel</source>
<translation>Samtals paus aktiverad</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -615,6 +615,10 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<source>abortEditDescriptionText</source>
<translation>Kişi düzenlemesini iptal etmek istediğinize emin misiniz?</translation>
</message>
<message>
<source>tooltipShowConversation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Contacts</name>
@ -657,6 +661,18 @@ Sunucu url&apos;si yapılandırılmadı.</translation>
<source>removeAllEntriesDescription</source>
<translation>Bu geçmişi temizlemek istediğinize emin misiniz?</translation>
</message>
<message>
<source>tooltipContactEdit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>tooltipContactAdd</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>cleanHistory</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CreateAppSipAccount</name>
@ -963,6 +979,10 @@ Buraya tıklayın: &lt;a href=&quot;%1&quot;&gt;%1&lt;/a&gt;
eklemek için akıllı arama çubuğunu kullanın. Yalnızca
arkadaşınızın SIP adresini veya kullanıcı adını girin.</translation>
</message>
<message>
<source>newConferenceButton</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindowMenuBar</name>
@ -1157,6 +1177,22 @@ arkadaşınızın SIP adresini veya kullanıcı adını girin.</translation>
<source>showAudioCodecsLabel</source>
<translation>Ses çözücüleri göster</translation>
</message>
<message>
<source>playbackGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>captureGainLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioTestLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>audioSettingsInCallWarning</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsCallsChat</name>
@ -1260,6 +1296,10 @@ arkadaşınızın SIP adresini veya kullanıcı adını girin.</translation>
<source>callPauseEnabledLabel</source>
<translation>Çağrı duraklatma etkin</translation>
</message>
<message>
<source>encryptionMandatoryLabel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SettingsNetwork</name>

View file

@ -23,6 +23,6 @@
lcb_define_target("linphoneqt" "linphone" "ms2plugins")
if (NOT WIN32 AND NOT APPLE)
lcb_blacklist_dependencies("turbo-jpeg") # turbo-jpeg is already provided by Qt5 so do not build it.
endif ()
#if (NOT WIN32 AND NOT APPLE)
# lcb_blacklist_dependencies("turbojpeg") # turbo-jpeg is already provided by Qt5 so do not build it.
#endif ()

13
create_appimage.sh Executable file
View file

@ -0,0 +1,13 @@
#!/bin/bash
APP_NAME="linphone"
BIN_SOURCE_DIR="OUTPUT/desktop"
WORK_DIR="OUTPUT/AppDir/usr"
mkdir -p "${WORK_DIR}"
cp -rfv "${BIN_SOURCE_DIR}"/* "${WORK_DIR}"
./AppImage/linuxdeployqt-continuous-x86_64.AppImage "${WORK_DIR}/bin/${APP_NAME}" -appimage -bundle-non-qt-libs -verbose=2

@ -1 +1 @@
Subproject commit 44380577a36e41c5e9226328dac64e7b27c4d0fc
Subproject commit b3dbedd109f9d4357f5b73410a132c11c2660b58

View file

@ -199,6 +199,7 @@
<file>assets/images/video_call_hovered.svg</file>
<file>assets/images/video_call_normal.svg</file>
<file>assets/images/video_call_pressed.svg</file>
<file>assets/images/warning.svg</file>
<file>ui/modules/Common/Animations/BusyIndicator.qml</file>
<file>ui/modules/Common/Constants/Constants.qml</file>
<file>ui/modules/Common/Dialog/ConfirmDialog.qml</file>

View file

@ -202,7 +202,7 @@ void Logger::init (const shared_ptr<linphone::Config> &config) {
{
shared_ptr<linphone::LoggingService> loggingService = mInstance->mLoggingService = linphone::LoggingService::get();
loggingService->setLogLevel(linphone::LogLevel::Message);
loggingService->setListener(make_shared<LinphoneLogger>(mInstance));
loggingService->addListener(make_shared<LinphoneLogger>(mInstance));
}
linphone::Core::setLogCollectionPath(Utils::appStringToCoreString(folder));

View file

@ -28,7 +28,10 @@ int main (int argc, char *argv[]) {
AppController controller(argc, argv);
App *app = controller.getApp();
if (app->isSecondary())
return EXIT_SUCCESS;
{
qInfo() << QStringLiteral("Running secondary app success. Kill it now.");
return EXIT_SUCCESS;
}
qInfo() << QStringLiteral("Running app...");

View file

@ -108,15 +108,23 @@ static inline QDir getAppPackageDir () {
QDir dir(QCoreApplication::applicationDirPath());
if (dir.dirName() == QLatin1String("MacOS")) {
dir.cdUp();
dir.cd("Resources");
if (!dir.cd("Resources"))
{
dir.mkdir("Resources");
dir.cd("Resources");
}
} else
dir.cdUp();
return dir;
}
static inline QString getAppPackageDataDirPath () {
static inline QString getAppPackageDataDirPath() {
QDir dir = getAppPackageDir();
dir.cd("share");
if (!dir.cd("share"))
{
dir.mkdir("share");
dir.cd("share");
}
return dir.absolutePath();
}

View file

@ -32,6 +32,7 @@
#include <QtCore/QCryptographicHash>
#include <QtNetwork/QLocalServer>
#include <QtNetwork/QLocalSocket>
#include <QProcess>
#ifdef Q_OS_UNIX
#include <signal.h>
@ -167,8 +168,10 @@ void SingleApplicationPrivate::startPrimary (bool resetMemory) {
if (resetMemory) {
inst->primary = true;
inst->secondary = 0;
inst->primaryId = q_ptr->applicationPid();
} else {
inst->primary = true;
inst->primaryId = q_ptr->applicationPid();
}
memory->unlock();
@ -344,10 +347,10 @@ SingleApplication::SingleApplication (int &argc, char *argv[], bool allowSeconda
// Attempt to attach to the memory segment
if (d->memory->attach()) {
d->memory->lock();
InstancesInfo *inst = static_cast<InstancesInfo *>(d->memory->data());
if (!inst->primary) {
if (!inst->primary || !Utils::processExists(inst->primaryId)) { // Check if there is not a primary instance and if there is, is it still running?
d->startPrimary(false);
d->memory->unlock();
return;

View file

@ -44,6 +44,7 @@
struct InstancesInfo {
bool primary;
quint32 secondary;
quint64 primaryId;
};
class SingleApplicationPrivate : public QObject {

View file

@ -150,7 +150,7 @@ AssistantModel::AssistantModel (QObject *parent) : QObject(parent) {
mAccountCreator = core->createAccountCreator(
core->getConfig()->getString("assistant", "xmlrpc_url", DefaultXmlrpcUri)
);
mAccountCreator->setListener(mHandlers);
mAccountCreator->addListener(mHandlers);
}
// -----------------------------------------------------------------------------

View file

@ -33,6 +33,7 @@
#include "components/settings/AccountSettingsModel.hpp"
#include "components/settings/SettingsModel.hpp"
#include "utils/LinphoneUtils.hpp"
#include "utils/MediastreamerUtils.hpp"
#include "utils/Utils.hpp"
#include "CallModel.hpp"
@ -469,11 +470,11 @@ float CallModel::getQuality () const {
// -----------------------------------------------------------------------------
float CallModel::getSpeakerVu () const {
return LinphoneUtils::computeVu(mCall->getPlayVolume());
return MediastreamerUtils::computeVu(mCall->getPlayVolume());
}
float CallModel::getMicroVu () const {
return LinphoneUtils::computeVu(mCall->getRecordVolume());
return MediastreamerUtils::computeVu(mCall->getRecordVolume());
}
// -----------------------------------------------------------------------------

View file

@ -409,7 +409,7 @@ void ChatModel::removeAllEntries () {
void ChatModel::sendMessage (const QString &message) {
shared_ptr<linphone::ChatMessage> _message = mChatRoom->createMessage(Utils::appStringToCoreString(message));
_message->setListener(mMessageHandlers);
_message->addListener(mMessageHandlers);
insertMessageAtEnd(_message);
mChatRoom->sendChatMessage(_message);
@ -435,7 +435,7 @@ void ChatModel::resendMessage (int id) {
case MessageStatusFileTransferError:
case MessageStatusNotDelivered: {
shared_ptr<linphone::ChatMessage> message = static_pointer_cast<linphone::ChatMessage>(entry.second);
message->setListener(mMessageHandlers);
message->addListener(mMessageHandlers);
message->resend();
break;
@ -473,7 +473,7 @@ void ChatModel::sendFileMessage (const QString &path) {
shared_ptr<linphone::ChatMessage> message = mChatRoom->createFileTransferMessage(content);
message->setFileTransferFilepath(Utils::appStringToCoreString(path));
message->setListener(mMessageHandlers);
message->addListener(mMessageHandlers);
createThumbnail(message);
@ -518,7 +518,7 @@ void ChatModel::downloadFile (int id) {
}
message->setFileTransferFilepath(Utils::appStringToCoreString(safeFilePath));
message->setListener(mMessageHandlers);
message->addListener(mMessageHandlers);
if (!message->downloadFile())
qWarning() << QStringLiteral("Unable to download file of entry %1.").arg(id);

View file

@ -28,6 +28,7 @@
#include "components/core/CoreManager.hpp"
#include "components/settings/SettingsModel.hpp"
#include "utils/LinphoneUtils.hpp"
#include "utils/MediastreamerUtils.hpp"
#include "utils/Utils.hpp"
#include "ConferenceModel.hpp"
@ -128,7 +129,7 @@ bool ConferenceModel::getRecording () const {
// -----------------------------------------------------------------------------
float ConferenceModel::getMicroVu () const {
return LinphoneUtils::computeVu(
return MediastreamerUtils::computeVu(
CoreManager::getInstance()->getCore()->getConferenceLocalInputVolume()
);
}

View file

@ -125,6 +125,11 @@ void CoreHandlers::onCallStatsUpdated (
call->getData<CallModel>("call-model").updateStats(stats);
}
void CoreHandlers::onCallCreated(const shared_ptr<linphone::Core> &,
const shared_ptr<linphone::Call> &call) {
emit callCreated(call);
}
void CoreHandlers::onGlobalStateChanged (
const shared_ptr<linphone::Core> &,
linphone::GlobalState gstate,

View file

@ -46,6 +46,7 @@ signals:
void callStateChanged (const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
void callTransferFailed (const std::shared_ptr<linphone::Call> &call);
void callTransferSucceeded (const std::shared_ptr<linphone::Call> &call);
void callCreated(const std::shared_ptr<linphone::Call> & call);
void coreStarted ();
void isComposingChanged (const std::shared_ptr<linphone::ChatRoom> &chatRoom);
void logsUploadStateChanged (linphone::Core::LogCollectionUploadState state, const std::string &info);
@ -87,6 +88,11 @@ private:
const std::shared_ptr<const linphone::CallStats> &stats
) override;
void onCallCreated(
const std::shared_ptr<linphone::Core> & lc,
const std::shared_ptr<linphone::Call> & call
) override;
void onGlobalStateChanged (
const std::shared_ptr<linphone::Core> &core,
linphone::GlobalState gstate,

View file

@ -66,7 +66,7 @@ void AbstractEventCountNotifier::internalnotifyEventCount () {
n = n > 99 ? 99 : n;
notifyEventCount(CoreManager::getInstance()->getSettingsModel()->getChatEnabled() ? n : 0);
emit eventCountChanged(mUnreadMessageCount);
emit eventCountChanged(n);
}
// -----------------------------------------------------------------------------

File diff suppressed because it is too large Load diff

View file

@ -17,534 +17,587 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Created on: February 2, 2017
* Author: Ronan Abhamon
* Author: Ronan Abhamon
*/
#ifndef SETTINGS_MODEL_H_
#define SETTINGS_MODEL_H_
#include <linphone++/linphone.hh>
#include <utils/MediastreamerUtils.hpp>
#include <QObject>
#include "components/core/CoreHandlers.hpp"
// =============================================================================
class SettingsModel : public QObject {
Q_OBJECT;
Q_OBJECT;
// ===========================================================================
// PROPERTIES.
// ===========================================================================
// ===========================================================================
// PROPERTIES.
// ===========================================================================
// Assistant. ----------------------------------------------------------------
// Assistant. ----------------------------------------------------------------
Q_PROPERTY(bool createAppSipAccountEnabled READ getCreateAppSipAccountEnabled WRITE setCreateAppSipAccountEnabled NOTIFY createAppSipAccountEnabledChanged);
Q_PROPERTY(bool fetchRemoteConfigurationEnabled READ getFetchRemoteConfigurationEnabled WRITE setFetchRemoteConfigurationEnabled NOTIFY fetchRemoteConfigurationEnabledChanged);
Q_PROPERTY(bool useAppSipAccountEnabled READ getUseAppSipAccountEnabled WRITE setUseAppSipAccountEnabled NOTIFY useAppSipAccountEnabledChanged);
Q_PROPERTY(bool useOtherSipAccountEnabled READ getUseOtherSipAccountEnabled WRITE setUseOtherSipAccountEnabled NOTIFY useOtherSipAccountEnabledChanged);
Q_PROPERTY(bool createAppSipAccountEnabled READ getCreateAppSipAccountEnabled WRITE setCreateAppSipAccountEnabled NOTIFY createAppSipAccountEnabledChanged);
Q_PROPERTY(bool fetchRemoteConfigurationEnabled READ getFetchRemoteConfigurationEnabled WRITE setFetchRemoteConfigurationEnabled NOTIFY fetchRemoteConfigurationEnabledChanged);
Q_PROPERTY(bool useAppSipAccountEnabled READ getUseAppSipAccountEnabled WRITE setUseAppSipAccountEnabled NOTIFY useAppSipAccountEnabledChanged);
Q_PROPERTY(bool useOtherSipAccountEnabled READ getUseOtherSipAccountEnabled WRITE setUseOtherSipAccountEnabled NOTIFY useOtherSipAccountEnabledChanged);
Q_PROPERTY(bool assistantSupportsPhoneNumbers READ getAssistantSupportsPhoneNumbers WRITE setAssistantSupportsPhoneNumbers NOTIFY assistantSupportsPhoneNumbersChanged);
Q_PROPERTY(bool assistantSupportsPhoneNumbers READ getAssistantSupportsPhoneNumbers WRITE setAssistantSupportsPhoneNumbers NOTIFY assistantSupportsPhoneNumbersChanged);
// Audio. --------------------------------------------------------------------
// Audio. --------------------------------------------------------------------
Q_PROPERTY(QStringList captureDevices READ getCaptureDevices CONSTANT);
Q_PROPERTY(QStringList playbackDevices READ getPlaybackDevices CONSTANT);
Q_PROPERTY(bool captureGraphRunning READ getCaptureGraphRunning NOTIFY captureGraphRunningChanged);
Q_PROPERTY(QString captureDevice READ getCaptureDevice WRITE setCaptureDevice NOTIFY captureDeviceChanged);
Q_PROPERTY(QString playbackDevice READ getPlaybackDevice WRITE setPlaybackDevice NOTIFY playbackDeviceChanged);
Q_PROPERTY(QString ringerDevice READ getRingerDevice WRITE setRingerDevice NOTIFY ringerDeviceChanged);
Q_PROPERTY(QStringList captureDevices READ getCaptureDevices NOTIFY captureDevicesChanged);
Q_PROPERTY(QStringList playbackDevices READ getPlaybackDevices NOTIFY playbackDevicesChanged);
Q_PROPERTY(QString ringPath READ getRingPath WRITE setRingPath NOTIFY ringPathChanged);
Q_PROPERTY(float playbackGain READ getPlaybackGain WRITE setPlaybackGain NOTIFY playbackGainChanged);
Q_PROPERTY(float captureGain READ getCaptureGain WRITE setCaptureGain NOTIFY captureGainChanged);
Q_PROPERTY(bool echoCancellationEnabled READ getEchoCancellationEnabled WRITE setEchoCancellationEnabled NOTIFY echoCancellationEnabledChanged);
Q_PROPERTY(QString captureDevice READ getCaptureDevice WRITE setCaptureDevice NOTIFY captureDeviceChanged);
Q_PROPERTY(QString playbackDevice READ getPlaybackDevice WRITE setPlaybackDevice NOTIFY playbackDeviceChanged);
Q_PROPERTY(QString ringerDevice READ getRingerDevice WRITE setRingerDevice NOTIFY ringerDeviceChanged);
Q_PROPERTY(bool showAudioCodecs READ getShowAudioCodecs WRITE setShowAudioCodecs NOTIFY showAudioCodecsChanged);
Q_PROPERTY(QString ringPath READ getRingPath WRITE setRingPath NOTIFY ringPathChanged);
// Video. --------------------------------------------------------------------
Q_PROPERTY(bool echoCancellationEnabled READ getEchoCancellationEnabled WRITE setEchoCancellationEnabled NOTIFY echoCancellationEnabledChanged);
Q_PROPERTY(QStringList videoDevices READ getVideoDevices CONSTANT);
Q_PROPERTY(bool showAudioCodecs READ getShowAudioCodecs WRITE setShowAudioCodecs NOTIFY showAudioCodecsChanged);
Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE setVideoDevice NOTIFY videoDeviceChanged);
// Video. --------------------------------------------------------------------
Q_PROPERTY(QString videoPreset READ getVideoPreset WRITE setVideoPreset NOTIFY videoPresetChanged);
Q_PROPERTY(int videoFramerate READ getVideoFramerate WRITE setVideoFramerate NOTIFY videoFramerateChanged);
Q_PROPERTY(QStringList videoDevices READ getVideoDevices NOTIFY videoDevicesChanged);
Q_PROPERTY(QVariantList supportedVideoDefinitions READ getSupportedVideoDefinitions CONSTANT);
Q_PROPERTY(QString videoDevice READ getVideoDevice WRITE setVideoDevice NOTIFY videoDeviceChanged);
Q_PROPERTY(QVariantMap videoDefinition READ getVideoDefinition WRITE setVideoDefinition NOTIFY videoDefinitionChanged);
Q_PROPERTY(QString videoPreset READ getVideoPreset WRITE setVideoPreset NOTIFY videoPresetChanged);
Q_PROPERTY(int videoFramerate READ getVideoFramerate WRITE setVideoFramerate NOTIFY videoFramerateChanged);
Q_PROPERTY(bool videoSupported READ getVideoSupported CONSTANT);
Q_PROPERTY(QVariantList supportedVideoDefinitions READ getSupportedVideoDefinitions CONSTANT);
Q_PROPERTY(bool showVideoCodecs READ getShowVideoCodecs WRITE setShowVideoCodecs NOTIFY showVideoCodecsChanged);
Q_PROPERTY(QVariantMap videoDefinition READ getVideoDefinition WRITE setVideoDefinition NOTIFY videoDefinitionChanged);
// Chat & calls. -------------------------------------------------------------
Q_PROPERTY(bool videoSupported READ getVideoSupported CONSTANT);
Q_PROPERTY(bool autoAnswerStatus READ getAutoAnswerStatus WRITE setAutoAnswerStatus NOTIFY autoAnswerStatusChanged);
Q_PROPERTY(bool autoAnswerVideoStatus READ getAutoAnswerVideoStatus WRITE setAutoAnswerVideoStatus NOTIFY autoAnswerVideoStatusChanged);
Q_PROPERTY(int autoAnswerDelay READ getAutoAnswerDelay WRITE setAutoAnswerDelay NOTIFY autoAnswerDelayChanged);
Q_PROPERTY(bool showVideoCodecs READ getShowVideoCodecs WRITE setShowVideoCodecs NOTIFY showVideoCodecsChanged);
Q_PROPERTY(bool showTelKeypadAutomatically READ getShowTelKeypadAutomatically WRITE setShowTelKeypadAutomatically NOTIFY showTelKeypadAutomaticallyChanged);
// Chat & calls. -------------------------------------------------------------
Q_PROPERTY(bool keepCallsWindowInBackground READ getKeepCallsWindowInBackground WRITE setKeepCallsWindowInBackground NOTIFY keepCallsWindowInBackgroundChanged);
Q_PROPERTY(bool autoAnswerStatus READ getAutoAnswerStatus WRITE setAutoAnswerStatus NOTIFY autoAnswerStatusChanged);
Q_PROPERTY(bool autoAnswerVideoStatus READ getAutoAnswerVideoStatus WRITE setAutoAnswerVideoStatus NOTIFY autoAnswerVideoStatusChanged);
Q_PROPERTY(int autoAnswerDelay READ getAutoAnswerDelay WRITE setAutoAnswerDelay NOTIFY autoAnswerDelayChanged);
Q_PROPERTY(bool outgoingCallsEnabled READ getOutgoingCallsEnabled WRITE setOutgoingCallsEnabled NOTIFY outgoingCallsEnabledChanged);
Q_PROPERTY(bool showTelKeypadAutomatically READ getShowTelKeypadAutomatically WRITE setShowTelKeypadAutomatically NOTIFY showTelKeypadAutomaticallyChanged);
Q_PROPERTY(bool callRecorderEnabled READ getCallRecorderEnabled WRITE setCallRecorderEnabled NOTIFY callRecorderEnabledChanged);
Q_PROPERTY(bool automaticallyRecordCalls READ getAutomaticallyRecordCalls WRITE setAutomaticallyRecordCalls NOTIFY automaticallyRecordCallsChanged);
Q_PROPERTY(bool keepCallsWindowInBackground READ getKeepCallsWindowInBackground WRITE setKeepCallsWindowInBackground NOTIFY keepCallsWindowInBackgroundChanged);
Q_PROPERTY(bool callPauseEnabled READ getCallPauseEnabled WRITE setCallPauseEnabled NOTIFY callPauseEnabledChanged);
Q_PROPERTY(bool muteMicrophoneEnabled READ getMuteMicrophoneEnabled WRITE setMuteMicrophoneEnabled NOTIFY muteMicrophoneEnabledChanged);
Q_PROPERTY(bool outgoingCallsEnabled READ getOutgoingCallsEnabled WRITE setOutgoingCallsEnabled NOTIFY outgoingCallsEnabledChanged);
Q_PROPERTY(bool chatEnabled READ getChatEnabled WRITE setChatEnabled NOTIFY chatEnabledChanged);
Q_PROPERTY(bool callRecorderEnabled READ getCallRecorderEnabled WRITE setCallRecorderEnabled NOTIFY callRecorderEnabledChanged);
Q_PROPERTY(bool automaticallyRecordCalls READ getAutomaticallyRecordCalls WRITE setAutomaticallyRecordCalls NOTIFY automaticallyRecordCallsChanged);
Q_PROPERTY(bool conferenceEnabled READ getConferenceEnabled WRITE setConferenceEnabled NOTIFY conferenceEnabledChanged);
Q_PROPERTY(bool callPauseEnabled READ getCallPauseEnabled WRITE setCallPauseEnabled NOTIFY callPauseEnabledChanged);
Q_PROPERTY(bool muteMicrophoneEnabled READ getMuteMicrophoneEnabled WRITE setMuteMicrophoneEnabled NOTIFY muteMicrophoneEnabledChanged);
Q_PROPERTY(bool chatNotificationSoundEnabled READ getChatNotificationSoundEnabled WRITE setChatNotificationSoundEnabled NOTIFY chatNotificationSoundEnabledChanged);
Q_PROPERTY(QString chatNotificationSoundPath READ getChatNotificationSoundPath WRITE setChatNotificationSoundPath NOTIFY chatNotificationSoundPathChanged);
Q_PROPERTY(bool chatEnabled READ getChatEnabled WRITE setChatEnabled NOTIFY chatEnabledChanged);
Q_PROPERTY(QString fileTransferUrl READ getFileTransferUrl WRITE setFileTransferUrl NOTIFY fileTransferUrlChanged);
Q_PROPERTY(bool conferenceEnabled READ getConferenceEnabled WRITE setConferenceEnabled NOTIFY conferenceEnabledChanged);
Q_PROPERTY(bool limeIsSupported READ getLimeIsSupported CONSTANT);
Q_PROPERTY(QVariantList supportedMediaEncryptions READ getSupportedMediaEncryptions CONSTANT);
Q_PROPERTY(bool chatNotificationSoundEnabled READ getChatNotificationSoundEnabled WRITE setChatNotificationSoundEnabled NOTIFY chatNotificationSoundEnabledChanged);
Q_PROPERTY(QString chatNotificationSoundPath READ getChatNotificationSoundPath WRITE setChatNotificationSoundPath NOTIFY chatNotificationSoundPathChanged);
Q_PROPERTY(MediaEncryption mediaEncryption READ getMediaEncryption WRITE setMediaEncryption NOTIFY mediaEncryptionChanged);
Q_PROPERTY(LimeState limeState READ getLimeState WRITE setLimeState NOTIFY limeStateChanged);
Q_PROPERTY(QString fileTransferUrl READ getFileTransferUrl WRITE setFileTransferUrl NOTIFY fileTransferUrlChanged);
Q_PROPERTY(bool contactsEnabled READ getContactsEnabled WRITE setContactsEnabled NOTIFY contactsEnabledChanged);
Q_PROPERTY(bool limeIsSupported READ getLimeIsSupported CONSTANT);
Q_PROPERTY(QVariantList supportedMediaEncryptions READ getSupportedMediaEncryptions CONSTANT);
// Network. ------------------------------------------------------------------
Q_PROPERTY(MediaEncryption mediaEncryption READ getMediaEncryption WRITE setMediaEncryption NOTIFY mediaEncryptionChanged);
Q_PROPERTY(bool mediaEncryptionMandatory READ mandatoryMediaEncryptionEnabled WRITE enableMandatoryMediaEncryption NOTIFY mediaEncryptionChanged);
Q_PROPERTY(bool showNetworkSettings READ getShowNetworkSettings WRITE setShowNetworkSettings NOTIFY showNetworkSettingsChanged);
Q_PROPERTY(LimeState limeState READ getLimeState WRITE setLimeState NOTIFY limeStateChanged);
Q_PROPERTY(bool useSipInfoForDtmfs READ getUseSipInfoForDtmfs WRITE setUseSipInfoForDtmfs NOTIFY dtmfsProtocolChanged);
Q_PROPERTY(bool useRfc2833ForDtmfs READ getUseRfc2833ForDtmfs WRITE setUseRfc2833ForDtmfs NOTIFY dtmfsProtocolChanged);
Q_PROPERTY(bool contactsEnabled READ getContactsEnabled WRITE setContactsEnabled NOTIFY contactsEnabledChanged);
Q_PROPERTY(bool ipv6Enabled READ getIpv6Enabled WRITE setIpv6Enabled NOTIFY ipv6EnabledChanged);
// Network. ------------------------------------------------------------------
Q_PROPERTY(int downloadBandwidth READ getDownloadBandwidth WRITE setDownloadBandwidth NOTIFY downloadBandWidthChanged);
Q_PROPERTY(int uploadBandwidth READ getUploadBandwidth WRITE setUploadBandwidth NOTIFY uploadBandWidthChanged);
Q_PROPERTY(bool showNetworkSettings READ getShowNetworkSettings WRITE setShowNetworkSettings NOTIFY showNetworkSettingsChanged);
Q_PROPERTY(
bool adaptiveRateControlEnabled
READ getAdaptiveRateControlEnabled
WRITE setAdaptiveRateControlEnabled
NOTIFY adaptiveRateControlEnabledChanged
);
Q_PROPERTY(bool useSipInfoForDtmfs READ getUseSipInfoForDtmfs WRITE setUseSipInfoForDtmfs NOTIFY dtmfsProtocolChanged);
Q_PROPERTY(bool useRfc2833ForDtmfs READ getUseRfc2833ForDtmfs WRITE setUseRfc2833ForDtmfs NOTIFY dtmfsProtocolChanged);
Q_PROPERTY(int tcpPort READ getTcpPort WRITE setTcpPort NOTIFY tcpPortChanged);
Q_PROPERTY(int udpPort READ getUdpPort WRITE setUdpPort NOTIFY udpPortChanged);
Q_PROPERTY(bool ipv6Enabled READ getIpv6Enabled WRITE setIpv6Enabled NOTIFY ipv6EnabledChanged);
Q_PROPERTY(QList<int> audioPortRange READ getAudioPortRange WRITE setAudioPortRange NOTIFY audioPortRangeChanged);
Q_PROPERTY(QList<int> videoPortRange READ getVideoPortRange WRITE setVideoPortRange NOTIFY videoPortRangeChanged);
Q_PROPERTY(int downloadBandwidth READ getDownloadBandwidth WRITE setDownloadBandwidth NOTIFY downloadBandWidthChanged);
Q_PROPERTY(int uploadBandwidth READ getUploadBandwidth WRITE setUploadBandwidth NOTIFY uploadBandWidthChanged);
Q_PROPERTY(bool iceEnabled READ getIceEnabled WRITE setIceEnabled NOTIFY iceEnabledChanged);
Q_PROPERTY(bool turnEnabled READ getTurnEnabled WRITE setTurnEnabled NOTIFY turnEnabledChanged);
Q_PROPERTY(
bool adaptiveRateControlEnabled
READ getAdaptiveRateControlEnabled
WRITE setAdaptiveRateControlEnabled
NOTIFY adaptiveRateControlEnabledChanged
);
Q_PROPERTY(QString stunServer READ getStunServer WRITE setStunServer NOTIFY stunServerChanged);
Q_PROPERTY(int tcpPort READ getTcpPort WRITE setTcpPort NOTIFY tcpPortChanged);
Q_PROPERTY(int udpPort READ getUdpPort WRITE setUdpPort NOTIFY udpPortChanged);
Q_PROPERTY(QString turnUser READ getTurnUser WRITE setTurnUser NOTIFY turnUserChanged);
Q_PROPERTY(QString turnPassword READ getTurnPassword WRITE setTurnPassword NOTIFY turnPasswordChanged);
Q_PROPERTY(QList<int> audioPortRange READ getAudioPortRange WRITE setAudioPortRange NOTIFY audioPortRangeChanged);
Q_PROPERTY(QList<int> videoPortRange READ getVideoPortRange WRITE setVideoPortRange NOTIFY videoPortRangeChanged);
Q_PROPERTY(int dscpSip READ getDscpSip WRITE setDscpSip NOTIFY dscpSipChanged);
Q_PROPERTY(int dscpAudio READ getDscpAudio WRITE setDscpAudio NOTIFY dscpAudioChanged);
Q_PROPERTY(int dscpVideo READ getDscpVideo WRITE setDscpVideo NOTIFY dscpVideoChanged);
Q_PROPERTY(bool iceEnabled READ getIceEnabled WRITE setIceEnabled NOTIFY iceEnabledChanged);
Q_PROPERTY(bool turnEnabled READ getTurnEnabled WRITE setTurnEnabled NOTIFY turnEnabledChanged);
Q_PROPERTY(bool rlsUriEnabled READ getRlsUriEnabled WRITE setRlsUriEnabled NOTIFY rlsUriEnabledChanged);
Q_PROPERTY(QString stunServer READ getStunServer WRITE setStunServer NOTIFY stunServerChanged);
// UI. -----------------------------------------------------------------------
Q_PROPERTY(QString turnUser READ getTurnUser WRITE setTurnUser NOTIFY turnUserChanged);
Q_PROPERTY(QString turnPassword READ getTurnPassword WRITE setTurnPassword NOTIFY turnPasswordChanged);
Q_PROPERTY(QString remoteProvisioning READ getRemoteProvisioning WRITE setRemoteProvisioning NOTIFY remoteProvisioningChanged);
Q_PROPERTY(int dscpSip READ getDscpSip WRITE setDscpSip NOTIFY dscpSipChanged);
Q_PROPERTY(int dscpAudio READ getDscpAudio WRITE setDscpAudio NOTIFY dscpAudioChanged);
Q_PROPERTY(int dscpVideo READ getDscpVideo WRITE setDscpVideo NOTIFY dscpVideoChanged);
Q_PROPERTY(QString savedScreenshotsFolder READ getSavedScreenshotsFolder WRITE setSavedScreenshotsFolder NOTIFY savedScreenshotsFolderChanged);
Q_PROPERTY(QString savedCallsFolder READ getSavedCallsFolder WRITE setSavedCallsFolder NOTIFY savedCallsFolderChanged);
Q_PROPERTY(QString downloadFolder READ getDownloadFolder WRITE setDownloadFolder NOTIFY downloadFolderChanged);
Q_PROPERTY(bool rlsUriEnabled READ getRlsUriEnabled WRITE setRlsUriEnabled NOTIFY rlsUriEnabledChanged);
Q_PROPERTY(bool exitOnClose READ getExitOnClose WRITE setExitOnClose NOTIFY exitOnCloseChanged);
// UI. -----------------------------------------------------------------------
// Advanced. -----------------------------------------------------------------
Q_PROPERTY(QString remoteProvisioning READ getRemoteProvisioning WRITE setRemoteProvisioning NOTIFY remoteProvisioningChanged);
Q_PROPERTY(QString logsFolder READ getLogsFolder WRITE setLogsFolder NOTIFY logsFolderChanged);
Q_PROPERTY(QString logsUploadUrl READ getLogsUploadUrl WRITE setLogsUploadUrl NOTIFY logsUploadUrlChanged);
Q_PROPERTY(bool logsEnabled READ getLogsEnabled WRITE setLogsEnabled NOTIFY logsEnabledChanged);
Q_PROPERTY(QString logsEmail READ getLogsEmail WRITE setLogsEmail NOTIFY logsEmailChanged);
Q_PROPERTY(QString savedScreenshotsFolder READ getSavedScreenshotsFolder WRITE setSavedScreenshotsFolder NOTIFY savedScreenshotsFolderChanged);
Q_PROPERTY(QString savedCallsFolder READ getSavedCallsFolder WRITE setSavedCallsFolder NOTIFY savedCallsFolderChanged);
Q_PROPERTY(QString downloadFolder READ getDownloadFolder WRITE setDownloadFolder NOTIFY downloadFolderChanged);
Q_PROPERTY(bool developerSettingsEnabled READ getDeveloperSettingsEnabled WRITE setDeveloperSettingsEnabled NOTIFY developerSettingsEnabledChanged);
Q_PROPERTY(bool exitOnClose READ getExitOnClose WRITE setExitOnClose NOTIFY exitOnCloseChanged);
// Advanced. -----------------------------------------------------------------
Q_PROPERTY(QString logsFolder READ getLogsFolder WRITE setLogsFolder NOTIFY logsFolderChanged);
Q_PROPERTY(QString logsUploadUrl READ getLogsUploadUrl WRITE setLogsUploadUrl NOTIFY logsUploadUrlChanged);
Q_PROPERTY(bool logsEnabled READ getLogsEnabled WRITE setLogsEnabled NOTIFY logsEnabledChanged);
Q_PROPERTY(QString logsEmail READ getLogsEmail WRITE setLogsEmail NOTIFY logsEmailChanged);
Q_PROPERTY(bool developerSettingsEnabled READ getDeveloperSettingsEnabled WRITE setDeveloperSettingsEnabled NOTIFY developerSettingsEnabledChanged);
Q_PROPERTY(bool isInCall READ getIsInCall NOTIFY isInCallChanged);
public:
enum MediaEncryption {
MediaEncryptionNone = int(linphone::MediaEncryption::None),
MediaEncryptionDtls = int(linphone::MediaEncryption::DTLS),
MediaEncryptionSrtp = int(linphone::MediaEncryption::SRTP),
MediaEncryptionZrtp = int(linphone::MediaEncryption::ZRTP)
};
Q_ENUM(MediaEncryption);
enum MediaEncryption {
MediaEncryptionNone = int(linphone::MediaEncryption::None),
MediaEncryptionDtls = int(linphone::MediaEncryption::DTLS),
MediaEncryptionSrtp = int(linphone::MediaEncryption::SRTP),
MediaEncryptionZrtp = int(linphone::MediaEncryption::ZRTP)
};
Q_ENUM(MediaEncryption);
enum LimeState {
LimeStateDisabled = int(linphone::LimeState::Disabled),
LimeStateMandatory = int(linphone::LimeState::Mandatory),
LimeStatePreferred = int(linphone::LimeState::Preferred)
};
Q_ENUM(LimeState);
enum LimeState {
LimeStateDisabled = int(linphone::LimeState::Disabled),
LimeStateMandatory = int(linphone::LimeState::Mandatory),
LimeStatePreferred = int(linphone::LimeState::Preferred)
};
Q_ENUM(LimeState);
SettingsModel (QObject *parent = Q_NULLPTR);
SettingsModel (QObject *parent = Q_NULLPTR);
// ===========================================================================
// METHODS.
// ===========================================================================
// ===========================================================================
// METHODS.
// ===========================================================================
// Assistant. ----------------------------------------------------------------
Q_INVOKABLE void onSettingsTabChanged(int idx);
Q_INVOKABLE void settingsWindowClosing(void);
bool getCreateAppSipAccountEnabled () const;
void setCreateAppSipAccountEnabled (bool status);
// Assistant. ----------------------------------------------------------------
bool getFetchRemoteConfigurationEnabled () const;
void setFetchRemoteConfigurationEnabled (bool status);
bool getCreateAppSipAccountEnabled () const;
void setCreateAppSipAccountEnabled (bool status);
bool getUseAppSipAccountEnabled () const;
void setUseAppSipAccountEnabled (bool status);
bool getFetchRemoteConfigurationEnabled () const;
void setFetchRemoteConfigurationEnabled (bool status);
bool getUseOtherSipAccountEnabled () const;
void setUseOtherSipAccountEnabled (bool status);
bool getUseAppSipAccountEnabled () const;
void setUseAppSipAccountEnabled (bool status);
bool getAssistantSupportsPhoneNumbers () const;
void setAssistantSupportsPhoneNumbers (bool status);
bool getUseOtherSipAccountEnabled () const;
void setUseOtherSipAccountEnabled (bool status);
// Audio. --------------------------------------------------------------------
bool getAssistantSupportsPhoneNumbers () const;
void setAssistantSupportsPhoneNumbers (bool status);
QStringList getCaptureDevices () const;
QStringList getPlaybackDevices () const;
// Audio. --------------------------------------------------------------------
QString getCaptureDevice () const;
void setCaptureDevice (const QString &device);
void createCaptureGraph();
bool getCaptureGraphRunning();
void accessAudioSettings();
void closeAudioSettings();
QString getPlaybackDevice () const;
void setPlaybackDevice (const QString &device);
Q_INVOKABLE float getMicVolume();
QString getRingerDevice () const;
void setRingerDevice (const QString &device);
float getPlaybackGain() const;
void setPlaybackGain(float gain);
QString getRingPath () const;
void setRingPath (const QString &path);
float getCaptureGain() const;
void setCaptureGain(float gain);
bool getEchoCancellationEnabled () const;
void setEchoCancellationEnabled (bool status);
QStringList getCaptureDevices () const;
QStringList getPlaybackDevices () const;
bool getShowAudioCodecs () const;
void setShowAudioCodecs (bool status);
QString getCaptureDevice () const;
void setCaptureDevice (const QString &device);
// Video. --------------------------------------------------------------------
QString getPlaybackDevice () const;
void setPlaybackDevice (const QString &device);
QStringList getVideoDevices () const;
QString getRingerDevice () const;
void setRingerDevice (const QString &device);
QString getVideoDevice () const;
void setVideoDevice (const QString &device);
QString getRingPath () const;
void setRingPath (const QString &path);
QString getVideoPreset () const;
void setVideoPreset (const QString &preset);
bool getEchoCancellationEnabled () const;
void setEchoCancellationEnabled (bool status);
int getVideoFramerate () const;
void setVideoFramerate (int framerate);
bool getShowAudioCodecs () const;
void setShowAudioCodecs (bool status);
QVariantList getSupportedVideoDefinitions () const;
// Video. --------------------------------------------------------------------
QVariantMap getVideoDefinition () const;
void setVideoDefinition (const QVariantMap &definition);
//Called from qml when accessing audio settings panel
Q_INVOKABLE void accessVideoSettings();
bool getVideoSupported () const;
QStringList getVideoDevices () const;
bool getShowVideoCodecs () const;
void setShowVideoCodecs (bool status);
QString getVideoDevice () const;
void setVideoDevice (const QString &device);
// Chat & calls. -------------------------------------------------------------
QString getVideoPreset () const;
void setVideoPreset (const QString &preset);
bool getAutoAnswerStatus () const;
void setAutoAnswerStatus (bool status);
int getVideoFramerate () const;
void setVideoFramerate (int framerate);
bool getAutoAnswerVideoStatus () const;
void setAutoAnswerVideoStatus (bool status);
QVariantList getSupportedVideoDefinitions () const;
int getAutoAnswerDelay () const;
void setAutoAnswerDelay (int delay);
QVariantMap getVideoDefinition () const;
void setVideoDefinition (const QVariantMap &definition);
bool getShowTelKeypadAutomatically () const;
void setShowTelKeypadAutomatically (bool status);
bool getVideoSupported () const;
bool getKeepCallsWindowInBackground () const;
void setKeepCallsWindowInBackground (bool status);
bool getShowVideoCodecs () const;
void setShowVideoCodecs (bool status);
bool getOutgoingCallsEnabled () const;
void setOutgoingCallsEnabled (bool status);
// Chat & calls. -------------------------------------------------------------
bool getCallRecorderEnabled () const;
void setCallRecorderEnabled (bool status);
bool getAutoAnswerStatus () const;
void setAutoAnswerStatus (bool status);
bool getAutomaticallyRecordCalls () const;
void setAutomaticallyRecordCalls (bool status);
bool getAutoAnswerVideoStatus () const;
void setAutoAnswerVideoStatus (bool status);
bool getCallPauseEnabled () const;
void setCallPauseEnabled (bool status);
int getAutoAnswerDelay () const;
void setAutoAnswerDelay (int delay);
bool getMuteMicrophoneEnabled () const;
void setMuteMicrophoneEnabled (bool status);
bool getShowTelKeypadAutomatically () const;
void setShowTelKeypadAutomatically (bool status);
bool getChatEnabled () const;
void setChatEnabled (bool status);
bool getKeepCallsWindowInBackground () const;
void setKeepCallsWindowInBackground (bool status);
bool getConferenceEnabled () const;
void setConferenceEnabled (bool status);
bool getOutgoingCallsEnabled () const;
void setOutgoingCallsEnabled (bool status);
bool getChatNotificationSoundEnabled () const;
void setChatNotificationSoundEnabled (bool status);
bool getCallRecorderEnabled () const;
void setCallRecorderEnabled (bool status);
QString getChatNotificationSoundPath () const;
void setChatNotificationSoundPath (const QString &path);
bool getAutomaticallyRecordCalls () const;
void setAutomaticallyRecordCalls (bool status);
QString getFileTransferUrl () const;
void setFileTransferUrl (const QString &url);
bool getCallPauseEnabled () const;
void setCallPauseEnabled (bool status);
bool getLimeIsSupported () const;
QVariantList getSupportedMediaEncryptions () const;
bool getMuteMicrophoneEnabled () const;
void setMuteMicrophoneEnabled (bool status);
MediaEncryption getMediaEncryption () const;
void setMediaEncryption (MediaEncryption encryption);
bool getChatEnabled () const;
void setChatEnabled (bool status);
LimeState getLimeState () const;
void setLimeState (LimeState state);
bool getConferenceEnabled () const;
void setConferenceEnabled (bool status);
bool getContactsEnabled () const;
void setContactsEnabled (bool status);
bool getChatNotificationSoundEnabled () const;
void setChatNotificationSoundEnabled (bool status);
// Network. ------------------------------------------------------------------
QString getChatNotificationSoundPath () const;
void setChatNotificationSoundPath (const QString &path);
bool getShowNetworkSettings () const;
void setShowNetworkSettings (bool status);
QString getFileTransferUrl () const;
void setFileTransferUrl (const QString &url);
bool getUseSipInfoForDtmfs () const;
void setUseSipInfoForDtmfs (bool status);
bool getLimeIsSupported () const;
QVariantList getSupportedMediaEncryptions () const;
bool getUseRfc2833ForDtmfs () const;
void setUseRfc2833ForDtmfs (bool status);
MediaEncryption getMediaEncryption () const;
void setMediaEncryption (MediaEncryption encryption);
bool getIpv6Enabled () const;
void setIpv6Enabled (bool status);
bool mandatoryMediaEncryptionEnabled () const;
void enableMandatoryMediaEncryption(bool mandatory);
int getDownloadBandwidth () const;
void setDownloadBandwidth (int bandwidth);
LimeState getLimeState () const;
void setLimeState (LimeState state);
int getUploadBandwidth () const;
void setUploadBandwidth (int bandwidth);
bool getContactsEnabled () const;
void setContactsEnabled (bool status);
bool getAdaptiveRateControlEnabled () const;
void setAdaptiveRateControlEnabled (bool status);
// Network. ------------------------------------------------------------------
int getTcpPort () const;
void setTcpPort (int port);
bool getShowNetworkSettings () const;
void setShowNetworkSettings (bool status);
int getUdpPort () const;
void setUdpPort (int port);
bool getUseSipInfoForDtmfs () const;
void setUseSipInfoForDtmfs (bool status);
QList<int> getAudioPortRange () const;
void setAudioPortRange (const QList<int> &range);
bool getUseRfc2833ForDtmfs () const;
void setUseRfc2833ForDtmfs (bool status);
QList<int> getVideoPortRange () const;
void setVideoPortRange (const QList<int> &range);
bool getIpv6Enabled () const;
void setIpv6Enabled (bool status);
bool getIceEnabled () const;
void setIceEnabled (bool status);
int getDownloadBandwidth () const;
void setDownloadBandwidth (int bandwidth);
bool getTurnEnabled () const;
void setTurnEnabled (bool status);
int getUploadBandwidth () const;
void setUploadBandwidth (int bandwidth);
QString getStunServer () const;
void setStunServer (const QString &stunServer);
bool getAdaptiveRateControlEnabled () const;
void setAdaptiveRateControlEnabled (bool status);
QString getTurnUser () const;
void setTurnUser (const QString &user);
int getTcpPort () const;
void setTcpPort (int port);
QString getTurnPassword () const;
void setTurnPassword (const QString &password);
int getUdpPort () const;
void setUdpPort (int port);
int getDscpSip () const;
void setDscpSip (int dscp);
QList<int> getAudioPortRange () const;
void setAudioPortRange (const QList<int> &range);
int getDscpAudio () const;
void setDscpAudio (int dscp);
QList<int> getVideoPortRange () const;
void setVideoPortRange (const QList<int> &range);
int getDscpVideo () const;
void setDscpVideo (int dscp);
bool getIceEnabled () const;
void setIceEnabled (bool status);
bool getRlsUriEnabled () const;
void setRlsUriEnabled (bool status);
bool getTurnEnabled () const;
void setTurnEnabled (bool status);
void configureRlsUri ();
void configureRlsUri (const std::shared_ptr<const linphone::ProxyConfig> &proxyConfig);
QString getStunServer () const;
void setStunServer (const QString &stunServer);
// UI. -----------------------------------------------------------------------
QString getTurnUser () const;
void setTurnUser (const QString &user);
QString getSavedScreenshotsFolder () const;
void setSavedScreenshotsFolder (const QString &folder);
QString getTurnPassword () const;
void setTurnPassword (const QString &password);
QString getSavedCallsFolder () const;
void setSavedCallsFolder (const QString &folder);
int getDscpSip () const;
void setDscpSip (int dscp);
QString getDownloadFolder () const;
void setDownloadFolder (const QString &folder);
int getDscpAudio () const;
void setDscpAudio (int dscp);
QString getRemoteProvisioning () const;
void setRemoteProvisioning (const QString &remoteProvisioning);
int getDscpVideo () const;
void setDscpVideo (int dscp);
bool getExitOnClose () const;
void setExitOnClose (bool value);
bool getRlsUriEnabled () const;
void setRlsUriEnabled (bool status);
// ---------------------------------------------------------------------------
void configureRlsUri ();
void configureRlsUri (const std::shared_ptr<const linphone::ProxyConfig> &proxyConfig);
QString getLogsFolder () const;
void setLogsFolder (const QString &folder);
// UI. -----------------------------------------------------------------------
QString getLogsUploadUrl () const;
void setLogsUploadUrl (const QString &url);
QString getSavedScreenshotsFolder () const;
void setSavedScreenshotsFolder (const QString &folder);
bool getLogsEnabled () const;
void setLogsEnabled (bool status);
QString getSavedCallsFolder () const;
void setSavedCallsFolder (const QString &folder);
QString getLogsEmail () const;
void setLogsEmail (const QString &email);
QString getDownloadFolder () const;
void setDownloadFolder (const QString &folder);
// ---------------------------------------------------------------------------
QString getRemoteProvisioning () const;
void setRemoteProvisioning (const QString &remoteProvisioning);
static QString getLogsFolder (const std::shared_ptr<linphone::Config> &config);
static bool getLogsEnabled (const std::shared_ptr<linphone::Config> &config);
bool getExitOnClose () const;
void setExitOnClose (bool value);
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
bool getDeveloperSettingsEnabled () const;
void setDeveloperSettingsEnabled (bool status);
QString getLogsFolder () const;
void setLogsFolder (const QString &folder);
static const std::string UiSection;
QString getLogsUploadUrl () const;
void setLogsUploadUrl (const QString &url);
// ===========================================================================
// SIGNALS.
// ===========================================================================
bool getLogsEnabled () const;
void setLogsEnabled (bool status);
QString getLogsEmail () const;
void setLogsEmail (const QString &email);
// ---------------------------------------------------------------------------
static QString getLogsFolder (const std::shared_ptr<linphone::Config> &config);
static bool getLogsEnabled (const std::shared_ptr<linphone::Config> &config);
// ---------------------------------------------------------------------------
bool getDeveloperSettingsEnabled () const;
void setDeveloperSettingsEnabled (bool status);
void handleCallCreated(const std::shared_ptr<linphone::Call> &call);
void handleCallStateChanged(const std::shared_ptr<linphone::Call> &call, linphone::Call::State state);
bool getIsInCall() const;
static const std::string UiSection;
// ===========================================================================
// SIGNALS.
// ===========================================================================
signals:
// Assistant. ----------------------------------------------------------------
// Assistant. ----------------------------------------------------------------
void createAppSipAccountEnabledChanged (bool status);
void fetchRemoteConfigurationEnabledChanged (bool status);
void useAppSipAccountEnabledChanged (bool status);
void useOtherSipAccountEnabledChanged (bool status);
void createAppSipAccountEnabledChanged (bool status);
void fetchRemoteConfigurationEnabledChanged (bool status);
void useAppSipAccountEnabledChanged (bool status);
void useOtherSipAccountEnabledChanged (bool status);
void assistantSupportsPhoneNumbersChanged (bool status);
void assistantSupportsPhoneNumbersChanged (bool status);
// Audio. --------------------------------------------------------------------
// Audio. --------------------------------------------------------------------
void captureDeviceChanged (const QString &device);
void playbackDeviceChanged (const QString &device);
void ringerDeviceChanged (const QString &device);
void captureGraphRunningChanged(bool running);
void ringPathChanged (const QString &path);
void playbackGainChanged(float gain);
void captureGainChanged(float gain);
void echoCancellationEnabledChanged (bool status);
void captureDevicesChanged (const QStringList &devices);
void playbackDevicesChanged (const QStringList &devices);
void showAudioCodecsChanged (bool status);
void captureDeviceChanged (const QString &device);
void playbackDeviceChanged (const QString &device);
void ringerDeviceChanged (const QString &device);
// Video. --------------------------------------------------------------------
void ringPathChanged (const QString &path);
void videoDeviceChanged (const QString &device);
void echoCancellationEnabledChanged (bool status);
void videoPresetChanged (const QString &preset);
void videoFramerateChanged (int framerate);
void showAudioCodecsChanged (bool status);
void videoDefinitionChanged (const QVariantMap &definition);
// Video. --------------------------------------------------------------------
void showVideoCodecsChanged (bool status);
void videoDevicesChanged (const QStringList &devices);
void videoDeviceChanged (const QString &device);
// Chat & calls. -------------------------------------------------------------
void videoPresetChanged (const QString &preset);
void videoFramerateChanged (int framerate);
void autoAnswerStatusChanged (bool status);
void autoAnswerVideoStatusChanged (bool status);
void autoAnswerDelayChanged (int delay);
void videoDefinitionChanged (const QVariantMap &definition);
void showTelKeypadAutomaticallyChanged (bool status);
void showVideoCodecsChanged (bool status);
void keepCallsWindowInBackgroundChanged (bool status);
// Chat & calls. -------------------------------------------------------------
void outgoingCallsEnabledChanged (bool status);
void autoAnswerStatusChanged (bool status);
void autoAnswerVideoStatusChanged (bool status);
void autoAnswerDelayChanged (int delay);
void callRecorderEnabledChanged (bool status);
void automaticallyRecordCallsChanged (bool status);
void showTelKeypadAutomaticallyChanged (bool status);
void callPauseEnabledChanged (bool status);
void muteMicrophoneEnabledChanged (bool status);
void keepCallsWindowInBackgroundChanged (bool status);
void chatEnabledChanged (bool status);
void outgoingCallsEnabledChanged (bool status);
void conferenceEnabledChanged (bool status);
void callRecorderEnabledChanged (bool status);
void automaticallyRecordCallsChanged (bool status);
void chatNotificationSoundEnabledChanged (bool status);
void chatNotificationSoundPathChanged (const QString &path);
void callPauseEnabledChanged (bool status);
void muteMicrophoneEnabledChanged (bool status);
void fileTransferUrlChanged (const QString &url);
void chatEnabledChanged (bool status);
void mediaEncryptionChanged (MediaEncryption encryption);
void limeStateChanged (LimeState state);
void conferenceEnabledChanged (bool status);
void contactsEnabledChanged (bool status);
void chatNotificationSoundEnabledChanged (bool status);
void chatNotificationSoundPathChanged (const QString &path);
// Network. ------------------------------------------------------------------
void fileTransferUrlChanged (const QString &url);
void showNetworkSettingsChanged (bool status);
void mediaEncryptionChanged (MediaEncryption encryption);
void limeStateChanged (LimeState state);
void dtmfsProtocolChanged ();
void contactsEnabledChanged (bool status);
void ipv6EnabledChanged (bool status);
// Network. ------------------------------------------------------------------
void downloadBandWidthChanged (int bandwidth);
void uploadBandWidthChanged (int bandwidth);
void showNetworkSettingsChanged (bool status);
bool adaptiveRateControlEnabledChanged (bool status);
void dtmfsProtocolChanged ();
void tcpPortChanged (int port);
void udpPortChanged (int port);
void ipv6EnabledChanged (bool status);
void audioPortRangeChanged (int a, int b);
void videoPortRangeChanged (int a, int b);
void downloadBandWidthChanged (int bandwidth);
void uploadBandWidthChanged (int bandwidth);
void iceEnabledChanged (bool status);
void turnEnabledChanged (bool status);
bool adaptiveRateControlEnabledChanged (bool status);
void stunServerChanged (const QString &server);
void tcpPortChanged (int port);
void udpPortChanged (int port);
void turnUserChanged (const QString &user);
void turnPasswordChanged (const QString &password);
void audioPortRangeChanged (int a, int b);
void videoPortRangeChanged (int a, int b);
void dscpSipChanged (int dscp);
void dscpAudioChanged (int dscp);
void dscpVideoChanged (int dscp);
void iceEnabledChanged (bool status);
void turnEnabledChanged (bool status);
void rlsUriEnabledChanged (bool status);
void stunServerChanged (const QString &server);
// UI. -----------------------------------------------------------------------
void turnUserChanged (const QString &user);
void turnPasswordChanged (const QString &password);
void savedScreenshotsFolderChanged (const QString &folder);
void savedCallsFolderChanged (const QString &folder);
void downloadFolderChanged (const QString &folder);
void dscpSipChanged (int dscp);
void dscpAudioChanged (int dscp);
void dscpVideoChanged (int dscp);
void remoteProvisioningChanged (const QString &remoteProvisioning);
void remoteProvisioningNotChanged (const QString &remoteProvisioning);
void rlsUriEnabledChanged (bool status);
void exitOnCloseChanged (bool value);
// UI. -----------------------------------------------------------------------
// Advanced. -----------------------------------------------------------------
void savedScreenshotsFolderChanged (const QString &folder);
void savedCallsFolderChanged (const QString &folder);
void downloadFolderChanged (const QString &folder);
void logsFolderChanged (const QString &folder);
void logsUploadUrlChanged (const QString &url);
void logsEnabledChanged (bool status);
void logsEmailChanged (const QString &email);
void remoteProvisioningChanged (const QString &remoteProvisioning);
void remoteProvisioningNotChanged (const QString &remoteProvisioning);
bool developerSettingsEnabledChanged (bool status);
void exitOnCloseChanged (bool value);
// Advanced. -----------------------------------------------------------------
void logsFolderChanged (const QString &folder);
void logsUploadUrlChanged (const QString &url);
void logsEnabledChanged (bool status);
void logsEmailChanged (const QString &email);
bool developerSettingsEnabledChanged (bool status);
bool isInCallChanged(bool);
private:
std::shared_ptr<linphone::Config> mConfig;
int mCurrentSettingsTab = 0;
MediastreamerUtils::SimpleCaptureGraph *mSimpleCaptureGraph = nullptr;
std::shared_ptr<linphone::Config> mConfig;
};
Q_DECLARE_METATYPE(std::shared_ptr<const linphone::VideoDefinition>);

View file

@ -451,6 +451,14 @@ void SipAddressesModel::addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry,
].timestamp = callLog->getStatus() == linphone::Call::Status::Success
? QDateTime::fromMSecsSinceEpoch((callLog->getStartDate() + callLog->getDuration()) * 1000)
: QDateTime::fromMSecsSinceEpoch(callLog->getStartDate() * 1000);
if (callLog->getStatus() == linphone::Call::Status::Missed) {
for (auto &observer : mObservers.values(QString::fromStdString((callLog->getRemoteAddress()->asStringUriOnly())))) {
if (observer->getLocalAddress() == QString::fromStdString(callLog->getLocalAddress()->asStringUriOnly())) {
observer->setUnreadMessageCount(1);
}
}
}
}
void SipAddressesModel::addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const shared_ptr<linphone::ChatMessage> &message) {
@ -561,18 +569,17 @@ void SipAddressesModel::initSipAddressesFromCalls () {
const QString localAddress(Utils::coreStringToAppString(callLog->getLocalAddress()->asStringUriOnly()));
switch (callLog->getStatus()) {
case linphone::Call::Status::Aborted:
case linphone::Call::Status::EarlyAborted:
return; // Ignore aborted calls.
case linphone::Call::Status::Aborted:
case linphone::Call::Status::EarlyAborted:
return; // Ignore aborted calls.
case linphone::Call::Status::AcceptedElsewhere:
case linphone::Call::Status::DeclinedElsewhere:
return; // Ignore accepted calls on other device.
case linphone::Call::Status::Success:
case linphone::Call::Status::Declined:
case linphone::Call::Status::AcceptedElsewhere:
case linphone::Call::Status::DeclinedElsewhere:
return; // Ignore accepted calls on other device.
case linphone::Call::Status::Success:
case linphone::Call::Status::Missed:
case linphone::Call::Status::Declined:
break;
case linphone::Call::Status::Missed:
break;
}
ConferenceId conferenceId{ peerAddress, localAddress };
@ -617,9 +624,10 @@ void SipAddressesModel::updateObservers (const QString &sipAddress, const Presen
}
void SipAddressesModel::updateObservers (const QString &peerAddress, const QString &localAddress, int messageCount) {
for (auto &observer : mObservers.values(peerAddress))
if (observer->getLocalAddress() == localAddress) {
observer->setUnreadMessageCount(messageCount);
return;
}
for (auto &observer : mObservers.values(peerAddress)) {
if (observer->getLocalAddress() == localAddress) {
observer->setUnreadMessageCount(messageCount);
return;
}
}
}

View file

@ -114,6 +114,9 @@ private:
void addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const std::shared_ptr<linphone::Call> &call);
void addOrUpdateSipAddress (SipAddressEntry &sipAddressEntry, const std::shared_ptr<linphone::ChatMessage> &message);
//NMN TODO bind to missedCall event and implement void addOrUpdateSipAddress
template<class T>
void addOrUpdateSipAddress (const QString &sipAddress, T data);

View file

@ -143,7 +143,7 @@ void SoundPlayer::buildInternalPlayer () {
mInternalPlayer = coreManager->getCore()->createLocalPlayer(
Utils::appStringToCoreString(settingsModel->getRingerDevice()), "", nullptr
);
mInternalPlayer->setListener(mHandlers);
mInternalPlayer->addListener(mHandlers);
QObject::connect(settingsModel, &SettingsModel::ringerDeviceChanged, this, [this] {
rebuildInternalPlayer();

View file

@ -30,17 +30,6 @@
class QString;
namespace LinphoneUtils {
inline float computeVu (float volume) {
constexpr float VuMin = -20.f;
constexpr float VuMax = 4.f;
if (volume < VuMin)
return 0.f;
if (volume > VuMax)
return 1.f;
return (volume - VuMin) / (VuMax - VuMin);
}
linphone::TransportType stringToTransportType (const QString &transport);

View file

@ -0,0 +1,141 @@
/*
* MediastreamerUtils.cpp
* Copyright (C) 2017-2019 Belledonne Communications, Grenoble, France
*
* 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.
*
* Created on: Nov 6, 2019
* Author: Nicolas Michon
*/
#include <linphone/linphonecore.h>
#include "mediastreamer2/msvolume.h"
#include "mediastreamer2/mssndcard.h"
#include "mediastreamer2/msticker.h"
#include "components/core/CoreManager.hpp"
#include "MediastreamerUtils.hpp"
using namespace MediastreamerUtils;
SimpleCaptureGraph::SimpleCaptureGraph(const std::string &capture, const std::string &playback)
: captureCardId(capture), playbackCardId(playback)
{
LinphoneCore *ccore = CoreManager::getInstance()->getCore()->cPtr();
msFactory = linphone_core_get_ms_factory(ccore);
playbackCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), playbackCardId.c_str());
captureCard = ms_snd_card_manager_get_card(ms_factory_get_snd_card_manager(msFactory), captureCardId.c_str());
init();
}
SimpleCaptureGraph::~SimpleCaptureGraph()
{
destroy();
}
void SimpleCaptureGraph::init() {
if (!audioCapture) {
audioCapture = ms_snd_card_create_reader(captureCard);
}
if (!audioSink) {
audioSink = ms_snd_card_create_writer(playbackCard);
}
if (!captureVolumeFilter) {
captureVolumeFilter = ms_factory_create_filter(msFactory, MS_VOLUME_ID);
}
if (!playbackVolumeFilter) {
playbackVolumeFilter = ms_factory_create_filter(msFactory, MS_VOLUME_ID);
}
ms_filter_link(audioCapture, 0, captureVolumeFilter, 0);
ms_filter_link(captureVolumeFilter, 0, playbackVolumeFilter, 0);
ms_filter_link(playbackVolumeFilter, 0, audioSink, 0);
//Mute playback
float muteGain = 0.0f;
ms_filter_call_method(playbackVolumeFilter, static_cast<unsigned int>(MS_VOLUME_SET_GAIN), &muteGain);
ticker = ms_ticker_new();
running = false;
}
void SimpleCaptureGraph::start() {
if (!running) {
ms_ticker_attach(ticker, audioCapture);
running = true;
}
}
void SimpleCaptureGraph::stop() {
if (running) {
ms_ticker_detach(ticker, audioCapture);
running = false;
}
}
void SimpleCaptureGraph::destroy() {
if (running) {
stop();
}
ms_ticker_destroy(ticker);
ms_filter_unlink(audioCapture, 0, captureVolumeFilter, 0);
ms_filter_unlink(captureVolumeFilter, 0, playbackVolumeFilter, 0);
ms_filter_unlink(playbackVolumeFilter, 0, audioSink, 0);
ms_free(audioCapture);
ms_free(captureVolumeFilter);
ms_free(audioSink);
ms_free(playbackVolumeFilter);
}
float SimpleCaptureGraph::getCaptureGain() {
float gain = 0.0f;
if (isRunning() && audioCapture) {
ms_filter_call_method(audioCapture, MS_AUDIO_CAPTURE_GET_VOLUME_GAIN, &gain);
}
return gain;
}
void SimpleCaptureGraph::setCaptureGain(float gain) {
if (isRunning() && audioCapture) {
ms_filter_call_method(audioCapture, MS_AUDIO_CAPTURE_SET_VOLUME_GAIN, &gain);
}
}
float SimpleCaptureGraph::getPlaybackGain() {
float gain = 0.0f;
if (isRunning() && audioSink) {
ms_filter_call_method(audioSink, MS_AUDIO_PLAYBACK_GET_VOLUME_GAIN, &gain);
}
return gain;
}
void SimpleCaptureGraph::setPlaybackGain(float gain) {
if (isRunning() && audioSink) {
ms_filter_call_method(audioSink, MS_AUDIO_PLAYBACK_SET_VOLUME_GAIN, &gain);
}
}
float SimpleCaptureGraph::getCaptureVolume() {
float vol = 0;
if (captureVolumeFilter) {
ms_filter_call_method(captureVolumeFilter, MS_VOLUME_GET, &vol);
vol = MediastreamerUtils::dbToLinear(vol);
}
return vol;
}

View file

@ -0,0 +1,102 @@
/*
* MediastreamerUtils.hpp
* Copyright (C) 2017-2019 Belledonne Communications, Grenoble, France
*
* 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.
*
* Created on: Nov 6, 2019
* Author: Nicolas Michon
*/
#ifndef MEDIASTREAMER_UTILS_H_
#define MEDIASTREAMER_UTILS_H_
#include <cmath>
#include "mediastreamer2/mssndcard.h"
#include "mediastreamer2/msvolume.h"
#include "mediastreamer2/msfilter.h"
#include "mediastreamer2/msticker.h"
#include <linphone++/linphone.hh>
// =============================================================================
namespace MediastreamerUtils {
inline float computeVu (float volume) {
constexpr float VuMin = -20.f;
constexpr float VuMax = 4.f;
if (volume < VuMin)
return 0.f;
if (volume > VuMax)
return 1.f;
return (volume - VuMin) / (VuMax - VuMin);
}
inline float dbToLinear(float volume) {
return static_cast<float>(pow(10, volume / 10));
}
inline float linearToDb(float volume) {
if (volume == 0.0f) {
return MS_VOLUME_DB_LOWEST;
}
return static_cast<float>(10 * log10(volume));
}
//Simple mediastreamer audio capture graph
//Used to get current microphone volume in audio settings
class SimpleCaptureGraph {
public:
SimpleCaptureGraph(const std::string &captureCardId, const std::string &playbackCardId);
~SimpleCaptureGraph();
void start();
void stop();
float getCaptureVolume();
float getCaptureGain();
float getPlaybackGain();
void setCaptureGain(float volume);
void setPlaybackGain(float volume);
bool isRunning() const {
return running;
}
protected:
void init();
void destroy();
bool running = false;
std::string captureCardId;
std::string playbackCardId;
MSFilter *audioSink = nullptr;
MSFilter *audioCapture = nullptr;
MSFilter *captureVolumeFilter = nullptr;
MSFilter *playbackVolumeFilter = nullptr;
MSTicker *ticker = nullptr;
MSSndCard *playbackCard = nullptr;
MSSndCard *captureCard = nullptr;
MSFactory *msFactory = nullptr;
};
}
#endif // ifndef MEDIASTREAMER_UTILS_H_

View file

@ -69,3 +69,54 @@ QString Utils::getSafeFilePath (const QString &filePath, bool *soFarSoGood) {
return QString("");
}
// Data to retrieve WIN32 process
#ifdef _WIN32
#include <windows.h>
struct EnumData {
DWORD dwProcessId;
HWND hWnd;
};
// Application-defined callback for EnumWindows
BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam) {
// Retrieve storage location for communication data
EnumData& ed = *(EnumData*)lParam;
DWORD dwProcessId = 0x0;
// Query process ID for hWnd
GetWindowThreadProcessId(hWnd, &dwProcessId);
// Apply filter - if you want to implement additional restrictions,
// this is the place to do so.
if (ed.dwProcessId == dwProcessId) {
// Found a window matching the process ID
ed.hWnd = hWnd;
// Report success
SetLastError(ERROR_SUCCESS);
// Stop enumeration
return FALSE;
}
// Continue enumeration
return TRUE;
}
// Main entry
HWND FindWindowFromProcessId(DWORD dwProcessId) {
EnumData ed = { dwProcessId };
if (!EnumWindows(EnumProc, (LPARAM)&ed) &&
(GetLastError() == ERROR_SUCCESS)) {
return ed.hWnd;
}
return NULL;
}
// Helper method for convenience
HWND FindWindowFromProcess(HANDLE hProcess) {
return FindWindowFromProcessId(GetProcessId(hProcess));
}
#endif
bool Utils::processExists(const quint64& p_processId)
{
#ifdef _WIN32
return FindWindowFromProcessId(p_processId) != NULL;
#else
return true;
#endif
}

View file

@ -56,6 +56,9 @@ namespace Utils {
// Otherwise returns a safe path with a unique number before the extension.
QString getSafeFilePath (const QString &filePath, bool *soFarSoGood = nullptr);
// Test if the process exists
bool processExists(const quint64& p_processId);
// Connect once to a member function.
template<typename Func1, typename Func2>
static inline QMetaObject::Connection connectOnce (

View file

@ -17,6 +17,7 @@ Item {
property bool useStates: true
property int iconSize // Optional.
readonly property alias hovered: button.hovered
property alias text: button.text
// If `useStates` = true, the used icons are:
// `icon`_pressed, `icon`_hovered and `icon`_normal.
@ -51,7 +52,7 @@ Item {
// ---------------------------------------------------------------------------
height: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.width
Button {
id: button

View file

@ -5,6 +5,7 @@ import QtQuick 2.7
Item {
property alias updating: actionButton.updating
property alias useStates: actionButton.useStates
property alias text: actionButton.text
property bool enabled: true
property int iconSize // Optionnal.
property string icon
@ -16,7 +17,7 @@ Item {
// ---------------------------------------------------------------------------
height: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.height
width: iconSize || parent.iconSize || parent.width
ActionButton {
id: actionButton

View file

@ -1,5 +1,5 @@
import QtQuick 2.7
import QtQuick.Controls 2.2
import QtQuick 2.7 as Core
import QtQuick.Controls 2.2 as Core
import Common 1.0
import Common.Styles 1.0
@ -7,7 +7,7 @@ import Utils 1.0
// =============================================================================
ToolTip {
Core.ToolTip {
id: tooltip
property var _edge: 'left'
@ -78,7 +78,7 @@ ToolTip {
// ---------------------------------------------------------------------------
background: Item {
background: Core.Item {
id: container
layer {
@ -86,7 +86,7 @@ ToolTip {
effect: PopupShadow {}
}
Rectangle {
Core.Rectangle {
anchors {
fill: parent
margins: TooltipStyle.margins
@ -97,10 +97,10 @@ ToolTip {
// Do not use `Icon` component to access to `implicitHeight`
// and `implicitWidth`.
Image {
Core.Image {
id: icon
fillMode: Image.PreserveAspectFit
fillMode: Core.Image.PreserveAspectFit
height: TooltipStyle.arrowSize
source: _edge
? Utils.resolveImageUri('tooltip_arrow_' + _edge)
@ -111,11 +111,11 @@ ToolTip {
width: TooltipStyle.arrowSize
z: Constants.zMax
onStatusChanged: status === Image.Ready && _setArrowPosition()
onStatusChanged: status === Core.Image.Ready && _setArrowPosition()
}
}
contentItem: Text {
contentItem: Core.Text {
id: text
color: TooltipStyle.color

View file

@ -81,6 +81,8 @@ PopupShadow 1.0 Popup/PopupShadow.qml
TooltipArea 1.0 Tooltip/TooltipArea.qml
ToolTip 1.0 Tooltip/Tooltip.qml
ScrollableListView 1.0 View/ScrollableListView.qml
ApplicationWindow 1.0 Window/ApplicationWindow.qml

View file

@ -17,7 +17,7 @@ Window {
// ---------------------------------------------------------------------------
// `{}` is a workaround to avoid `TypeError: Cannot read property...`.
// `{}` is a workaround to avoid `TypeError: Cannot read property...` when calls list is empty
readonly property var call: calls.selectedCall || ({
callError: '',
isOutgoing: true,

View file

@ -1,4 +1,5 @@
import QtQuick 2.7
import QtQuick.Controls 2.7
import QtQuick.Layouts 1.3
import Common 1.0
@ -67,10 +68,17 @@ DialogPlus {
}
Slider {
id: playbackSlider
width: parent.width
Component.onCompleted: value = call.speakerVolumeGain
onPositionChanged: call.speakerVolumeGain = position
ToolTip {
parent: playbackSlider.handle
visible: playbackSlider.pressed
text: (playbackSlider.value * 100).toFixed(0) + " %"
}
}
}
}
@ -103,10 +111,17 @@ DialogPlus {
}
Slider {
id: captureSlider
width: parent.width
Component.onCompleted: value = call.microVolumeGain
onPositionChanged: call.microVolumeGain = position
ToolTip {
parent: captureSlider.handle
visible: captureSlider.pressed
text: "+ " + (captureSlider.value * 100).toFixed(0) + " %"
}
}
}
}

View file

@ -129,6 +129,10 @@ ColumnLayout {
icon: 'history'
onClicked: sipAddressesMenu.open()
TooltipArea {
text: qsTr('tooltipShowConversation')
}
}
}

View file

@ -28,6 +28,10 @@ function getEditIcon () {
return conversation._sipAddressObserver.contact ? 'contact_edit' : 'contact_add'
}
function getEditTooltipText() {
return conversation._sipAddressObserver.contact ? qsTr('tooltipContactEdit') : qsTr('tooltipContactAdd')
}
function getUsername () {
return LinphoneUtils.getContactUsername(conversation._sipAddressObserver)
}

View file

@ -100,6 +100,9 @@ ColumnLayout {
onClicked: window.setView('ContactEdit', {
sipAddress: conversation.peerAddress
})
TooltipArea {
text: Logic.getEditTooltipText()
}
}
ActionButton {
@ -107,6 +110,10 @@ ColumnLayout {
iconSize: ConversationStyle.bar.actions.edit.iconSize
onClicked: Logic.removeAllEntries()
TooltipArea {
text: qsTr('cleanHistory')
}
}
}
}

View file

@ -81,6 +81,13 @@ DialogPlus {
itemIcon: Logic.getItemIcon(flattenedModel)
width: parent.width
ActionButton {
icon: 'options'
iconSize: 30
anchors.fill: parent
//TODO handle click and jump to proxy config settings
}
onClicked: {
container.currentIndex = index
AccountSettingsModel.setDefaultProxyConfig(flattenedModel.proxyConfig)

View file

@ -180,6 +180,10 @@ ApplicationWindow {
visible: SettingsModel.conferenceEnabled
onClicked: Logic.openConferenceManager()
TooltipArea {
text: qsTr('newConferenceButton')
}
}
ActionButton {

View file

@ -1,4 +1,6 @@
import QtQuick 2.7
import QtQuick 2.7 as Core
import QtQuick.Controls 2.7 as Core
import QtQuick.Layouts 1.10 as Core
import Common 1.0
import Linphone 1.0
@ -9,7 +11,7 @@ import App.Styles 1.0
// =============================================================================
TabContainer {
Column {
Core.Column {
spacing: SettingsWindowStyle.forms.spacing
width: parent.width
@ -21,6 +23,28 @@ TabContainer {
title: qsTr('audioTitle')
width: parent.width
//Warning if in call
FormLine {
visible: SettingsModel.isInCall
FormGroup {
Core.RowLayout {
spacing: SettingsAudioStyle.warningMessage.iconSize
Icon {
icon: 'warning'
iconSize: SettingsAudioStyle.warningMessage.iconSize
anchors {
rightMargin: SettingsAudioStyle.warningMessage.iconSize
leftMargin: SettingsAudioStyle.warningMessage.iconSize
}
}
Core.Text {
text: qsTr('audioSettingsInCallWarning')
}
}
}
}
FormLine {
FormGroup {
label: qsTr('playbackDeviceLabel')
@ -36,6 +60,28 @@ TabContainer {
}
}
FormLine {
FormGroup {
label: qsTr('playbackGainLabel')
enabled: !SettingsModel.isInCall
Slider {
id: playbackSlider
width: parent.width
enabled: !SettingsModel.isInCall
Core.Component.onCompleted: value = SettingsModel.playbackGain
onPositionChanged: SettingsModel.playbackGain = position
Core.ToolTip {
parent: playbackSlider.handle
visible: playbackSlider.pressed
text: (playbackSlider.value * 100).toFixed(0) + " %"
}
}
}
}
FormLine {
FormGroup {
label: qsTr('captureDeviceLabel')
@ -51,11 +97,83 @@ TabContainer {
}
}
FormLine {
FormGroup {
label: qsTr('captureGainLabel')
Slider {
id: captureSlider
width: parent.width
enabled: !SettingsModel.isInCall
Core.Component.onCompleted: value = SettingsModel.captureGain
onPositionChanged: SettingsModel.captureGain = position
Core.ToolTip {
parent: captureSlider.handle
visible: captureSlider.pressed
text: (captureSlider.value * 100).toFixed(0) + " %"
}
}
}
}
FormLine {
FormGroup {
id: audioTestRow
label: qsTr('audioTestLabel')
visible: !SettingsModel.isInCall
Core.Slider {
id: audioTestSlider
enabled: false
width: parent.width
anchors {
leftMargin: SettingsAudioStyle.ringPlayer.leftMargin
}
background: Core.Rectangle {
x: audioTestSlider.leftPadding
y: audioTestSlider.topPadding + audioTestSlider.availableHeight / 2 - height / 2
implicitWidth: 200
implicitHeight: 8
width: audioTestSlider.availableWidth
height: implicitHeight
radius: 2
color: "#bdbebf"
Core.Rectangle {
width: audioTestSlider.visualPosition * parent.width
height: parent.height
color: audioTestSlider.value > 0.8 ? "#ff0000" : "#21be2b"
radius: 2
}
}
//Empty slider handle
handle: Core.Text {
text: ''
visible: false
}
Core.Timer {
interval: 50
repeat: true
running: SettingsModel.captureGraphRunning
onTriggered: parent.value = SettingsModel.getMicVolume()
}
}
}
}
FormLine {
FormGroup {
label: qsTr('ringerDeviceLabel')
ComboBox {
enabled: !SettingsModel.isInCall
currentIndex: Utils.findIndex(model, function (device) {
return device === SettingsModel.ringerDevice
})
@ -108,7 +226,7 @@ TabContainer {
}
}
Loader {
Core.Loader {
id: ringPlayer
active: window.visible

View file

@ -55,6 +55,17 @@ TabContainer {
}
}
}
FormGroup {
label: qsTr('encryptionMandatoryLabel')
Switch {
id: encryptionMandatory
checked: SettingsModel.mediaEncryptionMandatory
onClicked: SettingsModel.mediaEncryptionMandatory = !checked
}
}
}
FormLine {

View file

@ -19,6 +19,8 @@ ApplicationWindow {
title: qsTr('settingsTitle')
onClosing: SettingsModel.settingsWindowClosing()
// ---------------------------------------------------------------------------
Shortcut {
@ -48,16 +50,21 @@ ApplicationWindow {
TabBar {
id: tabBar
onCurrentIndexChanged: SettingsModel.onSettingsTabChanged(currentIndex)
TabButton {
iconName: 'settings_sip_accounts'
text: qsTr('sipAccountsTab')
width: implicitWidth
}
//onClicked: SettingsModel.settingsButtonClicked("sip")
}
TabButton {
iconName: 'settings_audio'
text: qsTr('audioTab')
width: implicitWidth
//onClicked: SettingsModel.accessAudioSettings()
//onClicked: SettingsModel.settingsButtonClicked("audio")
}
TabButton {
@ -65,12 +72,15 @@ ApplicationWindow {
iconName: 'settings_video'
text: qsTr('videoTab')
width: implicitWidth
//onClicked: SettingsModel.accessVideoSettings()
//onClicked: SettingsModel.settingsButtonClicked("video")
}
TabButton {
iconName: 'settings_call'
text: qsTr('callsAndChatTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("call")
}
TabButton {
@ -78,18 +88,21 @@ ApplicationWindow {
iconName: 'settings_network'
text: qsTr('networkTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("network")
}
TabButton {
iconName: 'settings_advanced'
text: qsTr('uiTab')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("ui")
}
TabButton {
iconName: 'settings_advanced'
text: qsTr('uiAdvanced')
width: implicitWidth
//onClicked: SettingsModel.settingsButtonClicked("advanced")
}
}

View file

@ -7,4 +7,7 @@ QtObject {
property QtObject ringPlayer: QtObject {
property int leftMargin: 10
}
property QtObject warningMessage: QtObject {
property int iconSize: 20
}
}