mirror of
https://github.com/qbittorrent/qBittorrent.git
synced 2025-12-17 22:18:05 -06:00
Compare commits
162 Commits
release-5.
...
release-4.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da0b276d5f | ||
|
|
2d73bc9e7d | ||
|
|
fdd54fe568 | ||
|
|
e5ce24e55e | ||
|
|
d90349709b | ||
|
|
adb0fe6582 | ||
|
|
5ed81580c9 | ||
|
|
86d6fb86d7 | ||
|
|
ddec247d4f | ||
|
|
d431ecbe00 | ||
|
|
be929ed88c | ||
|
|
2e1f9bf8be | ||
|
|
7fff393b0e | ||
|
|
a669ec49ad | ||
|
|
1880082017 | ||
|
|
0cbd15890a | ||
|
|
7fe7c6c277 | ||
|
|
e4c177fec7 | ||
|
|
77f4e6c2cf | ||
|
|
4563b11a2e | ||
|
|
cb477f9a29 | ||
|
|
58ac07667e | ||
|
|
74bf3af41c | ||
|
|
9317071122 | ||
|
|
dab32f2090 | ||
|
|
dc464d4d41 | ||
|
|
e7e3f6a9db | ||
|
|
5a1c4e79b3 | ||
|
|
c6d9ab6810 | ||
|
|
d7afad835e | ||
|
|
8608d7b9da | ||
|
|
72970602af | ||
|
|
86579ca87d | ||
|
|
e55582124c | ||
|
|
bd8b06c607 | ||
|
|
230fedf069 | ||
|
|
7bea10f507 | ||
|
|
7cde969b90 | ||
|
|
a3b8f6880b | ||
|
|
ad79fc8d43 | ||
|
|
fb4bf94a56 | ||
|
|
1c184944fd | ||
|
|
ec420f6617 | ||
|
|
d908227619 | ||
|
|
ac8167410b | ||
|
|
26ce187b30 | ||
|
|
2c4e04e537 | ||
|
|
b418f65c2f | ||
|
|
dd3a8d5d56 | ||
|
|
49e54a55df | ||
|
|
8cd0a7ae85 | ||
|
|
442f0df613 | ||
|
|
f9ee5bdb59 | ||
|
|
b9602cc6ab | ||
|
|
abb854a1e6 | ||
|
|
4ee17a73d0 | ||
|
|
faf6e82274 | ||
|
|
c08ec1ac5e | ||
|
|
cd0b6d9a43 | ||
|
|
b8f1142abe | ||
|
|
78859415d6 | ||
|
|
ef92c17192 | ||
|
|
22f3abc4b5 | ||
|
|
a56e6294c1 | ||
|
|
77909e0093 | ||
|
|
2c2bb14b2a | ||
|
|
73c8b77464 | ||
|
|
042238db87 | ||
|
|
6e267f8e81 | ||
|
|
fdc64d9b38 | ||
|
|
0b42425db5 | ||
|
|
e5d7738127 | ||
|
|
422489e2a1 | ||
|
|
7de983b4e5 | ||
|
|
e4e55d2a80 | ||
|
|
926012ce71 | ||
|
|
487eb554c9 | ||
|
|
5a96e1fc7a | ||
|
|
2fe698ee60 | ||
|
|
177ac32a5e | ||
|
|
5f34d1555b | ||
|
|
7cfe68f46c | ||
|
|
f94f4d2391 | ||
|
|
73b18d7ef3 | ||
|
|
817e9c4747 | ||
|
|
28844eff44 | ||
|
|
389664213b | ||
|
|
953b6fd6f8 | ||
|
|
9b4f3fcbf8 | ||
|
|
80743180be | ||
|
|
b2847b2381 | ||
|
|
eb657ec032 | ||
|
|
fc2be601df | ||
|
|
5786c7ff11 | ||
|
|
4a183dd968 | ||
|
|
7c10dba10c | ||
|
|
894446d308 | ||
|
|
47e9c5ac08 | ||
|
|
7f47ac11f1 | ||
|
|
67b17891fa | ||
|
|
dd5b7ba05b | ||
|
|
61aa4d9f1c | ||
|
|
6e924b668e | ||
|
|
618ce33fa0 | ||
|
|
ac413c76b9 | ||
|
|
f266184514 | ||
|
|
8c48bf4a70 | ||
|
|
8bee69c9fc | ||
|
|
5876886345 | ||
|
|
0392bfce3c | ||
|
|
c66cf43d6a | ||
|
|
7515afc058 | ||
|
|
5fcfcc901e | ||
|
|
1728c16580 | ||
|
|
d3f46452a9 | ||
|
|
7092a98c93 | ||
|
|
8e19f66b4f | ||
|
|
b6ab2abf3f | ||
|
|
3edaaa30c9 | ||
|
|
38efff461e | ||
|
|
2179148b8d | ||
|
|
f92c4c0a40 | ||
|
|
1e7f792dbb | ||
|
|
1d4af505c2 | ||
|
|
baa609b713 | ||
|
|
bc20cf9ad7 | ||
|
|
7d3ecfa9a6 | ||
|
|
88a90ed7d4 | ||
|
|
3e540b3f51 | ||
|
|
87e1661bd5 | ||
|
|
f82a4051af | ||
|
|
5730e917a1 | ||
|
|
5e7d7c2ef0 | ||
|
|
2b6e1953d7 | ||
|
|
6fc50f4169 | ||
|
|
40d7a53695 | ||
|
|
7e89893454 | ||
|
|
d83f09e731 | ||
|
|
36575b225d | ||
|
|
fe0ea843e0 | ||
|
|
a8911f8136 | ||
|
|
c5ef1a0207 | ||
|
|
102d628c0a | ||
|
|
6ea3acdaea | ||
|
|
621578353d | ||
|
|
ca776c3036 | ||
|
|
9d27eb3b57 | ||
|
|
9171dffe97 | ||
|
|
f919d4f5bf | ||
|
|
59afc7c520 | ||
|
|
f02b65b866 | ||
|
|
891c471160 | ||
|
|
f49f5ba9a1 | ||
|
|
539b3b7c3e | ||
|
|
83ce285138 | ||
|
|
260e48b705 | ||
|
|
f09ee1b398 | ||
|
|
e3c2266611 | ||
|
|
53fb6220c5 | ||
|
|
34e6b73374 | ||
|
|
b925cffddb | ||
|
|
3595626eff |
1
.github/ISSUE_TEMPLATE.md
vendored
1
.github/ISSUE_TEMPLATE.md
vendored
@@ -17,4 +17,3 @@
|
|||||||
|
|
||||||
### Extra info(if any)
|
### Extra info(if any)
|
||||||
(type here)
|
(type here)
|
||||||
|
|
||||||
|
|||||||
44
.github/workflows/ci.yaml
vendored
44
.github/workflows/ci.yaml
vendored
@@ -12,12 +12,12 @@ on:
|
|||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Qt: 5.15.0
|
# Qt: 5.15.1
|
||||||
# libtorrent: RC_1_2 HEAD, 1.2.10
|
# libtorrent: RC_1_2 HEAD, 1.2.11
|
||||||
VCPKG_COMMIT: 32eccc18191fbb57b159784a1724d2d00613ae82
|
VCPKG_COMMIT: 133051b793486ef14e67e9d1f48c9cfe64dc127e
|
||||||
VCPKG_DEST_MACOS: /Users/runner/qbt_tools/vcpkg
|
VCPKG_DEST_MACOS: /Users/runner/qbt_tools/vcpkg
|
||||||
VCPKG_DEST_WIN: C:\qbt_tools\vcpkg
|
VCPKG_DEST_WIN: C:\qbt_tools\vcpkg
|
||||||
UBUNTU_LIBTORRENT_VERSION: libtorrent-1.2.10
|
LIBTORRENT_VERSION_TAG: v1.2.11
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: checkout repository
|
- name: checkout repository
|
||||||
uses: actions/checkout@v2.3.2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: install all build dependencies except libtorrent from Ubuntu repos
|
- name: install all build dependencies except libtorrent from Ubuntu repos
|
||||||
run: |
|
run: |
|
||||||
@@ -52,7 +52,7 @@ jobs:
|
|||||||
- name: install libtorrent from source
|
- name: install libtorrent from source
|
||||||
run: |
|
run: |
|
||||||
git clone https://github.com/arvidn/libtorrent && cd libtorrent
|
git clone https://github.com/arvidn/libtorrent && cd libtorrent
|
||||||
git checkout ${{ env.UBUNTU_LIBTORRENT_VERSION }}
|
git checkout ${{ env.LIBTORRENT_VERSION_TAG }}
|
||||||
cmake -B cmake-build-dir -G "Ninja" \
|
cmake -B cmake-build-dir -G "Ninja" \
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
-Ddeprecated-functions=OFF \
|
-Ddeprecated-functions=OFF \
|
||||||
@@ -70,9 +70,9 @@ jobs:
|
|||||||
cmake --build build
|
cmake --build build
|
||||||
|
|
||||||
- name: upload artifact as zip
|
- name: upload artifact as zip
|
||||||
uses: actions/upload-artifact@v2.1.3
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: qBittorrent-CI-Ubuntu_${{ matrix.os }}-${{ matrix.qbt_gui }}
|
name: qBittorrent-CI_${{ matrix.os }}-x64_${{ matrix.qbt_gui }}
|
||||||
path: |
|
path: |
|
||||||
build/compile_commands.json
|
build/compile_commands.json
|
||||||
build/target_graph.dot
|
build/target_graph.dot
|
||||||
@@ -92,7 +92,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: checkout repository
|
- name: checkout repository
|
||||||
uses: actions/checkout@v2.3.2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
||||||
- name: install additional required packages with chocolatey
|
- name: install additional required packages with chocolatey
|
||||||
@@ -100,7 +100,7 @@ jobs:
|
|||||||
choco install ninja
|
choco install ninja
|
||||||
|
|
||||||
- name: setup vcpkg (cached, if possible)
|
- name: setup vcpkg (cached, if possible)
|
||||||
uses: lukka/run-vcpkg@v3.3
|
uses: lukka/run-vcpkg@v4
|
||||||
with:
|
with:
|
||||||
vcpkgDirectory: ${{ env.VCPKG_DEST_WIN }}
|
vcpkgDirectory: ${{ env.VCPKG_DEST_WIN }}
|
||||||
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
||||||
@@ -134,7 +134,7 @@ jobs:
|
|||||||
|
|
||||||
# NOTE: this is necessary to correctly find and use cl.exe with the Ninja generator for now
|
# NOTE: this is necessary to correctly find and use cl.exe with the Ninja generator for now
|
||||||
- name: setup devcmd
|
- name: setup devcmd
|
||||||
uses: ilammy/msvc-dev-cmd@v1.3.0
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
|
||||||
- name: build qBittorrent
|
- name: build qBittorrent
|
||||||
shell: cmd
|
shell: cmd
|
||||||
@@ -149,9 +149,9 @@ jobs:
|
|||||||
cmake --build build
|
cmake --build build
|
||||||
|
|
||||||
- name: upload artifact as zip
|
- name: upload artifact as zip
|
||||||
uses: actions/upload-artifact@v2.1.3
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: qBittorrent-CI-Windows_x64-static-release
|
name: qBittorrent-CI_Windows-x64
|
||||||
path: |
|
path: |
|
||||||
build/compile_commands.json
|
build/compile_commands.json
|
||||||
build/target_graph.dot
|
build/target_graph.dot
|
||||||
@@ -175,17 +175,17 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: checkout repository
|
- name: checkout repository
|
||||||
uses: actions/checkout@v2.3.2
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
||||||
# - pkg-config is needed for some vcpkg installations
|
# - automake is needed for the installation the vcpkg installation of fontconfig, a dependency of qt5-base
|
||||||
- name: install additional required packages with homebrew
|
- name: install additional required packages with homebrew
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
brew install ninja pkg-config
|
brew install automake ninja
|
||||||
|
|
||||||
- name: setup vcpkg (cached, if possible)
|
- name: setup vcpkg (cached, if possible)
|
||||||
uses: lukka/run-vcpkg@v3.3
|
uses: lukka/run-vcpkg@v4
|
||||||
with:
|
with:
|
||||||
vcpkgDirectory: ${{ env.VCPKG_DEST_MACOS }}
|
vcpkgDirectory: ${{ env.VCPKG_DEST_MACOS }}
|
||||||
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
||||||
@@ -197,13 +197,13 @@ jobs:
|
|||||||
Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-osx.cmake `
|
Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-osx.cmake `
|
||||||
${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake
|
${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake
|
||||||
Add-Content ${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake `
|
Add-Content ${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake `
|
||||||
-Value "set(VCPKG_BUILD_TYPE release)"
|
-Value "set(VCPKG_BUILD_TYPE release)","set(VCPKG_OSX_DEPLOYMENT_TARGET 10.15)"
|
||||||
|
|
||||||
# NOTE: Avoids a libtorrent ABI issue. See https://github.com/arvidn/libtorrent/issues/4965
|
# NOTE: Avoids a libtorrent ABI issue. See https://github.com/arvidn/libtorrent/issues/4965
|
||||||
- name: force AppleClang to compile libtorrent with C++14
|
- name: force AppleClang to compile libtorrent with C++17
|
||||||
run: |
|
run: |
|
||||||
(Get-Content -path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake).Replace( `
|
(Get-Content -path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake).Replace( `
|
||||||
'${FEATURE_OPTIONS}', '${FEATURE_OPTIONS} -DCMAKE_CXX_STANDARD=14') `
|
'${FEATURE_OPTIONS}', '${FEATURE_OPTIONS} -DCMAKE_CXX_STANDARD=17') `
|
||||||
| Set-Content -Path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake
|
| Set-Content -Path ${{ env.RUNVCPKG_VCPKG_ROOT }}/ports/libtorrent/portfile.cmake
|
||||||
|
|
||||||
- name: install dependencies via vcpkg
|
- name: install dependencies via vcpkg
|
||||||
@@ -234,9 +234,9 @@ jobs:
|
|||||||
cmake --build build
|
cmake --build build
|
||||||
|
|
||||||
- name: upload artifact as zip
|
- name: upload artifact as zip
|
||||||
uses: actions/upload-artifact@v2.1.3
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: qBittorrent-CI-macOS_x64-static-release_${{ matrix.qbt_gui }}
|
name: qBittorrent-CI_macOS_${{ matrix.qbt_gui }}
|
||||||
path: |
|
path: |
|
||||||
build/compile_commands.json
|
build/compile_commands.json
|
||||||
build/target_graph.dot
|
build/target_graph.dot
|
||||||
|
|||||||
85
.github/workflows/file_health.sh
vendored
Executable file
85
.github/workflows/file_health.sh
vendored
Executable file
@@ -0,0 +1,85 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
set -o nounset
|
||||||
|
|
||||||
|
# Assumption: file names don't contain `:` (for the `cut` invocation).
|
||||||
|
# Safe to assume, as such a character in a filename would cause trouble on Windows, a platform we support
|
||||||
|
|
||||||
|
# any regression turn this non-zero
|
||||||
|
regressions=0
|
||||||
|
|
||||||
|
# exclusions (these are just grep extended regular expressions to match against paths relative to the root of the repository)
|
||||||
|
exclusions_nonutf8='(.*(7z|gif|ic(ns|o)|png|qm|zip))'
|
||||||
|
exclusions_bom='src/base/unicodestrings.h'
|
||||||
|
exclusions_tw='(*.ts)|src/webui/www/private/scripts/lib/mootools-1.2-more.js'
|
||||||
|
exclusions_trailing_newline='configure'
|
||||||
|
exclusions_no_lf='(*.ts)|(.*svg)|compile_commands.json|src/webui/www/private/scripts/lib/mootools-1.2-(core-yc.js|more.js)'
|
||||||
|
|
||||||
|
echo -e "\n*** Detect files not encoded in UTF-8 ***\n"
|
||||||
|
|
||||||
|
find . -path ./build -prune -false -o -path ./.git -prune -false -o -type f -exec file --mime {} \; | sort \
|
||||||
|
| grep -v -e "charset=us-ascii" -e "charset=utf-8" | cut -d ":" -f 1 \
|
||||||
|
| grep -E -v -e "${exclusions_nonutf8}" \
|
||||||
|
| tee >(echo -e "--> Files not encoded in UTF-8: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect files encoded in UTF-8 with BOM ***\n"
|
||||||
|
|
||||||
|
grep --exclude-dir={.git,build} -rIl $'\xEF\xBB\xBF' | sort \
|
||||||
|
| grep -E -v -e "${exclusions_bom}" \
|
||||||
|
| tee >(echo -e "--> Files encoded in UTF-8 with BOM: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect usage of CR byte ***\n"
|
||||||
|
|
||||||
|
grep --exclude-dir={.git,build} -rIlU $'\x0D' | sort \
|
||||||
|
| tee >(echo -e "--> Usage of CR byte: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect trailing whitespace in lines ***\n"
|
||||||
|
|
||||||
|
grep --exclude-dir={.git,build} -rIl "[[:blank:]]$" | sort \
|
||||||
|
| grep -E -v -e "${exclusions_tw}" \
|
||||||
|
| tee >(echo -e "--> Trailing whitespace in lines: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0';
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect too many trailing newlines ***\n"
|
||||||
|
|
||||||
|
find . -path ./build -prune -false -o -path ./.git -prune -false -o -type f -exec file --mime {} \; | sort \
|
||||||
|
| grep -e "charset=us-ascii" -e "charset=utf-8" | cut -d ":" -f 1 \
|
||||||
|
| grep -E -v -e "${exclusions_trailing_newline}" \
|
||||||
|
| xargs -L1 -I my_input bash -c 'test "$(tail -q -c2 "my_input" | hexdump -C | grep "0a 0a")" && echo "my_input"' \
|
||||||
|
| tee >(echo -e "--> Too many trailing newlines: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect no trailing newline ***\n"
|
||||||
|
|
||||||
|
find . -path ./build -prune -false -o -path ./.git -prune -false -o -type f -exec file --mime {} \; | sort \
|
||||||
|
| grep -e "charset=us-ascii" -e "charset=utf-8" | cut -d ":" -f 1 \
|
||||||
|
| grep -E -v -e "${exclusions_no_lf}" \
|
||||||
|
| xargs -L1 -I my_input bash -c 'test "$(tail -q -c1 "my_input" | hexdump -C | grep "0a")" || echo "my_input"' \
|
||||||
|
| tee >(echo -e "--> No trailing newline: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
echo -e "\n*** Detect translation closing tag in new line ***\n"
|
||||||
|
|
||||||
|
grep --exclude-dir={.git,build} -nri "^</translation>" | sort \
|
||||||
|
| cut -d ":" -f 1,2 \
|
||||||
|
| tee >(echo -e "--> Translation closing tag in new line: found" "$(wc -l < /dev/stdin)" "regression(s)\n") \
|
||||||
|
| xargs -I my_input -0 bash -c 'echo "my_input"; test "$(echo -n "my_input" | wc -l)" -eq 0'
|
||||||
|
regressions=$((regressions+$?))
|
||||||
|
|
||||||
|
if [ "$regressions" -ne 0 ]; then
|
||||||
|
regressions=1
|
||||||
|
echo "\nFile health regressions found. Please fix them (or add them as exclusions)."
|
||||||
|
else
|
||||||
|
echo "All OK, no file health regressions found."
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit $regressions;
|
||||||
27
.github/workflows/file_health.yaml
vendored
Normal file
27
.github/workflows/file_health.yaml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: GitHub Actions file health check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ '**' ]
|
||||||
|
pull_request:
|
||||||
|
types: [edited, opened, reopened, synchronize]
|
||||||
|
branches: [ '**' ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_file_health:
|
||||||
|
name: Check file health
|
||||||
|
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: install zsh
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install zsh
|
||||||
|
|
||||||
|
- name: run check file health script
|
||||||
|
run: |
|
||||||
|
./.github/workflows/file_health.sh
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -4,6 +4,7 @@ src/qbittorrent
|
|||||||
src/qbittorrent-nox
|
src/qbittorrent-nox
|
||||||
src/release
|
src/release
|
||||||
src/debug
|
src/debug
|
||||||
|
src/base/version.h
|
||||||
CMakeLists.txt.user*
|
CMakeLists.txt.user*
|
||||||
qbittorrent.pro.user*
|
qbittorrent.pro.user*
|
||||||
conf.pri
|
conf.pri
|
||||||
|
|||||||
55
.travis.yml
55
.travis.yml
@@ -4,7 +4,8 @@ os:
|
|||||||
- linux
|
- linux
|
||||||
- osx
|
- osx
|
||||||
|
|
||||||
dist: bionic
|
dist: focal
|
||||||
|
osx_image: xcode12.2
|
||||||
|
|
||||||
env:
|
env:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -16,15 +17,10 @@ env:
|
|||||||
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
||||||
- coverity_branch: coverity_scan
|
- coverity_branch: coverity_scan
|
||||||
|
|
||||||
matrix:
|
jobs:
|
||||||
allow_failures:
|
include:
|
||||||
- env: libt_branch=RC_1_2 gui=true build_system=cmake
|
- env: libt_branch=RC_2_0 gui=true build_system=qmake
|
||||||
- env: libt_branch=RC_1_2 gui=false build_system=cmake
|
os: linux
|
||||||
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- search_encoding_windows
|
|
||||||
- v2_9_x
|
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
email:
|
email:
|
||||||
@@ -49,8 +45,7 @@ addons:
|
|||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
# sources list: https://github.com/travis-ci/apt-source-safelist/blob/master/ubuntu.json
|
# sources list: https://github.com/travis-ci/apt-source-safelist/blob/master/ubuntu.json
|
||||||
- sourceline: 'ppa:qbittorrent-team/qbt-libtorrent-travisci'
|
- sourceline: 'deb https://apt.kitware.com/ubuntu/ focal main'
|
||||||
- sourceline: 'deb https://apt.kitware.com/ubuntu/ bionic main'
|
|
||||||
key_url: 'https://apt.kitware.com/keys/kitware-archive-latest.asc'
|
key_url: 'https://apt.kitware.com/keys/kitware-archive-latest.asc'
|
||||||
packages:
|
packages:
|
||||||
# packages list: https://github.com/travis-ci/apt-package-safelist/blob/master/ubuntu-trusty
|
# packages list: https://github.com/travis-ci/apt-package-safelist/blob/master/ubuntu-trusty
|
||||||
@@ -79,6 +74,8 @@ before_install:
|
|||||||
# TravisCI installs its own cmake to another location which ovverides other installations
|
# TravisCI installs its own cmake to another location which ovverides other installations
|
||||||
# if they don't call the new binary directly
|
# if they don't call the new binary directly
|
||||||
alias cmake="/usr/bin/cmake"
|
alias cmake="/usr/bin/cmake"
|
||||||
|
|
||||||
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
|
||||||
fi
|
fi
|
||||||
- |
|
- |
|
||||||
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
@@ -124,20 +121,34 @@ install:
|
|||||||
ccache -V && ccache --show-stats && ccache --zero-stats
|
ccache -V && ccache --show-stats && ccache --zero-stats
|
||||||
fi
|
fi
|
||||||
- |
|
- |
|
||||||
if [ "$libt_branch" = "RC_1_2" ] && [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
if [ "$libt_branch" = "RC_1_2" ]; then
|
||||||
# Will install latest 1.2.x daily build from the PPA
|
|
||||||
sudo apt-get -y install libtorrent-rasterbar-dev
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [ "$libt_branch" = "RC_1_2" ] && [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
|
||||||
# building libtorrent manually should be faster than using the official bottle
|
|
||||||
# because the bottle will also pull in a lot of updated dependencies and prolong the overall time
|
|
||||||
pushd "$HOME"
|
pushd "$HOME"
|
||||||
git clone --single-branch --branch RC_1_2 https://github.com/arvidn/libtorrent.git
|
git clone --single-branch --branch RC_1_2 https://github.com/arvidn/libtorrent.git
|
||||||
cd libtorrent
|
cd libtorrent
|
||||||
git checkout tags/v1.2.10
|
git checkout tags/v1.2.11
|
||||||
|
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD=14 -Ddeprecated-functions=OFF -DOPENSSL_ROOT_DIR="$openssl_root_path" ./
|
cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
|
-Ddeprecated-functions=OFF \
|
||||||
|
-DOPENSSL_ROOT_DIR="$openssl_root_path" \
|
||||||
|
./
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
popd
|
||||||
|
elif [ "$libt_branch" = "RC_2_0" ]; then
|
||||||
|
pushd "$HOME"
|
||||||
|
git clone --single-branch --branch RC_2_0 https://github.com/arvidn/libtorrent.git
|
||||||
|
cd libtorrent
|
||||||
|
git checkout tags/v2.0.1
|
||||||
|
git submodule update --init --recursive
|
||||||
|
|
||||||
|
cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
|
-Ddeprecated-functions=ON \
|
||||||
|
-DOPENSSL_ROOT_DIR="$openssl_root_path" \
|
||||||
|
./
|
||||||
make
|
make
|
||||||
sudo make install
|
sudo make install
|
||||||
popd
|
popd
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ cmake_minimum_required(VERSION 3.16 FATAL_ERROR) # Policies <= CMP0097 default t
|
|||||||
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
|
||||||
|
|
||||||
project(qBittorrent
|
project(qBittorrent
|
||||||
VERSION 4.3.0.0
|
|
||||||
DESCRIPTION "The qBittorrent BitTorrent client"
|
DESCRIPTION "The qBittorrent BitTorrent client"
|
||||||
HOMEPAGE_URL "https://www.qbittorrent.org/"
|
HOMEPAGE_URL "https://www.qbittorrent.org/"
|
||||||
LANGUAGES CXX
|
LANGUAGES CXX
|
||||||
@@ -11,14 +10,15 @@ project(qBittorrent
|
|||||||
|
|
||||||
# use CONFIG mode first in find_package
|
# use CONFIG mode first in find_package
|
||||||
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
|
||||||
# version requirements
|
# version requirements - older vesions may work, but you are on your own
|
||||||
set(requiredBoostVersion 1.40)
|
set(minBoostVersion 1.65)
|
||||||
set(requiredQtVersion 5.9.0)
|
set(minQtVersion 5.9.5)
|
||||||
set(requiredOpenSSLVersion 1.0)
|
set(minOpenSSLVersion 1.1.1)
|
||||||
set(requiredLibtorrentVersion 1.2.0)
|
set(minLibtorrentVersion 1.2.11)
|
||||||
set(requiredZlibVersion 1.2.5.2)
|
set(minZlibVersion 1.2.11)
|
||||||
|
|
||||||
# features (some are platform-specific)
|
# features (some are platform-specific)
|
||||||
|
include(CheckCXXSourceCompiles) # TODO: migrate to CheckSourceCompiles in CMake >= 3.19
|
||||||
include(FeatureSummary)
|
include(FeatureSummary)
|
||||||
include(FeatureOptionsSetup)
|
include(FeatureOptionsSetup)
|
||||||
feature_option(STACKTRACE "Enable stacktraces" ON)
|
feature_option(STACKTRACE "Enable stacktraces" ON)
|
||||||
@@ -34,12 +34,22 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|||||||
"Install systemd service file to a directory manually overridable with Systemd_SERVICES_INSTALL_DIR"
|
"Install systemd service file to a directory manually overridable with Systemd_SERVICES_INSTALL_DIR"
|
||||||
OFF "NOT GUI" OFF
|
OFF "NOT GUI" OFF
|
||||||
)
|
)
|
||||||
|
if (STACKTRACE)
|
||||||
|
check_cxx_source_compiles(
|
||||||
|
"#include <execinfo.h>
|
||||||
|
int main(){return 0;}"
|
||||||
|
QBITTORRENT_HAS_EXECINFO_H
|
||||||
|
)
|
||||||
|
if (NOT QBITTORRENT_HAS_EXECINFO_H)
|
||||||
|
message(FATAL_ERROR "execinfo.h header file not found.\n"
|
||||||
|
"Please either disable the STACKTRACE feature or use a libc that has this header file, such as glibc (GNU libc)."
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
elseif (MSVC)
|
elseif (MSVC)
|
||||||
feature_option(MSVC_RUNTIME_DYNAMIC "Use MSVC dynamic runtime library (-MD) instead of static (-MT)" ON)
|
feature_option(MSVC_RUNTIME_DYNAMIC "Use MSVC dynamic runtime library (-MD) instead of static (-MT)" ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(QBT_VER_STATUS "alpha1" CACHE STRING "Project status version. Should be empty for release builds.")
|
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
include(GNUInstallDirs)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
add_subdirectory(dist)
|
add_subdirectory(dist)
|
||||||
@@ -49,3 +59,7 @@ if (VERBOSE_CONFIGURE)
|
|||||||
else()
|
else()
|
||||||
feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES)
|
feature_summary(WHAT ENABLED_FEATURES DISABLED_FEATURES)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Generate version header
|
||||||
|
file(READ "src/base/version.h.in" versionHeader)
|
||||||
|
file(WRITE "src/base/version.h" "${versionHeader}")
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
All new code **must** follow the following coding guidelines.
|
# Coding Guidelines
|
||||||
If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes.
|
|
||||||
|
All new code **must** follow the following coding guidelines. \
|
||||||
|
If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes. \
|
||||||
For programming languages other than C++ (e.g. JavaScript) used in this repository and submodules, unless otherwise specified, coding guidelines listed here applies as much as possible.
|
For programming languages other than C++ (e.g. JavaScript) used in this repository and submodules, unless otherwise specified, coding guidelines listed here applies as much as possible.
|
||||||
|
|
||||||
**Note 1:** I will not take your head if you forget and use another style. However, most probably the request will be delayed until you fix your coding style.
|
**Note 1:** I will not take your head if you forget and use another style. However, most probably the request will be delayed until you fix your coding style. \
|
||||||
**Note 2:** You can use the `uncrustify` program/tool to clean up any source file. Use it with the `uncrustify.cfg` configuration file found in the root folder.
|
**Note 2:** You can use the `uncrustify` program/tool to clean up any source file. Use it with the `uncrustify.cfg` configuration file found in the root folder. \
|
||||||
**Note 3:** There is also a style for QtCreator but it doesn't cover all cases. In QtCreator `Tools->Options...->C++->Code Style->Import...` and choose the `codingStyleQtCreator.xml` file found in the root folder.
|
**Note 3:** There is also a style for QtCreator but it doesn't cover all cases. In QtCreator `Tools->Options...->C++->Code Style->Import...` and choose the `codingStyleQtCreator.xml` file found in the root folder.
|
||||||
|
|
||||||
### Table Of Contents
|
## Table Of Contents
|
||||||
|
|
||||||
* [1. New lines & curly braces](#1-new-lines--curly-braces)
|
* [1. New lines & curly braces](#1-new-lines--curly-braces)
|
||||||
* [a. Function blocks, class/struct definitions, namespaces](#a-function-blocks-classstruct-definitions-namespaces)
|
* [a. Function blocks, class/struct definitions, namespaces](#a-function-blocks-classstruct-definitions-namespaces)
|
||||||
@@ -29,11 +31,13 @@ For programming languages other than C++ (e.g. JavaScript) used in this reposito
|
|||||||
* [9. Misc](#9-misc)
|
* [9. Misc](#9-misc)
|
||||||
* [10. Git commit message](#10-git-commit-message)
|
* [10. Git commit message](#10-git-commit-message)
|
||||||
* [11. Not covered above](#11-not-covered-above)
|
* [11. Not covered above](#11-not-covered-above)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 1. New lines & curly braces ###
|
## 1. New lines & curly braces
|
||||||
|
|
||||||
|
### a. Function blocks, class/struct definitions, namespaces
|
||||||
|
|
||||||
#### a. Function blocks, class/struct definitions, namespaces ####
|
|
||||||
```c++
|
```c++
|
||||||
int myFunction(int a)
|
int myFunction(int a)
|
||||||
{
|
{
|
||||||
@@ -43,7 +47,7 @@ int myFunction(int a)
|
|||||||
void myFunction() {} // empty body
|
void myFunction() {} // empty body
|
||||||
|
|
||||||
MyClass::MyClass(int *parent)
|
MyClass::MyClass(int *parent)
|
||||||
: m_parent(parent)
|
: m_parent {parent}
|
||||||
{
|
{
|
||||||
// initialize
|
// initialize
|
||||||
}
|
}
|
||||||
@@ -79,17 +83,21 @@ namespace Name
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### b. Other code blocks ####
|
### b. Other code blocks
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
if (condition) {
|
if (condition)
|
||||||
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int a = 0; a < b; ++b) {
|
for (int a = 0; a < b; ++b)
|
||||||
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (a) {
|
switch (a)
|
||||||
|
{
|
||||||
case 1:
|
case 1:
|
||||||
// blah
|
// blah
|
||||||
case 2:
|
case 2:
|
||||||
@@ -97,17 +105,25 @@ case 2:
|
|||||||
default:
|
default:
|
||||||
// blah
|
// blah
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// code
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### c. Blocks in switch's case labels ####
|
### c. Blocks in switch's case labels
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
switch (var) {
|
switch (var)
|
||||||
case 1: {
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
// declare local variables
|
// declare local variables
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2: {
|
case 2:
|
||||||
|
{
|
||||||
// declare local variables
|
// declare local variables
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
@@ -117,22 +133,29 @@ default:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### d. If-else statements ####
|
### d. If-else statements
|
||||||
|
|
||||||
The `else if`/`else` must be on their own lines:
|
The `else if`/`else` must be on their own lines:
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
if (condition) {
|
if (condition)
|
||||||
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
else if (condition) {
|
else if (condition)
|
||||||
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### e. Single statement if blocks ####
|
### e. Single statement if blocks
|
||||||
|
|
||||||
Most single statement if blocks should look like this:
|
Most single statement if blocks should look like this:
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
if (condition)
|
if (condition)
|
||||||
a = a + b;
|
a = a + b;
|
||||||
@@ -141,19 +164,23 @@ if (condition)
|
|||||||
One acceptable exception to this can be `return`, `break` or `continue` statements,
|
One acceptable exception to this can be `return`, `break` or `continue` statements,
|
||||||
provided that the test condition isn't very long and its body statement occupies only one line.
|
provided that the test condition isn't very long and its body statement occupies only one line.
|
||||||
However you can still choose to use the first rule.
|
However you can still choose to use the first rule.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
if (a > 0) return;
|
if (a > 0) return;
|
||||||
|
|
||||||
while (p) {
|
while (p)
|
||||||
|
{
|
||||||
// ...
|
// ...
|
||||||
if (!b) continue;
|
if (!b) continue;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### f. Acceptable conditions to omit braces ####
|
### f. Acceptable conditions to omit braces
|
||||||
|
|
||||||
When the conditional statement in `if`/`else` has only one line and its body occupy only one line,
|
When the conditional statement in `if`/`else` has only one line and its body occupy only one line,
|
||||||
this also applies to loops statements.
|
this also applies to loops statements. \
|
||||||
Notice that for a series of `if - else` branches, if one branch needs braces then all branches must add braces.
|
Notice that for a series of `if - else` branches, if one branch needs braces then all branches must add braces.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
if (a < b) // conditional statement
|
if (a < b) // conditional statement
|
||||||
do(a); // body
|
do(a); // body
|
||||||
@@ -165,21 +192,27 @@ else if (a > b)
|
|||||||
else
|
else
|
||||||
do(c);
|
do(c);
|
||||||
|
|
||||||
if (a < b) {
|
if (a < b)
|
||||||
|
{
|
||||||
do(a);
|
do(a);
|
||||||
}
|
}
|
||||||
else if (a > b) { // curly braces required here, then all branches should also add them
|
else if (a > b)
|
||||||
|
{
|
||||||
|
// curly braces required here, then all branches should also add them
|
||||||
do(b);
|
do(b);
|
||||||
do(d);
|
do(d);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
do(c);
|
do(c);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### g. Brace enclosed initializers ####
|
### g. Brace enclosed initializers
|
||||||
Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.<br/>
|
|
||||||
|
Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions. \
|
||||||
But you must insert a space between the variable name and initializer.
|
But you must insert a space between the variable name and initializer.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
Class obj {}; // empty
|
Class obj {}; // empty
|
||||||
Class obj {expr};
|
Class obj {expr};
|
||||||
@@ -187,28 +220,33 @@ Class obj {expr1, /*...,*/ exprN};
|
|||||||
QVariantMap map {{"key1", 5}, {"key2", 10}};
|
QVariantMap map {{"key1", 5}, {"key2", 10}};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Indentation ###
|
## 2. Indentation
|
||||||
|
|
||||||
4 spaces.
|
4 spaces.
|
||||||
|
|
||||||
### 3. File encoding and line endings ###
|
## 3. File encoding and line endings
|
||||||
|
|
||||||
UTF-8 and Unix-like line ending (LF). Unless some platform specific files need other encodings/line endings.
|
UTF-8 and Unix-like line ending (LF). Unless some platform specific files need other encodings/line endings.
|
||||||
|
|
||||||
### 4. Initialization lists ###
|
## 4. Initialization lists
|
||||||
|
|
||||||
Initialization lists should be vertical. This will allow for more easily readable diffs. The initialization colon should be indented and in its own line along with first argument. The rest of the arguments should be indented too and have the comma prepended.
|
Initialization lists should be vertical. This will allow for more easily readable diffs. The initialization colon should be indented and in its own line along with first argument. The rest of the arguments should be indented too and have the comma prepended.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
myClass::myClass(int a, int b, int c, int d)
|
myClass::myClass(int a, int b, int c, int d)
|
||||||
: m_a(a)
|
: m_a {a}
|
||||||
, m_b(b)
|
, m_b {b}
|
||||||
, m_c(c)
|
, m_c {c}
|
||||||
, m_d(d)
|
, m_d {d}
|
||||||
{
|
{
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. Enums ###
|
## 5. Enums
|
||||||
|
|
||||||
Enums should be vertical. This will allow for more easily readable diffs. The members should be indented.
|
Enums should be vertical. This will allow for more easily readable diffs. The members should be indented.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
enum Days
|
enum Days
|
||||||
{
|
{
|
||||||
@@ -222,11 +260,14 @@ enum Days
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. Names ###
|
## 6. Names
|
||||||
|
|
||||||
All names should be camelCased.
|
All names should be camelCased.
|
||||||
|
|
||||||
#### a. Type names and namespaces ####
|
### a. Type names and namespaces
|
||||||
|
|
||||||
Type names and namespaces start with Upper case letter (except POD types).
|
Type names and namespaces start with Upper case letter (except POD types).
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
class ClassName {};
|
class ClassName {};
|
||||||
|
|
||||||
@@ -241,14 +282,18 @@ namespace NamespaceName
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
#### b. Variable names ####
|
### b. Variable names
|
||||||
|
|
||||||
Variable names start with lower case letter.
|
Variable names start with lower case letter.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
int myVar;
|
int myVar;
|
||||||
```
|
```
|
||||||
|
|
||||||
#### c. Private member variable names ####
|
### c. Private member variable names
|
||||||
|
|
||||||
Private member variable names start with lower case letter and should have ```m_``` prefix.
|
Private member variable names start with lower case letter and should have ```m_``` prefix.
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
class MyClass
|
class MyClass
|
||||||
{
|
{
|
||||||
@@ -256,23 +301,26 @@ class MyClass
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7. Header inclusion order ###
|
## 7. Header inclusion order
|
||||||
The headers should be placed in the following group order:
|
|
||||||
1. Module header (in .cpp)
|
|
||||||
2. C++ Standard Library headers
|
|
||||||
3. System headers
|
|
||||||
4. Boost library headers
|
|
||||||
5. Libtorrent headers
|
|
||||||
6. Qt headers
|
|
||||||
7. qBittorrent's own headers, starting from the *base* headers.
|
|
||||||
|
|
||||||
The headers should be ordered alphabetically within each group.
|
The headers should be placed in the following group order:
|
||||||
If there are conditionals for the same header group, then put them at the bottom of the respective group.
|
|
||||||
|
1. Module header (in .cpp)
|
||||||
|
2. C++ Standard Library headers
|
||||||
|
3. System headers
|
||||||
|
4. Boost library headers
|
||||||
|
5. Libtorrent headers
|
||||||
|
6. Qt headers
|
||||||
|
7. qBittorrent's own headers, starting from the *base* headers.
|
||||||
|
|
||||||
|
The headers should be ordered alphabetically within each group. \
|
||||||
|
If there are conditionals for the same header group, then put them at the bottom of the respective group. \
|
||||||
If there are conditionals that contain headers from several different header groups, then put them above the "qBittorrent's own headers" group.
|
If there are conditionals that contain headers from several different header groups, then put them above the "qBittorrent's own headers" group.
|
||||||
|
|
||||||
One exception is the header containing the library version (for example, QtGlobal), this particular header isn't constrained by the aforementioned order.
|
One exception is the header containing the library version (for example, QtGlobal), this particular header isn't constrained by the aforementioned order.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
// file: examplewidget.cpp
|
// file: examplewidget.cpp
|
||||||
|
|
||||||
@@ -322,8 +370,10 @@ Example:
|
|||||||
#include "ui_examplewidget.h"
|
#include "ui_examplewidget.h"
|
||||||
```
|
```
|
||||||
|
|
||||||
### 8. Include guard ###
|
## 8. Include guard
|
||||||
`#pragma once` should be used instead of "include guard" in new code:
|
|
||||||
|
`#pragma once` must be used instead of a "classic include guard":
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
// examplewidget.h
|
// examplewidget.h
|
||||||
|
|
||||||
@@ -338,75 +388,77 @@ class ExampleWidget : public QWidget
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 9. Misc ###
|
## 9. Misc
|
||||||
|
|
||||||
* Line breaks for long lines with operation:
|
* Line breaks for long lines with operation:
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
a += "b"
|
a += "b"
|
||||||
+ "c"
|
+ "c"
|
||||||
+ "d";
|
+ "d";
|
||||||
```
|
```
|
||||||
|
|
||||||
* **auto** keyword
|
* **auto** keyword
|
||||||
|
|
||||||
We allow the use of the **auto** keyword only where it is strictly necessary
|
We allow the use of the **auto** keyword only where it is strictly necessary (for example, to declare a lambda object, etc.), or where it **enhances** the readability of the code. \
|
||||||
(for example, to declare a lambda object, etc.), or where it **enhances** the readability of the code.
|
Declarations for which one can gather enough information about the object interface (type) from its name or the usage pattern (an iterator or a loop variable are good examples of clear patterns) or the right part of the expression nicely fit here.
|
||||||
Declarations for which one can gather enough information about the object interface (type) from its name
|
|
||||||
or the usage pattern (an iterator or a loop variable are good examples of clear patterns)
|
When weighing whether to use an auto-typed variable please think about potential reviewers of your code, who will read it as a plain diff (on github.com, for instance). \
|
||||||
or the right part of the expression nicely fit here.<br/>
|
Please make sure that such reviewers can understand the code completely and without excessive effort.
|
||||||
<br/>
|
|
||||||
When weighing whether to use an auto-typed variable please think about potential reviewers of your code,
|
Some valid use cases:
|
||||||
who will read it as a plain diff (on github.com, for instance). Please make sure that such reviewers can
|
|
||||||
understand the code completely and without excessive effort.<br/>
|
* Container iteration and casts:
|
||||||
<br/>
|
|
||||||
Some valid use cases:
|
```c++
|
||||||
```c++
|
template <typename List>
|
||||||
template <typename List>
|
void doSomethingWithList(const List &list)
|
||||||
void doSomethingWithList(const List &list)
|
{
|
||||||
{
|
foreach (const auto &item, list)
|
||||||
foreach (const auto &item, list) {
|
{
|
||||||
// we don't know item type here so we use 'auto' keyword
|
// we don't know item type here so we use 'auto' keyword
|
||||||
// do something with item
|
// do something with item
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto it = container.begin(), end = container.end(); it != end; ++it) {
|
for (auto it = container.begin(), end = container.end(); it != end; ++it)
|
||||||
|
{
|
||||||
// we don't need to know the exact iterator type,
|
// we don't need to know the exact iterator type,
|
||||||
// because all iterators have the same interface
|
// because all iterators have the same interface
|
||||||
}
|
}
|
||||||
|
|
||||||
auto spinBox = static_cast<QSpinBox*>(sender());
|
auto spinBox = static_cast<QSpinBox*>(sender());
|
||||||
// we know the variable type based on the right-hand expression
|
// we know the variable type based on the right-hand expression
|
||||||
```
|
```
|
||||||
|
|
||||||
* Notice the spaces in the following specific situations:
|
* Notice the spaces in the following specific situations:
|
||||||
```c++
|
|
||||||
// Before and after the assignment and other binary (and ternary) operators there should be a space
|
|
||||||
// There should not be a space between increment/decrement and its operand
|
|
||||||
a += 20;
|
|
||||||
a = (b <= MAX_B ? b : MAX_B);
|
|
||||||
++a;
|
|
||||||
--b;
|
|
||||||
|
|
||||||
for (int a = 0; a < b; ++b) {
|
```c++
|
||||||
}
|
// Before and after the assignment and other binary (and ternary) operators there should be a space
|
||||||
|
// There should not be a space between increment/decrement and its operand
|
||||||
// Range-based for loop, spaces before and after the colon
|
a += 20;
|
||||||
for (auto i : container) {
|
a = (b <= MAX_B ? b : MAX_B);
|
||||||
}
|
++a;
|
||||||
|
--b;
|
||||||
// Derived class, spaces before and after the colon
|
for (int a = 0; a < b; ++b)
|
||||||
class Derived : public Base
|
{
|
||||||
{
|
}
|
||||||
};
|
// Range-based for loop, spaces before and after the colon
|
||||||
```
|
for (auto i : container)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
// Derived class, spaces before and after the colon
|
||||||
|
class Derived : public Base
|
||||||
|
{
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
* Prefer pre-increment, pre-decrement operators
|
* Prefer pre-increment, pre-decrement operators
|
||||||
```c++
|
|
||||||
++i, --j; // Yes
|
```c++
|
||||||
i++, j--; // No
|
++i, --j; // Yes
|
||||||
```
|
i++, j--; // No
|
||||||
|
```
|
||||||
|
|
||||||
* private/public/protected must not be indented
|
* private/public/protected must not be indented
|
||||||
|
|
||||||
@@ -414,7 +466,8 @@ i++, j--; // No
|
|||||||
|
|
||||||
* Method definitions aren't allowed in header files
|
* Method definitions aren't allowed in header files
|
||||||
|
|
||||||
### 10. Git commit message ###
|
## 10. Git commit message
|
||||||
|
|
||||||
1. Limit the subject line to 50 characters. Subject should contain only the very essence of the changes (you should avoid extra details and internals)
|
1. Limit the subject line to 50 characters. Subject should contain only the very essence of the changes (you should avoid extra details and internals)
|
||||||
2. Separate subject from body with a blank line
|
2. Separate subject from body with a blank line
|
||||||
3. Capitalize the subject line
|
3. Capitalize the subject line
|
||||||
@@ -424,6 +477,7 @@ i++, j--; // No
|
|||||||
7. Use the body to explain what and why vs. how
|
7. Use the body to explain what and why vs. how
|
||||||
8. If commit fixes a reported issue, mention it in the message body (e.g. `Closes #4134.`)
|
8. If commit fixes a reported issue, mention it in the message body (e.g. `Closes #4134.`)
|
||||||
|
|
||||||
### 11. Not covered above ###
|
## 11. Not covered above
|
||||||
If something isn't covered above, just follow the same style the file you are editing has.
|
|
||||||
|
If something isn't covered above, just follow the same style the file you are editing has. \
|
||||||
*This guide is not exhaustive and the style for a particular piece of code not specified here will be determined by project members on code review.*
|
*This guide is not exhaustive and the style for a particular piece of code not specified here will be determined by project members on code review.*
|
||||||
|
|||||||
127
Changelog
127
Changelog
@@ -1,4 +1,117 @@
|
|||||||
Unreleased - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.0
|
Tue Jan 19 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.3
|
||||||
|
- FEATURE: New languages: Azerbaijani, Estonian
|
||||||
|
- BUGFIX: Unify global speed dialogs for normal/alternative speeds (thalieht)
|
||||||
|
- BUGFIX: Increase maximum global speed limits ~2 GiB/s (thalieht)
|
||||||
|
- BUGFIX: Save fastresume when setting torrent speed limits (thalieht)
|
||||||
|
- BUGFIX: Group several torrent options into one dialog (thalieht)
|
||||||
|
- BUGFIX: Capitalize locale names (Chocobo1)
|
||||||
|
- BUGFIX: Improve content file/folder names handling (glassez)
|
||||||
|
- BUGFIX: Drop notification about move storage finished or failed (glassez)
|
||||||
|
- BUGFIX: Reload "missing files" torrent instead of re-checking (glassez)
|
||||||
|
- BUGFIX: Remember dialog sizes (Chocobo1)
|
||||||
|
- BUGFIX: Improve detection of file extension string (Chocobo1)
|
||||||
|
- WEBUI: Don't call non-existent elements (glassez)
|
||||||
|
- WEBUI: Update "Keep top-level folder" in WebUI options (thalieht)
|
||||||
|
- MACOS: QMake: Raise minimal macOS target version to 10.14 (glassez)
|
||||||
|
- LINUX: Use legacy 'data' directory only as a fallback (lbilli)
|
||||||
|
- OTHER: Bump project requirement to C++17 (Chocobo1)
|
||||||
|
|
||||||
|
Sun Dec 27 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.2
|
||||||
|
- FEATURE: Allow to add root folder to torrent content (glassez)
|
||||||
|
- FEATURE: "HTTPS tracker validation" option is available on all platforms with latest libtorrent (Chocobo1)
|
||||||
|
- FEATURE: Option for supporting internationalized domain names (IDNs) (Chocobo1)
|
||||||
|
- BUGFIX: Fix broken sorting on some columns (Chocobo1)
|
||||||
|
- BUGFIX: Fix availability per file value (Chocobo1)
|
||||||
|
- BUGFIX: Fix status of torrents without metadata (sledgehammer999)
|
||||||
|
- BUGFIX: Don't try to remove folders for a torrent without metadata (sledgehammer999)
|
||||||
|
- BUGFIX: Lift upper limit of "Max concurrent HTTP announces" option (Chocobo1)
|
||||||
|
- BUGFIX: Add links to libtorrent documentation (Chocobo1)
|
||||||
|
- BUGFIX: Move "embedded tracker" options to qbt section (Chocobo1)
|
||||||
|
- BUGFIX: Properly handle "Append extension" option changing (glassez)
|
||||||
|
- BUGFIX: Correctly save paused torrent state (glassez)
|
||||||
|
- BUGFIX: Fix bug of "move storage job" can be performed multiple times (glassez)
|
||||||
|
- WEBUI: Add ability to use 'shift+delete' to delete torrents (Chocobo1)
|
||||||
|
- WEBUI: Allow to attach tags while adding torrents (Jesse Chan)
|
||||||
|
- WEBUI: Bump version to 2.6.2 (Jesse Chan)
|
||||||
|
- WEBUI: Remove unnecessary restriction on input length (Chocobo1)
|
||||||
|
- WINDOWS: NSIS: Update Russian translation (Andrei Stepanov)
|
||||||
|
- WINDOWS: NSIS: Update Italian translation (Alessandro Simonelli)
|
||||||
|
- OTHER: Drop support for building with libtorrent < 1.2.11 (Vladimir Golovnev)
|
||||||
|
|
||||||
|
Wed Nov 25 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.1
|
||||||
|
- FEATURE: Allow progress bar styling from custom themes (jagannatharjun)
|
||||||
|
- FEATURE: Allow adding torrents using "Paste" key sequence (Chocobo1)
|
||||||
|
- FEATURE: Add Latgalian translation (sledgehammer999)
|
||||||
|
- BUGFIX: Prevent resume data to be saved for removed torrent (glassez)
|
||||||
|
- BUGFIX: Clarify connection protocol choice label (FranciscoPombal)
|
||||||
|
- BUGFIX: Fix crash when clicked outside the table of torrent content view (jagannatharjun)
|
||||||
|
- BUGFIX: Don't resume "paused" torrents when put into "checking" state by libtorrent (glassez)
|
||||||
|
- BUGFIX: Fix torrent state calculation (glassez)
|
||||||
|
- BUGFIX: Align integer data to right in torrent content view (jagannatharjun)
|
||||||
|
- WEBUI: Place WebUI RSS description in sandboxed iframe (Sepro)
|
||||||
|
- WEBUI: Avoid settings being reset via WebAPI (Chocobo1)
|
||||||
|
- WEBUI: Fix toggling advanced option in WebUI (thalieht)
|
||||||
|
- WEBUI: Expose contentPath in WebAPI torrents/info (FranciscoPombal)
|
||||||
|
- WEBUI: Fix the issue that IPv6 address can't be banned (brvphoenix)
|
||||||
|
- RSS: Fix confusion in date format description (Thomas De Rocker)
|
||||||
|
- WINDOWS: Update dutch.nsi (Thomas De Rocker)
|
||||||
|
- LINUX: Update .desktop file translations (sledgehammer999)
|
||||||
|
|
||||||
|
Thu Oct 22 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.0.1
|
||||||
|
- WINDOWS: NSIS: Update Italian translation (bovirus)
|
||||||
|
|
||||||
|
Sun Oct 18 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.0
|
||||||
|
- FEATURE: Many UI elements colors are themeable now (jagannatharjun)
|
||||||
|
- FEATURE: Allow changing GUI icons from theme bundles (jagannatharjun)
|
||||||
|
- FEATURE: Notify user when torrent moving finished (glassez)
|
||||||
|
- FEATURE: Shortcut CTRL + I opens Statistics window (LoopsGod)
|
||||||
|
- FEATURE: Add RSS functionality in Web UI (Sepro)
|
||||||
|
- FEATURE: Drop ".unwanted folder" feature (glassez)
|
||||||
|
- FEATURE: Expose libtorrent peer_turnover, max_concurrent_http_announces, no_connect_privileged_ports settings (Sophist, an0n666, NotTsunami)
|
||||||
|
- BUGFIX: Fix typo in Options dialog (Andrei Stepanov)
|
||||||
|
- BUGFIX: Remove "requires restart" from network interface settings (an0n666)
|
||||||
|
- BUGFIX: Rename "Create subfolder" to "Keep top-level folder" (thalieht)
|
||||||
|
- BUGFIX: Show tooltip for some properties in transfer list (Nick Korotysh)
|
||||||
|
- BUGFIX: Fix calculation of torrent current state (glassez)
|
||||||
|
- BUGFIX: Improve detecting completed files when adding, rechecking or moving a torrent (glassez)
|
||||||
|
- BUGFIX: Fixed broken announce logic in embedded tracker causing failures in some cases (FranciscoPombal)
|
||||||
|
- BUGFIX: Disable checkbox if torrent doesn't have root folder (thalieht)
|
||||||
|
- BUGFIX: Update country flag icons with upstream (Chocobo1)
|
||||||
|
- BUGFIX: Private torrent: If tracker entry is edited clear old peer list. Also don't allow user to manually add peers. (an0n666)
|
||||||
|
- BUGFIX: Fix large strings not visible in log widget (jagannatharjun)
|
||||||
|
- BUGFIX: Disable edit action in Peer list widget (Chocobo1)
|
||||||
|
- BUGFIX: Add a scroll area to torrent creator dialog (Ernesto Castellotti)
|
||||||
|
- BUGFIX: Content tab: Open double-clicked folder regardless on which column the click happens (Chocobo1)
|
||||||
|
- BUGFIX: "Open containing folder" on a folder now opens it in its parent folder (Chocobo1)
|
||||||
|
- BUGFIX: Fix GeoDB download in systems with non-C locales (FranciscoPombal)
|
||||||
|
- BUGFIX: Fix peer blocked message (FranciscoPombal)
|
||||||
|
- BUGFIX: Make more robust the banning of selected peers from the list (NotTsunami)
|
||||||
|
- BUGFIX: Use toned green color for downloading pieces in Pieces bar (jagannatharjun)
|
||||||
|
- BUGFIX: Correctly fill whole width of speed graph (jagannatharjun)
|
||||||
|
- BUGFIX: Fix impossible speed in speed graph (jagannatharjun)
|
||||||
|
- WEBUI: Hide additional search filters on small screens (Thomas Piccirello)
|
||||||
|
- WEBUI: Shrink search bar on small screens (Thomas Piccirello)
|
||||||
|
- WEBUI: Fix search categories only working in English (Thomas Piccirello)
|
||||||
|
- WEBUI: Add Trackers section to sidebar (Thomas Piccirello)
|
||||||
|
- WEBUI: Fix Enter button behavior in textarea (Tom Piccirello)
|
||||||
|
- WEBUI: Fix wrong file renaming selection range (MR)
|
||||||
|
- WEBUI: Preselect "Default save path" in watched folders (thalieht)
|
||||||
|
- WEBUI: Fix banning peers (brvphoenix)
|
||||||
|
- WEBUI: Fix seeding time checkbox placement (Chocobo1)
|
||||||
|
- WEBUI: Bump Web API version (Thomas Piccirello)
|
||||||
|
- RSS: Fix renaming RSS autodownload rule (glassez)
|
||||||
|
- RSS: Fix RSS article is not marked as "read" when torrent is downloaded (glassez)
|
||||||
|
- SEARCH: Update minimum Python version to 3.5.0 (ngosang)
|
||||||
|
- SEARCH: Make middle-click close search tabs (Will Da Silva)
|
||||||
|
- WINDOWS: NSIS: Update Dutch translation (Thomas De Rocker)
|
||||||
|
- WINDOWS: NSIS: Change the installers uninstallation question to clear confusion (an0n666)
|
||||||
|
- LINUX: Fix typo in systemd service file (Shane Allgeier)
|
||||||
|
- LINUX: Don't use HTML in tray tooltip (thalieht)
|
||||||
|
- LINUX: Don't create 'data' subdirectory in XDG_DATA_HOME (lbilli)
|
||||||
|
- LINUX/MACOS: Add HTTPS tracker certificate validation option (NotTsunami)
|
||||||
|
- OTHER: Many CMake improvements (FranciscoPombal)
|
||||||
|
- OTHER: Support for libtorrent 1.1.x is dropped (Chocobo1)
|
||||||
|
- OTHER: Many code cleanups and improvements (FranciscoPombal, Chocobo1, glassez)
|
||||||
|
|
||||||
Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
||||||
- FEATURE: Libtorrent 1.2.x series are supported now (glassez)
|
- FEATURE: Libtorrent 1.2.x series are supported now (glassez)
|
||||||
@@ -31,7 +144,7 @@ Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
|||||||
- BUGFIX: Remove the max half-open connections option (thalieht)
|
- BUGFIX: Remove the max half-open connections option (thalieht)
|
||||||
- BUGFIX: Center align the section labels in advanced settings (thalieht)
|
- BUGFIX: Center align the section labels in advanced settings (thalieht)
|
||||||
- BUGFIX: Add documentation links to some advanced settings (thalieht)
|
- BUGFIX: Add documentation links to some advanced settings (thalieht)
|
||||||
- BUGFIX: Impove DownloadManager code (glassez)
|
- BUGFIX: Improve DownloadManager code (glassez)
|
||||||
- BUGFIX: Limit DownloadHandler max redirection to 20 (Chocobo1)
|
- BUGFIX: Limit DownloadHandler max redirection to 20 (Chocobo1)
|
||||||
- BUGFIX: Log DownloadManager SSL errors (Chocobo1)
|
- BUGFIX: Log DownloadManager SSL errors (Chocobo1)
|
||||||
- BUGFIX: Force recheck multiple torrents one by one (glassez)
|
- BUGFIX: Force recheck multiple torrents one by one (glassez)
|
||||||
@@ -262,10 +375,10 @@ Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
|||||||
- BUGFIX: Restore torrent in two steps (glassez)
|
- BUGFIX: Restore torrent in two steps (glassez)
|
||||||
- BUGFIX: Improve scaling of speed graphs (dzmat)
|
- BUGFIX: Improve scaling of speed graphs (dzmat)
|
||||||
- BUGFIX: Add isNetworkFileSystem() detection on Windows. This allows network mounts to be monitored correctly by polling timer. (Chocobo1)
|
- BUGFIX: Add isNetworkFileSystem() detection on Windows. This allows network mounts to be monitored correctly by polling timer. (Chocobo1)
|
||||||
- BUGFIX: Reduce horizontal graphs resolution. Improves perfomance. (dzmat)
|
- BUGFIX: Reduce horizontal graphs resolution. Improves performance. (dzmat)
|
||||||
- BUGFIX: Don't recheck just checked torrent (mj-p, glassez)
|
- BUGFIX: Don't recheck just checked torrent (mj-p, glassez)
|
||||||
- BUGFIX: Add SMB2 magic number (Chocobo1)
|
- BUGFIX: Add SMB2 magic number (Chocobo1)
|
||||||
- BUGFIX: Restore startup perfomance to v4.1.2 times. Needs at least libtorrent 1.1.10 (sledgehammer999)
|
- BUGFIX: Restore startup performance to v4.1.2 times. Needs at least libtorrent 1.1.10 (sledgehammer999)
|
||||||
- BUGFIX: Make strings actually translatable (sledgehammer999)
|
- BUGFIX: Make strings actually translatable (sledgehammer999)
|
||||||
- WEBUI: Handle downloading .torrent file as success (Tom Piccirello)
|
- WEBUI: Handle downloading .torrent file as success (Tom Piccirello)
|
||||||
- WEBUI: Fix Alternative Web UI to be available (glassez)
|
- WEBUI: Fix Alternative Web UI to be available (glassez)
|
||||||
@@ -336,7 +449,7 @@ Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
|||||||
- BUGFIX: Improve torrent initialization (glassez)
|
- BUGFIX: Improve torrent initialization (glassez)
|
||||||
- BUGFIX: Save resume data on torrent change events (glassez)
|
- BUGFIX: Save resume data on torrent change events (glassez)
|
||||||
- BUGFIX: Increase default resume data save interval (Chocobo1)
|
- BUGFIX: Increase default resume data save interval (Chocobo1)
|
||||||
- BUGFIX: Work around crash when procesing recursive download. Closes #9086 (Chocobo1)
|
- BUGFIX: Work around crash when processing recursive download. Closes #9086 (Chocobo1)
|
||||||
- BUGFIX: Reduce queries to python version (Chocobo1)
|
- BUGFIX: Reduce queries to python version (Chocobo1)
|
||||||
- BUGFIX: Disable certain mouse wheel events in Options dialog (Chocobo1)
|
- BUGFIX: Disable certain mouse wheel events in Options dialog (Chocobo1)
|
||||||
- WEBUI: Send all rechecks in one request (Thomas Piccirello)
|
- WEBUI: Send all rechecks in one request (Thomas Piccirello)
|
||||||
@@ -823,7 +936,7 @@ Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
|||||||
- COSMETIC: Change RSS view layout to horizontal. Closes #5920. (Chocobo1)
|
- COSMETIC: Change RSS view layout to horizontal. Closes #5920. (Chocobo1)
|
||||||
- OSX: Fix crash on exit using Qt4. (Yez Ezey)
|
- OSX: Fix crash on exit using Qt4. (Yez Ezey)
|
||||||
- OSX: Change QSettings to IniFormat on macOS. Closes #5770 #5808. (Yez Ezey)
|
- OSX: Change QSettings to IniFormat on macOS. Closes #5770 #5808. (Yez Ezey)
|
||||||
- LINUX: Workaround a Qt5 bug which results in a flood of network interface change singals. (Eugene Shalygin)
|
- LINUX: Workaround a Qt5 bug which results in a flood of network interface change signals. (Eugene Shalygin)
|
||||||
- OTHER: Turkish translation for installer. (Burak Yavuz)
|
- OTHER: Turkish translation for installer. (Burak Yavuz)
|
||||||
- OTHER: Update portugueseBR for installer. (DaRKSoM)
|
- OTHER: Update portugueseBR for installer. (DaRKSoM)
|
||||||
- OTHER: Update portuguese for installer. (EdwardLinux)
|
- OTHER: Update portuguese for installer. (EdwardLinux)
|
||||||
@@ -2170,7 +2283,7 @@ Tue Dec 03 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.0
|
|||||||
- FEATURE: Added "Unread" item to RSS feed list to display all unread news
|
- FEATURE: Added "Unread" item to RSS feed list to display all unread news
|
||||||
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too
|
- FEATURE: If a torrent contains a torrent file, process downloaded torrent file too
|
||||||
- FEATURE: A random listening port can be chosen automatically
|
- FEATURE: A random listening port can be chosen automatically
|
||||||
- BUGFIX: torrent resume code rewrited
|
- BUGFIX: torrent resume code rewritten
|
||||||
- BUGFIX: Fixed uTorrent spoofing code
|
- BUGFIX: Fixed uTorrent spoofing code
|
||||||
- BUGFIX: Greatly improved column sorting code
|
- BUGFIX: Greatly improved column sorting code
|
||||||
- BUGFIX: Possibility to create trackerless torrents
|
- BUGFIX: Possibility to create trackerless torrents
|
||||||
|
|||||||
16
INSTALL
16
INSTALL
@@ -3,23 +3,27 @@ qBittorrent - A BitTorrent client in C++ / Qt
|
|||||||
|
|
||||||
1) Install these dependencies:
|
1) Install these dependencies:
|
||||||
|
|
||||||
- Boost >= 1.40
|
- Boost >= 1.65
|
||||||
|
|
||||||
- libtorrent-rasterbar >= 1.2 (by Arvid Norberg)
|
- libtorrent-rasterbar >= 1.2.11 (by Arvid Norberg)
|
||||||
* https://www.libtorrent.org/
|
* https://www.libtorrent.org/
|
||||||
* Be careful: another library (the one used by rTorrent) uses a similar name
|
* Be careful: another library (the one used by rTorrent) uses a similar name
|
||||||
|
|
||||||
- OpenSSL >= 1.0
|
- OpenSSL >= 1.1.1
|
||||||
|
|
||||||
- Qt >= 5.9.0
|
- Qt >= 5.9.5
|
||||||
|
|
||||||
- zlib >= 1.2.5.2
|
- zlib >= 1.2.11
|
||||||
|
|
||||||
- pkg-config (compile-time only)
|
- pkg-config (compile-time only on *nix systems)
|
||||||
|
|
||||||
- Python >= 3.5.0 (optional, runtime only)
|
- Python >= 3.5.0 (optional, runtime only)
|
||||||
* Required by the internal search engine
|
* Required by the internal search engine
|
||||||
|
|
||||||
|
Dependency version numbers are bumped every once in a while to keep the range of properly tested configurations manageable, even if not strictly required to build.
|
||||||
|
You may be able to build with older versions of (some of) the dependencies other than the minimum versions specified in the build scripts, but support for such builds is not provided - you are on your own.
|
||||||
|
Please ensure you are building with an officially supported configuration when reporting bugs.
|
||||||
|
|
||||||
2a) Compile and install qBittorrent with Qt graphical interface
|
2a) Compile and install qBittorrent with Qt graphical interface
|
||||||
|
|
||||||
$ ./configure
|
$ ./configure
|
||||||
|
|||||||
1
TODO
1
TODO
@@ -1,2 +1 @@
|
|||||||
See https://blueprints.launchpad.net/qbittorrent/
|
See https://blueprints.launchpad.net/qbittorrent/
|
||||||
|
|
||||||
|
|||||||
19
build_dist.sh
Executable file
19
build_dist.sh
Executable file
@@ -0,0 +1,19 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# get version numbers
|
||||||
|
versionSrc="src/base/version.h.in"
|
||||||
|
versionMajor="$(grep -Po '(?<=QBT_VERSION_MAJOR )\d+' "$versionSrc")"
|
||||||
|
versionMinor="$(grep -Po '(?<=QBT_VERSION_MINOR )\d+' "$versionSrc")"
|
||||||
|
versionBugfix="$(grep -Po '(?<=QBT_VERSION_BUGFIX )\d+' "$versionSrc")"
|
||||||
|
versionBuild="$(grep -Po '(?<=QBT_VERSION_BUILD )\d+' "$versionSrc")"
|
||||||
|
versionStatus="$(grep -Po '(?<=QBT_VERSION_STATUS ")\w+' "$versionSrc")"
|
||||||
|
|
||||||
|
if [ "$versionBuild" != "0" ]; then
|
||||||
|
projectVersion="$versionMajor.$versionMinor.$versionBugfix.$versionBuild$versionStatus"
|
||||||
|
else
|
||||||
|
projectVersion="$versionMajor.$versionMinor.$versionBugfix$versionStatus"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# pack archives
|
||||||
|
git archive --format=tar --prefix="qbittorrent-$projectVersion/" HEAD | gzip -9 > "qbittorrent-$projectVersion.tar.gz"
|
||||||
|
git archive --format=tar --prefix="qbittorrent-$projectVersion/" HEAD | xz -9 > "qbittorrent-$projectVersion.tar.xz"
|
||||||
@@ -7,47 +7,16 @@ macro(qbt_common_config)
|
|||||||
# treat value specified by the CXX_STANDARD target property as a requirement by default
|
# treat value specified by the CXX_STANDARD target property as a requirement by default
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# these definitions are only needed for calls to
|
|
||||||
# lt::generate_fingerprint and for the qbittorrent.rc file on Windows
|
|
||||||
add_library(qbt_version_definitions INTERFACE)
|
|
||||||
|
|
||||||
target_compile_definitions(qbt_version_definitions INTERFACE
|
|
||||||
QBT_VERSION_MAJOR=${qBittorrent_VERSION_MAJOR}
|
|
||||||
QBT_VERSION_MINOR=${qBittorrent_VERSION_MINOR}
|
|
||||||
QBT_VERSION_BUGFIX=${qBittorrent_VERSION_PATCH}
|
|
||||||
QBT_VERSION_BUILD=${qBittorrent_VERSION_TWEAK}
|
|
||||||
)
|
|
||||||
|
|
||||||
add_library(qbt_common_cfg INTERFACE)
|
add_library(qbt_common_cfg INTERFACE)
|
||||||
|
|
||||||
# Full C++ 14 support is required
|
# Full C++ 17 support is required
|
||||||
# See also https://cmake.org/cmake/help/latest/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
|
# See also https://cmake.org/cmake/help/latest/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html
|
||||||
# for a breakdown of the features that CMake recognizes for each C++ standard
|
# for a breakdown of the features that CMake recognizes for each C++ standard
|
||||||
target_compile_features(qbt_common_cfg INTERFACE
|
target_compile_features(qbt_common_cfg INTERFACE
|
||||||
cxx_std_14
|
cxx_std_17
|
||||||
cxx_aggregate_default_initializers
|
|
||||||
cxx_attribute_deprecated
|
|
||||||
cxx_binary_literals
|
|
||||||
cxx_contextual_conversions
|
|
||||||
cxx_decltype_auto
|
|
||||||
cxx_digit_separators
|
|
||||||
cxx_generic_lambdas
|
|
||||||
cxx_lambda_init_captures
|
|
||||||
cxx_relaxed_constexpr
|
|
||||||
cxx_return_type_deduction
|
|
||||||
cxx_variable_templates
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set(QBT_PROJECT_VERSION "${qBittorrent_VERSION_MAJOR}.${qBittorrent_VERSION_MINOR}.${qBittorrent_VERSION_PATCH}")
|
|
||||||
if (NOT ${qBittorrent_VERSION_TWEAK} EQUAL 0)
|
|
||||||
set(QBT_PROJECT_VERSION "${QBT_PROJECT_VERSION}.${qBittorrent_VERSION_TWEAK}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(QBT_FULL_VERSION "${QBT_PROJECT_VERSION}${QBT_VER_STATUS}")
|
|
||||||
|
|
||||||
target_compile_definitions(qbt_common_cfg INTERFACE
|
target_compile_definitions(qbt_common_cfg INTERFACE
|
||||||
QBT_VERSION="v${QBT_FULL_VERSION}"
|
|
||||||
QBT_VERSION_2="${QBT_FULL_VERSION}"
|
|
||||||
QT_DEPRECATED_WARNINGS
|
QT_DEPRECATED_WARNINGS
|
||||||
QT_NO_CAST_TO_ASCII
|
QT_NO_CAST_TO_ASCII
|
||||||
QT_NO_CAST_FROM_BYTEARRAY
|
QT_NO_CAST_FROM_BYTEARRAY
|
||||||
@@ -90,6 +59,12 @@ macro(qbt_common_config)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if ((CXX_COMPILER_ID STREQUAL "Clang") OR (CXX_COMPILER_ID STREQUAL "AppleClang"))
|
||||||
|
target_compile_options(qbt_common_cfg INTERFACE
|
||||||
|
-Wno-range-loop-analysis
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if (MINGW)
|
if (MINGW)
|
||||||
target_link_options(qbt_common_cfg INTERFACE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:LINKER:--dynamicbase>)
|
target_link_options(qbt_common_cfg INTERFACE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:LINKER:--dynamicbase>)
|
||||||
endif()
|
endif()
|
||||||
@@ -101,8 +76,12 @@ macro(qbt_common_config)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
target_compile_options(qbt_common_cfg INTERFACE /guard:cf)
|
target_compile_options(qbt_common_cfg INTERFACE
|
||||||
target_link_options(qbt_common_cfg INTERFACE /guard:cf
|
/guard:cf
|
||||||
|
/utf-8
|
||||||
|
)
|
||||||
|
target_link_options(qbt_common_cfg INTERFACE
|
||||||
|
/guard:cf
|
||||||
$<$<NOT:$<CONFIG:Debug>>:/OPT:REF /OPT:ICF>
|
$<$<NOT:$<CONFIG:Debug>>:/OPT:REF /OPT:ICF>
|
||||||
# suppress linking warning due to /INCREMENTAL and /OPT:ICF being both ON
|
# suppress linking warning due to /INCREMENTAL and /OPT:ICF being both ON
|
||||||
$<$<CONFIG:RelWithDebInfo>:/INCREMENTAL:NO>
|
$<$<CONFIG:RelWithDebInfo>:/INCREMENTAL:NO>
|
||||||
|
|||||||
54
configure.ac
54
configure.ac
@@ -1,6 +1,8 @@
|
|||||||
AC_INIT([qbittorrent], [v4.3.0alpha], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/])
|
AC_INIT([qbittorrent], [v4.3.3], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
: ${CFLAGS=""}
|
||||||
|
: ${CXXFLAGS=""}
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AC_PROG_SED
|
AC_PROG_SED
|
||||||
@@ -157,7 +159,7 @@ AS_CASE(["x$enable_qt_dbus"],
|
|||||||
AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])])
|
AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])])
|
||||||
|
|
||||||
|
|
||||||
AX_BOOST_BASE([1.40],
|
AX_BOOST_BASE([1.65],
|
||||||
[AC_MSG_NOTICE([Boost CXXFLAGS: "$BOOST_CPPFLAGS"])
|
[AC_MSG_NOTICE([Boost CXXFLAGS: "$BOOST_CPPFLAGS"])
|
||||||
AC_MSG_NOTICE([Boost LDFLAGS: "$BOOST_LDFLAGS"])],
|
AC_MSG_NOTICE([Boost LDFLAGS: "$BOOST_LDFLAGS"])],
|
||||||
[AC_MSG_ERROR([Could not find Boost])])
|
[AC_MSG_ERROR([Could not find Boost])])
|
||||||
@@ -178,48 +180,48 @@ AC_MSG_NOTICE([Boost.System LIB: "$BOOST_SYSTEM_LIB"])
|
|||||||
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||||
|
|
||||||
PKG_CHECK_MODULES(libtorrent,
|
PKG_CHECK_MODULES(libtorrent,
|
||||||
[libtorrent-rasterbar >= 1.2],
|
[libtorrent-rasterbar >= 1.2.11],
|
||||||
[CXXFLAGS="$libtorrent_CFLAGS $CXXFLAGS"
|
[CXXFLAGS="$libtorrent_CFLAGS $CXXFLAGS"
|
||||||
LIBS="$libtorrent_LIBS $LIBS"])
|
LIBS="$libtorrent_LIBS $LIBS"])
|
||||||
|
|
||||||
PKG_CHECK_MODULES(openssl,
|
PKG_CHECK_MODULES(openssl,
|
||||||
[openssl >= 1.0],
|
[openssl >= 1.1.1],
|
||||||
[CXXFLAGS="$openssl_CFLAGS $CXXFLAGS"
|
[CXXFLAGS="$openssl_CFLAGS $CXXFLAGS"
|
||||||
LIBS="$openssl_LIBS $LIBS"])
|
LIBS="$openssl_LIBS $LIBS"])
|
||||||
|
|
||||||
PKG_CHECK_MODULES(zlib,
|
PKG_CHECK_MODULES(zlib,
|
||||||
[zlib >= 1.2.5.2],
|
[zlib >= 1.2.11],
|
||||||
[CXXFLAGS="$zlib_CFLAGS $CXXFLAGS"
|
[CXXFLAGS="$zlib_CFLAGS $CXXFLAGS"
|
||||||
LIBS="$zlib_LIBS $LIBS"])
|
LIBS="$zlib_LIBS $LIBS"])
|
||||||
|
|
||||||
# Check if already in >= C++14 mode because of the flags returned by one of the above packages
|
# Check if already in >= C++17 mode because of the flags returned by one of the above packages
|
||||||
TMP_CXXFLAGS="$CXXFLAGS"
|
TMP_CXXFLAGS="$CXXFLAGS"
|
||||||
CXXFLAGS=""
|
CXXFLAGS=""
|
||||||
AC_MSG_CHECKING([if compiler defaults to C++14 or later mode])
|
AC_MSG_CHECKING([if compiler defaults to C++17 or later mode])
|
||||||
AC_COMPILE_IFELSE([DETECT_CPP14_PROGRAM()],
|
AC_COMPILE_IFELSE([DETECT_CPP17_PROGRAM()],
|
||||||
[AC_MSG_RESULT([yes])
|
[AC_MSG_RESULT([yes])
|
||||||
QBT_CXX14_FOUND="yes"],
|
QBT_CXX17_FOUND="yes"],
|
||||||
[AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
QBT_CXX14_FOUND="no"])
|
QBT_CXX17_FOUND="no"])
|
||||||
|
|
||||||
# In case of no, check if the compiler can support at least C++14
|
# In case of no, check if the compiler can support at least C++17
|
||||||
# and if yes, enable it leaving a warning to the user
|
# and if yes, enable it leaving a warning to the user
|
||||||
AS_IF([test "x$QBT_CXX14_FOUND" = "xno"],
|
AS_IF([test "x$QBT_CXX17_FOUND" = "xno"],
|
||||||
[AC_MSG_CHECKING([if compiler supports C++14])
|
[AC_MSG_CHECKING([if compiler supports C++17])
|
||||||
CXXFLAGS="-std=c++14"
|
CXXFLAGS="-std=c++17"
|
||||||
AC_COMPILE_IFELSE([DETECT_CPP14_PROGRAM()],
|
AC_COMPILE_IFELSE([DETECT_CPP17_PROGRAM()],
|
||||||
[AC_MSG_RESULT([yes])
|
[AC_MSG_RESULT([yes])
|
||||||
AC_MSG_CHECKING([if C++14 is disabled by the set compiler flags])
|
AC_MSG_CHECKING([if C++17 is disabled by the set compiler flags])
|
||||||
# prepend the flag so it won't override conflicting user defined flags
|
# prepend the flag so it won't override conflicting user defined flags
|
||||||
CXXFLAGS="-std=c++14 $TMP_CXXFLAGS"
|
CXXFLAGS="-std=c++17 $TMP_CXXFLAGS"
|
||||||
AC_COMPILE_IFELSE([DETECT_CPP14_PROGRAM()],
|
AC_COMPILE_IFELSE([DETECT_CPP17_PROGRAM()],
|
||||||
[AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
QBT_ADD_CONFIG="$QBT_ADD_CONFIG c++14"
|
QBT_ADD_CONFIG="$QBT_ADD_CONFIG c++1z"
|
||||||
AC_MSG_WARN([C++14 mode is now force enabled. The C++ mode should match the mode that other libraries were built with, otherwise you'll likely get linking errors.])],
|
AC_MSG_WARN([C++17 mode is now force enabled. The C++ mode should match the mode that other libraries were built with, otherwise you'll likely get linking errors.])],
|
||||||
[AC_MSG_RESULT([yes])
|
[AC_MSG_RESULT([yes])
|
||||||
AC_MSG_ERROR([The compiler supports C++14 but the user or a dependency has explicitly enabled a lower mode.])])],
|
AC_MSG_ERROR([The compiler supports C++17 but the user or a dependency has explicitly enabled a lower mode.])])],
|
||||||
[AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
AC_MSG_ERROR([A compiler supporting C++14 is required.])])
|
AC_MSG_ERROR([A compiler supporting C++17 is required.])])
|
||||||
])
|
])
|
||||||
CXXFLAGS="$TMP_CXXFLAGS"
|
CXXFLAGS="$TMP_CXXFLAGS"
|
||||||
|
|
||||||
@@ -270,9 +272,13 @@ AC_SUBST(QBT_REMOVE_CONFIG)
|
|||||||
AC_SUBST(QBT_ADD_DEFINES)
|
AC_SUBST(QBT_ADD_DEFINES)
|
||||||
AC_SUBST(QBT_REMOVE_DEFINES)
|
AC_SUBST(QBT_REMOVE_DEFINES)
|
||||||
|
|
||||||
AC_OUTPUT(conf.pri)
|
QBT_CONFIG_FILES="conf.pri"
|
||||||
|
|
||||||
AS_IF([test "x$enable_systemd" = "xyes"],
|
AS_IF([test "x$enable_systemd" = "xyes"],
|
||||||
[AC_OUTPUT(dist/unix/systemd/qbittorrent-nox@.service)])
|
[QBT_CONFIG_FILES="$QBT_CONFIG_FILES dist/unix/systemd/qbittorrent-nox@.service"])
|
||||||
|
|
||||||
|
AC_CONFIG_FILES(["$QBT_CONFIG_FILES"])
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
AC_MSG_NOTICE([Running qmake to generate the makefile...])
|
AC_MSG_NOTICE([Running qmake to generate the makefile...])
|
||||||
TOPDIR="$(cd "$(dirname "$0")" && pwd)"
|
TOPDIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
|||||||
1
dist/mac/CMakeLists.txt
vendored
1
dist/mac/CMakeLists.txt
vendored
@@ -0,0 +1 @@
|
|||||||
|
# empty
|
||||||
|
|||||||
4
dist/mac/Info.plist
vendored
4
dist/mac/Info.plist
vendored
@@ -55,7 +55,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>4.3.0</string>
|
<string>4.3.3</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>@EXECUTABLE@</string>
|
<string>@EXECUTABLE@</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
@@ -67,7 +67,7 @@
|
|||||||
<key>NSAppleScriptEnabled</key>
|
<key>NSAppleScriptEnabled</key>
|
||||||
<string>YES</string>
|
<string>YES</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2006-2020 The qBittorrent project</string>
|
<string>Copyright © 2006-2021 The qBittorrent project</string>
|
||||||
<key>UTExportedTypeDeclarations</key>
|
<key>UTExportedTypeDeclarations</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
|||||||
@@ -74,6 +74,6 @@
|
|||||||
<url type="translate">https://github.com/qbittorrent/qBittorrent/wiki/How-to-translate-qBittorrent</url>
|
<url type="translate">https://github.com/qbittorrent/qBittorrent/wiki/How-to-translate-qBittorrent</url>
|
||||||
<content_rating type="oars-1.1"/>
|
<content_rating type="oars-1.1"/>
|
||||||
<releases>
|
<releases>
|
||||||
<release version="4.1.5" date="2018-12-24"/>
|
<release version="4.3.3" date="2021-01-19"/>
|
||||||
</releases>
|
</releases>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
69
dist/unix/org.qbittorrent.qBittorrent.desktop
vendored
69
dist/unix/org.qbittorrent.qBittorrent.desktop
vendored
@@ -12,6 +12,9 @@ StartupNotify=false
|
|||||||
StartupWMClass=qbittorrent
|
StartupWMClass=qbittorrent
|
||||||
Keywords=bittorrent;torrent;magnet;download;p2p;
|
Keywords=bittorrent;torrent;magnet;download;p2p;
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent
|
Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent
|
||||||
GenericName[oc]=Client BitTorrent
|
GenericName[oc]=Client BitTorrent
|
||||||
@@ -22,8 +25,8 @@ Name[af]=qBittorrent
|
|||||||
Comment[ar]=نزّل وشارك الملفات عبر كيوبتتورنت
|
Comment[ar]=نزّل وشارك الملفات عبر كيوبتتورنت
|
||||||
GenericName[ar]=عميل بتتورنت
|
GenericName[ar]=عميل بتتورنت
|
||||||
Name[ar]=كيوبتتورنت
|
Name[ar]=كيوبتتورنت
|
||||||
Comment[be]=Сцягванне і раздача файлаў праз пратакол BitTorrent
|
Comment[be]=Спампоўванне і раздача файлаў праз пратакол BitTorrent
|
||||||
GenericName[be]=BitTorrent-кліент
|
GenericName[be]=Кліент BitTorrent
|
||||||
Name[be]=qBittorrent
|
Name[be]=qBittorrent
|
||||||
Comment[bg]=Сваляне и споделяне на файлове чрез BitTorrent
|
Comment[bg]=Сваляне и споделяне на файлове чрез BitTorrent
|
||||||
GenericName[bg]=BitTorrent клиент
|
GenericName[bg]=BitTorrent клиент
|
||||||
@@ -34,19 +37,19 @@ Name[bn]=কিউবি্টটরেন্ট
|
|||||||
Comment[bs]=Preuzmi i dijeli datoteke preko BitTorrent-a
|
Comment[bs]=Preuzmi i dijeli datoteke preko BitTorrent-a
|
||||||
GenericName[bs]=BitTorrent klijent
|
GenericName[bs]=BitTorrent klijent
|
||||||
Name[bs]=qBittorrent
|
Name[bs]=qBittorrent
|
||||||
Comment[ca]=Baixeu i compartiu fitxers mitjançant BitTorrent
|
Comment[ca]=Baixeu i compartiu fitxers amb el BitTorrent
|
||||||
GenericName[ca]=Client de BitTorrent
|
GenericName[ca]=Client de BitTorrent
|
||||||
Name[ca]=qBittorrent
|
Name[ca]=qBittorrent
|
||||||
Comment[cs]=Stahování a sdílení souborů přes síť BitTorrent
|
Comment[cs]=Stahování a sdílení souborů přes síť BitTorrent
|
||||||
GenericName[cs]=BitTorrent klient
|
GenericName[cs]=BitTorrent klient
|
||||||
Name[cs]=qBittorrent
|
Name[cs]=qBittorrent
|
||||||
Comment[da]=Download og del filer over BitTorrent
|
Comment[da]=Download og del filer over BitTorrent
|
||||||
GenericName[da]=BitTorrent klient
|
GenericName[da]=BitTorrent-klient
|
||||||
Name[da]=qBittorrent
|
Name[da]=qBittorrent
|
||||||
Comment[de]=Über BitTorrent Dateien herunterladen und teilen
|
Comment[de]=Über BitTorrent Dateien herunterladen und teilen
|
||||||
GenericName[de]=BitTorrent Client
|
GenericName[de]=BitTorrent Client
|
||||||
Name[de]=qBittorrent
|
Name[de]=qBittorrent
|
||||||
Comment[el]=Κάντε λήψη και ανταλάξτε αρχεία μέσω BitTorrent
|
Comment[el]=Κάντε λήψη και ανταλλάξτε αρχεία μέσω BitTorrent
|
||||||
GenericName[el]=Πελάτης BitTorrent
|
GenericName[el]=Πελάτης BitTorrent
|
||||||
Name[el]=qBittorrent
|
Name[el]=qBittorrent
|
||||||
Comment[en_GB]=Download and share files over BitTorrent
|
Comment[en_GB]=Download and share files over BitTorrent
|
||||||
@@ -55,7 +58,10 @@ Name[en_GB]=qBittorrent
|
|||||||
Comment[es]=Descargue y comparta archivos por BitTorrent
|
Comment[es]=Descargue y comparta archivos por BitTorrent
|
||||||
GenericName[es]=Cliente BitTorrent
|
GenericName[es]=Cliente BitTorrent
|
||||||
Name[es]=qBittorrent
|
Name[es]=qBittorrent
|
||||||
Comment[eu]=Jeitsi eta elkarbanatu agiriak BitTorrent-en
|
Comment[et]=Lae alla ja jaga faile üle BitTorrenti
|
||||||
|
GenericName[et]=BitTorrent klient
|
||||||
|
Name[et]=qBittorrent
|
||||||
|
Comment[eu]=Jeitsi eta elkarbanatu agiriak BitTorrent bidez
|
||||||
GenericName[eu]=BitTorrent bezeroa
|
GenericName[eu]=BitTorrent bezeroa
|
||||||
Name[eu]=qBittorrent
|
Name[eu]=qBittorrent
|
||||||
Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت
|
Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت
|
||||||
@@ -82,13 +88,16 @@ Name[hr]=qBittorrent
|
|||||||
Comment[hu]=Fájlok letöltése és megosztása a BitTorrent hálózaton keresztül
|
Comment[hu]=Fájlok letöltése és megosztása a BitTorrent hálózaton keresztül
|
||||||
GenericName[hu]=BitTorrent kliens
|
GenericName[hu]=BitTorrent kliens
|
||||||
Name[hu]=qBittorrent
|
Name[hu]=qBittorrent
|
||||||
|
Comment[hy]=Նիշքերի փոխանցում BitTorrent-ի միջոցով
|
||||||
|
GenericName[hy]=BitTorrent սպասառու
|
||||||
|
Name[hy]=qBittorrent
|
||||||
Comment[id]=Unduh dan berbagi berkas melalui BitTorrent
|
Comment[id]=Unduh dan berbagi berkas melalui BitTorrent
|
||||||
GenericName[id]=Klien BitTorrent
|
GenericName[id]=Klien BitTorrent
|
||||||
Name[id]=qBittorrent
|
Name[id]=qBittorrent
|
||||||
Comment[is]=Sækja og deila skrám yfir BitTorrent
|
Comment[is]=Sækja og deila skrám yfir BitTorrent
|
||||||
GenericName[is]=BitTorrent biðlarar
|
GenericName[is]=BitTorrent biðlarar
|
||||||
Name[is]=qBittorrent
|
Name[is]=qBittorrent
|
||||||
Comment[it]=Client BitTorrent per il download di file via internet
|
Comment[it]=Scarica e condividi file tramite BitTorrent
|
||||||
GenericName[it]=Client BitTorrent
|
GenericName[it]=Client BitTorrent
|
||||||
Name[it]=qBittorrent
|
Name[it]=qBittorrent
|
||||||
Comment[ja]=BitTorrent でファイルをダウンロードおよび共有します
|
Comment[ja]=BitTorrent でファイルをダウンロードおよび共有します
|
||||||
@@ -97,15 +106,18 @@ Name[ja]=qBittorrent
|
|||||||
Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით
|
Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით
|
||||||
GenericName[ka]=BitTorrent კლიენტი
|
GenericName[ka]=BitTorrent კლიენტი
|
||||||
Name[ka]=qBittorrent
|
Name[ka]=qBittorrent
|
||||||
Comment[ko]=비트토런트를 통해 파일을 다운로드하고 공유합니다
|
Comment[ko]=비트토렌트를 통해 파일을 받고 공유합니다
|
||||||
GenericName[ko]=비트토런트 클라이언트
|
GenericName[ko]=비트토렌트 클라이언트
|
||||||
Name[ko]=큐빗토런트
|
Name[ko]=qBittorrent
|
||||||
Comment[zh]=通过 BitTorrent 下载和分享文件
|
Comment[zh]=通过 BitTorrent 下载和分享文件
|
||||||
GenericName[zh]=BitTorrent 客户端
|
GenericName[zh]=BitTorrent 客户端
|
||||||
Name[zh]=qBittorrent
|
Name[zh]=qBittorrent
|
||||||
Comment[lt]=Atsisiųskite bei dalinkitės failais BitTorrent tinkle
|
Comment[lt]=Atsisiųskite bei dalinkitės failais BitTorrent tinkle
|
||||||
GenericName[lt]=BitTorrent klientas
|
GenericName[lt]=BitTorrent klientas
|
||||||
Name[lt]=qBittorrent
|
Name[lt]=qBittorrent
|
||||||
|
Comment[mk]=Превземајте и споделувајте фајлови преку BitTorrent
|
||||||
|
GenericName[mk]=BitTorrent клиент
|
||||||
|
Name[mk]=qBittorrent
|
||||||
Comment[nb]=Last ned og del filer over BitTorrent
|
Comment[nb]=Last ned og del filer over BitTorrent
|
||||||
GenericName[nb]=BitTorrent-klient
|
GenericName[nb]=BitTorrent-klient
|
||||||
Name[nb]=qBittorrent
|
Name[nb]=qBittorrent
|
||||||
@@ -113,7 +125,7 @@ Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘ
|
|||||||
GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ
|
GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ
|
||||||
Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ
|
Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ
|
||||||
Comment[nl]=Bestanden downloaden en delen via BitTorrent
|
Comment[nl]=Bestanden downloaden en delen via BitTorrent
|
||||||
GenericName[nl]=BitTorrent-cliënt
|
GenericName[nl]=BitTorrent-client
|
||||||
Name[nl]=qBittorrent
|
Name[nl]=qBittorrent
|
||||||
Comment[pl]=Pobieraj i dziel się plikami przez BitTorrent
|
Comment[pl]=Pobieraj i dziel się plikami przez BitTorrent
|
||||||
GenericName[pl]=Klient BitTorrent
|
GenericName[pl]=Klient BitTorrent
|
||||||
@@ -127,8 +139,8 @@ Name[pt_BR]=qBittorrent
|
|||||||
Comment[ro]=Descărcați și partajați fișiere prin BitTorrent
|
Comment[ro]=Descărcați și partajați fișiere prin BitTorrent
|
||||||
GenericName[ro]=Client BitTorrent
|
GenericName[ro]=Client BitTorrent
|
||||||
Name[ro]=qBittorrent
|
Name[ro]=qBittorrent
|
||||||
Comment[ru]=Скачивайте и делитесь файлами с помощью BitTorrent
|
Comment[ru]=Обмен файлами по сети BitTorrent
|
||||||
GenericName[ru]=BitTorrent-клиент
|
GenericName[ru]=Клиент сети BitTorrent
|
||||||
Name[ru]=qBittorrent
|
Name[ru]=qBittorrent
|
||||||
Comment[sk]=Sťahovanie a zdieľanie súborov prostredníctvom siete BitTorrent
|
Comment[sk]=Sťahovanie a zdieľanie súborov prostredníctvom siete BitTorrent
|
||||||
GenericName[sk]=Klient siete BitTorrent
|
GenericName[sk]=Klient siete BitTorrent
|
||||||
@@ -136,6 +148,7 @@ Name[sk]=qBittorrent
|
|||||||
Comment[sl]=Prenesite in delite datoteke preko BitTorrenta
|
Comment[sl]=Prenesite in delite datoteke preko BitTorrenta
|
||||||
GenericName[sl]=BitTorrent odjemalec
|
GenericName[sl]=BitTorrent odjemalec
|
||||||
Name[sl]=qBittorrent
|
Name[sl]=qBittorrent
|
||||||
|
Comment[sr]=Преузимајте и делите фајлове преко BitTorrent протокола
|
||||||
GenericName[sr]=BitTorrent-клијент
|
GenericName[sr]=BitTorrent-клијент
|
||||||
Comment[sr@latin]=Preuzimanje i deljenje fajlova preko BitTorrent-a
|
Comment[sr@latin]=Preuzimanje i deljenje fajlova preko BitTorrent-a
|
||||||
GenericName[sr@latin]=BitTorrent klijent
|
GenericName[sr@latin]=BitTorrent klijent
|
||||||
@@ -146,21 +159,27 @@ Name[sv]=qBittorrent
|
|||||||
Comment[uz@Latn]=BitTorrent orqali fayllarni yuklab olish va baham ko‘rish
|
Comment[uz@Latn]=BitTorrent orqali fayllarni yuklab olish va baham ko‘rish
|
||||||
GenericName[uz@Latn]=BitTorrent mijozi
|
GenericName[uz@Latn]=BitTorrent mijozi
|
||||||
Name[uz@Latn]=qBittorrent
|
Name[uz@Latn]=qBittorrent
|
||||||
Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి
|
Comment[ltg]=Atsasyuteit i daleit failus ar BitTorrent
|
||||||
GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్
|
GenericName[ltg]=BitTorrent klients
|
||||||
Name[te]=క్యు బిట్ టొరెంట్
|
Name[ltg]=qBittorrent
|
||||||
Comment[hi_IN]= अपनी फाइलें BitTorrent के माध्यम से डाउनलोड आैर साॅझा करें
|
Comment[hi_IN]=BitTorrent द्वारा फाइल डाउनलोड व सहभाजन
|
||||||
GenericName[hi_IN]=BitTorrent उपभोक्ता
|
GenericName[hi_IN]=BitTorrent साधन
|
||||||
Name[hi_IN]=qBittorrent
|
Name[hi_IN]=qBittorrent
|
||||||
Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın
|
Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın
|
||||||
GenericName[tr]=BitTorrent istemcisi
|
GenericName[tr]=BitTorrent istemcisi
|
||||||
Name[tr]=qBittorrent
|
Name[tr]=qBittorrent
|
||||||
Comment[uk]=Завантажувати і обмінюватися файлами через BitTorrent
|
Comment[ur]=BitTorrent پر فائلوں کو ڈاؤن لوڈ کریں اور اشتراک کریں
|
||||||
|
GenericName[ur]=قیو بٹ ٹورنٹ کلائنٹ
|
||||||
|
Name[ur]=قیو بٹ ٹورنٹ
|
||||||
|
Comment[uk]=Завантажуйте та поширюйте файли через BitTorrent
|
||||||
GenericName[uk]=BitTorrent-клієнт
|
GenericName[uk]=BitTorrent-клієнт
|
||||||
Name[uk]=qBittorrent
|
Name[uk]=qBittorrent
|
||||||
Comment[vi]=Tải về và chia sẻ các tập tin thông qua BitTorrent
|
Comment[vi]=Tải về và chia sẻ các tập tin thông qua BitTorrent
|
||||||
GenericName[vi]=Máy trạm dạng BitTorrent
|
GenericName[vi]=Máy trạm dạng BitTorrent
|
||||||
Name[vi]=qBittorrent
|
Name[vi]=qBittorrent
|
||||||
|
Comment[az@latin]=Faylları BitTorrent vasitəsilə göndərin və paylaşın
|
||||||
|
GenericName[az@latin]=BitTorrent client
|
||||||
|
Name[az@latin]=qBittorrent
|
||||||
Comment[zh_HK]=經由BitTorrent下載並分享檔案
|
Comment[zh_HK]=經由BitTorrent下載並分享檔案
|
||||||
GenericName[zh_HK]=BitTorrent用戶端
|
GenericName[zh_HK]=BitTorrent用戶端
|
||||||
Name[zh_HK]=qBittorrent
|
Name[zh_HK]=qBittorrent
|
||||||
@@ -176,15 +195,21 @@ Name[ms_MY]=qBittorrent
|
|||||||
Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent
|
Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent
|
||||||
GenericName[eo]=BitTorrent-kliento
|
GenericName[eo]=BitTorrent-kliento
|
||||||
Name[eo]=qBittorrent
|
Name[eo]=qBittorrent
|
||||||
Comment[mn_MN]=BitTorrent ашиглан файлуудыг татаж түгээх
|
Comment[mn_MN]=BitTorrent-оор файлуудаа тат, түгээ
|
||||||
GenericName[mn_MN]=BitTorrent үйлчлүүлэгч
|
GenericName[mn_MN]=BitTorrent татагч
|
||||||
Name[mn_MN]=qBittorrent
|
Name[mn_MN]=qBittorrent
|
||||||
|
Comment[ta]=BitTorrent வழியாக கோப்புகளை பதிவிறக்க மற்றும் பகிர
|
||||||
|
GenericName[ta]=BitTorrent வாடிக்கையாளர்
|
||||||
|
Name[ta]=qBittorrent
|
||||||
Comment[ne_NP]=फाइलहरू डाउनलोड गर्नुहोस् र BitTorrent मा साझा गर्नुहोस्
|
Comment[ne_NP]=फाइलहरू डाउनलोड गर्नुहोस् र BitTorrent मा साझा गर्नुहोस्
|
||||||
GenericName[ne_NP]=BitTorrent क्लाइन्ट
|
GenericName[ne_NP]=BitTorrent क्लाइन्ट
|
||||||
Name[ne_NP]=qBittorrent
|
Name[ne_NP]=qBittorrent
|
||||||
|
Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి
|
||||||
|
GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్
|
||||||
|
Name[te]=క్యు బిట్ టొరెంట్
|
||||||
Comment[en_AU]=Download and share files over BitTorrent
|
Comment[en_AU]=Download and share files over BitTorrent
|
||||||
GenericName[en_AU]=BitTorrent client
|
GenericName[en_AU]=BitTorrent client
|
||||||
Name[en_AU]=qBittorrent
|
Name[en_AU]=qBittorrent
|
||||||
Comment[th]=ดาว์นโหลดและแชร์ไฟล์ด้วยบิททอเร้น
|
Comment[th]=ดาวน์โหลดและแชร์ไฟล์ด้วยบิททอเร้น
|
||||||
GenericName[th]=โปรแกรมบิททอเร้น
|
GenericName[th]=โปรแกรมบิททอเร้น
|
||||||
Name[th]=qBittorrent
|
Name[th]=qBittorrent
|
||||||
|
|||||||
3
dist/windows/README.txt
vendored
3
dist/windows/README.txt
vendored
@@ -8,7 +8,8 @@ TRANSLATORS:
|
|||||||
english message to help you with the translation.
|
english message to help you with the translation.
|
||||||
4. Edit only the part inside the quotation marks(""). Unless you know
|
4. Edit only the part inside the quotation marks(""). Unless you know
|
||||||
what you are doing.
|
what you are doing.
|
||||||
5. Save the files with utf8 encoding and BOM.
|
5. Save the files with UTF-8 encoding, without BOM
|
||||||
|
(this should be the default in any modern text editor).
|
||||||
6. Submit your changes: 1) as a pull request to the official git repo or
|
6. Submit your changes: 1) as a pull request to the official git repo or
|
||||||
2) open an issue to the bugtracker and attach them or 3) via email or
|
2) open an issue to the bugtracker and attach them or 3) via email or
|
||||||
4)the same way you provide the translations for qbt itself
|
4)the same way you provide the translations for qbt itself
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_AFRIKAANS} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_AFRIKAANS} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ALBANIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ALBANIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ARABIC} "qBittorrent (مطلوب)"
|
LangString inst_qbt_req ${LANG_ARABIC} "qBittorrent (مطلوب)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_BASQUE} "qBittorrent (beharrezkoa)"
|
LangString inst_qbt_req ${LANG_BASQUE} "qBittorrent (beharrezkoa)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_BELARUSIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_BELARUSIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_BOSNIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_BOSNIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_BRETON} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_BRETON} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_BULGARIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_BULGARIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_CATALAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_CATALAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_CROATIAN} "qBittorrent (neophodno)"
|
LangString inst_qbt_req ${LANG_CROATIAN} "qBittorrent (neophodno)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_CZECH} "qBittorrent (vyžadováno)"
|
LangString inst_qbt_req ${LANG_CZECH} "qBittorrent (vyžadováno)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_DANISH} "qBittorrent (påkrævet)"
|
LangString inst_qbt_req ${LANG_DANISH} "qBittorrent (påkrævet)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_DUTCH} "qBittorrent (vereist)"
|
LangString inst_qbt_req ${LANG_DUTCH} "qBittorrent (vereist)"
|
||||||
@@ -19,9 +19,9 @@ LangString inst_pathlimit ${LANG_DUTCH} "De Windows-begrenzing voor padlengte ui
|
|||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_DUTCH} "Uitzondering aan Windows Firewall toevoegen"
|
LangString inst_firewallinfo ${LANG_DUTCH} "Uitzondering aan Windows Firewall toevoegen"
|
||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_DUTCH} "qBittorrent is actief. Sluit de toepassing voordat u deze update installeert."
|
LangString inst_warning ${LANG_DUTCH} "qBittorrent is actief. Sluit het af voordat u deze update installeert."
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
LangString inst_uninstall_question ${LANG_DUTCH} "Er werd een eerdere installatie gedetecteerd. Deze wordt verwijderd zonder de gebruikersinstellingen te verwijderen."
|
LangString inst_uninstall_question ${LANG_DUTCH} "De huidige versie zal verwijderd worden. Gebruikersinstellingen en torrents blijven intact."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_DUTCH} "Vorige versie verwijderen."
|
LangString inst_unist ${LANG_DUTCH} "Vorige versie verwijderen."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
@@ -52,7 +52,7 @@ LangString remove_firewallinfo ${LANG_DUTCH} "Uitzondering uit Windows Firewall
|
|||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_DUTCH} "Torrents en cachegegevens verwijderen"
|
LangString remove_cache ${LANG_DUTCH} "Torrents en cachegegevens verwijderen"
|
||||||
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
LangString uninst_warning ${LANG_DUTCH} "qBittorrent is actief. Sluit de toepassing voordat u ze verwijdert."
|
LangString uninst_warning ${LANG_DUTCH} "qBittorrent is actief. Sluit het af voordat u het verwijdert."
|
||||||
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
||||||
LangString uninst_tor_warn ${LANG_DUTCH} ".torrent-associatie wordt niet verwijderd. Ze is gekoppeld met:"
|
LangString uninst_tor_warn ${LANG_DUTCH} ".torrent-associatie wordt niet verwijderd. Ze is gekoppeld met:"
|
||||||
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ESPERANTO} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ESPERANTO} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ESTONIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ESTONIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_FARSI} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_FARSI} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_FINNISH} "qBittorrent (pakollinen)"
|
LangString inst_qbt_req ${LANG_FINNISH} "qBittorrent (pakollinen)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_FRENCH} "qBittorrent (requis)"
|
LangString inst_qbt_req ${LANG_FRENCH} "qBittorrent (requis)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_GALICIAN} "qBittorrent (necesario)"
|
LangString inst_qbt_req ${LANG_GALICIAN} "qBittorrent (necesario)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_GERMAN} "qBittorrent (erforderlich)"
|
LangString inst_qbt_req ${LANG_GERMAN} "qBittorrent (erforderlich)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_GREEK} "qBittorrent (απαιτείται)"
|
LangString inst_qbt_req ${LANG_GREEK} "qBittorrent (απαιτείται)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_HEBREW} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_HEBREW} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_HUNGARIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_HUNGARIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ICELANDIC} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ICELANDIC} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_INDONESIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_INDONESIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_IRISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_IRISH} "qBittorrent (required)"
|
||||||
|
|||||||
22
dist/windows/installer-translations/italian.nsi
vendored
22
dist/windows/installer-translations/italian.nsi
vendored
@@ -1,13 +1,13 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ITALIAN} "qBittorrent (necessario)"
|
LangString inst_qbt_req ${LANG_ITALIAN} "qBittorrent (necessario)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_ITALIAN} "Crea icone sul desktop"
|
LangString inst_dekstop ${LANG_ITALIAN} "Crea collegamento sul Desktop"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_ITALIAN} "Crea gruppo programmi"
|
LangString inst_startmenu ${LANG_ITALIAN} "Aggiungi al menu Start"
|
||||||
;LangString inst_startup ${LANG_ENGLISH} "Start qBittorrent on Windows start up"
|
;LangString inst_startup ${LANG_ENGLISH} "Start qBittorrent on Windows start up"
|
||||||
LangString inst_startup ${LANG_ITALIAN} "Avvia qBittorrent all'avvio di Windows"
|
LangString inst_startup ${LANG_ITALIAN} "Esegui qBittorrent all'avvio di Windows"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_ITALIAN} "Apri file .torrent con qBittorrent"
|
LangString inst_torrent ${LANG_ITALIAN} "Apri file .torrent con qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
@@ -15,21 +15,21 @@ LangString inst_magnet ${LANG_ITALIAN} "Apri collegamenti magnet con qBittorrent
|
|||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_ITALIAN} "Aggiungi regola al firewall di Windows"
|
LangString inst_firewall ${LANG_ITALIAN} "Aggiungi regola al firewall di Windows"
|
||||||
;LangString inst_pathlimit ${LANG_ENGLISH} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
;LangString inst_pathlimit ${LANG_ENGLISH} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
LangString inst_pathlimit ${LANG_ITALIAN} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
LangString inst_pathlimit ${LANG_ITALIAN} "Disabilita limite lunghezza percorsi Windows (limite MAX_PATH di 260 caratteri, richiede Windows 10 versione 1607 o successive)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_ITALIAN} "Aggiunta regola al firewall di Windows"
|
LangString inst_firewallinfo ${LANG_ITALIAN} "Aggiunta regola al firewall di Windows"
|
||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_ITALIAN} "qBittorrent è in esecuzione. Chiudi l'applicazione prima dell'installazione."
|
LangString inst_warning ${LANG_ITALIAN} "qBittorrent è in esecuzione. Chiudilo prima di procedere con l'installazione."
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
LangString inst_uninstall_question ${LANG_ITALIAN} "Current version will be uninstalled. User settings and torrents will remain intact."
|
LangString inst_uninstall_question ${LANG_ITALIAN} "La versione attuale verrà disinstallata. Le impostazioni utente e i torrent rimarranno invariati."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_ITALIAN} "Disinstallazione versione precedente."
|
LangString inst_unist ${LANG_ITALIAN} "Disinstallazione versione precedente."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_ITALIAN} "Esegui qBittorrent."
|
LangString launch_qbt ${LANG_ITALIAN} "Esegui qBittorrent."
|
||||||
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
;LangString inst_requires_64bit ${LANG_ENGLISH} "This installer works only in 64-bit Windows versions."
|
||||||
LangString inst_requires_64bit ${LANG_ITALIAN} "This installer works only in 64-bit Windows versions."
|
LangString inst_requires_64bit ${LANG_ITALIAN} "Questo installer funziona solo con versioni di Windows a 64bit."
|
||||||
;LangString inst_requires_win7 ${LANG_ENGLISH} "This qBittorrent version requires at least Windows 7."
|
;LangString inst_requires_win7 ${LANG_ENGLISH} "This qBittorrent version requires at least Windows 7."
|
||||||
LangString inst_requires_win7 ${LANG_ITALIAN} "This qBittorrent version requires at least Windows 7."
|
LangString inst_requires_win7 ${LANG_ITALIAN} "Questa versione di qBittorrent richiede Windows 7 o versioni successive."
|
||||||
|
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
@@ -42,7 +42,7 @@ LangString remove_shortcuts ${LANG_ITALIAN} "Rimuovi collegamenti"
|
|||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_ITALIAN} "Rimuovi associazione file"
|
LangString remove_associations ${LANG_ITALIAN} "Rimuovi associazione file"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_ITALIAN} "Rimuovi chiavi registro"
|
LangString remove_registry ${LANG_ITALIAN} "Rimuovi chiavi di registro"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_ITALIAN} "Rimuovi file di configurazione"
|
LangString remove_conf ${LANG_ITALIAN} "Rimuovi file di configurazione"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
@@ -52,7 +52,7 @@ LangString remove_firewallinfo ${LANG_ITALIAN} "Rimozione regola dal firewall di
|
|||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_ITALIAN} "Rimuovi torrent e dati nella cache"
|
LangString remove_cache ${LANG_ITALIAN} "Rimuovi torrent e dati nella cache"
|
||||||
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
LangString uninst_warning ${LANG_ITALIAN} "qBittorrent è in esecuzione. Chiudi l'applicazione prima della disinstallazione."
|
LangString uninst_warning ${LANG_ITALIAN} "qBittorrent è in esecuzione. Chiudilo prima di procedere con la disinstallazione."
|
||||||
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
;LangString uninst_tor_warn ${LANG_ENGLISH} "Not removing .torrent association. It is associated with:"
|
||||||
LangString uninst_tor_warn ${LANG_ITALIAN} "Associazione file .torrent non rimossa. File associati con:"
|
LangString uninst_tor_warn ${LANG_ITALIAN} "Associazione file .torrent non rimossa. File associati con:"
|
||||||
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
;LangString uninst_mag_warn ${LANG_ENGLISH} "Not removing magnet association. It is associated with:"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_KOREAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_KOREAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_KURDISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_KURDISH} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_LATVIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_LATVIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_LITHUANIAN} "qBittorrent (reikalingas)"
|
LangString inst_qbt_req ${LANG_LITHUANIAN} "qBittorrent (reikalingas)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_LUXEMBOURGISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_LUXEMBOURGISH} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_MACEDONIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_MACEDONIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_MALAY} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_MALAY} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_MONGOLIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_MONGOLIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_NORWEGIAN} "qBittorrent (kreves)"
|
LangString inst_qbt_req ${LANG_NORWEGIAN} "qBittorrent (kreves)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_NORWEGIANNYNORSK} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_NORWEGIANNYNORSK} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_POLISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_POLISH} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_PORTUGUESE} "qBittorrent (obrigatório)"
|
LangString inst_qbt_req ${LANG_PORTUGUESE} "qBittorrent (obrigatório)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_PORTUGUESEBR} "qBittorrent (requerido)"
|
LangString inst_qbt_req ${LANG_PORTUGUESEBR} "qBittorrent (requerido)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_ROMANIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_ROMANIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_RUSSIAN} "qBittorrent (обязательно)"
|
LangString inst_qbt_req ${LANG_RUSSIAN} "qBittorrent (обязательно)"
|
||||||
@@ -21,7 +21,7 @@ LangString inst_firewallinfo ${LANG_RUSSIAN} "Добавление в списо
|
|||||||
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
;LangString inst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
LangString inst_warning ${LANG_RUSSIAN} "qBittorrent запущен. Пожалуйста, закройте qBittorrent и перезапустите программу установки."
|
LangString inst_warning ${LANG_RUSSIAN} "qBittorrent запущен. Пожалуйста, закройте qBittorrent и перезапустите программу установки."
|
||||||
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
;LangString inst_uninstall_question ${LANG_ENGLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
LangString inst_uninstall_question ${LANG_RUSSIAN} "Обнаружена предыдущая установка. Она будет деинсталлирована без удаления пользовательских настроек."
|
LangString inst_uninstall_question ${LANG_RUSSIAN} "Текущая версия будет деинсталлирована. Пользовательские настройки и торренты останутся нетронутыми."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_RUSSIAN} "Деинсталлируется старая версия."
|
LangString inst_unist ${LANG_RUSSIAN} "Деинсталлируется старая версия."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SERBIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_SERBIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SERBIANLATIN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_SERBIANLATIN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SIMPCHINESE} "qBittorrent (必要)"
|
LangString inst_qbt_req ${LANG_SIMPCHINESE} "qBittorrent (必要)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SLOVAK} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_SLOVAK} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SLOVENIAN} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_SLOVENIAN} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SPANISH} "qBittorrent (necesario)"
|
LangString inst_qbt_req ${LANG_SPANISH} "qBittorrent (necesario)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SPANISHINTERNATIONAL} "qBittorrent (necesario)"
|
LangString inst_qbt_req ${LANG_SPANISHINTERNATIONAL} "qBittorrent (necesario)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_SWEDISH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_SWEDISH} "qBittorrent (required)"
|
||||||
|
|||||||
2
dist/windows/installer-translations/thai.nsi
vendored
2
dist/windows/installer-translations/thai.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_THAI} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_THAI} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_TRADCHINESE} "qBittorrent (必要)"
|
LangString inst_qbt_req ${LANG_TRADCHINESE} "qBittorrent (必要)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_TURKISH} "qBittorrent (zorunlu)"
|
LangString inst_qbt_req ${LANG_TURKISH} "qBittorrent (zorunlu)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_UKRAINIAN} "qBittorrent (необхідний)"
|
LangString inst_qbt_req ${LANG_UKRAINIAN} "qBittorrent (необхідний)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_UZBEK} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_UZBEK} "qBittorrent (required)"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
;Installer strings
|
;Installer strings
|
||||||
|
|
||||||
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)"
|
||||||
LangString inst_qbt_req ${LANG_WELSH} "qBittorrent (required)"
|
LangString inst_qbt_req ${LANG_WELSH} "qBittorrent (required)"
|
||||||
|
|||||||
2
dist/windows/installer.nsi
vendored
2
dist/windows/installer.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
Var uninstallerPath
|
Var uninstallerPath
|
||||||
|
|
||||||
Section "-hidden"
|
Section "-hidden"
|
||||||
|
|
||||||
|
|||||||
6
dist/windows/options.nsi
vendored
6
dist/windows/options.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
Unicode true
|
Unicode true
|
||||||
ManifestDPIAware true
|
ManifestDPIAware true
|
||||||
;Compress the header too
|
;Compress the header too
|
||||||
!packhdr "$%TEMP%\exehead.tmp" 'upx.exe -9 --best --ultra-brute "$%TEMP%\exehead.tmp"'
|
!packhdr "$%TEMP%\exehead.tmp" 'upx.exe -9 --best --ultra-brute "$%TEMP%\exehead.tmp"'
|
||||||
@@ -28,7 +28,7 @@ XPStyle on
|
|||||||
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
||||||
|
|
||||||
; Program specific
|
; Program specific
|
||||||
!define PROG_VERSION "4.3.0"
|
!define PROG_VERSION "4.3.3"
|
||||||
|
|
||||||
!define MUI_FINISHPAGE_RUN
|
!define MUI_FINISHPAGE_RUN
|
||||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||||
@@ -51,7 +51,7 @@ XPStyle on
|
|||||||
;Installer Version Information
|
;Installer Version Information
|
||||||
VIAddVersionKey "ProductName" "qBittorrent"
|
VIAddVersionKey "ProductName" "qBittorrent"
|
||||||
VIAddVersionKey "CompanyName" "The qBittorrent project"
|
VIAddVersionKey "CompanyName" "The qBittorrent project"
|
||||||
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2020 The qBittorrent project"
|
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2021 The qBittorrent project"
|
||||||
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
|
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
|
||||||
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
|
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
|
||||||
|
|
||||||
|
|||||||
2
dist/windows/qbittorrent.nsi
vendored
2
dist/windows/qbittorrent.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
!include options.nsi
|
!include options.nsi
|
||||||
!include translations.nsi
|
!include translations.nsi
|
||||||
!include installer.nsi
|
!include installer.nsi
|
||||||
!include uninstaller.nsi
|
!include uninstaller.nsi
|
||||||
|
|||||||
2
dist/windows/translations.nsi
vendored
2
dist/windows/translations.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
;Nsis translations
|
;Nsis translations
|
||||||
|
|
||||||
!insertmacro MUI_LANGUAGE "English"
|
!insertmacro MUI_LANGUAGE "English"
|
||||||
!insertmacro MUI_LANGUAGE "Afrikaans"
|
!insertmacro MUI_LANGUAGE "Afrikaans"
|
||||||
|
|||||||
2
dist/windows/uninstaller.nsi
vendored
2
dist/windows/uninstaller.nsi
vendored
@@ -1,4 +1,4 @@
|
|||||||
Section "un.$(remove_files)" ;"un.Remove files"
|
Section "un.$(remove_files)" ;"un.Remove files"
|
||||||
SectionIn RO
|
SectionIn RO
|
||||||
|
|
||||||
; Remove files and uninstaller
|
; Remove files and uninstaller
|
||||||
|
|||||||
@@ -5,9 +5,9 @@
|
|||||||
# Sets the QT_QMAKE variable to the path of Qt5 qmake if found.
|
# Sets the QT_QMAKE variable to the path of Qt5 qmake if found.
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
AC_DEFUN([FIND_QT5],
|
AC_DEFUN([FIND_QT5],
|
||||||
[PKG_CHECK_EXISTS([Qt5Core >= 5.9.0],
|
[PKG_CHECK_EXISTS([Qt5Core >= 5.9.5],
|
||||||
[PKG_CHECK_VAR(QT_QMAKE,
|
[PKG_CHECK_VAR(QT_QMAKE,
|
||||||
[Qt5Core >= 5.9.0],
|
[Qt5Core >= 5.9.5],
|
||||||
[host_bins])
|
[host_bins])
|
||||||
])
|
])
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ AS_IF([test -f "$QT_QMAKE/qmake"],
|
|||||||
[QT_QMAKE=""])
|
[QT_QMAKE=""])
|
||||||
])
|
])
|
||||||
|
|
||||||
AC_MSG_CHECKING([for Qt5 qmake >= 5.9.0])
|
AC_MSG_CHECKING([for Qt5 qmake >= 5.9.5])
|
||||||
AS_IF([test "x$QT_QMAKE" != "x"],
|
AS_IF([test "x$QT_QMAKE" != "x"],
|
||||||
[AC_MSG_RESULT([$QT_QMAKE])],
|
[AC_MSG_RESULT([$QT_QMAKE])],
|
||||||
[AC_MSG_RESULT([not found])]
|
[AC_MSG_RESULT([not found])]
|
||||||
@@ -29,23 +29,23 @@ AS_IF([test "x$QT_QMAKE" != "x"],
|
|||||||
# Sets the HAVE_QTDBUS variable to true or false.
|
# Sets the HAVE_QTDBUS variable to true or false.
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
AC_DEFUN([FIND_QTDBUS],
|
AC_DEFUN([FIND_QTDBUS],
|
||||||
[AC_MSG_CHECKING([for Qt5DBus >= 5.9.0])
|
[AC_MSG_CHECKING([for Qt5DBus >= 5.9.5])
|
||||||
PKG_CHECK_EXISTS([Qt5DBus >= 5.9.0],
|
PKG_CHECK_EXISTS([Qt5DBus >= 5.9.5],
|
||||||
[AC_MSG_RESULT([found])
|
[AC_MSG_RESULT([found])
|
||||||
HAVE_QTDBUS=[true]],
|
HAVE_QTDBUS=[true]],
|
||||||
[AC_MSG_RESULT([not found])
|
[AC_MSG_RESULT([not found])
|
||||||
HAVE_QTDBUS=[false]])
|
HAVE_QTDBUS=[false]])
|
||||||
])
|
])
|
||||||
|
|
||||||
# DETECT_CPP14_PROGRAM()
|
# DETECT_CPP17_PROGRAM()
|
||||||
# Detects if at least C++14 mode is enabled.
|
# Detects if at least C++17 mode is enabled.
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
AC_DEFUN([DETECT_CPP14_PROGRAM],
|
AC_DEFUN([DETECT_CPP17_PROGRAM],
|
||||||
[AC_LANG_PROGRAM([[
|
[AC_LANG_PROGRAM([[
|
||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
#error "This is not a C++ compiler"
|
#error "This is not a C++ compiler"
|
||||||
#elif __cplusplus < 201402L
|
#elif __cplusplus < 201703L
|
||||||
#error "This is not a C++14 compiler"
|
#error "This is not a C++17 compiler"
|
||||||
#endif]],
|
#endif]],
|
||||||
[[]])
|
[[]])
|
||||||
])
|
])
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ else {
|
|||||||
include(conf.pri)
|
include(conf.pri)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.14
|
||||||
|
|
||||||
LIBS += -framework Carbon -framework IOKit -framework AppKit
|
LIBS += -framework Carbon -framework IOKit -framework AppKit
|
||||||
|
|
||||||
QT_LANG_PATH = ../dist/qt-translations
|
QT_LANG_PATH = ../dist/qt-translations
|
||||||
|
|||||||
@@ -4,19 +4,6 @@ SUBDIRS += src
|
|||||||
|
|
||||||
include(version.pri)
|
include(version.pri)
|
||||||
|
|
||||||
# Make target to create release tarball. Use 'make tarball'
|
|
||||||
tarball.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/ &&
|
|
||||||
tarball.commands += git clone . ../$${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
tarball.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.git &&
|
|
||||||
tarball.commands += rm -f ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.gitignore &&
|
|
||||||
tarball.commands += cd .. &&
|
|
||||||
tarball.commands += tar czf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar.gz $${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
tarball.commands += tar cf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar $${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
tarball.commands += xz -f $${PROJECT_NAME}-$${PROJECT_VERSION}.tar &&
|
|
||||||
tarball.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION}
|
|
||||||
|
|
||||||
QMAKE_EXTRA_TARGETS += tarball
|
|
||||||
|
|
||||||
# For Qt Creator beautifier
|
# For Qt Creator beautifier
|
||||||
DISTFILES += \
|
DISTFILES += \
|
||||||
uncrustify.cfg
|
uncrustify.cfg
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
||||||
find_package(LibtorrentRasterbar QUIET ${requiredLibtorrentVersion} COMPONENTS torrent-rasterbar)
|
find_package(LibtorrentRasterbar QUIET ${minLibtorrentVersion} COMPONENTS torrent-rasterbar)
|
||||||
if (NOT LibtorrentRasterbar_FOUND)
|
if (NOT LibtorrentRasterbar_FOUND)
|
||||||
include(FindPkgConfig)
|
include(FindPkgConfig)
|
||||||
pkg_check_modules(LIBTORRENT_RASTERBAR IMPORTED_TARGET GLOBAL "libtorrent-rasterbar>=${requiredLibtorrentVersion}")
|
pkg_check_modules(LIBTORRENT_RASTERBAR IMPORTED_TARGET GLOBAL "libtorrent-rasterbar>=${minLibtorrentVersion}")
|
||||||
if (NOT LIBTORRENT_RASTERBAR_FOUND)
|
if (NOT LIBTORRENT_RASTERBAR_FOUND)
|
||||||
message(
|
message(
|
||||||
FATAL_ERROR
|
FATAL_ERROR
|
||||||
"Package LibtorrentRasterbar >= ${requiredLibtorrentVersion} not found"
|
"Package LibtorrentRasterbar >= ${minLibtorrentVersion} not found"
|
||||||
" with CMake or pkg-config.\n- Set LibtorrentRasterbar_DIR to a directory containing"
|
" with CMake or pkg-config.\n- Set LibtorrentRasterbar_DIR to a directory containing"
|
||||||
" a LibtorrentRasterbarConfig.cmake file or add the installation prefix of LibtorrentRasterbar"
|
" a LibtorrentRasterbarConfig.cmake file or add the installation prefix of LibtorrentRasterbar"
|
||||||
" to CMAKE_PREFIX_PATH.\n- Alternatively, make sure there is a valid libtorrent-rasterbar.pc"
|
" to CMAKE_PREFIX_PATH.\n- Alternatively, make sure there is a valid libtorrent-rasterbar.pc"
|
||||||
@@ -18,9 +18,9 @@ if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
|||||||
# force a fake package to show up in the feature summary
|
# force a fake package to show up in the feature summary
|
||||||
set_property(GLOBAL APPEND PROPERTY
|
set_property(GLOBAL APPEND PROPERTY
|
||||||
PACKAGES_FOUND
|
PACKAGES_FOUND
|
||||||
"LibtorrentRasterbar via pkg-config (required version >= ${requiredLibtorrentVersion})"
|
"LibtorrentRasterbar via pkg-config (version >= ${minLibtorrentVersion})"
|
||||||
)
|
)
|
||||||
set_package_properties("LibtorrentRasterbar via pkg-config (required version >= ${requiredLibtorrentVersion})"
|
set_package_properties("LibtorrentRasterbar via pkg-config (version >= ${minLibtorrentVersion})"
|
||||||
PROPERTIES
|
PROPERTIES
|
||||||
TYPE REQUIRED
|
TYPE REQUIRED
|
||||||
)
|
)
|
||||||
@@ -28,16 +28,16 @@ if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
|||||||
set_package_properties(LibtorrentRasterbar PROPERTIES TYPE REQUIRED)
|
set_package_properties(LibtorrentRasterbar PROPERTIES TYPE REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
find_package(LibtorrentRasterbar ${requiredLibtorrentVersion} REQUIRED COMPONENTS torrent-rasterbar)
|
find_package(LibtorrentRasterbar ${minLibtorrentVersion} REQUIRED COMPONENTS torrent-rasterbar)
|
||||||
endif()
|
endif()
|
||||||
# force variable type so that it always shows up in ccmake/cmake-gui frontends
|
# force variable type so that it always shows up in ccmake/cmake-gui frontends
|
||||||
set_property(CACHE LibtorrentRasterbar_DIR PROPERTY TYPE PATH)
|
set_property(CACHE LibtorrentRasterbar_DIR PROPERTY TYPE PATH)
|
||||||
find_package(Boost ${requiredBoostVersion} REQUIRED)
|
find_package(Boost ${minBoostVersion} REQUIRED)
|
||||||
find_package(OpenSSL ${requiredOpenSSLVersion} REQUIRED)
|
find_package(OpenSSL ${minOpenSSLVersion} REQUIRED)
|
||||||
find_package(ZLIB ${requiredZlibVersion} REQUIRED)
|
find_package(ZLIB ${minZlibVersion} REQUIRED)
|
||||||
find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS Core Network Xml LinguistTools)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS Core Network Xml LinguistTools)
|
||||||
if (DBUS)
|
if (DBUS)
|
||||||
find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS DBus)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS DBus)
|
||||||
set_package_properties(Qt5DBus PROPERTIES
|
set_package_properties(Qt5DBus PROPERTIES
|
||||||
DESCRIPTION "Qt5 module for inter-process communication over the D-Bus protocol"
|
DESCRIPTION "Qt5 module for inter-process communication over the D-Bus protocol"
|
||||||
PURPOSE "Required by the DBUS feature"
|
PURPOSE "Required by the DBUS feature"
|
||||||
@@ -60,11 +60,11 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
add_subdirectory(base)
|
add_subdirectory(base)
|
||||||
|
|
||||||
if (GUI)
|
if (GUI)
|
||||||
find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS Widgets Svg)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS Widgets Svg)
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS MacExtras)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS MacExtras)
|
||||||
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
find_package(Qt5 ${requiredQtVersion} REQUIRED COMPONENTS WinExtras)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS WinExtras)
|
||||||
endif()
|
endif()
|
||||||
add_subdirectory(gui)
|
add_subdirectory(gui)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ target_sources(qbt_app PRIVATE
|
|||||||
|
|
||||||
target_link_libraries(qbt_app PRIVATE
|
target_link_libraries(qbt_app PRIVATE
|
||||||
qbt_base
|
qbt_base
|
||||||
qbt_version_definitions
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties(qbt_app PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
|
set_target_properties(qbt_app PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
|
|
||||||
#include "base/bittorrent/infohash.h"
|
#include "base/bittorrent/infohash.h"
|
||||||
#include "base/bittorrent/session.h"
|
#include "base/bittorrent/session.h"
|
||||||
#include "base/bittorrent/torrenthandle.h"
|
#include "base/bittorrent/torrent.h"
|
||||||
#include "base/exceptions.h"
|
#include "base/exceptions.h"
|
||||||
#include "base/iconprovider.h"
|
#include "base/iconprovider.h"
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
@@ -81,6 +81,7 @@
|
|||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/misc.h"
|
#include "base/utils/misc.h"
|
||||||
#include "base/utils/string.h"
|
#include "base/utils/string.h"
|
||||||
|
#include "base/version.h"
|
||||||
#include "applicationinstancemanager.h"
|
#include "applicationinstancemanager.h"
|
||||||
#include "filelogger.h"
|
#include "filelogger.h"
|
||||||
|
|
||||||
@@ -181,12 +182,14 @@ Application::Application(int &argc, char **argv)
|
|||||||
m_fileLogger = new FileLogger(fileLoggerPath(), isFileLoggerBackup(), fileLoggerMaxSize(), isFileLoggerDeleteOld(), fileLoggerAge(), static_cast<FileLogger::FileLogAgeType>(fileLoggerAgeType()));
|
m_fileLogger = new FileLogger(fileLoggerPath(), isFileLoggerBackup(), fileLoggerMaxSize(), isFileLoggerDeleteOld(), fileLoggerAge(), static_cast<FileLogger::FileLogAgeType>(fileLoggerAgeType()));
|
||||||
|
|
||||||
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
|
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
|
||||||
if (portableModeEnabled) {
|
if (portableModeEnabled)
|
||||||
|
{
|
||||||
Logger::instance()->addMessage(tr("Running in portable mode. Auto detected profile folder at: %1").arg(profileDir));
|
Logger::instance()->addMessage(tr("Running in portable mode. Auto detected profile folder at: %1").arg(profileDir));
|
||||||
if (m_commandLineArgs.relativeFastresumePaths)
|
if (m_commandLineArgs.relativeFastresumePaths)
|
||||||
Logger::instance()->addMessage(tr("Redundant command line flag detected: \"%1\". Portable mode implies relative fastresume.").arg("--relative-fastresume"), Log::WARNING); // to avoid translating the `--relative-fastresume` string
|
Logger::instance()->addMessage(tr("Redundant command line flag detected: \"%1\". Portable mode implies relative fastresume.").arg("--relative-fastresume"), Log::WARNING); // to avoid translating the `--relative-fastresume` string
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
Logger::instance()->addMessage(tr("Using config directory: %1").arg(Profile::instance()->location(SpecialFolder::Config)));
|
Logger::instance()->addMessage(tr("Using config directory: %1").arg(Profile::instance()->location(SpecialFolder::Config)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -212,7 +215,7 @@ const QBtCommandLineParameters &Application::commandLineArgs() const
|
|||||||
|
|
||||||
bool Application::isFileLoggerEnabled() const
|
bool Application::isFileLoggerEnabled() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true).toBool();
|
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerEnabled(const bool value)
|
void Application::setFileLoggerEnabled(const bool value)
|
||||||
@@ -226,8 +229,8 @@ void Application::setFileLoggerEnabled(const bool value)
|
|||||||
|
|
||||||
QString Application::fileLoggerPath() const
|
QString Application::fileLoggerPath() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_PATH,
|
return settings()->loadValue(KEY_FILELOGGER_PATH
|
||||||
{specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER}).toString();
|
, QString {specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerPath(const QString &path)
|
void Application::setFileLoggerPath(const QString &path)
|
||||||
@@ -239,7 +242,7 @@ void Application::setFileLoggerPath(const QString &path)
|
|||||||
|
|
||||||
bool Application::isFileLoggerBackup() const
|
bool Application::isFileLoggerBackup() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_BACKUP, true).toBool();
|
return settings()->loadValue(KEY_FILELOGGER_BACKUP, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerBackup(const bool value)
|
void Application::setFileLoggerBackup(const bool value)
|
||||||
@@ -251,7 +254,7 @@ void Application::setFileLoggerBackup(const bool value)
|
|||||||
|
|
||||||
bool Application::isFileLoggerDeleteOld() const
|
bool Application::isFileLoggerDeleteOld() const
|
||||||
{
|
{
|
||||||
return settings()->loadValue(KEY_FILELOGGER_DELETEOLD, true).toBool();
|
return settings()->loadValue(KEY_FILELOGGER_DELETEOLD, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerDeleteOld(const bool value)
|
void Application::setFileLoggerDeleteOld(const bool value)
|
||||||
@@ -263,7 +266,7 @@ void Application::setFileLoggerDeleteOld(const bool value)
|
|||||||
|
|
||||||
int Application::fileLoggerMaxSize() const
|
int Application::fileLoggerMaxSize() const
|
||||||
{
|
{
|
||||||
const int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZEBYTES, DEFAULT_FILELOG_SIZE).toInt();
|
const int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZEBYTES, DEFAULT_FILELOG_SIZE);
|
||||||
return std::min(std::max(val, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
return std::min(std::max(val, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,7 +280,7 @@ void Application::setFileLoggerMaxSize(const int bytes)
|
|||||||
|
|
||||||
int Application::fileLoggerAge() const
|
int Application::fileLoggerAge() const
|
||||||
{
|
{
|
||||||
const int val = settings()->loadValue(KEY_FILELOGGER_AGE, 1).toInt();
|
const int val = settings()->loadValue(KEY_FILELOGGER_AGE, 1);
|
||||||
return std::min(std::max(val, 1), 365);
|
return std::min(std::max(val, 1), 365);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +291,7 @@ void Application::setFileLoggerAge(const int value)
|
|||||||
|
|
||||||
int Application::fileLoggerAgeType() const
|
int Application::fileLoggerAgeType() const
|
||||||
{
|
{
|
||||||
const int val = settings()->loadValue(KEY_FILELOGGER_AGETYPE, 1).toInt();
|
const int val = settings()->loadValue(KEY_FILELOGGER_AGETYPE, 1);
|
||||||
return ((val < 0) || (val > 2)) ? 1 : val;
|
return ((val < 0) || (val > 2)) ? 1 : val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -308,7 +311,7 @@ void Application::processMessage(const QString &message)
|
|||||||
m_paramsQueue.append(params);
|
m_paramsQueue.append(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) const
|
void Application::runExternalProgram(const BitTorrent::Torrent *torrent) const
|
||||||
{
|
{
|
||||||
QString program = Preferences::instance()->getAutoRunProgram().trimmed();
|
QString program = Preferences::instance()->getAutoRunProgram().trimmed();
|
||||||
program.replace("%N", torrent->name());
|
program.replace("%N", torrent->name());
|
||||||
@@ -361,11 +364,13 @@ void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) c
|
|||||||
proc.setArguments(argList);
|
proc.setArguments(argList);
|
||||||
proc.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args)
|
proc.setCreateProcessArgumentsModifier([](QProcess::CreateProcessArguments *args)
|
||||||
{
|
{
|
||||||
if (Preferences::instance()->isAutoRunConsoleEnabled()) {
|
if (Preferences::instance()->isAutoRunConsoleEnabled())
|
||||||
|
{
|
||||||
args->flags |= CREATE_NEW_CONSOLE;
|
args->flags |= CREATE_NEW_CONSOLE;
|
||||||
args->flags &= ~(CREATE_NO_WINDOW | DETACHED_PROCESS);
|
args->flags &= ~(CREATE_NO_WINDOW | DETACHED_PROCESS);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
args->flags |= CREATE_NO_WINDOW;
|
args->flags |= CREATE_NO_WINDOW;
|
||||||
args->flags &= ~(CREATE_NEW_CONSOLE | DETACHED_PROCESS);
|
args->flags &= ~(CREATE_NEW_CONSOLE | DETACHED_PROCESS);
|
||||||
}
|
}
|
||||||
@@ -400,7 +405,7 @@ void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) c
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::sendNotificationEmail(const BitTorrent::TorrentHandle *torrent)
|
void Application::sendNotificationEmail(const BitTorrent::Torrent *torrent)
|
||||||
{
|
{
|
||||||
// Prepare mail content
|
// Prepare mail content
|
||||||
const QString content = tr("Torrent name: %1").arg(torrent->name()) + '\n'
|
const QString content = tr("Torrent name: %1").arg(torrent->name()) + '\n'
|
||||||
@@ -419,7 +424,7 @@ void Application::sendNotificationEmail(const BitTorrent::TorrentHandle *torrent
|
|||||||
content);
|
content);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::torrentFinished(BitTorrent::TorrentHandle *const torrent)
|
void Application::torrentFinished(BitTorrent::Torrent *const torrent)
|
||||||
{
|
{
|
||||||
Preferences *const pref = Preferences::instance();
|
Preferences *const pref = Preferences::instance();
|
||||||
|
|
||||||
@@ -428,7 +433,8 @@ void Application::torrentFinished(BitTorrent::TorrentHandle *const torrent)
|
|||||||
runExternalProgram(torrent);
|
runExternalProgram(torrent);
|
||||||
|
|
||||||
// Mail notification
|
// Mail notification
|
||||||
if (pref->isMailNotificationEnabled()) {
|
if (pref->isMailNotificationEnabled())
|
||||||
|
{
|
||||||
Logger::instance()->addMessage(tr("Torrent: %1, sending mail notification").arg(torrent->name()));
|
Logger::instance()->addMessage(tr("Torrent: %1, sending mail notification").arg(torrent->name()));
|
||||||
sendNotificationEmail(torrent);
|
sendNotificationEmail(torrent);
|
||||||
}
|
}
|
||||||
@@ -455,16 +461,19 @@ void Application::allTorrentsFinished()
|
|||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
// ask confirm
|
// ask confirm
|
||||||
if ((action == ShutdownDialogAction::Exit) && (pref->dontConfirmAutoExit())) {
|
if ((action == ShutdownDialogAction::Exit) && (pref->dontConfirmAutoExit()))
|
||||||
|
{
|
||||||
// do nothing & skip confirm
|
// do nothing & skip confirm
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
if (!ShutdownConfirmDialog::askForConfirmation(m_window, action)) return;
|
if (!ShutdownConfirmDialog::askForConfirmation(m_window, action)) return;
|
||||||
}
|
}
|
||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
// Actually shut down
|
// Actually shut down
|
||||||
if (action != ShutdownDialogAction::Exit) {
|
if (action != ShutdownDialogAction::Exit)
|
||||||
|
{
|
||||||
qDebug("Preparing for auto-shutdown because all downloads are complete!");
|
qDebug("Preparing for auto-shutdown because all downloads are complete!");
|
||||||
// Disabling it for next time
|
// Disabling it for next time
|
||||||
pref->setShutdownWhenDownloadsComplete(false);
|
pref->setShutdownWhenDownloadsComplete(false);
|
||||||
@@ -490,51 +499,60 @@ bool Application::sendParams(const QStringList ¶ms)
|
|||||||
void Application::processParams(const QStringList ¶ms)
|
void Application::processParams(const QStringList ¶ms)
|
||||||
{
|
{
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (params.isEmpty()) {
|
if (params.isEmpty())
|
||||||
|
{
|
||||||
m_window->activate(); // show UI
|
m_window->activate(); // show UI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
BitTorrent::AddTorrentParams torrentParams;
|
BitTorrent::AddTorrentParams torrentParams;
|
||||||
TriStateBool skipTorrentDialog;
|
std::optional<bool> skipTorrentDialog;
|
||||||
|
|
||||||
for (QString param : params) {
|
for (QString param : params)
|
||||||
|
{
|
||||||
param = param.trimmed();
|
param = param.trimmed();
|
||||||
|
|
||||||
// Process strings indicating options specified by the user.
|
// Process strings indicating options specified by the user.
|
||||||
|
|
||||||
if (param.startsWith(QLatin1String("@savePath="))) {
|
if (param.startsWith(QLatin1String("@savePath=")))
|
||||||
|
{
|
||||||
torrentParams.savePath = param.mid(10);
|
torrentParams.savePath = param.mid(10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param.startsWith(QLatin1String("@addPaused="))) {
|
if (param.startsWith(QLatin1String("@addPaused=")))
|
||||||
torrentParams.addPaused = param.midRef(11).toInt() ? TriStateBool::True : TriStateBool::False;
|
{
|
||||||
|
torrentParams.addPaused = (param.midRef(11).toInt() != 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param == QLatin1String("@skipChecking")) {
|
if (param == QLatin1String("@skipChecking"))
|
||||||
|
{
|
||||||
torrentParams.skipChecking = true;
|
torrentParams.skipChecking = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param.startsWith(QLatin1String("@category="))) {
|
if (param.startsWith(QLatin1String("@category=")))
|
||||||
|
{
|
||||||
torrentParams.category = param.mid(10);
|
torrentParams.category = param.mid(10);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param == QLatin1String("@sequential")) {
|
if (param == QLatin1String("@sequential"))
|
||||||
|
{
|
||||||
torrentParams.sequential = true;
|
torrentParams.sequential = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param == QLatin1String("@firstLastPiecePriority")) {
|
if (param == QLatin1String("@firstLastPiecePriority"))
|
||||||
|
{
|
||||||
torrentParams.firstLastPiecePriority = true;
|
torrentParams.firstLastPiecePriority = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (param.startsWith(QLatin1String("@skipDialog="))) {
|
if (param.startsWith(QLatin1String("@skipDialog=")))
|
||||||
skipTorrentDialog = param.midRef(12).toInt() ? TriStateBool::True : TriStateBool::False;
|
{
|
||||||
|
skipTorrentDialog = (param.midRef(12).toInt() != 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -544,9 +562,7 @@ void Application::processParams(const QStringList ¶ms)
|
|||||||
// be shown and skipTorrentDialog is undefined. The other is when
|
// be shown and skipTorrentDialog is undefined. The other is when
|
||||||
// skipTorrentDialog is false, meaning that the application setting
|
// skipTorrentDialog is false, meaning that the application setting
|
||||||
// should be overridden.
|
// should be overridden.
|
||||||
const bool showDialogForThisTorrent =
|
const bool showDialogForThisTorrent = !skipTorrentDialog.value_or(!AddNewTorrentDialog::isEnabled());
|
||||||
((AddNewTorrentDialog::isEnabled() && skipTorrentDialog == TriStateBool::Undefined)
|
|
||||||
|| skipTorrentDialog == TriStateBool::False);
|
|
||||||
if (showDialogForThisTorrent)
|
if (showDialogForThisTorrent)
|
||||||
AddNewTorrentDialog::show(param, torrentParams, m_window);
|
AddNewTorrentDialog::show(param, torrentParams, m_window);
|
||||||
else
|
else
|
||||||
@@ -561,7 +577,8 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
Net::DownloadManager::initInstance();
|
Net::DownloadManager::initInstance();
|
||||||
IconProvider::initInstance();
|
IconProvider::initInstance();
|
||||||
|
|
||||||
try {
|
try
|
||||||
|
{
|
||||||
BitTorrent::Session::initInstance();
|
BitTorrent::Session::initInstance();
|
||||||
connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished);
|
connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished);
|
||||||
connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection);
|
connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection);
|
||||||
@@ -581,7 +598,8 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
new RSS::Session; // create RSS::Session singleton
|
new RSS::Session; // create RSS::Session singleton
|
||||||
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
|
new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
|
||||||
}
|
}
|
||||||
catch (const RuntimeError &err) {
|
catch (const RuntimeError &err)
|
||||||
|
{
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
fprintf(stderr, "%s", err.what());
|
fprintf(stderr, "%s", err.what());
|
||||||
#else
|
#else
|
||||||
@@ -605,7 +623,8 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
.arg(QString("http://localhost:") + QString::number(pref->getWebUiPort())) + '\n';
|
.arg(QString("http://localhost:") + QString::number(pref->getWebUiPort())) + '\n';
|
||||||
printf("%s", qUtf8Printable(mesg));
|
printf("%s", qUtf8Printable(mesg));
|
||||||
|
|
||||||
if (pref->getWebUIPassword() == "ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==") {
|
if (pref->getWebUIPassword() == "ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==")
|
||||||
|
{
|
||||||
const QString warning = tr("The Web UI administrator username is: %1").arg(pref->getWebUiUsername()) + '\n'
|
const QString warning = tr("The Web UI administrator username is: %1").arg(pref->getWebUiUsername()) + '\n'
|
||||||
+ tr("The Web UI administrator password is still the default one: %1").arg("adminadmin") + '\n'
|
+ tr("The Web UI administrator password is still the default one: %1").arg("adminadmin") + '\n'
|
||||||
+ tr("This is a security risk, please consider changing your password from program preferences.") + '\n';
|
+ tr("This is a security risk, please consider changing your password from program preferences.") + '\n';
|
||||||
@@ -623,7 +642,8 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
BitTorrent::Session::instance()->startUpTorrents();
|
BitTorrent::Session::instance()->startUpTorrents();
|
||||||
|
|
||||||
m_paramsQueue = params + m_paramsQueue;
|
m_paramsQueue = params + m_paramsQueue;
|
||||||
if (!m_paramsQueue.isEmpty()) {
|
if (!m_paramsQueue.isEmpty())
|
||||||
|
{
|
||||||
processParams(m_paramsQueue);
|
processParams(m_paramsQueue);
|
||||||
m_paramsQueue.clear();
|
m_paramsQueue.clear();
|
||||||
}
|
}
|
||||||
@@ -639,7 +659,8 @@ bool Application::isRunning()
|
|||||||
#ifdef Q_OS_MACOS
|
#ifdef Q_OS_MACOS
|
||||||
bool Application::event(QEvent *ev)
|
bool Application::event(QEvent *ev)
|
||||||
{
|
{
|
||||||
if (ev->type() == QEvent::FileOpen) {
|
if (ev->type() == QEvent::FileOpen)
|
||||||
|
{
|
||||||
QString path = static_cast<QFileOpenEvent *>(ev)->file();
|
QString path = static_cast<QFileOpenEvent *>(ev)->file();
|
||||||
if (path.isEmpty())
|
if (path.isEmpty())
|
||||||
// Get the url instead
|
// Get the url instead
|
||||||
@@ -651,7 +672,8 @@ bool Application::event(QEvent *ev)
|
|||||||
m_paramsQueue.append(path);
|
m_paramsQueue.append(path);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
return BaseApplication::event(ev);
|
return BaseApplication::event(ev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -679,11 +701,13 @@ void Application::initializeTranslation()
|
|||||||
installTranslator(&m_translator);
|
installTranslator(&m_translator);
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (localeStr.startsWith("ar") || localeStr.startsWith("he")) {
|
if (localeStr.startsWith("ar") || localeStr.startsWith("he"))
|
||||||
|
{
|
||||||
qDebug("Right to Left mode");
|
qDebug("Right to Left mode");
|
||||||
setLayoutDirection(Qt::RightToLeft);
|
setLayoutDirection(Qt::RightToLeft);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
setLayoutDirection(Qt::LeftToRight);
|
setLayoutDirection(Qt::LeftToRight);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -725,7 +749,8 @@ void Application::cleanup()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (m_window) {
|
if (m_window)
|
||||||
|
{
|
||||||
// Hide the window and don't leave it on screen as
|
// Hide the window and don't leave it on screen as
|
||||||
// unresponsive. Also for Windows take the WinId
|
// unresponsive. Also for Windows take the WinId
|
||||||
// after it's hidden, because hide() may cause a
|
// after it's hidden, because hide() may cause a
|
||||||
@@ -769,7 +794,8 @@ void Application::cleanup()
|
|||||||
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
|
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (m_window) {
|
if (m_window)
|
||||||
|
{
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
::ShutdownBlockReasonDestroy(reinterpret_cast<HWND>(m_window->effectiveWinId()));
|
::ShutdownBlockReasonDestroy(reinterpret_cast<HWND>(m_window->effectiveWinId()));
|
||||||
#endif // Q_OS_WIN
|
#endif // Q_OS_WIN
|
||||||
@@ -780,7 +806,8 @@ void Application::cleanup()
|
|||||||
|
|
||||||
Profile::freeInstance();
|
Profile::freeInstance();
|
||||||
|
|
||||||
if (m_shutdownAct != ShutdownDialogAction::Exit) {
|
if (m_shutdownAct != ShutdownDialogAction::Exit)
|
||||||
|
{
|
||||||
qDebug() << "Sending computer shutdown/suspend/hibernate signal...";
|
qDebug() << "Sending computer shutdown/suspend/hibernate signal...";
|
||||||
Utils::Misc::shutdownComputer(m_shutdownAct);
|
Utils::Misc::shutdownComputer(m_shutdownAct);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class FileLogger;
|
|||||||
|
|
||||||
namespace BitTorrent
|
namespace BitTorrent
|
||||||
{
|
{
|
||||||
class TorrentHandle;
|
class Torrent;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace RSS
|
namespace RSS
|
||||||
@@ -112,7 +112,7 @@ protected:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void processMessage(const QString &message);
|
void processMessage(const QString &message);
|
||||||
void torrentFinished(BitTorrent::TorrentHandle *const torrent);
|
void torrentFinished(BitTorrent::Torrent *const torrent);
|
||||||
void allTorrentsFinished();
|
void allTorrentsFinished();
|
||||||
void cleanup();
|
void cleanup();
|
||||||
#if (!defined(DISABLE_GUI) && defined(Q_OS_WIN))
|
#if (!defined(DISABLE_GUI) && defined(Q_OS_WIN))
|
||||||
@@ -142,6 +142,6 @@ private:
|
|||||||
|
|
||||||
void initializeTranslation();
|
void initializeTranslation();
|
||||||
void processParams(const QStringList ¶ms);
|
void processParams(const QStringList ¶ms);
|
||||||
void runExternalProgram(const BitTorrent::TorrentHandle *torrent) const;
|
void runExternalProgram(const BitTorrent::Torrent *torrent) const;
|
||||||
void sendNotificationEmail(const BitTorrent::TorrentHandle *torrent);
|
void sendNotificationEmail(const BitTorrent::Torrent *torrent);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -46,16 +46,20 @@ ApplicationInstanceManager::ApplicationInstanceManager(const QString &appId, QOb
|
|||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
auto sharedMem = new QSharedMemory {appId + QLatin1String {"-shared-memory-key"}, this};
|
auto sharedMem = new QSharedMemory {appId + QLatin1String {"-shared-memory-key"}, this};
|
||||||
if (m_isFirstInstance) {
|
if (m_isFirstInstance)
|
||||||
|
{
|
||||||
// First instance creates shared memory and store PID
|
// First instance creates shared memory and store PID
|
||||||
if (sharedMem->create(sizeof(DWORD)) && sharedMem->lock()) {
|
if (sharedMem->create(sizeof(DWORD)) && sharedMem->lock())
|
||||||
|
{
|
||||||
*(static_cast<DWORD *>(sharedMem->data())) = ::GetCurrentProcessId();
|
*(static_cast<DWORD *>(sharedMem->data())) = ::GetCurrentProcessId();
|
||||||
sharedMem->unlock();
|
sharedMem->unlock();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// Later instances attach to shared memory and retrieve PID
|
// Later instances attach to shared memory and retrieve PID
|
||||||
if (sharedMem->attach() && sharedMem->lock()) {
|
if (sharedMem->attach() && sharedMem->lock())
|
||||||
|
{
|
||||||
::AllowSetForegroundWindow(*(static_cast<DWORD *>(sharedMem->data())));
|
::AllowSetForegroundWindow(*(static_cast<DWORD *>(sharedMem->data())));
|
||||||
sharedMem->unlock();
|
sharedMem->unlock();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -217,7 +217,8 @@ namespace
|
|||||||
|
|
||||||
bool ok;
|
bool ok;
|
||||||
int res = val.toInt(&ok);
|
int res = val.toInt(&ok);
|
||||||
if (!ok) {
|
if (!ok)
|
||||||
|
{
|
||||||
qDebug() << QObject::tr("Expected integer number in environment variable '%1', but got '%2'")
|
qDebug() << QObject::tr("Expected integer number in environment variable '%1', but got '%2'")
|
||||||
.arg(envVarName(), val);
|
.arg(envVarName(), val);
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@@ -253,21 +254,25 @@ namespace
|
|||||||
return padUsageText(fullParameter() + QLatin1String("=<true|false>"));
|
return padUsageText(fullParameter() + QLatin1String("=<true|false>"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TriStateBool value(const QString &arg) const
|
std::optional<bool> value(const QString &arg) const
|
||||||
{
|
{
|
||||||
QStringList parts = arg.split(QLatin1Char('='));
|
QStringList parts = arg.split(QLatin1Char('='));
|
||||||
|
|
||||||
if (parts.size() == 1) {
|
if (parts.size() == 1)
|
||||||
return TriStateBool(m_defaultValue);
|
{
|
||||||
|
return m_defaultValue;
|
||||||
}
|
}
|
||||||
if (parts.size() == 2) {
|
if (parts.size() == 2)
|
||||||
|
{
|
||||||
QString val = parts[1];
|
QString val = parts[1];
|
||||||
|
|
||||||
if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) {
|
if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1")))
|
||||||
return TriStateBool::True;
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) {
|
if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0")))
|
||||||
return TriStateBool::False;
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,26 +282,30 @@ namespace
|
|||||||
.arg(fullParameter(), QLatin1String("<true|false>")));
|
.arg(fullParameter(), QLatin1String("<true|false>")));
|
||||||
}
|
}
|
||||||
|
|
||||||
TriStateBool value(const QProcessEnvironment &env) const
|
std::optional<bool> value(const QProcessEnvironment &env) const
|
||||||
{
|
{
|
||||||
const QString val = env.value(envVarName(), "-1");
|
const QString val = env.value(envVarName(), "-1");
|
||||||
|
|
||||||
if (val.isEmpty()) {
|
if (val.isEmpty())
|
||||||
return TriStateBool(m_defaultValue);
|
{
|
||||||
|
return m_defaultValue;
|
||||||
}
|
}
|
||||||
if (val == QLatin1String("-1")) {
|
if (val == QLatin1String("-1"))
|
||||||
return TriStateBool::Undefined;
|
{
|
||||||
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) {
|
if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1")))
|
||||||
return TriStateBool::True;
|
{
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) {
|
if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0")))
|
||||||
return TriStateBool::False;
|
{
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << QObject::tr("Expected %1 in environment variable '%2', but got '%3'")
|
qDebug() << QObject::tr("Expected %1 in environment variable '%2', but got '%3'")
|
||||||
.arg(QLatin1String("true|false"), envVarName(), val);
|
.arg(QLatin1String("true|false"), envVarName(), val);
|
||||||
return TriStateBool::Undefined;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool m_defaultValue;
|
bool m_defaultValue;
|
||||||
@@ -365,12 +374,8 @@ QStringList QBtCommandLineParameters::paramList() const
|
|||||||
if (!savePath.isEmpty())
|
if (!savePath.isEmpty())
|
||||||
result.append(QLatin1String("@savePath=") + savePath);
|
result.append(QLatin1String("@savePath=") + savePath);
|
||||||
|
|
||||||
if (addPaused == TriStateBool::True) {
|
if (addPaused.has_value())
|
||||||
result.append(QLatin1String("@addPaused=1"));
|
result.append(*addPaused ? QLatin1String {"@addPaused=1"} : QLatin1String {"@addPaused=0"});
|
||||||
}
|
|
||||||
else if (addPaused == TriStateBool::False) {
|
|
||||||
result.append(QLatin1String("@addPaused=0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skipChecking)
|
if (skipChecking)
|
||||||
result.append(QLatin1String("@skipChecking"));
|
result.append(QLatin1String("@skipChecking"));
|
||||||
@@ -384,12 +389,8 @@ QStringList QBtCommandLineParameters::paramList() const
|
|||||||
if (firstLastPiecePriority)
|
if (firstLastPiecePriority)
|
||||||
result.append(QLatin1String("@firstLastPiecePriority"));
|
result.append(QLatin1String("@firstLastPiecePriority"));
|
||||||
|
|
||||||
if (skipDialog == TriStateBool::True) {
|
if (skipDialog.has_value())
|
||||||
result.append(QLatin1String("@skipDialog=1"));
|
result.append(*skipDialog ? QLatin1String {"@skipDialog=1"} : QLatin1String {"@skipDialog=0"});
|
||||||
}
|
|
||||||
else if (skipDialog == TriStateBool::False) {
|
|
||||||
result.append(QLatin1String("@skipDialog=0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
result += torrents;
|
result += torrents;
|
||||||
return result;
|
return result;
|
||||||
@@ -399,72 +400,91 @@ QBtCommandLineParameters parseCommandLine(const QStringList &args)
|
|||||||
{
|
{
|
||||||
QBtCommandLineParameters result {QProcessEnvironment::systemEnvironment()};
|
QBtCommandLineParameters result {QProcessEnvironment::systemEnvironment()};
|
||||||
|
|
||||||
for (int i = 1; i < args.count(); ++i) {
|
for (int i = 1; i < args.count(); ++i)
|
||||||
|
{
|
||||||
const QString &arg = args[i];
|
const QString &arg = args[i];
|
||||||
|
|
||||||
if ((arg.startsWith("--") && !arg.endsWith(".torrent"))
|
if ((arg.startsWith("--") && !arg.endsWith(".torrent"))
|
||||||
|| (arg.startsWith('-') && (arg.size() == 2))) {
|
|| (arg.startsWith('-') && (arg.size() == 2)))
|
||||||
|
{
|
||||||
// Parse known parameters
|
// Parse known parameters
|
||||||
if (arg == SHOW_HELP_OPTION) {
|
if (arg == SHOW_HELP_OPTION)
|
||||||
|
{
|
||||||
result.showHelp = true;
|
result.showHelp = true;
|
||||||
}
|
}
|
||||||
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
||||||
else if (arg == SHOW_VERSION_OPTION) {
|
else if (arg == SHOW_VERSION_OPTION)
|
||||||
|
{
|
||||||
result.showVersion = true;
|
result.showVersion = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (arg == WEBUI_PORT_OPTION) {
|
else if (arg == WEBUI_PORT_OPTION)
|
||||||
|
{
|
||||||
result.webUiPort = WEBUI_PORT_OPTION.value(arg);
|
result.webUiPort = WEBUI_PORT_OPTION.value(arg);
|
||||||
if ((result.webUiPort < 1) || (result.webUiPort > 65535))
|
if ((result.webUiPort < 1) || (result.webUiPort > 65535))
|
||||||
throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).")
|
throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).")
|
||||||
.arg(QLatin1String("--webui-port")));
|
.arg(QLatin1String("--webui-port")));
|
||||||
}
|
}
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
else if (arg == NO_SPLASH_OPTION) {
|
else if (arg == NO_SPLASH_OPTION)
|
||||||
|
{
|
||||||
result.noSplash = true;
|
result.noSplash = true;
|
||||||
}
|
}
|
||||||
#elif !defined(Q_OS_WIN)
|
#elif !defined(Q_OS_WIN)
|
||||||
else if (arg == DAEMON_OPTION) {
|
else if (arg == DAEMON_OPTION)
|
||||||
|
{
|
||||||
result.shouldDaemonize = true;
|
result.shouldDaemonize = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
else if (arg == PROFILE_OPTION) {
|
else if (arg == PROFILE_OPTION)
|
||||||
|
{
|
||||||
result.profileDir = PROFILE_OPTION.value(arg);
|
result.profileDir = PROFILE_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else if (arg == RELATIVE_FASTRESUME) {
|
else if (arg == RELATIVE_FASTRESUME)
|
||||||
|
{
|
||||||
result.relativeFastresumePaths = true;
|
result.relativeFastresumePaths = true;
|
||||||
}
|
}
|
||||||
else if (arg == CONFIGURATION_OPTION) {
|
else if (arg == CONFIGURATION_OPTION)
|
||||||
|
{
|
||||||
result.configurationName = CONFIGURATION_OPTION.value(arg);
|
result.configurationName = CONFIGURATION_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else if (arg == SAVE_PATH_OPTION) {
|
else if (arg == SAVE_PATH_OPTION)
|
||||||
|
{
|
||||||
result.savePath = SAVE_PATH_OPTION.value(arg);
|
result.savePath = SAVE_PATH_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else if (arg == PAUSED_OPTION) {
|
else if (arg == PAUSED_OPTION)
|
||||||
|
{
|
||||||
result.addPaused = PAUSED_OPTION.value(arg);
|
result.addPaused = PAUSED_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else if (arg == SKIP_HASH_CHECK_OPTION) {
|
else if (arg == SKIP_HASH_CHECK_OPTION)
|
||||||
|
{
|
||||||
result.skipChecking = true;
|
result.skipChecking = true;
|
||||||
}
|
}
|
||||||
else if (arg == CATEGORY_OPTION) {
|
else if (arg == CATEGORY_OPTION)
|
||||||
|
{
|
||||||
result.category = CATEGORY_OPTION.value(arg);
|
result.category = CATEGORY_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else if (arg == SEQUENTIAL_OPTION) {
|
else if (arg == SEQUENTIAL_OPTION)
|
||||||
|
{
|
||||||
result.sequential = true;
|
result.sequential = true;
|
||||||
}
|
}
|
||||||
else if (arg == FIRST_AND_LAST_OPTION) {
|
else if (arg == FIRST_AND_LAST_OPTION)
|
||||||
|
{
|
||||||
result.firstLastPiecePriority = true;
|
result.firstLastPiecePriority = true;
|
||||||
}
|
}
|
||||||
else if (arg == SKIP_DIALOG_OPTION) {
|
else if (arg == SKIP_DIALOG_OPTION)
|
||||||
|
{
|
||||||
result.skipDialog = SKIP_DIALOG_OPTION.value(arg);
|
result.skipDialog = SKIP_DIALOG_OPTION.value(arg);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// Unknown argument
|
// Unknown argument
|
||||||
result.unknownParameter = arg;
|
result.unknownParameter = arg;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
QFileInfo torrentPath;
|
QFileInfo torrentPath;
|
||||||
torrentPath.setFile(arg);
|
torrentPath.setFile(arg);
|
||||||
|
|
||||||
@@ -495,11 +515,14 @@ QString wrapText(const QString &text, int initialIndentation = USAGE_TEXT_COLUMN
|
|||||||
QStringList lines = {words.first()};
|
QStringList lines = {words.first()};
|
||||||
int currentLineMaxLength = wrapAtColumn - initialIndentation;
|
int currentLineMaxLength = wrapAtColumn - initialIndentation;
|
||||||
|
|
||||||
for (const QString &word : asConst(words.mid(1))) {
|
for (const QString &word : asConst(words.mid(1)))
|
||||||
if (lines.last().length() + word.length() + 1 < currentLineMaxLength) {
|
{
|
||||||
|
if (lines.last().length() + word.length() + 1 < currentLineMaxLength)
|
||||||
|
{
|
||||||
lines.last().append(' ' + word);
|
lines.last().append(' ' + word);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
lines.append(QString(initialIndentation, ' ') + word);
|
lines.append(QString(initialIndentation, ' ') + word);
|
||||||
currentLineMaxLength = wrapAtColumn;
|
currentLineMaxLength = wrapAtColumn;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,16 +28,14 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef APP_OPTIONS_H
|
#pragma once
|
||||||
#define APP_OPTIONS_H
|
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
#include "base/tristatebool.h"
|
|
||||||
|
|
||||||
class QProcessEnvironment;
|
class QProcessEnvironment;
|
||||||
|
|
||||||
struct QBtCommandLineParameters
|
struct QBtCommandLineParameters
|
||||||
@@ -56,8 +54,8 @@ struct QBtCommandLineParameters
|
|||||||
bool shouldDaemonize;
|
bool shouldDaemonize;
|
||||||
#endif
|
#endif
|
||||||
int webUiPort;
|
int webUiPort;
|
||||||
TriStateBool addPaused;
|
std::optional<bool> addPaused;
|
||||||
TriStateBool skipDialog;
|
std::optional<bool> skipDialog;
|
||||||
QStringList torrents;
|
QStringList torrents;
|
||||||
QString profileDir;
|
QString profileDir;
|
||||||
QString configurationName;
|
QString configurationName;
|
||||||
@@ -81,5 +79,3 @@ private:
|
|||||||
|
|
||||||
QBtCommandLineParameters parseCommandLine(const QStringList &args);
|
QBtCommandLineParameters parseCommandLine(const QStringList &args);
|
||||||
void displayUsage(const QString &prgName);
|
void displayUsage(const QString &prgName);
|
||||||
|
|
||||||
#endif // APP_OPTIONS_H
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
#include "base/global.h"
|
#include "base/global.h"
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
@@ -73,7 +74,8 @@ void FileLogger::changePath(const QString &newPath)
|
|||||||
dir.mkpath(newPath);
|
dir.mkpath(newPath);
|
||||||
const QString tmpPath = dir.absoluteFilePath("qbittorrent.log");
|
const QString tmpPath = dir.absoluteFilePath("qbittorrent.log");
|
||||||
|
|
||||||
if (tmpPath != m_path) {
|
if (tmpPath != m_path)
|
||||||
|
{
|
||||||
m_path = tmpPath;
|
m_path = tmpPath;
|
||||||
|
|
||||||
closeLogFile();
|
closeLogFile();
|
||||||
@@ -89,9 +91,11 @@ void FileLogger::deleteOld(const int age, const FileLogAgeType ageType)
|
|||||||
const QFileInfoList fileList = dir.entryInfoList(QStringList("qbittorrent.log.bak*")
|
const QFileInfoList fileList = dir.entryInfoList(QStringList("qbittorrent.log.bak*")
|
||||||
, (QDir::Files | QDir::Writable), (QDir::Time | QDir::Reversed));
|
, (QDir::Files | QDir::Writable), (QDir::Time | QDir::Reversed));
|
||||||
|
|
||||||
for (const QFileInfo &file : fileList) {
|
for (const QFileInfo &file : fileList)
|
||||||
|
{
|
||||||
QDateTime modificationDate = file.lastModified();
|
QDateTime modificationDate = file.lastModified();
|
||||||
switch (ageType) {
|
switch (ageType)
|
||||||
|
{
|
||||||
case DAYS:
|
case DAYS:
|
||||||
modificationDate = modificationDate.addDays(age);
|
modificationDate = modificationDate.addDays(age);
|
||||||
break;
|
break;
|
||||||
@@ -124,7 +128,8 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
|||||||
QTextStream stream(&m_logFile);
|
QTextStream stream(&m_logFile);
|
||||||
stream.setCodec("UTF-8");
|
stream.setCodec("UTF-8");
|
||||||
|
|
||||||
switch (msg.type) {
|
switch (msg.type)
|
||||||
|
{
|
||||||
case Log::INFO:
|
case Log::INFO:
|
||||||
stream << "(I) ";
|
stream << "(I) ";
|
||||||
break;
|
break;
|
||||||
@@ -140,12 +145,14 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
|||||||
|
|
||||||
stream << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << '\n';
|
stream << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << '\n';
|
||||||
|
|
||||||
if (m_backup && (m_logFile.size() >= m_maxSize)) {
|
if (m_backup && (m_logFile.size() >= m_maxSize))
|
||||||
|
{
|
||||||
closeLogFile();
|
closeLogFile();
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
QString backupLogFilename = m_path + ".bak";
|
QString backupLogFilename = m_path + ".bak";
|
||||||
|
|
||||||
while (QFile::exists(backupLogFilename)) {
|
while (QFile::exists(backupLogFilename))
|
||||||
|
{
|
||||||
++counter;
|
++counter;
|
||||||
backupLogFilename = m_path + ".bak" + QString::number(counter);
|
backupLogFilename = m_path + ".bak" + QString::number(counter);
|
||||||
}
|
}
|
||||||
@@ -153,7 +160,8 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
|||||||
QFile::rename(m_path, backupLogFilename);
|
QFile::rename(m_path, backupLogFilename);
|
||||||
openLogFile();
|
openLogFile();
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
if (!m_flusher.isActive())
|
if (!m_flusher.isActive())
|
||||||
m_flusher.start();
|
m_flusher.start();
|
||||||
}
|
}
|
||||||
@@ -168,7 +176,8 @@ void FileLogger::flushLog()
|
|||||||
void FileLogger::openLogFile()
|
void FileLogger::openLogFile()
|
||||||
{
|
{
|
||||||
if (!m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)
|
if (!m_logFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)
|
||||||
|| !m_logFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
|
|| !m_logFile.setPermissions(QFile::ReadOwner | QFile::WriteOwner))
|
||||||
|
{
|
||||||
m_logFile.close();
|
m_logFile.close();
|
||||||
LogMsg(tr("An error occurred while trying to open the log file. Logging to file is disabled."), Log::CRITICAL);
|
LogMsg(tr("An error occurred while trying to open the log file. Logging to file is disabled."), Log::CRITICAL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,7 @@
|
|||||||
* exception statement from your version.
|
* exception statement from your version.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef FILELOGGER_H
|
#pragma once
|
||||||
#define FILELOGGER_H
|
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
@@ -73,5 +72,3 @@ private:
|
|||||||
QFile m_logFile;
|
QFile m_logFile;
|
||||||
QTimer m_flusher;
|
QTimer m_flusher;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FILELOGGER_H
|
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ Q_IMPORT_PLUGIN(QICOPlugin)
|
|||||||
|
|
||||||
#include "base/preferences.h"
|
#include "base/preferences.h"
|
||||||
#include "base/profile.h"
|
#include "base/profile.h"
|
||||||
|
#include "base/version.h"
|
||||||
#include "application.h"
|
#include "application.h"
|
||||||
#include "cmdoptions.h"
|
#include "cmdoptions.h"
|
||||||
#include "upgrade.h"
|
#include "upgrade.h"
|
||||||
@@ -92,7 +93,8 @@ void sigNormalHandler(int signum);
|
|||||||
void sigAbnormalHandler(int signum);
|
void sigAbnormalHandler(int signum);
|
||||||
#endif
|
#endif
|
||||||
// sys_signame[] is only defined in BSD
|
// sys_signame[] is only defined in BSD
|
||||||
const char *const sysSigName[] = {
|
const char *const sysSigName[] =
|
||||||
|
{
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
"", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "",
|
"", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "",
|
||||||
"", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "",
|
"", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "",
|
||||||
@@ -141,19 +143,23 @@ int main(int argc, char *argv[])
|
|||||||
Application::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
Application::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
try {
|
try
|
||||||
|
{
|
||||||
// Create Application
|
// Create Application
|
||||||
auto app = std::make_unique<Application>(argc, argv);
|
auto app = std::make_unique<Application>(argc, argv);
|
||||||
|
|
||||||
const QBtCommandLineParameters params = app->commandLineArgs();
|
const QBtCommandLineParameters params = app->commandLineArgs();
|
||||||
if (!params.unknownParameter.isEmpty()) {
|
if (!params.unknownParameter.isEmpty())
|
||||||
|
{
|
||||||
throw CommandLineParameterError(QObject::tr("%1 is an unknown command line parameter.",
|
throw CommandLineParameterError(QObject::tr("%1 is an unknown command line parameter.",
|
||||||
"--random-parameter is an unknown command line parameter.")
|
"--random-parameter is an unknown command line parameter.")
|
||||||
.arg(params.unknownParameter));
|
.arg(params.unknownParameter));
|
||||||
}
|
}
|
||||||
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
||||||
if (params.showVersion) {
|
if (params.showVersion)
|
||||||
if (isOneArg) {
|
{
|
||||||
|
if (isOneArg)
|
||||||
|
{
|
||||||
displayVersion();
|
displayVersion();
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -161,8 +167,10 @@ int main(int argc, char *argv[])
|
|||||||
.arg(QLatin1String("-v (or --version)")));
|
.arg(QLatin1String("-v (or --version)")));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (params.showHelp) {
|
if (params.showHelp)
|
||||||
if (isOneArg) {
|
{
|
||||||
|
if (isOneArg)
|
||||||
|
{
|
||||||
displayUsage(argv[0]);
|
displayUsage(argv[0]);
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
@@ -175,7 +183,8 @@ int main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "Couldn't set environment variable...\n");
|
fprintf(stderr, "Couldn't set environment variable...\n");
|
||||||
|
|
||||||
const bool firstTimeUser = !Preferences::instance()->getAcceptedLegal();
|
const bool firstTimeUser = !Preferences::instance()->getAcceptedLegal();
|
||||||
if (firstTimeUser) {
|
if (firstTimeUser)
|
||||||
|
{
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (!userAgreesWithLegalNotice())
|
if (!userAgreesWithLegalNotice())
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
@@ -195,9 +204,11 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if qBittorrent is already running for this user
|
// Check if qBittorrent is already running for this user
|
||||||
if (app->isRunning()) {
|
if (app->isRunning())
|
||||||
|
{
|
||||||
#if defined(DISABLE_GUI) && !defined(Q_OS_WIN)
|
#if defined(DISABLE_GUI) && !defined(Q_OS_WIN)
|
||||||
if (params.shouldDaemonize) {
|
if (params.shouldDaemonize)
|
||||||
|
{
|
||||||
throw CommandLineParameterError(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
|
throw CommandLineParameterError(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
|
||||||
.arg(QLatin1String("-d (or --daemon)")));
|
.arg(QLatin1String("-d (or --daemon)")));
|
||||||
}
|
}
|
||||||
@@ -242,7 +253,8 @@ int main(int argc, char *argv[])
|
|||||||
app->setAttribute(Qt::AA_DontShowIconsInMenus);
|
app->setAttribute(Qt::AA_DontShowIconsInMenus);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!firstTimeUser) {
|
if (!firstTimeUser)
|
||||||
|
{
|
||||||
handleChangedDefaults(DefaultPreferencesMode::Legacy);
|
handleChangedDefaults(DefaultPreferencesMode::Legacy);
|
||||||
|
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
@@ -256,21 +268,26 @@ int main(int argc, char *argv[])
|
|||||||
&& isatty(fileno(stdout)))) return EXIT_FAILURE;
|
&& isatty(fileno(stdout)))) return EXIT_FAILURE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
handleChangedDefaults(DefaultPreferencesMode::Current);
|
handleChangedDefaults(DefaultPreferencesMode::Current);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DISABLE_GUI) && !defined(Q_OS_WIN)
|
#if defined(DISABLE_GUI) && !defined(Q_OS_WIN)
|
||||||
if (params.shouldDaemonize) {
|
if (params.shouldDaemonize)
|
||||||
|
{
|
||||||
app.reset(); // Destroy current application
|
app.reset(); // Destroy current application
|
||||||
if (daemon(1, 0) == 0) {
|
if (daemon(1, 0) == 0)
|
||||||
|
{
|
||||||
app = std::make_unique<Application>(argc, argv);
|
app = std::make_unique<Application>(argc, argv);
|
||||||
if (app->isRunning()) {
|
if (app->isRunning())
|
||||||
|
{
|
||||||
// Another instance had time to start.
|
// Another instance had time to start.
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
qCritical("Something went wrong while daemonizing, exiting...");
|
qCritical("Something went wrong while daemonizing, exiting...");
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -289,7 +306,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
return app->exec(params.paramList());
|
return app->exec(params.paramList());
|
||||||
}
|
}
|
||||||
catch (const CommandLineParameterError &er) {
|
catch (const CommandLineParameterError &er)
|
||||||
|
{
|
||||||
displayBadArgMessage(er.messageForUser());
|
displayBadArgMessage(er.messageForUser());
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
@@ -300,10 +318,12 @@ void reportToUser(const char *str)
|
|||||||
{
|
{
|
||||||
const size_t strLen = strlen(str);
|
const size_t strLen = strlen(str);
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
if (write(STDERR_FILENO, str, strLen) < static_cast<ssize_t>(strLen)) {
|
if (write(STDERR_FILENO, str, strLen) < static_cast<ssize_t>(strLen))
|
||||||
|
{
|
||||||
const auto dummy = write(STDOUT_FILENO, str, strLen);
|
const auto dummy = write(STDOUT_FILENO, str, strLen);
|
||||||
#else
|
#else
|
||||||
if (_write(STDERR_FILENO, str, strLen) < static_cast<ssize_t>(strLen)) {
|
if (_write(STDERR_FILENO, str, strLen) < static_cast<ssize_t>(strLen))
|
||||||
|
{
|
||||||
const auto dummy = _write(STDOUT_FILENO, str, strLen);
|
const auto dummy = _write(STDOUT_FILENO, str, strLen);
|
||||||
#endif
|
#endif
|
||||||
Q_UNUSED(dummy);
|
Q_UNUSED(dummy);
|
||||||
@@ -405,7 +425,8 @@ bool userAgreesWithLegalNotice()
|
|||||||
printf("%s", qUtf8Printable(eula));
|
printf("%s", qUtf8Printable(eula));
|
||||||
|
|
||||||
const char ret = getchar(); // Read pressed key
|
const char ret = getchar(); // Read pressed key
|
||||||
if ((ret == 'y') || (ret == 'Y')) {
|
if ((ret == 'y') || (ret == 'Y'))
|
||||||
|
{
|
||||||
// Save the answer
|
// Save the answer
|
||||||
pref->setAcceptedLegal(true);
|
pref->setAcceptedLegal(true);
|
||||||
return true;
|
return true;
|
||||||
@@ -419,7 +440,8 @@ bool userAgreesWithLegalNotice()
|
|||||||
msgBox.show(); // Need to be shown or to moveToCenter does not work
|
msgBox.show(); // Need to be shown or to moveToCenter does not work
|
||||||
msgBox.move(Utils::Gui::screenCenter(&msgBox));
|
msgBox.move(Utils::Gui::screenCenter(&msgBox));
|
||||||
msgBox.exec();
|
msgBox.exec();
|
||||||
if (msgBox.clickedButton() == agreeButton) {
|
if (msgBox.clickedButton() == agreeButton)
|
||||||
|
{
|
||||||
// Save the answer
|
// Save the answer
|
||||||
pref->setAcceptedLegal(true);
|
pref->setAcceptedLegal(true);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId)
|
|||||||
, id(appId)
|
, id(appId)
|
||||||
{
|
{
|
||||||
QString prefix = id;
|
QString prefix = id;
|
||||||
if (id.isEmpty()) {
|
if (id.isEmpty())
|
||||||
|
{
|
||||||
id = QCoreApplication::applicationFilePath();
|
id = QCoreApplication::applicationFilePath();
|
||||||
#if defined(Q_OS_WIN)
|
#if defined(Q_OS_WIN)
|
||||||
id = id.toLower();
|
id = id.toLower();
|
||||||
@@ -143,14 +144,15 @@ bool QtLocalPeer::isClient()
|
|||||||
bool res = server->listen(socketName);
|
bool res = server->listen(socketName);
|
||||||
#if defined(Q_OS_UNIX)
|
#if defined(Q_OS_UNIX)
|
||||||
// ### Workaround
|
// ### Workaround
|
||||||
if (!res && server->serverError() == QAbstractSocket::AddressInUseError) {
|
if (!res && server->serverError() == QAbstractSocket::AddressInUseError)
|
||||||
|
{
|
||||||
QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
|
QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
|
||||||
res = server->listen(socketName);
|
res = server->listen(socketName);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!res)
|
if (!res)
|
||||||
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
|
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
|
||||||
QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection()));
|
connect(server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +163,8 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
|
|||||||
|
|
||||||
QLocalSocket socket;
|
QLocalSocket socket;
|
||||||
bool connOk = false;
|
bool connOk = false;
|
||||||
for(int i = 0; i < 2; i++) {
|
for(int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
// Try twice, in case the other instance is just starting up
|
// Try twice, in case the other instance is just starting up
|
||||||
socket.connectToServer(socketName);
|
socket.connectToServer(socketName);
|
||||||
connOk = socket.waitForConnected(timeout/2);
|
connOk = socket.waitForConnected(timeout/2);
|
||||||
@@ -182,7 +185,8 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
|
|||||||
QDataStream ds(&socket);
|
QDataStream ds(&socket);
|
||||||
ds.writeBytes(uMsg.constData(), uMsg.size());
|
ds.writeBytes(uMsg.constData(), uMsg.size());
|
||||||
bool res = socket.waitForBytesWritten(timeout);
|
bool res = socket.waitForBytesWritten(timeout);
|
||||||
if (res) {
|
if (res)
|
||||||
|
{
|
||||||
res &= socket.waitForReadyRead(timeout); // wait for ack
|
res &= socket.waitForReadyRead(timeout); // wait for ack
|
||||||
if (res)
|
if (res)
|
||||||
res &= (socket.read(qstrlen(ack)) == ack);
|
res &= (socket.read(qstrlen(ack)) == ack);
|
||||||
@@ -201,8 +205,10 @@ void QtLocalPeer::receiveConnection()
|
|||||||
if (!socket)
|
if (!socket)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
while (true) {
|
while (true)
|
||||||
if (socket->state() == QLocalSocket::UnconnectedState) {
|
{
|
||||||
|
if (socket->state() == QLocalSocket::UnconnectedState)
|
||||||
|
{
|
||||||
qWarning("QtLocalPeer: Peer disconnected");
|
qWarning("QtLocalPeer: Peer disconnected");
|
||||||
delete socket;
|
delete socket;
|
||||||
return;
|
return;
|
||||||
@@ -216,7 +222,8 @@ void QtLocalPeer::receiveConnection()
|
|||||||
QByteArray uMsg;
|
QByteArray uMsg;
|
||||||
quint32 remaining;
|
quint32 remaining;
|
||||||
ds >> remaining;
|
ds >> remaining;
|
||||||
if (remaining > 65535) {
|
if (remaining > 65535)
|
||||||
|
{
|
||||||
// drop suspiciously large data
|
// drop suspiciously large data
|
||||||
delete socket;
|
delete socket;
|
||||||
return;
|
return;
|
||||||
@@ -225,12 +232,14 @@ void QtLocalPeer::receiveConnection()
|
|||||||
uMsg.resize(remaining);
|
uMsg.resize(remaining);
|
||||||
int got = 0;
|
int got = 0;
|
||||||
char* uMsgBuf = uMsg.data();
|
char* uMsgBuf = uMsg.data();
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
got = ds.readRawData(uMsgBuf, remaining);
|
got = ds.readRawData(uMsgBuf, remaining);
|
||||||
remaining -= got;
|
remaining -= got;
|
||||||
uMsgBuf += got;
|
uMsgBuf += got;
|
||||||
} while (remaining && got >= 0 && socket->waitForReadyRead(2000));
|
} while (remaining && got >= 0 && socket->waitForReadyRead(2000));
|
||||||
if (got < 0) {
|
if (got < 0)
|
||||||
|
{
|
||||||
qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData());
|
qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData());
|
||||||
delete socket;
|
delete socket;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -66,8 +66,7 @@
|
|||||||
****************************************************************************
|
****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef QTLOCALPEER_H
|
#pragma once
|
||||||
#define QTLOCALPEER_H
|
|
||||||
|
|
||||||
#include "qtlockedfile.h"
|
#include "qtlockedfile.h"
|
||||||
|
|
||||||
@@ -99,5 +98,3 @@ protected:
|
|||||||
private:
|
private:
|
||||||
static const char* ack;
|
static const char* ack;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QTLOCALPEER_H
|
|
||||||
|
|||||||
@@ -178,8 +178,8 @@ QtLockedFile::LockMode QtLockedFile::lockMode() const
|
|||||||
can be locked.
|
can be locked.
|
||||||
|
|
||||||
If \a block is true, this function will block until the lock is
|
If \a block is true, this function will block until the lock is
|
||||||
aquired. If \a block is false, this function returns \e false
|
acquired. If \a block is false, this function returns \e false
|
||||||
immediately if the lock cannot be aquired.
|
immediately if the lock cannot be acquired.
|
||||||
|
|
||||||
If this object already has a lock of type \a mode, this function
|
If this object already has a lock of type \a mode, this function
|
||||||
returns \e true immediately. If this object has a lock of a
|
returns \e true immediately. If this object has a lock of a
|
||||||
|
|||||||
@@ -66,8 +66,7 @@
|
|||||||
****************************************************************************
|
****************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef QTLOCKEDFILE_H
|
#pragma once
|
||||||
#define QTLOCKEDFILE_H
|
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
@@ -112,5 +111,3 @@ namespace QtLP_Private
|
|||||||
LockMode m_lock_mode;
|
LockMode m_lock_mode;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -22,7 +22,8 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
|
|||||||
// retrieve current stack addresses
|
// retrieve current stack addresses
|
||||||
int addrlen = backtrace(addrlist.data(), addrlist.size());
|
int addrlen = backtrace(addrlist.data(), addrlist.size());
|
||||||
|
|
||||||
if (addrlen == 0) {
|
if (addrlen == 0)
|
||||||
|
{
|
||||||
fprintf(out, " <empty, possibly corrupt>\n");
|
fprintf(out, " <empty, possibly corrupt>\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -38,27 +39,33 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
|
|||||||
int functionNamesFound = 0;
|
int functionNamesFound = 0;
|
||||||
// iterate over the returned symbol lines. skip the first, it is the
|
// iterate over the returned symbol lines. skip the first, it is the
|
||||||
// address of this function.
|
// address of this function.
|
||||||
for (int i = 2; i < addrlen; i++) {
|
for (int i = 2; i < addrlen; i++)
|
||||||
|
{
|
||||||
char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
|
char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
|
||||||
|
|
||||||
// find parentheses and +address offset surrounding the mangled name:
|
// find parentheses and +address offset surrounding the mangled name:
|
||||||
// ./module(function+0x15c) [0x8048a6d]
|
// ./module(function+0x15c) [0x8048a6d]
|
||||||
// fprintf(out, "%s TT\n", symbollist[i]);
|
// fprintf(out, "%s TT\n", symbollist[i]);
|
||||||
for (char *p = symbollist[i]; *p; ++p) {
|
for (char *p = symbollist[i]; *p; ++p)
|
||||||
if (*p == '(') {
|
{
|
||||||
|
if (*p == '(')
|
||||||
|
{
|
||||||
begin_name = p;
|
begin_name = p;
|
||||||
}
|
}
|
||||||
else if (*p == '+') {
|
else if (*p == '+')
|
||||||
|
{
|
||||||
begin_offset = p;
|
begin_offset = p;
|
||||||
}
|
}
|
||||||
else if ((*p == ')') && begin_offset) {
|
else if ((*p == ')') && begin_offset)
|
||||||
|
{
|
||||||
end_offset = p;
|
end_offset = p;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (begin_name && begin_offset && end_offset
|
if (begin_name && begin_offset && end_offset
|
||||||
&& (begin_name < begin_offset)) {
|
&& (begin_name < begin_offset))
|
||||||
|
{
|
||||||
*begin_name++ = '\0';
|
*begin_name++ = '\0';
|
||||||
*begin_offset++ = '\0';
|
*begin_offset++ = '\0';
|
||||||
*end_offset = '\0';
|
*end_offset = '\0';
|
||||||
@@ -70,12 +77,14 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
|
|||||||
int status;
|
int status;
|
||||||
char *ret = abi::__cxa_demangle(begin_name,
|
char *ret = abi::__cxa_demangle(begin_name,
|
||||||
funcname, &funcnamesize, &status);
|
funcname, &funcnamesize, &status);
|
||||||
if (status == 0) {
|
if (status == 0)
|
||||||
|
{
|
||||||
funcname = ret; // use possibly realloc()-ed string
|
funcname = ret; // use possibly realloc()-ed string
|
||||||
fprintf(out, " %s : %s+%s %s\n",
|
fprintf(out, " %s : %s+%s %s\n",
|
||||||
symbollist[i], funcname, begin_offset, ++end_offset);
|
symbollist[i], funcname, begin_offset, ++end_offset);
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// demangling failed. Output function name as a C function with
|
// demangling failed. Output function name as a C function with
|
||||||
// no arguments.
|
// no arguments.
|
||||||
fprintf(out, " %s : %s()+%s %s\n",
|
fprintf(out, " %s : %s()+%s %s\n",
|
||||||
@@ -83,17 +92,20 @@ static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames
|
|||||||
}
|
}
|
||||||
++functionNamesFound;
|
++functionNamesFound;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
// couldn't parse the line? print the whole line.
|
// couldn't parse the line? print the whole line.
|
||||||
fprintf(out, " %s\n", symbollist[i]);
|
fprintf(out, " %s\n", symbollist[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!functionNamesFound) {
|
if (!functionNamesFound)
|
||||||
|
{
|
||||||
fprintf(out, "There were no function names found in the stack trace\n."
|
fprintf(out, "There were no function names found in the stack trace\n."
|
||||||
"Seems like debug symbols are not installed, and the stack trace is useless.\n");
|
"Seems like debug symbols are not installed, and the stack trace is useless.\n");
|
||||||
}
|
}
|
||||||
if (functionNamesFound < addrlen - 2) {
|
if (functionNamesFound < addrlen - 2)
|
||||||
|
{
|
||||||
fprintf(out, "Consider installing debug symbols for packages containing files with empty"
|
fprintf(out, "Consider installing debug symbols for packages containing files with empty"
|
||||||
" function names (i.e. empty braces \"()\") to make your stack trace more useful\n");
|
" function names (i.e. empty braces \"()\") to make your stack trace more useful\n");
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user