Compare commits
325 Commits
release-4.
...
release-4.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac8105c304 | ||
|
|
6cb16cfbb7 | ||
|
|
2b475c4296 | ||
|
|
3a9e4397fd | ||
|
|
1ce0bb7cee | ||
|
|
dd4b09f3a9 | ||
|
|
8c2df049f1 | ||
|
|
8b66c444ee | ||
|
|
0ccbdbccf4 | ||
|
|
d08b6c81ba | ||
|
|
5f897709cf | ||
|
|
e25948e737 | ||
|
|
144956a209 | ||
|
|
667d4e4211 | ||
|
|
d957eef331 | ||
|
|
baa32a20e0 | ||
|
|
eff465126e | ||
|
|
09089b2d33 | ||
|
|
3aa36ad40c | ||
|
|
24bc5a9875 | ||
|
|
744a2cb5a3 | ||
|
|
33e090cfcb | ||
|
|
063844ed44 | ||
|
|
899f8a3f61 | ||
|
|
0f72f22096 | ||
|
|
ffda0ab0ac | ||
|
|
21f18623db | ||
|
|
c4265db0fd | ||
|
|
bc8d9656f6 | ||
|
|
bd284facbd | ||
|
|
7eb77cbcbd | ||
|
|
86e96b819e | ||
|
|
132be7ee9d | ||
|
|
9f8a6e8fb1 | ||
|
|
e6447c8f28 | ||
|
|
7dd9e73431 | ||
|
|
ea82962c5d | ||
|
|
b2a43eeffc | ||
|
|
681347148d | ||
|
|
1f63490755 | ||
|
|
0140ed356f | ||
|
|
2c8f322af5 | ||
|
|
6f31ebd899 | ||
|
|
014df529c5 | ||
|
|
482dad00fd | ||
|
|
7898037006 | ||
|
|
5c819ee384 | ||
|
|
a590e7139b | ||
|
|
89a8e07217 | ||
|
|
5c05bdaa27 | ||
|
|
7006afc611 | ||
|
|
9cb3a6d29e | ||
|
|
2b6baa6099 | ||
|
|
8881035b7a | ||
|
|
2be30a50ef | ||
|
|
81a7b0c034 | ||
|
|
e7235cc3f8 | ||
|
|
1570b51f6c | ||
|
|
6272c6d95d | ||
|
|
473ae25fd8 | ||
|
|
42d7d9b5f4 | ||
|
|
0f77b00428 | ||
|
|
060804d3b8 | ||
|
|
f8b6cb4879 | ||
|
|
a6d27223db | ||
|
|
bb32b88a62 | ||
|
|
332b173e08 | ||
|
|
e921cf677a | ||
|
|
973b5a4809 | ||
|
|
688e11a911 | ||
|
|
f7e6b96493 | ||
|
|
88bf6f11c7 | ||
|
|
90e2236990 | ||
|
|
6ad7cadc4b | ||
|
|
0499111156 | ||
|
|
ae44e59c9a | ||
|
|
1de52f9bcf | ||
|
|
448e55031e | ||
|
|
3b748178c2 | ||
|
|
a4a54ce712 | ||
|
|
d19b524d2d | ||
|
|
1e2bf50e66 | ||
|
|
e7f3409053 | ||
|
|
9758633eeb | ||
|
|
3def5e40c4 | ||
|
|
ca923ed02c | ||
|
|
e4c3bad93a | ||
|
|
3b52c5ce97 | ||
|
|
44b94803a4 | ||
|
|
5d4644c4fc | ||
|
|
a2ef115c66 | ||
|
|
1356f200b8 | ||
|
|
3c68896b1d | ||
|
|
265da50791 | ||
|
|
4037143f4e | ||
|
|
8cae8ad5c5 | ||
|
|
50bd845682 | ||
|
|
ed5aa07526 | ||
|
|
437b51b3a5 | ||
|
|
c2ccc9dfa4 | ||
|
|
b2c7d8211f | ||
|
|
726455ac3e | ||
|
|
ae2bb4efeb | ||
|
|
9971329121 | ||
|
|
d0ec1c4a86 | ||
|
|
9c55600d81 | ||
|
|
b45fb74e01 | ||
|
|
f16c585a77 | ||
|
|
9c664d04ae | ||
|
|
3d0ca83474 | ||
|
|
e713ffb064 | ||
|
|
cf1e61bcf5 | ||
|
|
42b22d6645 | ||
|
|
2d607f8c1a | ||
|
|
69256905c2 | ||
|
|
305316b1fc | ||
|
|
27e222455b | ||
|
|
2b18318e0c | ||
|
|
49cadce253 | ||
|
|
f1b908b95b | ||
|
|
4acfcef8da | ||
|
|
69f2196a22 | ||
|
|
b20a3c5b8e | ||
|
|
2c5271b3b2 | ||
|
|
7696895a88 | ||
|
|
c1ae5d2572 | ||
|
|
0e635c7fdd | ||
|
|
58345e5bbf | ||
|
|
89382d4ec2 | ||
|
|
372f5af36b | ||
|
|
f38736729d | ||
|
|
bf67ef21c6 | ||
|
|
cfd40adcb5 | ||
|
|
8210f9841e | ||
|
|
ae3d17ec01 | ||
|
|
349e958be3 | ||
|
|
42acc75394 | ||
|
|
8b91dcedb0 | ||
|
|
a454a0303d | ||
|
|
789c6de2e8 | ||
|
|
c2fb51159f | ||
|
|
bfb0afe3cf | ||
|
|
26a2d4f24d | ||
|
|
f6e88c8c55 | ||
|
|
51033c212a | ||
|
|
16c858cf61 | ||
|
|
0496543fce | ||
|
|
746e8a7be1 | ||
|
|
6d301ccf55 | ||
|
|
d441b18da0 | ||
|
|
13023ba70a | ||
|
|
ecb7c02d4c | ||
|
|
fd1ac43157 | ||
|
|
c6d4a1f7d4 | ||
|
|
01110690da | ||
|
|
c998c7d38d | ||
|
|
230f98da4a | ||
|
|
c86db0004f | ||
|
|
e645514c8f | ||
|
|
f3c9dbd512 | ||
|
|
ef650293e3 | ||
|
|
05e217537c | ||
|
|
13cb3b5ca1 | ||
|
|
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 |
@@ -3,7 +3,7 @@ version: '{branch}-{build}'
|
|||||||
# Do not build on tags (GitHub only)
|
# Do not build on tags (GitHub only)
|
||||||
skip_tags: true
|
skip_tags: true
|
||||||
|
|
||||||
image: Visual Studio 2022
|
image: Visual Studio 2017
|
||||||
|
|
||||||
branches:
|
branches:
|
||||||
except: # blacklist
|
except: # blacklist
|
||||||
@@ -13,8 +13,8 @@ environment:
|
|||||||
REPO_DIR: &REPO_DIR c:\qbittorrent
|
REPO_DIR: &REPO_DIR c:\qbittorrent
|
||||||
CACHE_DIR: &CACHE_DIR c:\qbt_cache
|
CACHE_DIR: &CACHE_DIR c:\qbt_cache
|
||||||
|
|
||||||
QBT_VER_URL: https://builds.shiki.hu/appveyor/version_64
|
QBT_VER_URL: https://builds.shiki.hu/appveyor/version
|
||||||
QBT_LIB_URL: https://builds.shiki.hu/appveyor/qbt_libraries_64.7z
|
QBT_LIB_URL: https://builds.shiki.hu/appveyor/qbt_libraries.7z
|
||||||
|
|
||||||
# project directory
|
# project directory
|
||||||
clone_folder: *REPO_DIR
|
clone_folder: *REPO_DIR
|
||||||
@@ -38,12 +38,12 @@ install:
|
|||||||
appveyor DownloadFile "%QBT_LIB_URL%" -FileName "c:\qbt_lib.7z" && 7z x "c:\qbt_lib.7z" -o"%CACHE_DIR%" > nul &&
|
appveyor DownloadFile "%QBT_LIB_URL%" -FileName "c:\qbt_lib.7z" && 7z x "c:\qbt_lib.7z" -o"%CACHE_DIR%" > nul &&
|
||||||
COPY "c:\version_new" "%CACHE_DIR%\version")
|
COPY "c:\version_new" "%CACHE_DIR%\version")
|
||||||
# Qt stay compressed in cache
|
# Qt stay compressed in cache
|
||||||
- 7z x "%CACHE_DIR%\qt5_64.7z" -o"c:\qbt" > nul
|
- 7z x "%CACHE_DIR%\qt5_32.7z" -o"c:\qbt" > nul
|
||||||
|
|
||||||
before_build:
|
before_build:
|
||||||
# setup env
|
# setup env
|
||||||
- CALL "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64
|
- CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
|
||||||
- SET PATH=%PATH%;C:\Qt\5.15.2\msvc2019_64\bin;%CACHE_DIR%\jom
|
- SET PATH=%PATH%;c:\qbt\qt5_32\bin;%CACHE_DIR%\jom;
|
||||||
# setup project
|
# setup project
|
||||||
- COPY /Y "%CACHE_DIR%\conf.pri" "%REPO_DIR%"
|
- COPY /Y "%CACHE_DIR%\conf.pri" "%REPO_DIR%"
|
||||||
# workarounds
|
# workarounds
|
||||||
@@ -56,38 +56,4 @@ build_script:
|
|||||||
- qmake qbittorrent.pro && cd src && qmake src.pro
|
- qmake qbittorrent.pro && cd src && qmake src.pro
|
||||||
- jom -j2 -f Makefile.Release
|
- jom -j2 -f Makefile.Release
|
||||||
|
|
||||||
after_build:
|
|
||||||
- cd "%REPO_DIR%"
|
|
||||||
- MKDIR upload
|
|
||||||
- COPY dist\windows\qt.conf upload
|
|
||||||
- COPY src\release\qbittorrent.exe upload
|
|
||||||
- COPY src\release\qbittorrent.pdb upload
|
|
||||||
- COPY "%CACHE_DIR%\base\bin\libcrypto-1_1-x64.dll" upload
|
|
||||||
- COPY "%CACHE_DIR%\base\bin\libssl-1_1-x64.dll" upload
|
|
||||||
- COPY "%CACHE_DIR%\base\lib\torrent-rasterbar.dll" upload
|
|
||||||
- COPY "%CACHE_DIR%\base\lib\zlib1.dll" upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Core.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Gui.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Network.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Sql.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Svg.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Widgets.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5WinExtras.dll upload
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\bin\Qt5Xml.dll upload
|
|
||||||
- MKDIR upload\plugins\iconengines
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\iconengines\qsvgicon.dll upload\plugins\iconengines
|
|
||||||
- MKDIR upload\plugins\imageformats
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\imageformats\qico.dll upload\plugins\imageformats
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\imageformats\qsvg.dll upload\plugins\imageformats
|
|
||||||
- MKDIR upload\plugins\platforms
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\platforms\qwindows.dll upload\plugins\platforms
|
|
||||||
- MKDIR upload\plugins\sqldrivers
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers\qsqlite.dll upload\plugins\sqldrivers
|
|
||||||
- MKDIR upload\plugins\styles
|
|
||||||
- COPY C:\Qt\5.15.2\msvc2019_64\plugins\styles\qwindowsvistastyle.dll upload\plugins\styles
|
|
||||||
|
|
||||||
test: off
|
test: off
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: upload
|
|
||||||
name: qBittorrent-Appveyor_Windows-x64
|
|
||||||
|
|||||||
19
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
**Please provide the following information**
|
||||||
|
|
||||||
|
### qBittorrent version and Operating System
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
### If on linux, libtorrent-rasterbar and Qt version
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
### What is the problem
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
### What is the expected behavior
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
### Steps to reproduce
|
||||||
|
(type here)
|
||||||
|
|
||||||
|
### Extra info(if any)
|
||||||
|
(type here)
|
||||||
76
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,76 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: File a bug report to help improve qBittorrent user experience.
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
#### ADVISORY
|
|
||||||
"We do not support any versions older than the current release series"
|
|
||||||
|
|
||||||
"We do not support any 3rd party/forked versions e.g. `portableapps`/`Enhanced Edition`etc."
|
|
||||||
|
|
||||||
"Please post all details in **English**."
|
|
||||||
|
|
||||||
#### Prerequisites before submitting an issue!
|
|
||||||
- Read the issue reporting section in the **[contributing guidelines](https://github.com/qbittorrent/qBittorrent/blob/master/CONTRIBUTING.md)**, to know how to submit a good bug report with the required information.
|
|
||||||
- Verify that the issue is not fixed and is reproducible in the **[latest official qBittorrent version](https://www.qbittorrent.org/download.php).**
|
|
||||||
- (Optional, but recommended) Verify that the issue is not fixed and is reproducible in the latest CI (**[macOS](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_macos.yaml?query=branch%3Amaster+event%3Apush)** / **[Ubuntu](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_ubuntu.yaml?query=branch%3Amaster+event%3Apush)** / **[Windows](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_windows.yaml?query=branch%3Amaster+event%3Apush)**) builds.
|
|
||||||
- Check the **[frequent/common issues list](https://github.com/qbittorrent/qBittorrent/projects/2)** and perform a **[search of the issue tracker (including closed ones)](https://github.com/qbittorrent/qBittorrent/issues)** to avoid posting a duplicate.
|
|
||||||
- Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/qbittorrent/qBittorrent/discussions)**, **[forum](https://qbforums.shiki.hu/)**, or **[subreddit](https://www.reddit.com/r/qBittorrent/)**.
|
|
||||||
- Verify that the **[wiki](https://github.com/qbittorrent/qBittorrent/wiki)** did not contain a suitable solution either.
|
|
||||||
- If relevant to issue/when asked, the qBittorrent preferences file, qBittorrent.log & watched_folders.json (if using "Watched Folders" feature) must be provided.
|
|
||||||
See **[Where does qBittorrent save its settings?](https://github.com/qbittorrent/qBittorrent/wiki/Frequently-Asked-Questions#Where_does_qBittorrent_save_its_settings)**
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: qBittorrent & operating system versions
|
|
||||||
description: |
|
|
||||||
Qt and libtorrent-rasterbar versions are required when: 1. You are using linux. 2. You are not using an official build downloaded from our website.
|
|
||||||
|
|
||||||
Example of preferred formatting:
|
|
||||||
qBittorrent: 4.3.7 x64
|
|
||||||
Operating system: Windows 10 Pro 21H1/2009 x64
|
|
||||||
Qt: 5.15.2
|
|
||||||
libtorrent-rasterbar: 1.2.14
|
|
||||||
placeholder: |
|
|
||||||
qBittorrent:
|
|
||||||
Operating system:
|
|
||||||
Qt:
|
|
||||||
libtorrent-rasterbar:
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: What is the problem?
|
|
||||||
description: Please add the "crash report" (if encountered) or give a clear and concise description of problem.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Steps to reproduce
|
|
||||||
description: Please provide reliable steps to reproduce the problem.
|
|
||||||
placeholder: |
|
|
||||||
1. First step
|
|
||||||
2. Second step
|
|
||||||
3. and so on...
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Additional context
|
|
||||||
description: Add screenshots etc. (Anything that will provide more context about the problem)
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Log(s) & preferences file(s)
|
|
||||||
description: |
|
|
||||||
Add these files: qBittorrent preferences file, qBittorrent.log & watched_folders.json (if using "Watched Folders" feature).
|
|
||||||
See **[Where does qBittorrent save its settings?](https://github.com/qbittorrent/qBittorrent/wiki/Frequently-Asked-Questions#Where_does_qBittorrent_save_its_settings)**
|
|
||||||
#### Note: It's the user's responsibility to redact any sensitive information
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
17
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,17 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Wiki
|
|
||||||
url: "https://github.com/qbittorrent/qBittorrent/wiki/"
|
|
||||||
about: "Consult the wiki first (especially the FAQ), it might already contain the information you are looking for"
|
|
||||||
|
|
||||||
- name: Question
|
|
||||||
url: "https://github.com/qbittorrent/qBittorrent/discussions"
|
|
||||||
about: "Please ask questions related to usage/setup/support/non-issue development discussion in the Discussions section"
|
|
||||||
|
|
||||||
- name: Question
|
|
||||||
url: "http://forum.qbittorrent.org/"
|
|
||||||
about: "Alternatively, ask on the official forum"
|
|
||||||
|
|
||||||
- name: Question
|
|
||||||
url: "https://www.reddit.com/r/qBittorrent/"
|
|
||||||
about: "Alternatively, use the subreddit"
|
|
||||||
37
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,37 +0,0 @@
|
|||||||
name: Feature Request
|
|
||||||
description: Suggest a new feature or enhancement for qBittorrent.
|
|
||||||
labels: ["Feature request"]
|
|
||||||
body:
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
#### ADVISORY
|
|
||||||
|
|
||||||
"Please post all details in **English**."
|
|
||||||
|
|
||||||
#### Prerequisites before submitting a feature request!
|
|
||||||
- Read the feature request section in the **[contributing guidelines](https://github.com/qbittorrent/qBittorrent/blob/master/CONTRIBUTING.md)**, to know how to submit a good feature request with the required information.
|
|
||||||
- Verify that the feature being requested is not available in the **[latest official qBittorrent version](https://www.qbittorrent.org/download.php).**
|
|
||||||
- (Optional but recommended) Verify that the feature being requested is not available in the latest CI (**[macOS](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_macos.yaml?query=branch%3Amaster+event%3Apush)** / **[Ubuntu](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_ubuntu.yaml?query=branch%3Amaster+event%3Apush)** / **[Windows](https://github.com/qbittorrent/qBittorrent/actions/workflows/ci_windows.yaml?query=branch%3Amaster+event%3Apush)**) builds.
|
|
||||||
- Search the issue tracker with the **[feature request filter](https://github.com/qbittorrent/qBittorrent/issues?q=is%3Aopen+is%3Aissue+label%3A%22Feature+request%22)** for similar feature requests (including closed ones) to avoid posting a duplicate.
|
|
||||||
- Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/qbittorrent/qBittorrent/discussions)**, **[forum](https://qbforums.shiki.hu/)**, or **[subreddit](https://www.reddit.com/r/qBittorrent/)**.
|
|
||||||
- Verify that the **[wiki](https://github.com/qbittorrent/qBittorrent/wiki)** did not contain a suitable solution either.
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Suggestion
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Use case
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Extra info/examples/attachments
|
|
||||||
description: Add screenshots etc. (Anything that will give us more context about what is being requested!)
|
|
||||||
validations:
|
|
||||||
required: false
|
|
||||||
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,5 +0,0 @@
|
|||||||
<!--
|
|
||||||
MANDATORY Before submitting your work, make sure you have:
|
|
||||||
1. Read https://github.com/qbittorrent/qBittorrent/blob/master/CONTRIBUTING.md#opening-a-pull-request
|
|
||||||
2. Delete this comment block
|
|
||||||
-->
|
|
||||||
18
.github/SUPPORT.md
vendored
@@ -1,18 +0,0 @@
|
|||||||
# Support Resources
|
|
||||||
|
|
||||||
The issue tracker is only for bug reports/feature requests related to the project itself.
|
|
||||||
|
|
||||||
Please do not use the issue tracker for questions about general program usage,
|
|
||||||
how BitTorrent (the protocol) works in general, etc.
|
|
||||||
|
|
||||||
For such questions, use one of the following community support resources:
|
|
||||||
|
|
||||||
* The [discussions section][discussions-url]
|
|
||||||
|
|
||||||
* The official forum [official forum][forum-url]
|
|
||||||
|
|
||||||
* The [qBittorrent subreddit][subreddit-url]
|
|
||||||
|
|
||||||
[discussions-url]: https://github.com/qbittorrent/qBittorrent/discussions
|
|
||||||
[forum-url]: http://forum.qbittorrent.org/
|
|
||||||
[subreddit-url]: https://www.reddit.com/r/qBittorrent/
|
|
||||||
68
.github/workflows/check_translation_tag.py
vendored
@@ -1,68 +0,0 @@
|
|||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
# A pre-commit hook for detecting problematic <translation> tags
|
|
||||||
# Copyright (C) 2021 Mike Tzou (Chocobo1)
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU General Public License
|
|
||||||
# as published by the Free Software Foundation; either version 2
|
|
||||||
# of the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# In addition, as a special exception, the copyright holders give permission to
|
|
||||||
# link this program with the OpenSSL project's "OpenSSL" library (or with
|
|
||||||
# modified versions of it that use the same license as the "OpenSSL" library),
|
|
||||||
# and distribute the linked executables. You must obey the GNU General Public
|
|
||||||
# License in all respects for all of the code used other than "OpenSSL". If you
|
|
||||||
# modify file(s), you may extend this exception to your version of the file(s),
|
|
||||||
# but you are not obligated to do so. If you do not wish to do so, delete this
|
|
||||||
# exception statement from your version.
|
|
||||||
|
|
||||||
from typing import Optional, Sequence
|
|
||||||
import argparse
|
|
||||||
import re
|
|
||||||
|
|
||||||
def main(argv: Optional[Sequence[str]] = None) -> int:
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument('filenames', nargs='*', help='Filenames to check')
|
|
||||||
args = parser.parse_args(argv)
|
|
||||||
|
|
||||||
error_msg = ""
|
|
||||||
regex = re.compile(r"\s*</translation>")
|
|
||||||
|
|
||||||
for filename in args.filenames:
|
|
||||||
line_counter = 1
|
|
||||||
error_buffer = ""
|
|
||||||
|
|
||||||
with open(filename) as file:
|
|
||||||
try:
|
|
||||||
for line in file:
|
|
||||||
if (match := regex.match(line)) is not None:
|
|
||||||
error_buffer += str(f"Defect file: \"{filename}\"\n"
|
|
||||||
f"Line: {line_counter}\n"
|
|
||||||
f"Column span: {match.span()}\n"
|
|
||||||
f"Part: \"{match.group()}\"\n\n")
|
|
||||||
line_counter += 1
|
|
||||||
|
|
||||||
except UnicodeDecodeError as error:
|
|
||||||
# not a text file, skip
|
|
||||||
continue
|
|
||||||
|
|
||||||
error_msg += error_buffer
|
|
||||||
|
|
||||||
if len(error_msg) > 0:
|
|
||||||
print(error_msg)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
exit(main())
|
|
||||||
240
.github/workflows/ci.yaml
vendored
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
name: GitHub Actions CI
|
||||||
|
|
||||||
|
# Cache is used for all Windows and macOS dependencies (size approx. 1230 * 2 + 1850 = 4310 MiB)
|
||||||
|
# Cache is not used for Ubuntu builds, because it already has all dependencies except
|
||||||
|
# the appropriate libtorrent version, which only takes 3-5 minutes to build from source anyway
|
||||||
|
|
||||||
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
env:
|
||||||
|
VCPKG_COMMIT: e4ce66eecfd3e5cca5eac06c971921bf8e37cf88
|
||||||
|
VCPKG_DEST_MACOS: /Users/runner/qbt_tools/vcpkg
|
||||||
|
VCPKG_DEST_WIN: C:\qbt_tools\vcpkg
|
||||||
|
LIBTORRENT_VERSION_TAG: v1.2.12
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
ci_ubuntu:
|
||||||
|
name: Ubuntu
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-20.04]
|
||||||
|
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: install all build dependencies except libtorrent from Ubuntu repos
|
||||||
|
run: |
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install \
|
||||||
|
build-essential cmake git ninja-build pkg-config \
|
||||||
|
libssl-dev libgeoip-dev zlib1g-dev \
|
||||||
|
libboost-dev libboost-chrono-dev libboost-random-dev libboost-system-dev \
|
||||||
|
libqt5svg5-dev qtbase5-dev qttools5-dev
|
||||||
|
|
||||||
|
- name: install libtorrent from source
|
||||||
|
run: |
|
||||||
|
git clone https://github.com/arvidn/libtorrent && cd libtorrent
|
||||||
|
git checkout ${{ env.LIBTORRENT_VERSION_TAG }}
|
||||||
|
cmake -B cmake-build-dir -G "Ninja" \
|
||||||
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-Ddeprecated-functions=OFF \
|
||||||
|
--graphviz=cmake-build-dir/target_graph.dot
|
||||||
|
cmake --build cmake-build-dir
|
||||||
|
sudo cmake --install cmake-build-dir --prefix /usr/local
|
||||||
|
|
||||||
|
- name: build qBittorrent
|
||||||
|
run: |
|
||||||
|
cmake -B build -G "Ninja" \
|
||||||
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-D${{ matrix.qbt_gui }} \
|
||||||
|
-DVERBOSE_CONFIGURE=ON \
|
||||||
|
--graphviz=build/target_graph.dot
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
- name: upload artifact as zip
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: qBittorrent-CI_${{ matrix.os }}-x64_${{ matrix.qbt_gui }}
|
||||||
|
path: |
|
||||||
|
build/compile_commands.json
|
||||||
|
build/target_graph.dot
|
||||||
|
build/qbittorrent
|
||||||
|
build/qbittorrent-nox
|
||||||
|
libtorrent/cmake-build-dir/compile_commands.json
|
||||||
|
libtorrent/cmake-build-dir/target_graph.dot
|
||||||
|
|
||||||
|
ci_windows:
|
||||||
|
name: Windows + vcpkg
|
||||||
|
|
||||||
|
runs-on: windows-2019
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
||||||
|
- name: install additional required packages with chocolatey
|
||||||
|
run: |
|
||||||
|
choco install ninja
|
||||||
|
|
||||||
|
- name: setup vcpkg (cached, if possible)
|
||||||
|
uses: lukka/run-vcpkg@v4
|
||||||
|
with:
|
||||||
|
vcpkgDirectory: ${{ env.VCPKG_DEST_WIN }}
|
||||||
|
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
||||||
|
setupOnly: true
|
||||||
|
|
||||||
|
# Tell vcpkg to only build Release variants of the dependencies
|
||||||
|
- name: configure vcpkg triplet overlay for release builds only
|
||||||
|
run: |
|
||||||
|
New-Item -Path ${{ github.workspace }} -Name "triplets_overlay" -ItemType Directory
|
||||||
|
Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-windows-static.cmake `
|
||||||
|
${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake
|
||||||
|
Add-Content ${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake `
|
||||||
|
-Value "set(VCPKG_BUILD_TYPE release)"
|
||||||
|
|
||||||
|
# clear buildtrees after each package installation to reduce disk space requirements
|
||||||
|
- name: install dependencies via vcpkg
|
||||||
|
run: |
|
||||||
|
$packages = `
|
||||||
|
"boost-circular-buffer:x64-windows-static-release",
|
||||||
|
"libtorrent:x64-windows-static-release",
|
||||||
|
"qt5-base:x64-windows-static-release",
|
||||||
|
"qt5-svg:x64-windows-static-release",
|
||||||
|
"qt5-tools:x64-windows-static-release",
|
||||||
|
"qt5-winextras:x64-windows-static-release"
|
||||||
|
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe upgrade `
|
||||||
|
--overlay-triplets=${{ github.workspace }}/triplets_overlay `
|
||||||
|
--overlay-ports=${{ github.workspace }}/vcpkg `
|
||||||
|
--no-dry-run
|
||||||
|
foreach($package in $packages)
|
||||||
|
{
|
||||||
|
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe install $package `
|
||||||
|
--overlay-triplets=${{ github.workspace }}/triplets_overlay `
|
||||||
|
--overlay-ports=${{ github.workspace }}/vcpkg `
|
||||||
|
--clean-after-build
|
||||||
|
}
|
||||||
|
|
||||||
|
# NOTE: this is necessary to correctly find and use cl.exe with the Ninja generator for now
|
||||||
|
- name: setup devcmd
|
||||||
|
uses: ilammy/msvc-dev-cmd@v1
|
||||||
|
|
||||||
|
- name: build qBittorrent
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
cmake -B build -G "Ninja" ^
|
||||||
|
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo ^
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_DEST_WIN }}\scripts\buildsystems\vcpkg.cmake ^
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-windows-static-release ^
|
||||||
|
-DVERBOSE_CONFIGURE=ON ^
|
||||||
|
-DMSVC_RUNTIME_DYNAMIC=OFF ^
|
||||||
|
--graphviz=build\target_graph.dot
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
- name: upload artifact as zip
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: qBittorrent-CI_Windows-x64
|
||||||
|
path: |
|
||||||
|
build/compile_commands.json
|
||||||
|
build/target_graph.dot
|
||||||
|
build/qbittorrent.exe
|
||||||
|
build/qbittorrent.pdb
|
||||||
|
dist/windows/qt.conf
|
||||||
|
|
||||||
|
ci_macos:
|
||||||
|
name: macOS + vcpkg
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
||||||
|
fail-fast: false
|
||||||
|
|
||||||
|
runs-on: macos-10.15
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# - ninja is needed for building qBittorrent (because it's preferrable, not a hard requirement)
|
||||||
|
# - automake is needed for the installation the vcpkg installation of fontconfig, a dependency of qt5-base
|
||||||
|
- name: install additional required packages with homebrew
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
brew install automake ninja
|
||||||
|
|
||||||
|
- name: setup vcpkg (cached, if possible)
|
||||||
|
uses: lukka/run-vcpkg@v4
|
||||||
|
with:
|
||||||
|
vcpkgDirectory: ${{ env.VCPKG_DEST_MACOS }}
|
||||||
|
vcpkgGitCommitId: ${{ env.VCPKG_COMMIT }}
|
||||||
|
setupOnly: true
|
||||||
|
|
||||||
|
- name: configure vcpkg triplet overlay for release builds only
|
||||||
|
run: |
|
||||||
|
New-Item -Path ${{ github.workspace }} -Name "triplets_overlay" -ItemType Directory
|
||||||
|
Copy-Item ${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-osx.cmake `
|
||||||
|
${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake
|
||||||
|
Add-Content ${{ github.workspace }}/triplets_overlay/x64-osx-release.cmake `
|
||||||
|
-Value "set(VCPKG_BUILD_TYPE release)","set(VCPKG_OSX_DEPLOYMENT_TARGET 10.15)"
|
||||||
|
|
||||||
|
- name: install dependencies via vcpkg
|
||||||
|
run: |
|
||||||
|
$packages = `
|
||||||
|
"boost-circular-buffer:x64-osx-release",
|
||||||
|
"libtorrent:x64-osx-release",
|
||||||
|
"qt5-base:x64-osx-release",
|
||||||
|
"qt5-svg:x64-osx-release",
|
||||||
|
"qt5-tools:x64-osx-release",
|
||||||
|
"qt5-macextras:x64-osx-release"
|
||||||
|
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg upgrade `
|
||||||
|
--overlay-triplets=${{ github.workspace }}/triplets_overlay `
|
||||||
|
--overlay-ports=${{ github.workspace }}/vcpkg `
|
||||||
|
--no-dry-run
|
||||||
|
foreach($package in $packages)
|
||||||
|
{
|
||||||
|
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg install $package `
|
||||||
|
--overlay-triplets=${{ github.workspace }}/triplets_overlay `
|
||||||
|
--overlay-ports=${{ github.workspace }}/vcpkg `
|
||||||
|
--clean-after-build
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: build qBittorrent
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake -B build -G "Ninja" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=${{ env.VCPKG_DEST_MACOS }}/scripts/buildsystems/vcpkg.cmake \
|
||||||
|
-DVCPKG_TARGET_TRIPLET=x64-osx-release \
|
||||||
|
-D${{ matrix.qbt_gui }} \
|
||||||
|
-DVERBOSE_CONFIGURE=ON \
|
||||||
|
--graphviz=build/target_graph.dot
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
- name: upload artifact as zip
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: qBittorrent-CI_macOS_${{ matrix.qbt_gui }}
|
||||||
|
path: |
|
||||||
|
build/compile_commands.json
|
||||||
|
build/target_graph.dot
|
||||||
|
build/qbittorrent.app
|
||||||
|
build/qbittorrent-nox.app
|
||||||
17
.github/workflows/ci_file_health.yaml
vendored
@@ -1,17 +0,0 @@
|
|||||||
name: CI - File health
|
|
||||||
|
|
||||||
on: [pull_request, push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: Check
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
uses: actions/setup-python@v2
|
|
||||||
|
|
||||||
- name: Check files
|
|
||||||
uses: pre-commit/action@v2.0.3
|
|
||||||
104
.github/workflows/ci_macos.yaml
vendored
@@ -1,104 +0,0 @@
|
|||||||
name: CI - macOS
|
|
||||||
on: [pull_request, push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: Build
|
|
||||||
runs-on: macos-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
libt_version: ["2.0.5", "1.2.15"]
|
|
||||||
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
|
||||||
qt_version: ["5.15.2", "6.2.0"]
|
|
||||||
exclude:
|
|
||||||
- libt_version: "1.2.15"
|
|
||||||
qt_version: "6.2.0"
|
|
||||||
|
|
||||||
env:
|
|
||||||
openssl_root: /usr/local/opt/openssl@1.1
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
brew update > /dev/null
|
|
||||||
brew install \
|
|
||||||
cmake ninja \
|
|
||||||
boost openssl@1.1 zlib
|
|
||||||
|
|
||||||
- name: Setup ccache
|
|
||||||
uses: Chocobo1/setup-ccache-action@v1
|
|
||||||
with:
|
|
||||||
update_packager_index: false
|
|
||||||
|
|
||||||
- name: Install Qt
|
|
||||||
uses: jurplel/install-qt-action@v2
|
|
||||||
with:
|
|
||||||
version: ${{ matrix.qt_version }}
|
|
||||||
|
|
||||||
- name: Install libtorrent
|
|
||||||
run: |
|
|
||||||
git clone \
|
|
||||||
--branch v${{ matrix.libt_version }} \
|
|
||||||
--depth 1 \
|
|
||||||
--recurse-submodules \
|
|
||||||
https://github.com/arvidn/libtorrent.git
|
|
||||||
cd libtorrent
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-Ddeprecated-functions=OFF \
|
|
||||||
-DOPENSSL_ROOT_DIR="${{ env.openssl_root }}"
|
|
||||||
cmake --build build
|
|
||||||
sudo cmake --install build
|
|
||||||
|
|
||||||
- name: Build qBittorrent (Qt5)
|
|
||||||
if: ${{ startsWith(matrix.qt_version, 5) }}
|
|
||||||
run: |
|
|
||||||
lupdate -extensions c,cpp,h,hpp,ui ./
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" \
|
|
||||||
-DVERBOSE_CONFIGURE=ON \
|
|
||||||
-D${{ matrix.qbt_gui }}
|
|
||||||
cmake --build build
|
|
||||||
|
|
||||||
- name: Build qBittorrent (Qt6)
|
|
||||||
if: ${{ startsWith(matrix.qt_version, 6) }}
|
|
||||||
run: |
|
|
||||||
lupdate -extensions c,cpp,h,hpp,ui ./
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-DOPENSSL_ROOT_DIR="${{ env.openssl_root }}" \
|
|
||||||
-DQT6=ON \
|
|
||||||
-DVERBOSE_CONFIGURE=ON \
|
|
||||||
-D${{ matrix.qbt_gui }}
|
|
||||||
cmake --build build
|
|
||||||
|
|
||||||
- name: Prepare build artifacts
|
|
||||||
run: |
|
|
||||||
mkdir upload
|
|
||||||
mv build/qbittorrent*.app upload
|
|
||||||
mkdir upload/cmake
|
|
||||||
cp build/compile_commands.json upload/cmake
|
|
||||||
mkdir upload/cmake/libtorrent
|
|
||||||
cp libtorrent/build/compile_commands.json upload/cmake/libtorrent
|
|
||||||
|
|
||||||
- name: Upload build artifacts
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: qBittorrent-CI_macOS_${{ matrix.qbt_gui }}_libtorrent-${{ matrix.libt_version }}_Qt-${{ matrix.qt_version }}
|
|
||||||
path: upload
|
|
||||||
102
.github/workflows/ci_ubuntu.yaml
vendored
@@ -1,102 +0,0 @@
|
|||||||
name: CI - Ubuntu
|
|
||||||
on: [pull_request, push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
libt_version: ["2.0.5", "1.2.15"]
|
|
||||||
qbt_gui: ["GUI=ON", "GUI=OFF"]
|
|
||||||
qt_version: ["5.15.2", "6.2.0"]
|
|
||||||
exclude:
|
|
||||||
- libt_version: "1.2.15"
|
|
||||||
qt_version: "6.2.0"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install \
|
|
||||||
build-essential cmake ninja-build pkg-config \
|
|
||||||
libboost-dev libssl-dev zlib1g-dev
|
|
||||||
|
|
||||||
- name: Setup ccache
|
|
||||||
uses: Chocobo1/setup-ccache-action@v1
|
|
||||||
with:
|
|
||||||
update_packager_index: false
|
|
||||||
ccache_options: |
|
|
||||||
max_size=2G
|
|
||||||
|
|
||||||
- name: Install Qt
|
|
||||||
uses: jurplel/install-qt-action@v2
|
|
||||||
with:
|
|
||||||
version: ${{ matrix.qt_version }}
|
|
||||||
|
|
||||||
- name: Install libtorrent
|
|
||||||
run: |
|
|
||||||
git clone \
|
|
||||||
--branch v${{ matrix.libt_version }} \
|
|
||||||
--depth 1 \
|
|
||||||
--recurse-submodules \
|
|
||||||
https://github.com/arvidn/libtorrent.git
|
|
||||||
cd libtorrent
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-Ddeprecated-functions=OFF
|
|
||||||
cmake --build build
|
|
||||||
sudo cmake --install build
|
|
||||||
|
|
||||||
- name: Build qBittorrent (Qt5)
|
|
||||||
if: ${{ startsWith(matrix.qt_version, 5) }}
|
|
||||||
run: |
|
|
||||||
lupdate -extensions c,cpp,h,hpp,ui ./
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
|
||||||
-DVERBOSE_CONFIGURE=ON \
|
|
||||||
-D${{ matrix.qbt_gui }}
|
|
||||||
cmake --build build
|
|
||||||
DESTDIR="qbittorrent" cmake --install build
|
|
||||||
|
|
||||||
- name: Build qBittorrent (Qt6)
|
|
||||||
if: ${{ startsWith(matrix.qt_version, 6) }}
|
|
||||||
run: |
|
|
||||||
lupdate -extensions c,cpp,h,hpp,ui ./
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX="/usr" \
|
|
||||||
-DQT6=ON \
|
|
||||||
-DVERBOSE_CONFIGURE=ON \
|
|
||||||
-D${{ matrix.qbt_gui }}
|
|
||||||
cmake --build build
|
|
||||||
DESTDIR="qbittorrent" cmake --install build
|
|
||||||
|
|
||||||
- name: Prepare build artifacts
|
|
||||||
run: |
|
|
||||||
mkdir upload
|
|
||||||
mkdir upload/cmake
|
|
||||||
cp build/compile_commands.json upload/cmake
|
|
||||||
mkdir upload/cmake/libtorrent
|
|
||||||
cp libtorrent/build/compile_commands.json upload/cmake/libtorrent
|
|
||||||
|
|
||||||
- name: Upload build artifacts
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: build-info_ubuntu-20.04-x64_${{ matrix.qbt_gui }}_libtorrent-${{ matrix.libt_version }}_Qt-${{ matrix.qt_version }}
|
|
||||||
path: upload
|
|
||||||
32
.github/workflows/ci_webui.yaml
vendored
@@ -1,32 +0,0 @@
|
|||||||
name: CI - WebUI
|
|
||||||
|
|
||||||
on: [pull_request, push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: Check
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: src/webui/www
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup nodejs
|
|
||||||
uses: actions/setup-node@v2
|
|
||||||
with:
|
|
||||||
node-version: 'lts/*'
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Lint code
|
|
||||||
run: npm run lint
|
|
||||||
|
|
||||||
- name: Format code
|
|
||||||
run: |
|
|
||||||
npm run format
|
|
||||||
git diff --exit-code
|
|
||||||
154
.github/workflows/ci_windows.yaml
vendored
@@ -1,154 +0,0 @@
|
|||||||
name: CI - Windows
|
|
||||||
on: [pull_request, push]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
ci:
|
|
||||||
name: Build
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
libt_version: ["2.0.5", "1.2.15"]
|
|
||||||
|
|
||||||
env:
|
|
||||||
boost_path: "${{ github.workspace }}/../boost"
|
|
||||||
libtorrent_path: "${{ github.workspace }}/libtorrent"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup devcmd
|
|
||||||
uses: ilammy/msvc-dev-cmd@v1
|
|
||||||
|
|
||||||
- name: Install build tools
|
|
||||||
run: |
|
|
||||||
choco install ninja
|
|
||||||
|
|
||||||
# use the preinstalled vcpkg from image
|
|
||||||
# https://github.com/actions/virtual-environments/blob/main/images/win/Windows2019-Readme.md#package-management
|
|
||||||
- name: Setup vcpkg
|
|
||||||
uses: lukka/run-vcpkg@v7
|
|
||||||
with:
|
|
||||||
vcpkgDirectory: C:/vcpkg
|
|
||||||
doNotUpdateVcpkg: true # the preinstalled vcpkg is updated regularly
|
|
||||||
setupOnly: true
|
|
||||||
|
|
||||||
- name: Install dependencies from vcpkg
|
|
||||||
run: |
|
|
||||||
# tell vcpkg to only build Release variants of the dependencies
|
|
||||||
New-Item `
|
|
||||||
-Path "${{ github.workspace }}" `
|
|
||||||
-Name "triplets_overlay" `
|
|
||||||
-ItemType Directory
|
|
||||||
Copy-Item `
|
|
||||||
"${{ env.RUNVCPKG_VCPKG_ROOT }}/triplets/x64-windows-static.cmake" `
|
|
||||||
"${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake"
|
|
||||||
Add-Content `
|
|
||||||
"${{ github.workspace }}/triplets_overlay/x64-windows-static-release.cmake" `
|
|
||||||
-Value "set(VCPKG_BUILD_TYPE release)"
|
|
||||||
# clear buildtrees after each package installation to reduce disk space requirements
|
|
||||||
$packages = `
|
|
||||||
"openssl:x64-windows-static-release",
|
|
||||||
"zlib:x64-windows-static-release"
|
|
||||||
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe upgrade `
|
|
||||||
--overlay-triplets="${{ github.workspace }}/triplets_overlay" `
|
|
||||||
--no-dry-run
|
|
||||||
${{ env.RUNVCPKG_VCPKG_ROOT }}/vcpkg.exe install `
|
|
||||||
--overlay-triplets="${{ github.workspace }}/triplets_overlay" `
|
|
||||||
--clean-after-build `
|
|
||||||
$packages
|
|
||||||
|
|
||||||
- name: Install boost
|
|
||||||
run: |
|
|
||||||
aria2c `
|
|
||||||
"https://boostorg.jfrog.io/artifactory/main/release/1.76.0/source/boost_1_76_0.7z" `
|
|
||||||
-d "${{ runner.temp }}" `
|
|
||||||
-o "boost.7z"
|
|
||||||
7z x "${{ runner.temp }}/boost.7z" -o"${{ github.workspace }}/.."
|
|
||||||
move "${{ github.workspace }}/../boost_*" "${{ env.boost_path }}"
|
|
||||||
|
|
||||||
- name: Install Qt
|
|
||||||
uses: jurplel/install-qt-action@v2
|
|
||||||
with:
|
|
||||||
version: "5.15.2"
|
|
||||||
|
|
||||||
- name: Install libtorrent
|
|
||||||
run: |
|
|
||||||
git clone `
|
|
||||||
--branch v${{ matrix.libt_version }} `
|
|
||||||
--depth 1 `
|
|
||||||
--recurse-submodules `
|
|
||||||
https://github.com/arvidn/libtorrent.git
|
|
||||||
cd libtorrent
|
|
||||||
cmake `
|
|
||||||
-B build `
|
|
||||||
-G "Ninja" `
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo `
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON `
|
|
||||||
-DCMAKE_INSTALL_PREFIX="${{ env.libtorrent_path }}" `
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" `
|
|
||||||
-DBOOST_ROOT="${{ env.boost_path }}" `
|
|
||||||
-DBUILD_SHARED_LIBS=OFF `
|
|
||||||
-Ddeprecated-functions=OFF `
|
|
||||||
-Dstatic_runtime=ON `
|
|
||||||
-DVCPKG_TARGET_TRIPLET=x64-windows-static-release
|
|
||||||
cmake --build build
|
|
||||||
cmake --install build
|
|
||||||
|
|
||||||
- name: Build qBittorrent
|
|
||||||
run: |
|
|
||||||
lupdate -extensions c,cpp,h,hpp,ui .
|
|
||||||
cmake `
|
|
||||||
-B build `
|
|
||||||
-G "Ninja" `
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo `
|
|
||||||
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON `
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" `
|
|
||||||
-DBOOST_ROOT="${{ env.boost_path }}" `
|
|
||||||
-DLibtorrentRasterbar_DIR="${{ env.libtorrent_path }}/lib/cmake/LibtorrentRasterbar" `
|
|
||||||
-DMSVC_RUNTIME_DYNAMIC=OFF `
|
|
||||||
-DVCPKG_TARGET_TRIPLET=x64-windows-static-release `
|
|
||||||
-DVERBOSE_CONFIGURE=ON `
|
|
||||||
--graphviz=build/target_graph.dot
|
|
||||||
cmake --build build
|
|
||||||
|
|
||||||
- name: Prepare build artifacts
|
|
||||||
run: |
|
|
||||||
mkdir upload
|
|
||||||
copy build/qbittorrent.exe upload
|
|
||||||
copy build/qbittorrent.pdb upload
|
|
||||||
copy dist/windows/qt.conf upload
|
|
||||||
# runtimes
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Core.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Gui.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Network.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Sql.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Svg.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Widgets.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5WinExtras.dll" upload
|
|
||||||
copy "${{ env.Qt5_DIR }}/bin/Qt5Xml.dll" upload
|
|
||||||
mkdir upload/plugins/iconengines
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/iconengines/qsvgicon.dll" upload/plugins/iconengines
|
|
||||||
mkdir upload/plugins/imageformats
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/imageformats/qico.dll" upload/plugins/imageformats
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/imageformats/qsvg.dll" upload/plugins/imageformats
|
|
||||||
mkdir upload/plugins/platforms
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/platforms/qwindows.dll" upload/plugins/platforms
|
|
||||||
mkdir upload/plugins/sqldrivers
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/sqldrivers/qsqlite.dll" upload/plugins/sqldrivers
|
|
||||||
mkdir upload/plugins/styles
|
|
||||||
copy "${{ env.Qt5_DIR }}/plugins/styles/qwindowsvistastyle.dll" upload/plugins/styles
|
|
||||||
# cmake additionals
|
|
||||||
mkdir upload/cmake
|
|
||||||
copy build/compile_commands.json upload/cmake
|
|
||||||
copy build/target_graph.dot upload/cmake
|
|
||||||
mkdir upload/cmake/libtorrent
|
|
||||||
copy libtorrent/build/compile_commands.json upload/cmake/libtorrent
|
|
||||||
|
|
||||||
- name: Upload build artifacts
|
|
||||||
uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: qBittorrent-CI_Windows-x64_libtorrent-${{ matrix.libt_version }}
|
|
||||||
path: upload
|
|
||||||
74
.github/workflows/coverity-scan.yml
vendored
@@ -1,74 +0,0 @@
|
|||||||
name: Coverity Scan
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 1 * *' # Monthly (1st day of month at midnight)
|
|
||||||
workflow_dispatch: # Mainly for testing. Don't forget the Coverity usage limits.
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
coverity_scan:
|
|
||||||
name: Scan
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install \
|
|
||||||
build-essential cmake ninja-build pkg-config \
|
|
||||||
libboost-dev libssl-dev zlib1g-dev
|
|
||||||
|
|
||||||
- name: Install Qt
|
|
||||||
uses: jurplel/install-qt-action@v2
|
|
||||||
with:
|
|
||||||
version: "5.15.2"
|
|
||||||
|
|
||||||
- name: Install libtorrent
|
|
||||||
run: |
|
|
||||||
git clone \
|
|
||||||
--branch "v2.0.5" \
|
|
||||||
--depth 1 \
|
|
||||||
--recurse-submodules \
|
|
||||||
https://github.com/arvidn/libtorrent.git
|
|
||||||
cd libtorrent
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-Ddeprecated-functions=OFF
|
|
||||||
cmake --build build
|
|
||||||
sudo cmake --install build
|
|
||||||
|
|
||||||
- name: Download Coverity Build Tool
|
|
||||||
run: |
|
|
||||||
wget \
|
|
||||||
-q \
|
|
||||||
https://scan.coverity.com/download/linux64 \
|
|
||||||
--post-data "token=${{ secrets.COVERITY_SCAN_TOKEN }}&project=qbittorrent%2FqBittorrent" \
|
|
||||||
-O coverity_tool.tgz
|
|
||||||
mkdir coverity_tool
|
|
||||||
tar xzf coverity_tool.tgz --strip 1 -C coverity_tool
|
|
||||||
|
|
||||||
- name: Build qBittorrent
|
|
||||||
run: |
|
|
||||||
cmake \
|
|
||||||
-B build \
|
|
||||||
-G "Ninja" \
|
|
||||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
|
|
||||||
-DGUI=ON \
|
|
||||||
-DVERBOSE_CONFIGURE=ON
|
|
||||||
export PATH="$(pwd)/coverity_tool/bin:$PATH"
|
|
||||||
cov-build --dir cov-int cmake --build build
|
|
||||||
|
|
||||||
- name: Submit the result to Coverity Scan
|
|
||||||
run: |
|
|
||||||
tar caf qbittorrent.xz cov-int
|
|
||||||
curl \
|
|
||||||
--form token="${{ secrets.COVERITY_SCAN_TOKEN }}" \
|
|
||||||
--form email=sledgehammer999@qbittorrent.org \
|
|
||||||
--form file=@qbittorrent.xz \
|
|
||||||
--form version="$(git rev-parse --short HEAD)" \
|
|
||||||
--form description="master" \
|
|
||||||
https://scan.coverity.com/builds?project=qbittorrent%2FqBittorrent
|
|
||||||
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;
|
||||||
22
.github/workflows/file_health.yaml
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
name: GitHub Actions file health check
|
||||||
|
|
||||||
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
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
|
||||||
22
.github/workflows/stale_bot.yaml
vendored
@@ -1,22 +0,0 @@
|
|||||||
name: Stale bot
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 0 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
stale:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Mark and close stale PRs
|
|
||||||
uses: actions/stale@v4
|
|
||||||
with:
|
|
||||||
stale-pr-message: "This PR is stale because it has been 60 days with no activity. This PR will be automatically closed within 7 days if there is no further activity."
|
|
||||||
close-pr-message: "This PR was closed because it has been stalled for some time with no activity."
|
|
||||||
days-before-stale: -1 # avoid marking issues
|
|
||||||
days-before-pr-stale: 60
|
|
||||||
days-before-close: -1 # avoid closing issues
|
|
||||||
days-before-pr-close: 7
|
|
||||||
exempt-all-pr-assignees: true # avoid stale for all PR with assignees
|
|
||||||
exempt-all-pr-milestones: true # avoid stale for all PR with milestones
|
|
||||||
operations-per-run: 200
|
|
||||||
31
.github/workflows/webui_ci.yaml
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
name: WebUI CI
|
||||||
|
|
||||||
|
on: [pull_request, push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_webui:
|
||||||
|
name: Check WebUI
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: src/webui/www
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: setup nodejs
|
||||||
|
uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
|
||||||
|
- name: install tools
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: lint code
|
||||||
|
run: npm run lint
|
||||||
|
|
||||||
|
- name: format code
|
||||||
|
run: |
|
||||||
|
npm run format
|
||||||
|
git diff --exit-code
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
repos:
|
|
||||||
- repo: local
|
|
||||||
hooks:
|
|
||||||
- id: check-translation-tag
|
|
||||||
name: Check newline characters in <translation> tag
|
|
||||||
entry: .github/workflows/check_translation_tag.py
|
|
||||||
language: script
|
|
||||||
types_or:
|
|
||||||
- ts
|
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks.git
|
|
||||||
rev: v4.0.1
|
|
||||||
hooks:
|
|
||||||
- id: check-json
|
|
||||||
name: Check JSON files
|
|
||||||
|
|
||||||
- id: check-yaml
|
|
||||||
name: Check YAML files
|
|
||||||
|
|
||||||
- id: fix-byte-order-marker
|
|
||||||
name: Check file encoding (UTF-8 without BOM)
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
src/base/unicodestrings.h
|
|
||||||
)$
|
|
||||||
|
|
||||||
- id: mixed-line-ending
|
|
||||||
name: Check line ending character (LF)
|
|
||||||
args: ["--fix=lf"]
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
compile_commands.json |
|
|
||||||
src/webui/www/private/scripts/lib/.*
|
|
||||||
)$
|
|
||||||
|
|
||||||
- id: end-of-file-fixer
|
|
||||||
name: Check trailing newlines
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
compile_commands.json |
|
|
||||||
configure |
|
|
||||||
src/webui/www/private/scripts/lib/.*
|
|
||||||
)$
|
|
||||||
exclude_types:
|
|
||||||
- svg
|
|
||||||
- ts
|
|
||||||
|
|
||||||
- id: trailing-whitespace
|
|
||||||
name: Check trailing whitespaces
|
|
||||||
exclude: |
|
|
||||||
(?x)^(
|
|
||||||
src/webui/www/private/scripts/lib/.*
|
|
||||||
)$
|
|
||||||
exclude_types:
|
|
||||||
- ts
|
|
||||||
188
.travis.yml
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
language: cpp
|
||||||
|
|
||||||
|
os:
|
||||||
|
- linux
|
||||||
|
- osx
|
||||||
|
|
||||||
|
dist: focal
|
||||||
|
osx_image: xcode12.2
|
||||||
|
|
||||||
|
env:
|
||||||
|
matrix:
|
||||||
|
- libt_branch=RC_1_2 gui=true build_system=qmake
|
||||||
|
- libt_branch=RC_1_2 gui=false build_system=qmake
|
||||||
|
- libt_branch=RC_1_2 gui=true build_system=cmake
|
||||||
|
- libt_branch=RC_1_2 gui=false build_system=cmake
|
||||||
|
global:
|
||||||
|
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
||||||
|
- coverity_branch: coverity_scan
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
include:
|
||||||
|
- env: libt_branch=RC_2_0 gui=true build_system=qmake
|
||||||
|
os: linux
|
||||||
|
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
on_success: change
|
||||||
|
on_failure: change
|
||||||
|
|
||||||
|
cache:
|
||||||
|
ccache: true
|
||||||
|
directories:
|
||||||
|
- $HOME/travis/deb
|
||||||
|
- $HOME/travis/brew
|
||||||
|
|
||||||
|
addons:
|
||||||
|
coverity_scan:
|
||||||
|
project:
|
||||||
|
name: "qbittorrent/qBittorrent"
|
||||||
|
description: "Build submitted via Travis CI"
|
||||||
|
build_command_prepend: "./bootstrap.sh && ./configure $qmake_conf"
|
||||||
|
build_command: "make -j2"
|
||||||
|
branch_pattern: $coverity_branch
|
||||||
|
notification_email: sledgehammer999@qbittorrent.org
|
||||||
|
apt:
|
||||||
|
sources:
|
||||||
|
# sources list: https://github.com/travis-ci/apt-source-safelist/blob/master/ubuntu.json
|
||||||
|
- sourceline: 'deb https://apt.kitware.com/ubuntu/ focal main'
|
||||||
|
key_url: 'https://apt.kitware.com/keys/kitware-archive-latest.asc'
|
||||||
|
packages:
|
||||||
|
# packages list: https://github.com/travis-ci/apt-package-safelist/blob/master/ubuntu-trusty
|
||||||
|
- [autoconf, automake, cmake, colormake]
|
||||||
|
- [libboost-dev, libboost-system-dev]
|
||||||
|
- libssl-dev
|
||||||
|
- [qtbase5-dev, libqt5svg5-dev, qttools5-dev]
|
||||||
|
- zlib1g-dev
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
# only allow specific build for coverity scan, others will stop
|
||||||
|
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [ "$TRAVIS_OS_NAME" = "linux" -a "$libt_branch" = "RC_1_2" -a "$gui" = "true" -a "$build_system" = "qmake" ]; then exit ; fi
|
||||||
|
|
||||||
|
- shopt -s expand_aliases
|
||||||
|
- alias make="colormake -j2" # Using nprocs/2 sometimes may fail (gcc is killed by system)
|
||||||
|
- qbt_path="$HOME/qbt_install"
|
||||||
|
- qmake_conf="$qmake_conf --prefix=$qbt_path"
|
||||||
|
- cmake_conf="$cmake_conf -DCMAKE_INSTALL_PREFIX=$qbt_path"
|
||||||
|
|
||||||
|
# options for specific branches
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
|
||||||
|
# setup virtual display for after_success target
|
||||||
|
if [ "$gui" = "true" ]; then export "DISPLAY=:99.0" && /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 ; fi ;
|
||||||
|
# CMake from Kitware is installed in /usr/bin
|
||||||
|
# TravisCI installs its own cmake to another location which ovverides other installations
|
||||||
|
# if they don't call the new binary directly
|
||||||
|
alias cmake="/usr/bin/cmake"
|
||||||
|
|
||||||
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib"
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
|
CXXFLAGS="$CXXFLAGS -Wno-unused-local-typedefs"
|
||||||
|
|
||||||
|
openssl_root_path="/usr/local/opt/openssl"
|
||||||
|
qmake_conf="$qmake_conf PKG_CONFIG_PATH=$openssl_root_path/lib/pkgconfig:$PKG_CONFIG_PATH"
|
||||||
|
cmake_conf="$cmake_conf -DOPENSSL_ROOT_DIR=$openssl_root_path"
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$gui" = "false" ]; then
|
||||||
|
qmake_conf="$qmake_conf --disable-gui"
|
||||||
|
cmake_conf="$cmake_conf -DGUI=OFF"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# print settings
|
||||||
|
- echo $libt_branch
|
||||||
|
- echo $gui
|
||||||
|
- echo $build_system
|
||||||
|
- echo $qmake_conf
|
||||||
|
- echo $cmake_conf
|
||||||
|
|
||||||
|
install:
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
|
# dependencies
|
||||||
|
PATH="/usr/local/opt/ccache/libexec:$PATH"
|
||||||
|
|
||||||
|
brew update > /dev/null
|
||||||
|
brew upgrade cmake
|
||||||
|
brew install ccache colormake boost openssl qt@5 zlib
|
||||||
|
brew link --force qt@5 zlib
|
||||||
|
|
||||||
|
if [ "$build_system" = "cmake" ]; then
|
||||||
|
sudo ln -s /usr/local/opt/qt/mkspecs /usr/local/mkspecs
|
||||||
|
sudo ln -s /usr/local/opt/qt/plugins /usr/local/plugins
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_BRANCH" != "$coverity_branch" ]; then
|
||||||
|
export use_ccache=true
|
||||||
|
ccache -M 512M
|
||||||
|
ccache -V && ccache --show-stats && ccache --zero-stats
|
||||||
|
fi
|
||||||
|
- |
|
||||||
|
if [ "$libt_branch" = "RC_1_2" ]; then
|
||||||
|
pushd "$HOME"
|
||||||
|
git clone --single-branch --branch RC_1_2 https://github.com/arvidn/libtorrent.git
|
||||||
|
cd libtorrent
|
||||||
|
git checkout tags/v1.2.12
|
||||||
|
|
||||||
|
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.2
|
||||||
|
git submodule update --init --recursive
|
||||||
|
|
||||||
|
cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
|
-Ddeprecated-functions=OFF \
|
||||||
|
-DOPENSSL_ROOT_DIR="$openssl_root_path" \
|
||||||
|
./
|
||||||
|
make
|
||||||
|
sudo make install
|
||||||
|
popd
|
||||||
|
fi
|
||||||
|
|
||||||
|
script:
|
||||||
|
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # skip usual build when running coverity scan
|
||||||
|
- |
|
||||||
|
cd "$TRAVIS_BUILD_DIR"
|
||||||
|
if [ "$build_system" = "qmake" ]; then
|
||||||
|
# scan only as lupdate is prone to hang
|
||||||
|
lupdate -extensions c,cpp,h,hpp,ui ./
|
||||||
|
./bootstrap.sh
|
||||||
|
./configure $qmake_conf CXXFLAGS="$CXXFLAGS"
|
||||||
|
else
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake $cmake_conf ../
|
||||||
|
fi
|
||||||
|
- make
|
||||||
|
- make install
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- if [ "$gui" = "true" ]; then qbt_exe="qbittorrent" ; else qbt_exe="qbittorrent-nox" ; fi
|
||||||
|
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then cd "$qbt_path/bin" ; fi
|
||||||
|
- |
|
||||||
|
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
|
||||||
|
if [ "$build_system" = "qmake" ]; then
|
||||||
|
macdeployqt "$TRAVIS_BUILD_DIR/src/$qbt_exe.app"
|
||||||
|
cd "$TRAVIS_BUILD_DIR/src/$qbt_exe.app/Contents/MacOS"
|
||||||
|
else
|
||||||
|
cd "$qbt_path/$qbt_exe.app/Contents/MacOS"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
- ./$qbt_exe --version
|
||||||
|
|
||||||
|
after_script:
|
||||||
|
- if [ "$use_ccache" = true ]; then ccache --show-stats ; fi
|
||||||
@@ -10,20 +10,17 @@ 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 - older versions may work, but you are on your own
|
# version requirements - older vesions may work, but you are on your own
|
||||||
set(minBoostVersion 1.65)
|
set(minBoostVersion 1.65)
|
||||||
set(minQt5Version 5.15.2)
|
set(minQtVersion 5.11)
|
||||||
set(minQt6Version 6.2)
|
|
||||||
set(minOpenSSLVersion 1.1.1)
|
set(minOpenSSLVersion 1.1.1)
|
||||||
set(minLibtorrent1Version 1.2.14)
|
set(minLibtorrentVersion 1.2.12)
|
||||||
set(minLibtorrentVersion 2.0.4)
|
|
||||||
set(minZlibVersion 1.2.11)
|
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(CheckCXXSourceCompiles) # TODO: migrate to CheckSourceCompiles in CMake >= 3.19
|
||||||
include(FeatureSummary)
|
include(FeatureSummary)
|
||||||
include(FeatureOptionsSetup)
|
include(FeatureOptionsSetup)
|
||||||
feature_option(QT6 "Use Qt6" OFF)
|
|
||||||
feature_option(STACKTRACE "Enable stacktraces" ON)
|
feature_option(STACKTRACE "Enable stacktraces" ON)
|
||||||
feature_option(GUI "Build GUI application" ON)
|
feature_option(GUI "Build GUI application" ON)
|
||||||
feature_option(WEBUI "Enables built-in HTTP server for headless use" ON)
|
feature_option(WEBUI "Enables built-in HTTP server for headless use" ON)
|
||||||
|
|||||||
@@ -6,14 +6,22 @@ Read the respective section to find out more.
|
|||||||
### Table Of Contents
|
### Table Of Contents
|
||||||
|
|
||||||
* **[Bug reporting etiquette](#bug-reporting-etiquette)**
|
* **[Bug reporting etiquette](#bug-reporting-etiquette)**
|
||||||
|
|
||||||
|
|
||||||
* **[Submitting an issue/bug report](#submitting-an-issuebug-report)**
|
* **[Submitting an issue/bug report](#submitting-an-issuebug-report)**
|
||||||
* [What is an actual bug report?](#what-is-an-actual-bug-report)
|
* [What is an actual bug report?](#what-is-an-actual-bug-report)
|
||||||
* [Before submitting a bug report](#before-submitting-a-bug-report)
|
* [Before submitting a bug report](#before-submitting-a-bug-report)
|
||||||
* [Steps to ensure a good bug report](#steps-to-ensure-a-good-bug-report)
|
* [Steps to ensure a good bug report](#steps-to-ensure-a-good-bug-report)
|
||||||
|
|
||||||
|
|
||||||
* **[Suggesting enhancements/feature requests](#suggesting-enhancementsfeature-requests)**
|
* **[Suggesting enhancements/feature requests](#suggesting-enhancementsfeature-requests)**
|
||||||
* [Before submitting an enhancement/feature request](#before-submitting-an-enhancementfeature-request)
|
* [Before submitting an enhancement/feature request](#before-submitting-an-enhancementfeature-request)
|
||||||
* [Steps to ensure a good enhancement/feature suggestion](#steps-to-ensure-a-good-enhancementfeature-suggestion)
|
* [Steps to ensure a good enhancement/feature suggestion](#steps-to-ensure-a-good-enhancementfeature-suggestion)
|
||||||
|
|
||||||
|
|
||||||
* **[Opening a pull request](#opening-a-pull-request)**
|
* **[Opening a pull request](#opening-a-pull-request)**
|
||||||
|
* [Must read](#must-read)
|
||||||
|
* [Good to know](#good-to-know)
|
||||||
|
|
||||||
# Bug reporting etiquette
|
# Bug reporting etiquette
|
||||||
|
|
||||||
@@ -186,26 +194,28 @@ Following these guidelines helps maintainers and the community understand your s
|
|||||||
|
|
||||||
# Opening a pull request
|
# Opening a pull request
|
||||||
|
|
||||||
* Consult [coding guidelines][coding-guidelines-url] first. If you are working on translation/i18n, read ["How to translate qBittorrent"][how-to-translate-url].
|
### Must read
|
||||||
* Keep your git commit history clean.
|
* Read our [**coding guidelines**][coding-guidelines-url]. There are some scripts to help you: [uncrustify script][uncrustify-script-url], [astyle script][astyle-script-url], [(related thread)][coding-guidelines-thread-url].
|
||||||
* Refer to the section about ["Git commit messages"][coding-guidelines-git-commit-message-url] in the coding guidelines.
|
* Keep the title **short** and provide a **clear** description about what your pull request does.
|
||||||
* When merge conflicts arise, do `git rebase <target_branch_name>` and fix the conflicts, don't do `git pull`. Here is a good explanation: [merging-vs-rebasing][merging-vs-rebasing-url].
|
* Provide **screenshots** for UI related changes.
|
||||||
* Keep pull request title concise and provide motivation and "what it does" in the pull request description area. Make it easy to read and understand.
|
* Keep your git commit history **clean** and **precise.** Refer to the section about "Git commit messages" in the [**coding guidelines**][coding-guidelines-url].
|
||||||
* Provide screenshots for UI related changes.
|
* If your commit fixes a reported issue (for example #4134), add the following message to the commit `Closes #4134.`. Example [here][commit-message-fix-issue-example-url].
|
||||||
* If your commit addresses a reported issue (for example issue #8454), append the following text to the commit body `Closes #8454.`. Example [commit][commit-message-fix-issue-example-url].
|
|
||||||
* Search [pull request list][pull-request-list-url] first. Others might have already implemented your idea (or got rejected already).
|
|
||||||
|
|
||||||
|
### Good to know
|
||||||
|
* **Search** pull request history! Others might have already implemented your idea and it is waiting to be merged (or got rejected already). Save your precious time by doing a search first.
|
||||||
|
* When resolving merge conflicts, do `git rebase <target_branch_name>`, don't do `git pull`. Then you can start fixing the conflicts. Here is a good explanation: [link][merging-vs-rebasing-url].
|
||||||
|
|
||||||
|
[astyle-script-url]: https://gist.github.com/Chocobo1/539cee860d1eef0acfa6
|
||||||
[attachments-howto-url]: https://help.github.com/articles/file-attachments-on-issues-and-pull-requests
|
[attachments-howto-url]: https://help.github.com/articles/file-attachments-on-issues-and-pull-requests
|
||||||
[builds-url]: https://sourceforge.net/projects/qbittorrent/files/
|
|
||||||
[coding-guidelines-url]: https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md
|
[coding-guidelines-url]: https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md
|
||||||
[coding-guidelines-git-commit-message-url]: https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md#10-git-commit-message
|
[coding-guidelines-thread-url]: https://github.com/qbittorrent/qBittorrent/issues/2192
|
||||||
[commit-message-fix-issue-example-url]: https://github.com/qbittorrent/qBittorrent/commit/c07cd440cd46345297debb47cb260f8688975f50
|
[commit-message-fix-issue-example-url]: https://github.com/qbittorrent/qBittorrent/commit/c07cd440cd46345297debb47cb260f8688975f50
|
||||||
[forum-url]: http://forum.qbittorrent.org/
|
[forum-url]: http://forum.qbittorrent.org/
|
||||||
[howto-report-bugs-url]: https://www.chiark.greenend.org.uk/~sgtatham/bugs.html
|
[howto-report-bugs-url]: https://www.chiark.greenend.org.uk/~sgtatham/bugs.html
|
||||||
[how-to-translate-url]: https://github.com/qbittorrent/qBittorrent/wiki/How-to-translate-qBittorrent
|
|
||||||
[merging-vs-rebasing-url]: https://www.atlassian.com/git/tutorials/merging-vs-rebasing
|
[merging-vs-rebasing-url]: https://www.atlassian.com/git/tutorials/merging-vs-rebasing
|
||||||
[pull-request-list-url]: https://github.com/qbittorrent/qBittorrent/pulls
|
|
||||||
[python-url]: https://www.python.org/
|
[python-url]: https://www.python.org/
|
||||||
[releases-url]: https://github.com/qbittorrent/qBittorrent/releases
|
[releases-url]: https://github.com/qbittorrent/qBittorrent/releases
|
||||||
[search-plugins-url]: https://github.com/qbittorrent/search-plugins
|
[search-plugins-url]: https://github.com/qbittorrent/search-plugins
|
||||||
|
[uncrustify-script-url]: https://raw.githubusercontent.com/qbittorrent/qBittorrent/master/uncrustify.cfg
|
||||||
[wiki-url]: https://github.com/qbittorrent/qBittorrent/wiki
|
[wiki-url]: https://github.com/qbittorrent/qBittorrent/wiki
|
||||||
|
[builds-url]: https://sourceforge.net/projects/qbittorrent/files/
|
||||||
|
|||||||
65
COPYING
@@ -18,8 +18,8 @@ See also the AUTHORS file
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Lesser General Public License instead.) You can apply it to
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -295,62 +295,3 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
|||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
|
||||||
possible use to the public, the best way to achieve this is to make it
|
|
||||||
free software which everyone can redistribute and change under these terms.
|
|
||||||
|
|
||||||
To do so, attach the following notices to the program. It is safest
|
|
||||||
to attach them to the start of each source file to most effectively
|
|
||||||
convey the exclusion of warranty; and each file should have at least
|
|
||||||
the "copyright" line and a pointer to where the full notice is found.
|
|
||||||
|
|
||||||
<one line to give the program's name and a brief idea of what it does.>
|
|
||||||
Copyright (C) <year> <name of author>
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License along
|
|
||||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
||||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
|
||||||
when it starts in an interactive mode:
|
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
||||||
This is free software, and you are welcome to redistribute it
|
|
||||||
under certain conditions; type `show c' for details.
|
|
||||||
|
|
||||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
|
||||||
parts of the General Public License. Of course, the commands you use may
|
|
||||||
be called something other than `show w' and `show c'; they could even be
|
|
||||||
mouse-clicks or menu items--whatever suits your program.
|
|
||||||
|
|
||||||
You should also get your employer (if you work as a programmer) or your
|
|
||||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
|
||||||
necessary. Here is a sample; alter the names:
|
|
||||||
|
|
||||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
|
||||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
|
||||||
|
|
||||||
<signature of Ty Coon>, 1 April 1989
|
|
||||||
Ty Coon, President of Vice
|
|
||||||
|
|
||||||
This General Public License does not permit incorporating your program into
|
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
|
||||||
consider it more useful to permit linking proprietary applications with the
|
|
||||||
library. If this is what you want to do, use the GNU Lesser General
|
|
||||||
Public License instead of this License.
|
|
||||||
|
|||||||
226
Changelog
@@ -1,108 +1,3 @@
|
|||||||
Tue Feb 15 2022 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.4.1
|
|
||||||
- FEATURE: Restore all torrent settings to the torrent's main context menu (thalieht)
|
|
||||||
- FEATURE: Add confirmation for enabling Auto TMM from context menu (thalieht)
|
|
||||||
- FEATURE: Add tooltip to Automatic Torrent Management context menu action (thalieht)
|
|
||||||
- FEATURE: Add Select All/None buttons in new torrent dialog (thalieht)
|
|
||||||
- BUGFIX: Keep "torrent info" alive while generate .torrent file (glassez)
|
|
||||||
- BUGFIX: Correctly handle Auto TMM in Torrent Files Watcher (glassez)
|
|
||||||
- BUGFIX: Correctly track the root folder name change (glassez)
|
|
||||||
- BUGFIX: Various fixes to the moving torrent code (glassez)
|
|
||||||
- BUGFIX: Update the torrent's download path field when changing category (thalieht)
|
|
||||||
- BUGFIX: Correctly handle received metadata (glassez)
|
|
||||||
- BUGFIX: Store hybrid torrents using legacy filenames (glassez)
|
|
||||||
- BUGFIX: Open correct directory when clicked on Browse button (glassez)
|
|
||||||
- BUGFIX: Fix crash when shutting down and clicing on system tray icon (Chocobo1)
|
|
||||||
- BUGFIX: Fix "Free space on disk" in new torrent dialog (thalieht)
|
|
||||||
- BUGFIX: Optimize completed files handling (Prince Gupta)
|
|
||||||
- BUGFIX: Migrate proxy settings (sledgehammer999)
|
|
||||||
- BUGFIX: Try to recover missing categories (glassez)
|
|
||||||
- WEBUI: WebAPI: fix wrong key used for categories (Chocobo1)
|
|
||||||
- WEBUI: Remove hack for outdated IE 6 browser (Chocobo1)
|
|
||||||
- RSS: Correctly handle XML parsing errors (glassez)
|
|
||||||
|
|
||||||
Thu Jan 06 2022 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.4.0
|
|
||||||
- FEATURE: Support for v2 torrents along with libtorrent 2.0.x support (glassez, Chocobo1)
|
|
||||||
- FEATURE: Support for Qt6 (glassez)
|
|
||||||
- FEATURE: Expose libtorrent hashing_threads settings (Anton Bershanskiy)
|
|
||||||
- FEATURE: Add "Notification timeout" option (kevtechxx)
|
|
||||||
- FEATURE: Add `connection_speed` to advanced settings (Chocobo1)
|
|
||||||
- FEATURE: Announce to all trackers if IP changed (#15001) (zhuangzi926)
|
|
||||||
- FEATURE: Add tooltip for various columns (Chocobo1)
|
|
||||||
- FEATURE: Add context menu to toggle content tab columns (#15164) (AbeniMatteo)
|
|
||||||
- FEATURE: Add filter "Checking" to side panel (#15166) (AbeniMatteo)
|
|
||||||
- FEATURE: Add "Forced metadata downloading" state (#15185) (AbeniMatteo)
|
|
||||||
- FEATURE: Remember last viewed page in Options dialog (#15230) (Chocobo1)
|
|
||||||
- FEATURE: Add tooltip to listening port spinbox (Chocobo1)
|
|
||||||
- FEATURE: Add "Skip hash check" option for watched folders (glassez)
|
|
||||||
- FEATURE: Add "Show torrent options" double-click action (glassez)
|
|
||||||
- FEATURE: Allow setting temp folder per torrent/catergory (glassez)
|
|
||||||
- FEATURE: Support folder based UI Themes (Prince Gupta)
|
|
||||||
- BUGFIX: Save "resume data" once file priority is changed (glassez)
|
|
||||||
- BUGFIX: Show priority menu at top level if there is no other in Add New Torrent dialog (FozzeY)
|
|
||||||
- BUGFIX: Capitalize "peer flags" descriptions (Chocobo1)
|
|
||||||
- BUGFIX: Reorder peer flags (Chocobo1)
|
|
||||||
- BUGFIX: Show "last activity" value under all circumstances (Chocobo1)
|
|
||||||
- BUGFIX: Elide text from the right for all columns' header (smigii)
|
|
||||||
- BUGFIX: Fix startup with different profiles (jagannatharjun)
|
|
||||||
- BUGFIX: Move a few torrent context menu actions into "Torrent options" dialog (thalieht)
|
|
||||||
- BUGFIX: Allow deselecting radio buttons in "Torrent options" for mixed torrents (thalieht)
|
|
||||||
- BUGFIX: Apply file priority changes correctly (a-sum-duma, Chocobo1)
|
|
||||||
- BUGFIX: Use proper string for Korean language (OctopusET)
|
|
||||||
- BUGFIX: Disable "add peers" menu items instead of hiding it (Chocobo1)
|
|
||||||
- BUGFIX: Disable system tray icon menu when app is exiting (Chocobo1)
|
|
||||||
- BUGFIX: Show GUI lock icon after system tray icon is initialized (Chocobo1)
|
|
||||||
- BUGFIX: Apply selected layout to displayed torrent content in "Add New Torrent" dialog (glassez)
|
|
||||||
- WEBUI: Add reverse proxy source IP resolution (#15047) (HiFiPhile)
|
|
||||||
- WEBUI: Support navigating UI tables with arrow keys (Thomas Piccirello)
|
|
||||||
- WEBUI: Support expanding/collapsing UI folders with arrow keys (Thomas Piccirello)
|
|
||||||
- WEBUI: Support sorting UI tables via touch (#15205) (Tom Piccirello)
|
|
||||||
- WEBUI: Add pieces progress bar to General tab (Jesse Smick)
|
|
||||||
- WEBUI: Update authors page (Chocobo1)
|
|
||||||
- WEBUI: Set icon sizes attribute (Daniel Aleksandersen)
|
|
||||||
- WEBUI: Add meta application name (Daniel Aleksandersen)
|
|
||||||
- WEBUI: Sort WebUI language selection values (Chocobo1)
|
|
||||||
- WEBUI: Use correct URL scheme in user prompt when HTTPS is enabled (Chocobo1)
|
|
||||||
- RSS: Stick Unread row to top in RSS feed list (Prince Gupta)
|
|
||||||
- RSS: Correctly use fallback icons for RSS feed in GUI (jagannatharjun)
|
|
||||||
- SEARCH: Add context menu for tabs in search widget (#14926) (Anton)
|
|
||||||
- SEARCH: Add more download options to torrent search result right-click menu (a-sum-duma)
|
|
||||||
- WINDOWS: Add windows-clang support (#15115) (Biswapriyo Nath)
|
|
||||||
- WINDOWS: Update python installer URL for Windows (xavier2k6)
|
|
||||||
- WINDOWS: NSIS: Update Simplified Chinese translation (Losiki)
|
|
||||||
- LINUX: Prolong wait time for shutdown for qbittorrent-nox (Chocobo1)
|
|
||||||
- LINUX: Install vector program icon (Chocobo1)
|
|
||||||
- LINUX: Add detection for OpenBSD, Haiku in configure script (Chocobo1)
|
|
||||||
- MACOS: Update Mac icons for Big Sur (17jiangz1)
|
|
||||||
- EXPERIMENTAL: Setting to store/load fastresume/torrent files in an SQLite database (glassez)
|
|
||||||
- OTHER: Many internal code refactorings and bug fixing by many people
|
|
||||||
|
|
||||||
Sun Oct 31 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.9
|
|
||||||
- BUGFIX: Fix "no action" option on torrent double click (Jose M. Abuin)
|
|
||||||
- BUGFIX: Fix broken behavior of "priority by shown file order" (Chocobo1)
|
|
||||||
- WEBUI: Fix WebUI crash when tracker URL is invalid (Chocobo1)
|
|
||||||
- WEBUI: Revert "WebUI: group trackers by hostname" (Chocobo1)
|
|
||||||
- WINDOWS: Remove Windows Vista support from manifest (xavier2k6)
|
|
||||||
- WINDOWS: NSIS: Update Korean, Indonesian and Traditional Chinese translation (JungHee Lee, Faisal Al-Munawar Fathur Rahman, SiderealArt)
|
|
||||||
|
|
||||||
Sun Aug 29 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.8
|
|
||||||
- BUGFIX: Delay processing of watched folders (#15282) (glassez)
|
|
||||||
- BUGFIX: Use the same icon for selecting folders/files (Chocobo1)
|
|
||||||
- BUGFIX: Use default upper limits for ddns entries (Chocobo1)
|
|
||||||
- WEBUI: Expose SSRF mitigation (#15247) (Sylvain Finot)
|
|
||||||
- WEBUI: Update webui libraries (Chocobo1)
|
|
||||||
- WEBUI: Group trackers by hostname (#15264) (Mengyang Li)
|
|
||||||
- WEBUI: Improve "last activity" calculation in WebAPI (#15339) (Chocobo1)
|
|
||||||
- WINDOWS: NSIS: Add Polish translation (#15262) (Matthaiks)
|
|
||||||
|
|
||||||
Tue Aug 03 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.7
|
|
||||||
- BUGFIX: Don't forget to start Watched folders timer (glassez)
|
|
||||||
- BUGFIX: Don't close tags menu when toggling items (tgregerson)
|
|
||||||
- BUGFIX: Don't overwrite tracker message (glassez)
|
|
||||||
- BUGFIX: Bump file pool size (#14966) (An0n)
|
|
||||||
- BUGFIX: Properly create "clean path" for watched folder (glassez)
|
|
||||||
- WEBUI: Disconnect comment links (Daniel Aleksandersen)
|
|
||||||
- WINDOWS: NSIS: Update Danish translation (scootergrisen)
|
|
||||||
|
|
||||||
Sat Jun 26 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.6
|
Sat Jun 26 2021 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.6
|
||||||
- FEATURE: New languages: Mongolian, Persian, Thai
|
- FEATURE: New languages: Mongolian, Persian, Thai
|
||||||
- BUGFIX: Provide correct error description in "upload mode" (glassez)
|
- BUGFIX: Provide correct error description in "upload mode" (glassez)
|
||||||
@@ -295,127 +190,6 @@ Sun Oct 18 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.3.0
|
|||||||
- OTHER: Support for libtorrent 1.1.x is dropped (Chocobo1)
|
- OTHER: Support for libtorrent 1.1.x is dropped (Chocobo1)
|
||||||
- OTHER: Many code cleanups and improvements (FranciscoPombal, Chocobo1, glassez)
|
- OTHER: Many code cleanups and improvements (FranciscoPombal, Chocobo1, glassez)
|
||||||
|
|
||||||
Sat Apr 25 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.5
|
|
||||||
- BUGFIX: Fix crash when torrent is deleted on limit reached (glassez)
|
|
||||||
- BUGFIX: Register datatype properly (Chocobo1)
|
|
||||||
- WEBUI: Add ability to send custom HTTP headers (Chocobo1)
|
|
||||||
- WEBUI: Expand RSS related API (Sepro)
|
|
||||||
- WINDOWS: Installer: Update german translation (schnurlos)
|
|
||||||
|
|
||||||
Wed Apr 22 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.4
|
|
||||||
- BUGFIX: Fix sub-sorting of Transfer list (glassez)
|
|
||||||
- BUGFIX: Fix wrong logic that disables "prevent sleeping" timer (Chocobo1)
|
|
||||||
- BUGFIX: Set disk cache size for older libtorrent versions (NotTsunami)
|
|
||||||
- BUGFIX: Sort locale language list (Chocobo1)
|
|
||||||
- BUGFIX: Remove white outline around mascot.png (adem)
|
|
||||||
- BUGFIX: Various fixes in configuring the chosen network interface and not leaking the IP (Raif Atef, an0n666)
|
|
||||||
- BUGFIX: Save "resume data" when torrent storage is moved (glassez)
|
|
||||||
- BUGFIX: Avoid holding encoded resume data in memory (Chocobo1)
|
|
||||||
- BUGFIX: Fix date format for "Last seen complete" (Chocobo1)
|
|
||||||
- BUGFIX: Remove deprecated strict super seeding mode from advanced settings (an0n666)
|
|
||||||
- BUGFIX: Change default stop_tracker_timeout settings (an0n666)
|
|
||||||
- BUGFIX: Convert the Log widget to use custom View/Model (jagannatharjun)
|
|
||||||
- BUGFIX: Change default upload slot choking limits (an0n666)
|
|
||||||
- BUGFIX: Don't uncheck Authentication checkbox when changing proxy type (thalieht)
|
|
||||||
- BUGFIX: Reduce ambiguity for selecting tray icons (Chocobo1)
|
|
||||||
- WEBUI: Fix unable to add multiple peers in WebUI (Sepro)
|
|
||||||
- WEBUI: Fix UPnP lease duration get/set (NotTsunami)
|
|
||||||
- SEARCH: Detect python3 executable on Windows (József Sallai)
|
|
||||||
|
|
||||||
Wed Apr 01 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.3
|
|
||||||
- FEATURE: Add logging for SOCKS5 proxy errors (Chocobo1)
|
|
||||||
- FEATURE: Add UPnP lease duration advanced option (NotTsunami)
|
|
||||||
- BUGFIX: Allow to translate error messages (Chocobo1)
|
|
||||||
- BUGFIX: Don't round scaling factor (Nick Korotysh)
|
|
||||||
- BUGFIX: Save log file in UTF-8 encoding (Chocobo1)
|
|
||||||
- BUGFIX: Avoid log file excessive flushing (Chocobo1)
|
|
||||||
- BUGFIX: Fix regression when fastresume contains network path (Tester798)
|
|
||||||
- BUGFIX: Fix broken UNC paths in fastresumes on Windows (sledgehammer999)
|
|
||||||
- BUGFIX: Prevent multiple instances for the same app config (glassez)
|
|
||||||
- BUGFIX: Fix unexpected torrent resume after app restart with libtorrent 1.1.x (glassez)
|
|
||||||
- WEBUI: Add alt and title tags for WebUI footer (LameLemon)
|
|
||||||
- WINDOWS: Installer: Update Finnish translation (Roope Jukkara)
|
|
||||||
- WINDOWS: Installer: Update Japanese translation (maboroshin)
|
|
||||||
- WINDOWS: Installer: Update Turkish translation (Burak Yavuz)
|
|
||||||
- WINDOWS: Installer: Update Russian translation (Andrei Stepanov)
|
|
||||||
|
|
||||||
Tue Mar 24 2020 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.2
|
|
||||||
- FEATURE: Allow transfer list text color changes through QSS (Prince Gupta)
|
|
||||||
- FEATURE: Option to show console when external program is run (sledgehammer999)
|
|
||||||
- FEATURE: Rename Country column to "Country / Region" (Thomas Piccirello)
|
|
||||||
- FEATURE: Change the defaults of some settings (FranciscoPombal)
|
|
||||||
- FEATURE: Refactored Transfer List code to allow theming. As a sideffect the row height has more padding. (glassez)
|
|
||||||
- FEATURE: Allow double-click in preview dialog (thalieht)
|
|
||||||
- FEATURE: Expose stop_tracker_timeout in advanced settings (an0n666)
|
|
||||||
- FEATURE: Add piece_extent_affinity to AdvancedSettings (FranciscoPombal)
|
|
||||||
- FEATURE: Reorganize UI theme selection (Prince Gupta)
|
|
||||||
- FEATURE: Show any multiple connections from the same IP in peer list (thalieht)
|
|
||||||
- FEATURE: Add stalled filters to GUI and Web API/UI (FranciscoPombal)
|
|
||||||
- FEATURE: Use IP geolocation database by DB-IP instead of MaxMind (sledgehammer999)
|
|
||||||
- FEATURE: Allow to save downloaded metadata as torrent file (glassez)
|
|
||||||
- FEATURE: Allow single app instance per configuration (glassez)
|
|
||||||
- PERFORMANCE: Move multiple torrents one by one (glassez)
|
|
||||||
- BUGFIX: Disable Torrent Queue by default for new users (an0n666)
|
|
||||||
- BUGFIX: Update free disk space label on Category change in Auto Mode (Medvedishce)
|
|
||||||
- BUGFIX: Save resume data after recheck (glassez)
|
|
||||||
- BUGFIX: Tracker is errored only if all local endpoints fail (sledgehammer999)
|
|
||||||
- BUGFIX: Change placement of stop tracker timeout setting (An0n)
|
|
||||||
- BUGFIX: Redesign torrent startup handling (glassez)
|
|
||||||
- BUGFIX: Show "∞" instead of " -1" in Preferences (Sakib-Abrar)
|
|
||||||
- BUGFIX: Improve code efficiency for reverse resolution of peers (Chocobo1)
|
|
||||||
- BUGFIX: Handle HTTP redirection to magnet URI (glassez)
|
|
||||||
- BUGFIX: Various fixes for portable mode (Tester798)
|
|
||||||
- BUGFIX: Include resume folder path in exception message (Chocobo1)
|
|
||||||
- BUGFIX: Change placeholder text in torrent list's filter (djt3)
|
|
||||||
- BUGFIX: Improvements in the embedded tracker to be more spec compliant (FranciscoPombal)
|
|
||||||
- BUGFIX: Improve the options tooltips (NotTsunami)
|
|
||||||
- BUGFIX: Check if file exists in seed mode (an0n666)
|
|
||||||
- BUGFIX: Delegate GUI scaling work to Qt (Nick Korotysh)
|
|
||||||
- BUGFIX: Fix crash when renaming torrent contents (Chocobo1)
|
|
||||||
- BUGFIX: Fix total connected peers count calculation (FranciscoPombal)
|
|
||||||
- BUGFIX: Allow other keypresses in LogListWidget (NotTsunami)
|
|
||||||
- BUGFIX: Disable Auto TMM when not using default savepath from monitored folder (thalieht)
|
|
||||||
- WEBUI: Fix first row renaming in files tab (Denis)
|
|
||||||
- WEBUI: Use SVG image for WebUI favicon (Nick Korotysh)
|
|
||||||
- WEBUI: Inherit text color for filter list elements (Nick Korotysh)
|
|
||||||
- WEBUI: Expose WebUI ban counter to users (Chocobo1)
|
|
||||||
- WEBUI: Expose WebUI ban duration to users (Chocobo1)
|
|
||||||
- WEBUI: Implement "Secure" flag for session cookie (FranciscoPombal)
|
|
||||||
- WEBUI: Remove unused/deprecated option (FranciscoPombal)
|
|
||||||
- WEBUI: Prevent excessive sync requests (FranciscoPombal)
|
|
||||||
- WEBUI: Fix populating statistics window (FranciscoPombal)
|
|
||||||
- WEBUI: Fix matching uncategorized torrents (FranciscoPombal)
|
|
||||||
- WEBUI: Always allow whitespace in category names (FranciscoPombal)
|
|
||||||
- SEARCH: Bump python version for new installation (Chocobo1)
|
|
||||||
- SEARCH: Fix missing string (Chocobo1)
|
|
||||||
- SEARCH: Drop python2 support (Chocobo1)
|
|
||||||
- WINDOWS: Installer: Option to start qBittorrent on Windows start up (An0n)
|
|
||||||
- WINDOWS: Installer: Improve Czech translation (slrslr)
|
|
||||||
- WINDOWS: Installer: Update French translation (zywo)
|
|
||||||
- WINDOWS: Installer: Update German translation (schnurlos)
|
|
||||||
- WINDOWS: Installer: Update Japanese translation (maboroshin)
|
|
||||||
- WINDOWS: Path length limitation is removed on Windows 10 1607 onwards (an0n666)
|
|
||||||
|
|
||||||
Wed Dec 18 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.2.1
|
|
||||||
- FEATURE: Enable portable mode if "profile" directory exists (Tester798)
|
|
||||||
- FEATURE: Enable "Apply rate limit to peers on LAN" option by default (Chocobo1)
|
|
||||||
- BUGFIX: Sync translations from Transifex and run lupdate (sledgehammer999)
|
|
||||||
- BUGFIX: Don't unnecessarily delete OS files in folders (sledgehammer999)
|
|
||||||
- BUGFIX: Use the incomplete folder where appropriate (sledgehammer999)
|
|
||||||
- BUGFIX: Align Properties tab bar correctly on window resize (Prince Gupta)
|
|
||||||
- BUGFIX: Rework the listening IP/interface selection code (sledgehammer999)
|
|
||||||
- BUGFIX: Fix inconsistent icon for deleting torrent (Chocobo1)
|
|
||||||
- BUGFIX: Show torrent error message in transfer list (Chocobo1)
|
|
||||||
- BUGFIX: Fix stuck in wrong torrent state (Chocobo1)
|
|
||||||
- BUGFIX: Expand single-item folders in torrent content (warren)
|
|
||||||
- WEBUI: Bump Web API version (sledgehammer999)
|
|
||||||
- WEBUI: Add ability to rename torrent files from the WebUI (Thomas Piccirello)
|
|
||||||
- WEBUI: Mention lack of HTTPS in WebUI magnet link warning (nl6720)
|
|
||||||
- WEBUI: Fix HTML elements size in search tab (Chocobo1)
|
|
||||||
- SEARCH: Fix incorrect translation displayed after language change (Chocobo1)
|
|
||||||
- SEARCH: Fix missing translations in search plugins dialog (Chocobo1)
|
|
||||||
- WINDOWS: Update russian translation of the installer (Andrei Stepanov)
|
|
||||||
|
|
||||||
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)
|
||||||
- FEATURE: Add OpenSSL version to GUI and stackdump (Chocobo1)
|
- FEATURE: Add OpenSSL version to GUI and stackdump (Chocobo1)
|
||||||
|
|||||||
14
INSTALL
@@ -5,22 +5,20 @@ qBittorrent - A BitTorrent client in C++ / Qt
|
|||||||
|
|
||||||
- Boost >= 1.65
|
- Boost >= 1.65
|
||||||
|
|
||||||
- libtorrent-rasterbar 1.2.14 - 1.2.x || 2.0.4 - 2.0.x
|
- libtorrent-rasterbar >= 1.2.12 (by Arvid Norberg)
|
||||||
* 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.1.1
|
- OpenSSL >= 1.1.1
|
||||||
|
|
||||||
- Qt 5.15.2 - 5.x || 6.2.0 - 6.x
|
- Qt >= 5.12
|
||||||
|
|
||||||
- zlib >= 1.2.11
|
- zlib >= 1.2.11
|
||||||
|
|
||||||
- pkg-config *
|
- pkg-config (compile-time only on *nix systems)
|
||||||
* Compile-time only on *nix systems
|
|
||||||
|
|
||||||
- Python >= 3.5.0
|
- Python >= 3.5.0 (optional, runtime only)
|
||||||
* Optional, run-time only
|
* Required by the internal search engine
|
||||||
* Used by the bundled 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.
|
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.
|
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.
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
qBittorrent - A BitTorrent client in Qt
|
qBittorrent - A BitTorrent client in Qt
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
|
[](https://travis-ci.org/qbittorrent/qBittorrent)
|
||||||
[](https://ci.appveyor.com/project/qbittorrent/qBittorrent)
|
[](https://ci.appveyor.com/project/qbittorrent/qBittorrent)
|
||||||
[](https://github.com/qbittorrent/qBittorrent/actions)
|
[](https://github.com/qbittorrent/qBittorrent/actions)
|
||||||
[](https://scan.coverity.com/projects/5494)
|
[](https://scan.coverity.com/projects/5494)
|
||||||
@@ -45,8 +46,8 @@ http://forum.qbittorrent.org
|
|||||||
Please report any bug (or feature request) to:
|
Please report any bug (or feature request) to:
|
||||||
http://bugs.qbittorrent.org
|
http://bugs.qbittorrent.org
|
||||||
|
|
||||||
Official IRC channel:
|
You can also meet me (sledgehammer_999) on IRC:
|
||||||
[#qbittorrent on irc.libera.chat](ircs://irc.libera.chat:6697/qbittorrent)
|
`#qbittorrent on irc.freenode.net`
|
||||||
|
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
sledgehammer999 \<sledgehammer999@qbittorrent.org\>
|
sledgehammer999 <sledgehammer999@qbittorrent.org>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ macro(qbt_common_config)
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_compile_definitions(qbt_common_cfg INTERFACE
|
target_compile_definitions(qbt_common_cfg INTERFACE
|
||||||
QT_DISABLE_DEPRECATED_BEFORE=0x050f02
|
QT_DEPRECATED_WARNINGS
|
||||||
QT_NO_CAST_TO_ASCII
|
QT_NO_CAST_TO_ASCII
|
||||||
QT_NO_CAST_FROM_BYTEARRAY
|
QT_NO_CAST_FROM_BYTEARRAY
|
||||||
QT_USE_QSTRINGBUILDER
|
QT_USE_QSTRINGBUILDER
|
||||||
@@ -25,12 +25,6 @@ macro(qbt_common_config)
|
|||||||
$<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG_OUTPUT>
|
$<$<NOT:$<CONFIG:Debug>>:QT_NO_DEBUG_OUTPUT>
|
||||||
)
|
)
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
||||||
target_compile_definitions(qbt_common_cfg INTERFACE
|
|
||||||
_DARWIN_FEATURE_64_BIT_INODE
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
target_compile_definitions(qbt_common_cfg INTERFACE
|
target_compile_definitions(qbt_common_cfg INTERFACE
|
||||||
NTDDI_VERSION=0x06010000
|
NTDDI_VERSION=0x06010000
|
||||||
@@ -43,7 +37,7 @@ macro(qbt_common_config)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"))
|
if ((CXX_COMPILER_ID STREQUAL "GNU") OR (CXX_COMPILER_ID STREQUAL "Clang") OR (CXX_COMPILER_ID STREQUAL "AppleClang"))
|
||||||
target_compile_options(qbt_common_cfg INTERFACE
|
target_compile_options(qbt_common_cfg INTERFACE
|
||||||
-Wall
|
-Wall
|
||||||
-Wextra
|
-Wextra
|
||||||
@@ -65,7 +59,7 @@ macro(qbt_common_config)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if ((CMAKE_CXX_COMPILER_ID STREQUAL "Clang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang"))
|
if ((CXX_COMPILER_ID STREQUAL "Clang") OR (CXX_COMPILER_ID STREQUAL "AppleClang"))
|
||||||
target_compile_options(qbt_common_cfg INTERFACE
|
target_compile_options(qbt_common_cfg INTERFACE
|
||||||
-Wno-range-loop-analysis
|
-Wno-range-loop-analysis
|
||||||
)
|
)
|
||||||
@@ -85,8 +79,6 @@ macro(qbt_common_config)
|
|||||||
target_compile_options(qbt_common_cfg INTERFACE
|
target_compile_options(qbt_common_cfg INTERFACE
|
||||||
/guard:cf
|
/guard:cf
|
||||||
/utf-8
|
/utf-8
|
||||||
# https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
|
|
||||||
/Zc:__cplusplus
|
|
||||||
)
|
)
|
||||||
target_link_options(qbt_common_cfg INTERFACE
|
target_link_options(qbt_common_cfg INTERFACE
|
||||||
/guard:cf
|
/guard:cf
|
||||||
@@ -96,7 +88,4 @@ macro(qbt_common_config)
|
|||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (LibtorrentRasterbar_VERSION VERSION_GREATER_EQUAL ${minLibtorrentVersion})
|
|
||||||
target_compile_definitions(qbt_common_cfg INTERFACE QBT_USES_LIBTORRENT2)
|
|
||||||
endif()
|
|
||||||
endmacro(qbt_common_config)
|
endmacro(qbt_common_config)
|
||||||
|
|||||||
@@ -45,9 +45,6 @@ DEFINES += BOOST_SYSTEM_STATIC_LINK
|
|||||||
# Enable if linking dynamically against libtorrent
|
# Enable if linking dynamically against libtorrent
|
||||||
#DEFINES += TORRENT_LINKING_SHARED
|
#DEFINES += TORRENT_LINKING_SHARED
|
||||||
|
|
||||||
# Enable this if compiling with libtorrent 2.x
|
|
||||||
#DEFINES += QBT_USES_LIBTORRENT2
|
|
||||||
|
|
||||||
# Enable stack trace support
|
# Enable stack trace support
|
||||||
CONFIG += stacktrace
|
CONFIG += stacktrace
|
||||||
|
|
||||||
|
|||||||
53
configure.ac
@@ -1,4 +1,4 @@
|
|||||||
AC_INIT([qbittorrent], [v4.4.1], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/])
|
AC_INIT([qbittorrent], [v4.3.6], [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=""}
|
: ${CFLAGS=""}
|
||||||
@@ -53,32 +53,17 @@ AC_ARG_ENABLE(qt-dbus,
|
|||||||
[enable_qt_dbus=yes])
|
[enable_qt_dbus=yes])
|
||||||
|
|
||||||
# Detect OS
|
# Detect OS
|
||||||
AC_MSG_CHECKING([whether to enable specific tweaks for current host "$host_os"])
|
AC_MSG_CHECKING([whether OS is FreeBSD])
|
||||||
case "$host_os" in
|
AS_IF([expr "$host_os" : ".*freebsd.*" > /dev/null],
|
||||||
*darwin*)
|
[AC_MSG_RESULT([yes])
|
||||||
AC_MSG_RESULT([yes])
|
LIBS="-lexecinfo $LIBS"],
|
||||||
enable_qt_dbus=no
|
[AC_MSG_RESULT([no])])
|
||||||
;;
|
|
||||||
|
|
||||||
*freebsd*)
|
AC_MSG_CHECKING([whether OS is macOS])
|
||||||
AC_MSG_RESULT([yes])
|
AS_IF([expr "$host_os" : ".*darwin.*" > /dev/null],
|
||||||
LIBS="-lexecinfo $LIBS"
|
[AC_MSG_RESULT([yes])
|
||||||
;;
|
enable_qt_dbus=no],
|
||||||
|
[AC_MSG_RESULT([no])])
|
||||||
*haiku*)
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
LIBS="-lnetwork $LIBS"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*openbsd*)
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
LIBS="-lexecinfo $LIBS"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Require 0.23 pkg-config
|
# Require 0.23 pkg-config
|
||||||
PKG_PROG_PKG_CONFIG([0.23])
|
PKG_PROG_PKG_CONFIG([0.23])
|
||||||
@@ -156,7 +141,7 @@ AS_IF([test "x$QT_QMAKE" = "x"],
|
|||||||
[AC_MSG_ERROR([Could not find qmake])
|
[AC_MSG_ERROR([Could not find qmake])
|
||||||
])
|
])
|
||||||
AS_IF([test "x$enable_gui" = "xyes"],
|
AS_IF([test "x$enable_gui" = "xyes"],
|
||||||
[PKG_CHECK_MODULES(Qt5Svg, [Qt5Svg >= 5.15.2])
|
[PKG_CHECK_MODULES(Qt5Svg, [Qt5Svg >= 5.11])
|
||||||
])
|
])
|
||||||
AC_MSG_CHECKING([whether QtDBus should be enabled])
|
AC_MSG_CHECKING([whether QtDBus should be enabled])
|
||||||
AS_CASE(["x$enable_qt_dbus"],
|
AS_CASE(["x$enable_qt_dbus"],
|
||||||
@@ -190,12 +175,14 @@ m4_define([DETECT_BOOST_VERSION_PROGRAM],
|
|||||||
AC_COMPILE_IFELSE([DETECT_BOOST_VERSION_PROGRAM(106000)], [],
|
AC_COMPILE_IFELSE([DETECT_BOOST_VERSION_PROGRAM(106000)], [],
|
||||||
[QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES"])
|
[QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES"])
|
||||||
|
|
||||||
|
AX_BOOST_SYSTEM()
|
||||||
|
AC_MSG_NOTICE([Boost.System LIB: "$BOOST_SYSTEM_LIB"])
|
||||||
|
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||||
|
|
||||||
PKG_CHECK_MODULES(libtorrent,
|
PKG_CHECK_MODULES(libtorrent,
|
||||||
[libtorrent-rasterbar >= 2.0.4],
|
[libtorrent-rasterbar >= 1.2.12],
|
||||||
[CXXFLAGS="$libtorrent_CFLAGS $CXXFLAGS" LIBS="$libtorrent_LIBS $LIBS" QBT_ADD_DEFINES="$QBT_ADD_DEFINES QBT_USES_LIBTORRENT2"],
|
[CXXFLAGS="$libtorrent_CFLAGS $CXXFLAGS"
|
||||||
[PKG_CHECK_MODULES(libtorrent,
|
LIBS="$libtorrent_LIBS $LIBS"])
|
||||||
[libtorrent-rasterbar >= 1.2.14 libtorrent-rasterbar < 2],
|
|
||||||
[CXXFLAGS="$libtorrent_CFLAGS $CXXFLAGS" LIBS="$libtorrent_LIBS $LIBS"])])
|
|
||||||
|
|
||||||
PKG_CHECK_MODULES(openssl,
|
PKG_CHECK_MODULES(openssl,
|
||||||
[openssl >= 1.1.1],
|
[openssl >= 1.1.1],
|
||||||
@@ -229,7 +216,7 @@ AS_IF([test "x$QBT_CXX17_FOUND" = "xno"],
|
|||||||
CXXFLAGS="-std=c++17 $TMP_CXXFLAGS"
|
CXXFLAGS="-std=c++17 $TMP_CXXFLAGS"
|
||||||
AC_COMPILE_IFELSE([DETECT_CPP17_PROGRAM()],
|
AC_COMPILE_IFELSE([DETECT_CPP17_PROGRAM()],
|
||||||
[AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
QBT_ADD_CONFIG="$QBT_ADD_CONFIG c++17"
|
QBT_ADD_CONFIG="$QBT_ADD_CONFIG c++1z"
|
||||||
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_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++17 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.])])],
|
||||||
|
|||||||
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.4.1</string>
|
<string>4.3.6</string>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
<string>${EXECUTABLE_NAME}</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-2022 The qBittorrent project</string>
|
<string>Copyright © 2006-2021 The qBittorrent project</string>
|
||||||
<key>UTExportedTypeDeclarations</key>
|
<key>UTExportedTypeDeclarations</key>
|
||||||
<array>
|
<array>
|
||||||
<dict>
|
<dict>
|
||||||
|
|||||||
BIN
dist/mac/qBitTorrentDocument.icns
vendored
BIN
dist/mac/qbittorrent_mac.icns
vendored
11
dist/unix/CMakeLists.txt
vendored
@@ -30,6 +30,12 @@ install(FILES ${MAN_FILES}
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (GUI)
|
if (GUI)
|
||||||
|
install(DIRECTORY menuicons/
|
||||||
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor
|
||||||
|
COMPONENT data
|
||||||
|
FILES_MATCHING PATTERN "*.png"
|
||||||
|
)
|
||||||
|
|
||||||
install(FILES org.qbittorrent.qBittorrent.desktop
|
install(FILES org.qbittorrent.qBittorrent.desktop
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/
|
||||||
COMPONENT data
|
COMPONENT data
|
||||||
@@ -40,11 +46,6 @@ if (GUI)
|
|||||||
COMPONENT data
|
COMPONENT data
|
||||||
)
|
)
|
||||||
|
|
||||||
install(DIRECTORY menuicons/
|
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor
|
|
||||||
COMPONENT data
|
|
||||||
)
|
|
||||||
|
|
||||||
install(FILES
|
install(FILES
|
||||||
${PROJECT_SOURCE_DIR}/src/icons/qbittorrent-tray.svg
|
${PROJECT_SOURCE_DIR}/src/icons/qbittorrent-tray.svg
|
||||||
${PROJECT_SOURCE_DIR}/src/icons/qbittorrent-tray-dark.svg
|
${PROJECT_SOURCE_DIR}/src/icons/qbittorrent-tray-dark.svg
|
||||||
|
|||||||
BIN
dist/unix/menuicons/128x128/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.5 KiB |
BIN
dist/unix/menuicons/16x16/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 775 B |
|
Before Width: | Height: | Size: 750 B After Width: | Height: | Size: 775 B |
BIN
dist/unix/menuicons/192x192/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
BIN
dist/unix/menuicons/22x22/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
BIN
dist/unix/menuicons/24x24/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
BIN
dist/unix/menuicons/32x32/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
BIN
dist/unix/menuicons/36x36/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.0 KiB |
BIN
dist/unix/menuicons/48x48/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.9 KiB |
BIN
dist/unix/menuicons/64x64/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.8 KiB |
BIN
dist/unix/menuicons/72x72/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.2 KiB |
BIN
dist/unix/menuicons/96x96/apps/qbittorrent.png
vendored
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.5 KiB |
@@ -1,16 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
|
|
||||||
<title>
|
|
||||||
qbittorrent-new-light
|
|
||||||
</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient x1="34.012%" y1="0%" x2="76.373%" y2="76.805%" id="a">
|
|
||||||
<stop stop-color="#72B4F5" offset="0%"/>
|
|
||||||
<stop stop-color="#356EBF" offset="100%"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<g fill="none" fill-rule="evenodd">
|
|
||||||
<circle stroke="#DAEFFF" stroke-width="32" fill="url(#a)" cx="512" cy="512" r="496"/>
|
|
||||||
<path d="M712.898 332.399q66.657 0 103.38 45.671 37.03 45.364 37.03 128.684t-37.34 129.61q-37.03 45.98-103.07 45.98-33.02 0-60.484-12.035-27.156-12.344-45.672-37.649h-3.703l-10.8 43.512h-36.724V196h51.227v116.65q0 39.191-2.469 70.359h2.47q35.796-50.61 106.155-50.61zm-7.406 42.894q-52.46 0-75.605 30.242-23.145 29.934-23.145 101.219t23.762 102.145q23.761 30.55 76.222 30.55 47.215 0 70.36-34.254 23.144-34.562 23.144-99.058 0-66.04-23.144-98.442-23.145-32.402-71.594-32.402z" fill="#fff"/>
|
|
||||||
<path d="M317.273 639.45q51.227 0 74.68-27.466 23.453-27.464 24.996-92.578v-11.418q0-70.976-24.07-102.144-24.07-31.168-76.223-31.168-45.055 0-69.125 35.18-23.762 34.87-23.762 98.75 0 63.879 23.454 97.515 23.761 33.328 70.05 33.328zm-7.715 42.894q-65.421 0-102.144-45.98-36.723-45.981-36.723-128.376 0-83.011 37.032-129.609 37.03-46.598 103.07-46.598 69.433 0 106.773 52.461h2.778l7.406-46.289h40.426V828h-51.227V683.27q0-30.86 3.395-52.461h-4.012q-35.488 51.535-106.774 51.535z" fill="#c8e8ff"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |
@@ -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.4.1" date="2022-02-15"/>
|
<release version="4.3.6" date="2021-06-26"/>
|
||||||
</releases>
|
</releases>
|
||||||
</component>
|
</component>
|
||||||
|
|||||||
117
dist/unix/org.qbittorrent.qBittorrent.desktop
vendored
@@ -16,12 +16,15 @@ Keywords=bittorrent;torrent;magnet;download;p2p;
|
|||||||
|
|
||||||
|
|
||||||
# Translations
|
# Translations
|
||||||
|
Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent
|
||||||
|
GenericName[oc]=Client BitTorrent
|
||||||
|
Name[oc]=qBittorrent
|
||||||
Comment[af]=Aflaai en deel lêers oor BitTorrent
|
Comment[af]=Aflaai en deel lêers oor BitTorrent
|
||||||
GenericName[af]=BitTorrent kliënt
|
GenericName[af]=BitTorrent kliënt
|
||||||
Name[af]=qBittorrent
|
Name[af]=qBittorrent
|
||||||
Comment[ar]=نزّل وشارك الملفات عبر كيوبتتورنت
|
Comment[ar]=نزّل وشارك الملفات عبر كيوبتتورنت
|
||||||
GenericName[ar]=عميل بتتورنت
|
GenericName[ar]=عميل بتتورنت
|
||||||
Name[ar]=qBittorrent
|
Name[ar]=كيوبتتورنت
|
||||||
Comment[be]=Спампоўванне і раздача файлаў праз пратакол BitTorrent
|
Comment[be]=Спампоўванне і раздача файлаў праз пратакол BitTorrent
|
||||||
GenericName[be]=Кліент BitTorrent
|
GenericName[be]=Кліент BitTorrent
|
||||||
Name[be]=qBittorrent
|
Name[be]=qBittorrent
|
||||||
@@ -30,10 +33,7 @@ GenericName[bg]=BitTorrent клиент
|
|||||||
Name[bg]=qBittorrent
|
Name[bg]=qBittorrent
|
||||||
Comment[bn]=বিটটরেন্টে ফাইল ডাউনলোড এবং শেয়ার করুন
|
Comment[bn]=বিটটরেন্টে ফাইল ডাউনলোড এবং শেয়ার করুন
|
||||||
GenericName[bn]=বিটটরেন্ট ক্লায়েন্ট
|
GenericName[bn]=বিটটরেন্ট ক্লায়েন্ট
|
||||||
Name[bn]=qBittorrent
|
Name[bn]=কিউবি্টটরেন্ট
|
||||||
Comment[zh]=通过 BitTorrent 下载和分享文件
|
|
||||||
GenericName[zh]=BitTorrent 客户端
|
|
||||||
Name[zh]=qBittorrent
|
|
||||||
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
|
||||||
@@ -49,8 +49,8 @@ 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 client
|
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
|
||||||
GenericName[en_GB]=BitTorrent client
|
GenericName[en_GB]=BitTorrent client
|
||||||
@@ -66,11 +66,11 @@ GenericName[eu]=BitTorrent bezeroa
|
|||||||
Name[eu]=qBittorrent
|
Name[eu]=qBittorrent
|
||||||
Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت
|
Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت
|
||||||
GenericName[fa]=بیت تورنت نسخه کلاینت
|
GenericName[fa]=بیت تورنت نسخه کلاینت
|
||||||
Name[fa]=qBittorrent
|
Name[fa]=کیو بیت تورنت
|
||||||
Comment[fi]=Lataa ja jaa tiedostoja BitTorrentia käyttäen
|
Comment[fi]=Lataa ja jaa tiedostoja BitTorrentia käyttäen
|
||||||
GenericName[fi]=BitTorrent-asiakasohjelma
|
GenericName[fi]=BitTorrent-asiakasohjelma
|
||||||
Name[fi]=qBittorrent
|
Name[fi]=qBittorrent
|
||||||
Comment[fr]=Télécharger et partager des fichiers sur BitTorrent
|
Comment[fr]=Télécharger et partager des fichiers avec BitTorrent
|
||||||
GenericName[fr]=Client BitTorrent
|
GenericName[fr]=Client BitTorrent
|
||||||
Name[fr]=qBittorrent
|
Name[fr]=qBittorrent
|
||||||
Comment[gl]=Descargar e compartir ficheiros co protocolo BitTorrent
|
Comment[gl]=Descargar e compartir ficheiros co protocolo BitTorrent
|
||||||
@@ -78,7 +78,7 @@ GenericName[gl]=Cliente BitTorrent
|
|||||||
Name[gl]=qBittorrent
|
Name[gl]=qBittorrent
|
||||||
Comment[gu]=બિટ્ટોરેંટ પર ફાઈલો ડાઉનલોડ અને શેર કરો
|
Comment[gu]=બિટ્ટોરેંટ પર ફાઈલો ડાઉનલોડ અને શેર કરો
|
||||||
GenericName[gu]=બિટ્ટોરેંટ ક્લાયન્ટ
|
GenericName[gu]=બિટ્ટોરેંટ ક્લાયન્ટ
|
||||||
Name[gu]=qBittorrent
|
Name[gu]=ક્યૂ-બિટ્ટોરેંટ
|
||||||
Comment[he]=הורד ושתף קבצים על גבי ביטורנט
|
Comment[he]=הורד ושתף קבצים על גבי ביטורנט
|
||||||
GenericName[he]=לקוח ביטורנט
|
GenericName[he]=לקוח ביטורנט
|
||||||
Name[he]=qBittorrent
|
Name[he]=qBittorrent
|
||||||
@@ -106,21 +106,27 @@ Name[ja]=qBittorrent
|
|||||||
Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით
|
Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით
|
||||||
GenericName[ka]=BitTorrent კლიენტი
|
GenericName[ka]=BitTorrent კლიენტი
|
||||||
Name[ka]=qBittorrent
|
Name[ka]=qBittorrent
|
||||||
Comment[ko]=BitTorrent를 통해 파일 다운로드 및 공유
|
Comment[ko]=비트토렌트를 통해 파일을 받고 공유합니다
|
||||||
GenericName[ko]=BitTorrent 클라이언트
|
GenericName[ko]=비트토렌트 클라이언트
|
||||||
Name[ko]=qBittorrent
|
Name[ko]=qBittorrent
|
||||||
|
Comment[zh]=通过 BitTorrent 下载和分享文件
|
||||||
|
GenericName[zh]=BitTorrent 客户端
|
||||||
|
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
|
Comment[mk]=Превземајте и споделувајте фајлови преку BitTorrent
|
||||||
GenericName[mk]=BitTorrent клиент
|
GenericName[mk]=BitTorrent клиент
|
||||||
Name[mk]=qBittorrent
|
Name[mk]=qBittorrent
|
||||||
Comment[my]=တောရန့်ဖြင့်ဖိုင်များဒေါင်းလုဒ်ဆွဲရန်နှင့်မျှဝေရန်
|
Comment[en_AU]=Download and share files over BitTorrent
|
||||||
GenericName[my]=တောရန့်စီမံခန့်ခွဲသည့်အရာ
|
GenericName[en_AU]=BitTorrent client
|
||||||
Name[my]=qBittorrent
|
Name[en_AU]=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
|
||||||
|
Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘߐߕߟߊ߫ ߓߌߙߏߙߍ߲ߕ ߞߊ߲߬
|
||||||
|
GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ
|
||||||
|
Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ
|
||||||
Comment[nl]=Bestanden downloaden en delen via BitTorrent
|
Comment[nl]=Bestanden downloaden en delen via BitTorrent
|
||||||
GenericName[nl]=BitTorrent-client
|
GenericName[nl]=BitTorrent-client
|
||||||
Name[nl]=qBittorrent
|
Name[nl]=qBittorrent
|
||||||
@@ -145,62 +151,14 @@ 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
|
||||||
Name[sq]=qBittorrent
|
|
||||||
Comment[sr]=Преузимајте и делите фајлове преко BitTorrent протокола
|
Comment[sr]=Преузимајте и делите фајлове преко BitTorrent протокола
|
||||||
GenericName[sr]=BitTorrent-клијент
|
GenericName[sr]=BitTorrent-клијент
|
||||||
Name[sr]=qBittorrent
|
|
||||||
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
|
||||||
Name[sr@latin]=qBittorrent
|
Name[sr@latin]=qBittorrent
|
||||||
Comment[sv]=Hämta och dela filer över BitTorrent
|
Comment[sv]=Hämta och dela filer över BitTorrent
|
||||||
GenericName[sv]=BitTorrent-klient
|
GenericName[sv]=BitTorrent-klient
|
||||||
Name[sv]=qBittorrent
|
Name[sv]=qBittorrent
|
||||||
Comment[ta]=BitTorrent வழியாக கோப்புகளை பதிவிறக்க மற்றும் பகிர
|
|
||||||
GenericName[ta]=BitTorrent வாடிக்கையாளர்
|
|
||||||
Name[ta]=qBittorrent
|
|
||||||
Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి
|
|
||||||
GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్
|
|
||||||
Name[te]=qBittorrent
|
|
||||||
Comment[th]=ดาวน์โหลดและแชร์ไฟล์ผ่าน BitTorrent
|
|
||||||
GenericName[th]=ไคลเอนต์ BitTorrent
|
|
||||||
Name[th]=qBittorrent
|
|
||||||
Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın
|
|
||||||
GenericName[tr]=BitTorrent istemcisi
|
|
||||||
Name[tr]=qBittorrent
|
|
||||||
Comment[ur]=BitTorrent پر فائلوں کو ڈاؤن لوڈ کریں اور اشتراک کریں
|
|
||||||
GenericName[ur]=قیو بٹ ٹورنٹ کلائنٹ
|
|
||||||
Name[ur]=qBittorrent
|
|
||||||
Comment[uk]=Завантажуйте та поширюйте файли через BitTorrent
|
|
||||||
GenericName[uk]=BitTorrent-клієнт
|
|
||||||
Name[uk]=qBittorrent
|
|
||||||
Comment[vi]=Tải về và chia sẻ tệp qua BitTorrent
|
|
||||||
GenericName[vi]=Máy khách BitTorrent
|
|
||||||
Name[vi]=qBittorrent
|
|
||||||
Comment[zh_HK]=經由BitTorrent下載並分享檔案
|
|
||||||
GenericName[zh_HK]=BitTorrent用戶端
|
|
||||||
Name[zh_HK]=qBittorrent
|
|
||||||
Comment[zh_TW]=經由 BitTorrent 下載並分享檔案
|
|
||||||
GenericName[zh_TW]=BitTorrent 客戶端
|
|
||||||
Name[zh_TW]=qBittorrent
|
|
||||||
Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent
|
|
||||||
GenericName[eo]=BitTorrent-kliento
|
|
||||||
Name[eo]=qBittorrent
|
|
||||||
Comment[kk]=BitTorrent арқылы файл жүктеу және бөлісу
|
|
||||||
GenericName[kk]=BitTorrent клиенті
|
|
||||||
Name[kk]=qBittorrent
|
|
||||||
Comment[en_AU]=Download and share files over BitTorrent
|
|
||||||
GenericName[en_AU]=BitTorrent client
|
|
||||||
Name[en_AU]=qBittorrent
|
|
||||||
Name[rm]=qBittorrent
|
|
||||||
Name[jv]=qBittorrent
|
|
||||||
Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent
|
|
||||||
GenericName[oc]=Client BitTorrent
|
|
||||||
Name[oc]=qBittorrent
|
|
||||||
Name[ug]=qBittorrent
|
|
||||||
Name[yi]=qBittorrent
|
|
||||||
Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘߐߕߟߊ߫ ߓߌߙߏߙߍ߲ߕ ߞߊ߲߬
|
|
||||||
GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ
|
|
||||||
Name[nqo]=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
|
||||||
@@ -209,23 +167,52 @@ GenericName[ltg]=BitTorrent klients
|
|||||||
Name[ltg]=qBittorrent
|
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]=क्यूबिटटाॅरेंट
|
||||||
|
Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın
|
||||||
|
GenericName[tr]=BitTorrent istemcisi
|
||||||
|
Name[tr]=qBittorrent
|
||||||
|
Comment[ur]=BitTorrent پر فائلوں کو ڈاؤن لوڈ کریں اور اشتراک کریں
|
||||||
|
GenericName[ur]=قیو بٹ ٹورنٹ کلائنٹ
|
||||||
|
Name[ur]=قیو بٹ ٹورنٹ
|
||||||
|
Comment[uk]=Завантажуйте та поширюйте файли через BitTorrent
|
||||||
|
GenericName[uk]=BitTorrent-клієнт
|
||||||
|
Name[uk]=qBittorrent
|
||||||
|
Comment[vi]=Tải xuống và chia sẻ tệp qua BitTorrent
|
||||||
|
GenericName[vi]=Client BitTorrent
|
||||||
|
Name[vi]=qBittorrent
|
||||||
Comment[az@latin]=Faylları BitTorrent vasitəsilə göndərin və paylaşın
|
Comment[az@latin]=Faylları BitTorrent vasitəsilə göndərin və paylaşın
|
||||||
GenericName[az@latin]=BitTorrent client
|
GenericName[az@latin]=BitTorrent client
|
||||||
Name[az@latin]=qBittorrent
|
Name[az@latin]=qBittorrent
|
||||||
|
Comment[zh_HK]=經由BitTorrent下載並分享檔案
|
||||||
|
GenericName[zh_HK]=BitTorrent用戶端
|
||||||
|
Name[zh_HK]=qBittorrent
|
||||||
|
Comment[zh_TW]=經由 BitTorrent 下載並分享檔案
|
||||||
|
GenericName[zh_TW]=BitTorrent 客戶端
|
||||||
|
Name[zh_TW]=qBittorrent
|
||||||
Comment[lv_LV]=Lejupielādēt un koplietot failus ar BitTorrent
|
Comment[lv_LV]=Lejupielādēt un koplietot failus ar BitTorrent
|
||||||
GenericName[lv_LV]=BitTorrent klients
|
GenericName[lv_LV]=BitTorrent klients
|
||||||
Name[lv_LV]=qBittorrent
|
Name[lv_LV]=qBittorrent
|
||||||
Comment[ms_MY]=Muat turun dan kongsi fail melalui BitTorrent
|
Comment[ms_MY]=Muat turun dan kongsi fail melalui BitTorrent
|
||||||
GenericName[ms_MY]=Klien BitTorrent
|
GenericName[ms_MY]=Klien BitTorrent
|
||||||
Name[ms_MY]=qBittorrent
|
Name[ms_MY]=qBittorrent
|
||||||
|
Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent
|
||||||
|
GenericName[eo]=BitTorrent-kliento
|
||||||
|
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[pt_PT]=Transferir e partilhar ficheiros por BitTorrent
|
Comment[pt_PT]=Transferir e partilhar ficheiros por BitTorrent
|
||||||
GenericName[pt_PT]=Cliente BitTorrent
|
GenericName[pt_PT]=Cliente BitTorrent
|
||||||
Name[pt_PT]=qBittorrent
|
Name[pt_PT]=qBittorrent
|
||||||
Name[si_LK]=qBittorrent
|
Comment[th]=ดาวน์โหลดและแชร์ไฟล์ด้วยบิททอเร้น
|
||||||
|
GenericName[th]=โปรแกรมบิททอเร้น
|
||||||
|
Name[th]=qBittorrent
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ Type=simple
|
|||||||
PrivateTmp=false
|
PrivateTmp=false
|
||||||
User=%i
|
User=%i
|
||||||
ExecStart=@EXPAND_BINDIR@/qbittorrent-nox
|
ExecStart=@EXPAND_BINDIR@/qbittorrent-nox
|
||||||
TimeoutStopSec=1800
|
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|||||||
10
dist/windows/installer-translations/danish.nsi
vendored
@@ -7,7 +7,7 @@ LangString inst_dekstop ${LANG_DANISH} "Opret skrivebordsgenvej"
|
|||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_DANISH} "Opret genvej i menuen Start"
|
LangString inst_startmenu ${LANG_DANISH} "Opret genvej i menuen 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_DANISH} "Start qBittorrent når Windows starter"
|
LangString inst_startup ${LANG_DANISH} "Start qBittorrent i Windows opstart"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_DANISH} "Åbn .torrent-filer med qBittorrent"
|
LangString inst_torrent ${LANG_DANISH} "Åbn .torrent-filer med qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
@@ -15,7 +15,7 @@ LangString inst_magnet ${LANG_DANISH} "Åbn magnet-links med qBittorrent"
|
|||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_DANISH} "Tilføj Windows Firewall-regel"
|
LangString inst_firewall ${LANG_DANISH} "Tilføj Windows Firewall-regel"
|
||||||
;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_DANISH} "Deaktivér grænse for for lang Windows-stien kan være (MAX_PATH-begrænsning på 260 tegn, kræver Windows 10 1607 eller senere)"
|
LangString inst_pathlimit ${LANG_DANISH} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_DANISH} "Tilføjer Windows Firewall-regel"
|
LangString inst_firewallinfo ${LANG_DANISH} "Tilføjer Windows Firewall-regel"
|
||||||
;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."
|
||||||
@@ -27,11 +27,11 @@ LangString inst_unist ${LANG_DANISH} "Afinstallerer tidligere version."
|
|||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_DANISH} "Start qBittorrent."
|
LangString launch_qbt ${LANG_DANISH} "Start 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_DANISH} "Installationsprogrammet virker kun i Windows-versioner som er 64-bit."
|
LangString inst_requires_64bit ${LANG_DANISH} "Dette installationsprogram virker kun i 64-bit Windows versioner."
|
||||||
;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_DANISH} "qBittorrent-versionen kræver mindst Windows 7."
|
LangString inst_requires_win7 ${LANG_DANISH} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_DANISH} "Afinstaller qBittorrent"
|
LangString inst_uninstall_link_description ${LANG_DANISH} "Uninstall qBittorrent"
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|||||||
@@ -1,60 +1,60 @@
|
|||||||
;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 (diperlukan)"
|
LangString inst_qbt_req ${LANG_INDONESIAN} "qBittorrent (required)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_INDONESIAN} "Buat Pintasan Desktop"
|
LangString inst_dekstop ${LANG_INDONESIAN} "Create Desktop Shortcut"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_INDONESIAN} "Buat Pintasan Menu"
|
LangString inst_startmenu ${LANG_INDONESIAN} "Create Start Menu Shortcut"
|
||||||
;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_INDONESIAN} "Jalankan qBittorrent pada start up Windows"
|
LangString inst_startup ${LANG_INDONESIAN} "Start qBittorrent on Windows start up"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_INDONESIAN} "Buka file .torrent dengan qBittorrent"
|
LangString inst_torrent ${LANG_INDONESIAN} "Open .torrent files with qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_INDONESIAN} "Buka link magnet dengan qBittorrent"
|
LangString inst_magnet ${LANG_INDONESIAN} "Open magnet links with qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_INDONESIAN} "Tambahkan aturan Windows Firewall"
|
LangString inst_firewall ${LANG_INDONESIAN} "Add Windows Firewall rule"
|
||||||
;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_INDONESIAN} "Matikan batasan panjang path Windows (limitasi MAX_PATH 260 karaker, membutuhkan Windows 10 1607 atau lebih baru)"
|
LangString inst_pathlimit ${LANG_INDONESIAN} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_INDONESIAN} "Menambahkan aturan Windows Firewall"
|
LangString inst_firewallinfo ${LANG_INDONESIAN} "Adding Windows Firewall rule"
|
||||||
;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_INDONESIAN} "qBittorrent berjalan. Mohon tutup aplikasi sebelum memasang."
|
LangString inst_warning ${LANG_INDONESIAN} "qBittorrent is running. Please close the application before installing."
|
||||||
;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_INDONESIAN} "Versi saat ini akan dicopot. Pengaturan pengguna dan torrent akan tetap utuh."
|
LangString inst_uninstall_question ${LANG_INDONESIAN} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_INDONESIAN} "Mencopot versi sebelumnya."
|
LangString inst_unist ${LANG_INDONESIAN} "Uninstalling previous version."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_INDONESIAN} "Buka qBittorrent."
|
LangString launch_qbt ${LANG_INDONESIAN} "Launch 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_INDONESIAN} "Aplikasi ini hanya berjalan pada versi Windows 64-bit."
|
LangString inst_requires_64bit ${LANG_INDONESIAN} "This installer works only in 64-bit Windows versions."
|
||||||
;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_INDONESIAN} "Versi qBittorrent ini membutuhkan setidaknya Windows 7."
|
LangString inst_requires_win7 ${LANG_INDONESIAN} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_INDONESIAN} "Copot qBittorrent"
|
LangString inst_uninstall_link_description ${LANG_INDONESIAN} "Uninstall qBittorrent"
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|
||||||
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
||||||
LangString remove_files ${LANG_INDONESIAN} "Hapus file"
|
LangString remove_files ${LANG_INDONESIAN} "Remove files"
|
||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_INDONESIAN} "Hapus pintasan"
|
LangString remove_shortcuts ${LANG_INDONESIAN} "Remove shortcuts"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_INDONESIAN} "Hapus asosiasi file"
|
LangString remove_associations ${LANG_INDONESIAN} "Remove file associations"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_INDONESIAN} "Hapus key registri"
|
LangString remove_registry ${LANG_INDONESIAN} "Remove registry keys"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_INDONESIAN} "Hapus file konfigurasi"
|
LangString remove_conf ${LANG_INDONESIAN} "Remove configuration files"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_INDONESIAN} "Hapus aturan Windows Firewall"
|
LangString remove_firewall ${LANG_INDONESIAN} "Remove Windows Firewall rule"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_INDONESIAN} "Menghapus aturan Windows Firewall"
|
LangString remove_firewallinfo ${LANG_INDONESIAN} "Removing Windows Firewall rule"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_INDONESIAN} "Hapus torrent dan data ter-cache"
|
LangString remove_cache ${LANG_INDONESIAN} "Remove torrents and cached data"
|
||||||
;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_INDONESIAN} "qBittorrent berjalan. Mohon tutup aplikasi sebelum mencopot."
|
LangString uninst_warning ${LANG_INDONESIAN} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
;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_INDONESIAN} "Tidak menghapus asosiasi .torrent. Terasosiasi dengan:"
|
LangString uninst_tor_warn ${LANG_INDONESIAN} "Not removing .torrent association. It is associated with:"
|
||||||
;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:"
|
||||||
LangString uninst_mag_warn ${LANG_INDONESIAN} "Tidak menghapus asosiasi magnet. Terasosiasi dengan:"
|
LangString uninst_mag_warn ${LANG_INDONESIAN} "Not removing magnet association. It is associated with:"
|
||||||
|
|||||||
54
dist/windows/installer-translations/korean.nsi
vendored
@@ -1,60 +1,60 @@
|
|||||||
;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 (필요함)"
|
LangString inst_qbt_req ${LANG_KOREAN} "qBittorrent (required)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_KOREAN} "바탕화면 바로가기 만들기"
|
LangString inst_dekstop ${LANG_KOREAN} "Create Desktop Shortcut"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_KOREAN} "시작 메뉴 바로가기 만들기"
|
LangString inst_startmenu ${LANG_KOREAN} "Create Start Menu Shortcut"
|
||||||
;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_KOREAN} "Windows 시작 시 qBittorrent 시작"
|
LangString inst_startup ${LANG_KOREAN} "Start qBittorrent on Windows start up"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_KOREAN} "qBittorrent로 .torrent 파일 열기"
|
LangString inst_torrent ${LANG_KOREAN} "Open .torrent files with qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_KOREAN} "qBittorrent로 자석 링크 열기"
|
LangString inst_magnet ${LANG_KOREAN} "Open magnet links with qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_KOREAN} "Windows 방화벽 규칙 추가"
|
LangString inst_firewall ${LANG_KOREAN} "Add Windows Firewall rule"
|
||||||
;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_KOREAN} "Windows 경로 길이 제한 비활성화(260자 MAX_PATH 제한, Windows 10 1607 이상 필요)"
|
LangString inst_pathlimit ${LANG_KOREAN} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_KOREAN} "Windows 방화벽 규칙 추가하는 중"
|
LangString inst_firewallinfo ${LANG_KOREAN} "Adding Windows Firewall rule"
|
||||||
;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_KOREAN} "qBittorrent가 실행 중입니다. 설치하기 전에 응용 프로그램을 닫으십시오."
|
LangString inst_warning ${LANG_KOREAN} "qBittorrent is running. Please close the application before installing."
|
||||||
;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_KOREAN} "현재 버전이 삭제됩니다. 사용자 설정과 토렌트는 그대로 유지됩니다."
|
LangString inst_uninstall_question ${LANG_KOREAN} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_KOREAN} "이전 버전을 삭제하는 중입니다."
|
LangString inst_unist ${LANG_KOREAN} "Uninstalling previous version."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_KOREAN} "qBittorrent를 실행합니다."
|
LangString launch_qbt ${LANG_KOREAN} "Launch 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_KOREAN} "이 설치 프로그램은 64비트 윈도우즈 버전에서만 작동합니다."
|
LangString inst_requires_64bit ${LANG_KOREAN} "This installer works only in 64-bit Windows versions."
|
||||||
;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_KOREAN} "이 qBittorrent 버전에는 Windows 7 이상이 필요합니다."
|
LangString inst_requires_win7 ${LANG_KOREAN} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_KOREAN} "qBittorrent 삭제"
|
LangString inst_uninstall_link_description ${LANG_KOREAN} "Uninstall qBittorrent"
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|
||||||
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
||||||
LangString remove_files ${LANG_KOREAN} "파일 제거"
|
LangString remove_files ${LANG_KOREAN} "Remove files"
|
||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_KOREAN} "바로가기 제거"
|
LangString remove_shortcuts ${LANG_KOREAN} "Remove shortcuts"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_KOREAN} "파일 연결 제거"
|
LangString remove_associations ${LANG_KOREAN} "Remove file associations"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_KOREAN} "레지스트리 키 제거"
|
LangString remove_registry ${LANG_KOREAN} "Remove registry keys"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_KOREAN} "구성 파일 제거"
|
LangString remove_conf ${LANG_KOREAN} "Remove configuration files"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_KOREAN} "Windows 방화벽 규칙 제거"
|
LangString remove_firewall ${LANG_KOREAN} "Remove Windows Firewall rule"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_KOREAN} "Windows 방화벽 규칙 제거하는 중"
|
LangString remove_firewallinfo ${LANG_KOREAN} "Removing Windows Firewall rule"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_KOREAN} "토렌트 및 캐시된 데이터 제거"
|
LangString remove_cache ${LANG_KOREAN} "Remove torrents and cached data"
|
||||||
;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_KOREAN} "qBittorrent가 실행 중입니다. 삭제하기 전에 응용 프로그램을 닫으십시오."
|
LangString uninst_warning ${LANG_KOREAN} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
;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_KOREAN} ".torrent 연결을 제거하지 않습니다. 관련 항목:"
|
LangString uninst_tor_warn ${LANG_KOREAN} "Not removing .torrent association. It is associated with:"
|
||||||
;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:"
|
||||||
LangString uninst_mag_warn ${LANG_KOREAN} "자석 연결을 제거하지 않습니다. 관련 항목:"
|
LangString uninst_mag_warn ${LANG_KOREAN} "Not removing magnet association. It is associated with:"
|
||||||
|
|||||||
54
dist/windows/installer-translations/polish.nsi
vendored
@@ -1,60 +1,60 @@
|
|||||||
;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 (wymagany)"
|
LangString inst_qbt_req ${LANG_POLISH} "qBittorrent (required)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_POLISH} "Utwórz skrót na pulpicie"
|
LangString inst_dekstop ${LANG_POLISH} "Create Desktop Shortcut"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_POLISH} "Utwórz skrót w menu Start"
|
LangString inst_startmenu ${LANG_POLISH} "Create Start Menu Shortcut"
|
||||||
;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_POLISH} "Uruchamiaj qBittorrent wraz z systemem Windows"
|
LangString inst_startup ${LANG_POLISH} "Start qBittorrent on Windows start up"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_POLISH} "Otwieraj pliki .torrent za pomocą qBittorrent"
|
LangString inst_torrent ${LANG_POLISH} "Open .torrent files with qBittorrent"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_POLISH} "Otwieraj odnośniki magnet za pomocą qBittorrent"
|
LangString inst_magnet ${LANG_POLISH} "Open magnet links with qBittorrent"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_POLISH} "Dodaj regułę Zapory systemu Windows"
|
LangString inst_firewall ${LANG_POLISH} "Add Windows Firewall rule"
|
||||||
;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_POLISH} "Wyłącz ograniczenie długości ścieżki systemu Windows (ograniczenie MAX_PATH do 260 znaków, wymaga systemu Windows 10 1607 lub nowszego)"
|
LangString inst_pathlimit ${LANG_POLISH} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_POLISH} "Dodawanie reguły Zapory systemu Windows"
|
LangString inst_firewallinfo ${LANG_POLISH} "Adding Windows Firewall rule"
|
||||||
;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_POLISH} "qBittorrent jest uruchomiony. Proszę zamknąć aplikację przed instalacją."
|
LangString inst_warning ${LANG_POLISH} "qBittorrent is running. Please close the application before installing."
|
||||||
;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_POLISH} "Obecna wersja zostanie odinstalowana. Ustawienia użytkownika i torrenty pozostaną nienaruszone."
|
LangString inst_uninstall_question ${LANG_POLISH} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_POLISH} "Odinstalowywanie poprzedniej wersji."
|
LangString inst_unist ${LANG_POLISH} "Uninstalling previous version."
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_POLISH} "Uruchom qBittorrent."
|
LangString launch_qbt ${LANG_POLISH} "Launch 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_POLISH} "Ten instalator działa tylko w 64-bitowych wersjach systemu Windows."
|
LangString inst_requires_64bit ${LANG_POLISH} "This installer works only in 64-bit Windows versions."
|
||||||
;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_POLISH} "Ta wersja qBittorrent wymaga co najmniej systemu Windows 7."
|
LangString inst_requires_win7 ${LANG_POLISH} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_POLISH} "Odinstaluj qBittorrent"
|
LangString inst_uninstall_link_description ${LANG_POLISH} "Uninstall qBittorrent"
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
|
|
||||||
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
;LangString remove_files ${LANG_ENGLISH} "Remove files"
|
||||||
LangString remove_files ${LANG_POLISH} "Usuń pliki"
|
LangString remove_files ${LANG_POLISH} "Remove files"
|
||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_POLISH} "Usuń skróty"
|
LangString remove_shortcuts ${LANG_POLISH} "Remove shortcuts"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_POLISH} "Usuń skojarzenia plików"
|
LangString remove_associations ${LANG_POLISH} "Remove file associations"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_POLISH} "Usuń klucze rejestru"
|
LangString remove_registry ${LANG_POLISH} "Remove registry keys"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_POLISH} "Usuń pliki konfiguracyjne"
|
LangString remove_conf ${LANG_POLISH} "Remove configuration files"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_POLISH} "Usuń regułę Zapory systemu Windows"
|
LangString remove_firewall ${LANG_POLISH} "Remove Windows Firewall rule"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_POLISH} "Usuwanie reguły Zapory systemu Windows"
|
LangString remove_firewallinfo ${LANG_POLISH} "Removing Windows Firewall rule"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_POLISH} "Usuń torrenty i dane z pamięci podręcznej"
|
LangString remove_cache ${LANG_POLISH} "Remove torrents and cached data"
|
||||||
;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_POLISH} "qBittorrent jest uruchomiony. Zamknij aplikację przed odinstalowaniem."
|
LangString uninst_warning ${LANG_POLISH} "qBittorrent is running. Please close the application before uninstalling."
|
||||||
;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_POLISH} "Bez usuwania skojarzenia .torrent. Skojarzono z:"
|
LangString uninst_tor_warn ${LANG_POLISH} "Not removing .torrent association. It is associated with:"
|
||||||
;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:"
|
||||||
LangString uninst_mag_warn ${LANG_POLISH} "Bez usuwania skojarzenia magnet. Skojarzono z:"
|
LangString uninst_mag_warn ${LANG_POLISH} "Not removing magnet association. It is associated with:"
|
||||||
|
|||||||
@@ -1,37 +1,37 @@
|
|||||||
;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 (必要)"
|
||||||
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
;LangString inst_dekstop ${LANG_ENGLISH} "Create Desktop Shortcut"
|
||||||
LangString inst_dekstop ${LANG_SIMPCHINESE} "创建桌面快捷方式"
|
LangString inst_dekstop ${LANG_SIMPCHINESE} "创建桌面快捷方式"
|
||||||
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut"
|
||||||
LangString inst_startmenu ${LANG_SIMPCHINESE} "创建开始菜单快捷方式"
|
LangString inst_startmenu ${LANG_SIMPCHINESE} "创建开始菜单快捷方式"
|
||||||
;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_SIMPCHINESE} "qBittorrent 开机自启动"
|
LangString inst_startup ${LANG_SIMPCHINESE} "在Windows上启动qBittorrent进行启动"
|
||||||
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent"
|
||||||
LangString inst_torrent ${LANG_SIMPCHINESE} "用 qBittorrent 打开.torrent文件"
|
LangString inst_torrent ${LANG_SIMPCHINESE} "用 qBittorrent 打开.torrent文件"
|
||||||
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
;LangString inst_magnet ${LANG_ENGLISH} "Open magnet links with qBittorrent"
|
||||||
LangString inst_magnet ${LANG_SIMPCHINESE} "用 qBittorrent 打开磁力链接"
|
LangString inst_magnet ${LANG_SIMPCHINESE} "用 qBittorrent 打开磁力链接"
|
||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_SIMPCHINESE} "添加 Windows 防火墙规则"
|
LangString inst_firewall ${LANG_SIMPCHINESE} "添加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_SIMPCHINESE} "解除 Windows 的 PATH 长度限制 (解除 MAX_PATH 为 260 的限制, 需要 Windows 10 1607 或更新版本)"
|
LangString inst_pathlimit ${LANG_SIMPCHINESE} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_SIMPCHINESE} "正在添加 Windows 防火墙规则"
|
LangString inst_firewallinfo ${LANG_SIMPCHINESE} "正在添加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_SIMPCHINESE} "qBittorrent 正在运行。 安装前请先关闭它。"
|
LangString inst_warning ${LANG_SIMPCHINESE} "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_SIMPCHINESE} "当前版本会被卸载。 用户设置和种子会被完整保留。"
|
LangString inst_uninstall_question ${LANG_SIMPCHINESE} "检测到以前的安装。 它将被卸载但不删除用户设置。"
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_SIMPCHINESE} "卸载以前的版本。"
|
LangString inst_unist ${LANG_SIMPCHINESE} "卸载以前的版本。"
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_SIMPCHINESE} "启动 qBittorrent。"
|
LangString launch_qbt ${LANG_SIMPCHINESE} "启动 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_SIMPCHINESE} "此安装程序仅支持 64 位 Windows 系统。"
|
LangString inst_requires_64bit ${LANG_SIMPCHINESE} "此安装程序只能在64位的Windows上工作。"
|
||||||
;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_SIMPCHINESE} "这个版本的 qBittorrent 仅支持 Windows 7 及更新的系统。"
|
LangString inst_requires_win7 ${LANG_SIMPCHINESE} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_SIMPCHINESE} "卸载 qBittorrent"
|
LangString inst_uninstall_link_description ${LANG_SIMPCHINESE} "Uninstall qBittorrent"
|
||||||
|
|
||||||
;------------------------------------
|
;------------------------------------
|
||||||
;Uninstaller strings
|
;Uninstaller strings
|
||||||
@@ -41,20 +41,20 @@ LangString remove_files ${LANG_SIMPCHINESE} "删除文件"
|
|||||||
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts"
|
||||||
LangString remove_shortcuts ${LANG_SIMPCHINESE} "删除快捷方式"
|
LangString remove_shortcuts ${LANG_SIMPCHINESE} "删除快捷方式"
|
||||||
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
;LangString remove_associations ${LANG_ENGLISH} "Remove file associations"
|
||||||
LangString remove_associations ${LANG_SIMPCHINESE} "解除文件关联"
|
LangString remove_associations ${LANG_SIMPCHINESE} "删除文件关联"
|
||||||
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys"
|
||||||
LangString remove_registry ${LANG_SIMPCHINESE} "删除注册表键"
|
LangString remove_registry ${LANG_SIMPCHINESE} "删除注册表键"
|
||||||
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files"
|
||||||
LangString remove_conf ${LANG_SIMPCHINESE} "删除配置文件"
|
LangString remove_conf ${LANG_SIMPCHINESE} "删除配置文件"
|
||||||
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule"
|
||||||
LangString remove_firewall ${LANG_SIMPCHINESE} "删除 Windows 防火墙规则"
|
LangString remove_firewall ${LANG_SIMPCHINESE} "删除Windows防火墙规则"
|
||||||
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule"
|
||||||
LangString remove_firewallinfo ${LANG_SIMPCHINESE} "正在删除 Windows 防火墙规则"
|
LangString remove_firewallinfo ${LANG_SIMPCHINESE} "正在删除Windows防火墙规则"
|
||||||
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data"
|
||||||
LangString remove_cache ${LANG_SIMPCHINESE} "删除种子和缓存数据"
|
LangString remove_cache ${LANG_SIMPCHINESE} "删除种子和缓存数据"
|
||||||
;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_SIMPCHINESE} "qBittorrent 正在运行。 卸载前请关闭程序。"
|
LangString uninst_warning ${LANG_SIMPCHINESE} "qBittorrent 正在运行。 卸载前请关闭程序。"
|
||||||
;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_SIMPCHINESE} "未解除与 .torrent 的关联。 它已与另一程序关联:"
|
LangString uninst_tor_warn ${LANG_SIMPCHINESE} "不删除 .torrent 关联。 关联的是:"
|
||||||
;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:"
|
||||||
LangString uninst_mag_warn ${LANG_SIMPCHINESE} "未解除与 磁力链接 的关联。 它已与另一程序关联:"
|
LangString uninst_mag_warn ${LANG_SIMPCHINESE} "不删除磁力关联。 关联的是:"
|
||||||
|
|||||||
@@ -15,21 +15,21 @@ LangString inst_magnet ${LANG_TRADCHINESE} "使用 qBittorrent 開啟 magnet 連
|
|||||||
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule"
|
||||||
LangString inst_firewall ${LANG_TRADCHINESE} "建立 Windows 防火牆規則"
|
LangString inst_firewall ${LANG_TRADCHINESE} "建立 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_TRADCHINESE} "停用 Windows 路徑長度限制 (MAX_PATH 260 字元限制,需 Windows 10 1607 以上版本)"
|
LangString inst_pathlimit ${LANG_TRADCHINESE} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)"
|
||||||
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule"
|
||||||
LangString inst_firewallinfo ${LANG_TRADCHINESE} "正在建立 Windows 防火牆規則"
|
LangString inst_firewallinfo ${LANG_TRADCHINESE} "正在建立 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_TRADCHINESE} "qBittorrent 正在執行中,請先關閉後再進行安裝。"
|
LangString inst_warning ${LANG_TRADCHINESE} "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_TRADCHINESE} "目前版本將被解除安裝。使用者設定及 torrent 將保留。"
|
LangString inst_uninstall_question ${LANG_TRADCHINESE} "Current version will be uninstalled. User settings and torrents will remain intact."
|
||||||
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version."
|
||||||
LangString inst_unist ${LANG_TRADCHINESE} "正在移除先前版本"
|
LangString inst_unist ${LANG_TRADCHINESE} "正在移除先前版本"
|
||||||
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent."
|
||||||
LangString launch_qbt ${LANG_TRADCHINESE} "啟動 qBittorrent"
|
LangString launch_qbt ${LANG_TRADCHINESE} "啟動 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_TRADCHINESE} "此安裝程式僅支援 64 位元版本的 Windows。"
|
LangString inst_requires_64bit ${LANG_TRADCHINESE} "This installer works only in 64-bit Windows versions."
|
||||||
;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_TRADCHINESE} "此 qBittorrent 版本僅支援 Windows 7 以上的系統。"
|
LangString inst_requires_win7 ${LANG_TRADCHINESE} "This qBittorrent version requires at least Windows 7."
|
||||||
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent"
|
||||||
LangString inst_uninstall_link_description ${LANG_TRADCHINESE} "移除 qBittorrent"
|
LangString inst_uninstall_link_description ${LANG_TRADCHINESE} "移除 qBittorrent"
|
||||||
|
|
||||||
|
|||||||
4
dist/windows/options.nsi
vendored
@@ -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.4.1"
|
!define PROG_VERSION "4.3.6"
|
||||||
|
|
||||||
!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-2022 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}"
|
||||||
|
|
||||||
|
|||||||
121
m4/ax_boost_system.m4
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
# ===========================================================================
|
||||||
|
# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_BOOST_SYSTEM
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# Test for System library from the Boost C++ libraries. The macro requires
|
||||||
|
# a preceding call to AX_BOOST_BASE. Further documentation is available at
|
||||||
|
# <http://randspringer.de/boost/index.html>.
|
||||||
|
#
|
||||||
|
# This macro calls:
|
||||||
|
#
|
||||||
|
# AC_SUBST(BOOST_SYSTEM_LIB)
|
||||||
|
#
|
||||||
|
# And sets:
|
||||||
|
#
|
||||||
|
# HAVE_BOOST_SYSTEM
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2008 Thomas Porschberg <thomas@randspringer.de>
|
||||||
|
# Copyright (c) 2008 Michael Tindal
|
||||||
|
# Copyright (c) 2008 Daniel Casimiro <dan.casimiro@gmail.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 20
|
||||||
|
|
||||||
|
AC_DEFUN([AX_BOOST_SYSTEM],
|
||||||
|
[
|
||||||
|
AC_ARG_WITH([boost-system],
|
||||||
|
AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@],
|
||||||
|
[use the System library from boost - it is possible to specify a certain library for the linker
|
||||||
|
e.g. --with-boost-system=boost_system-gcc-mt ]),
|
||||||
|
[
|
||||||
|
if test "$withval" = "no"; then
|
||||||
|
want_boost="no"
|
||||||
|
elif test "$withval" = "yes"; then
|
||||||
|
want_boost="yes"
|
||||||
|
ax_boost_user_system_lib=""
|
||||||
|
else
|
||||||
|
want_boost="yes"
|
||||||
|
ax_boost_user_system_lib="$withval"
|
||||||
|
fi
|
||||||
|
],
|
||||||
|
[want_boost="yes"]
|
||||||
|
)
|
||||||
|
|
||||||
|
if test "x$want_boost" = "xyes"; then
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_CANONICAL_BUILD])
|
||||||
|
CPPFLAGS_SAVED="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
export CPPFLAGS
|
||||||
|
|
||||||
|
LDFLAGS_SAVED="$LDFLAGS"
|
||||||
|
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"
|
||||||
|
export LDFLAGS
|
||||||
|
|
||||||
|
AC_CACHE_CHECK(whether the Boost::System library is available,
|
||||||
|
ax_cv_boost_system,
|
||||||
|
[AC_LANG_PUSH([C++])
|
||||||
|
CXXFLAGS_SAVE=$CXXFLAGS
|
||||||
|
CXXFLAGS=
|
||||||
|
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/system/error_code.hpp>]],
|
||||||
|
[[boost::system::error_category *a = 0;]])],
|
||||||
|
ax_cv_boost_system=yes, ax_cv_boost_system=no)
|
||||||
|
CXXFLAGS=$CXXFLAGS_SAVE
|
||||||
|
AC_LANG_POP([C++])
|
||||||
|
])
|
||||||
|
if test "x$ax_cv_boost_system" = "xyes"; then
|
||||||
|
AC_SUBST(BOOST_CPPFLAGS)
|
||||||
|
|
||||||
|
AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available])
|
||||||
|
BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
|
||||||
|
|
||||||
|
LDFLAGS_SAVE=$LDFLAGS
|
||||||
|
if test "x$ax_boost_user_system_lib" = "x"; then
|
||||||
|
for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do
|
||||||
|
ax_lib=${libextension}
|
||||||
|
AC_CHECK_LIB($ax_lib, exit,
|
||||||
|
[BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
|
||||||
|
[link_system="no"])
|
||||||
|
done
|
||||||
|
if test "x$link_system" != "xyes"; then
|
||||||
|
for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do
|
||||||
|
ax_lib=${libextension}
|
||||||
|
AC_CHECK_LIB($ax_lib, exit,
|
||||||
|
[BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
|
||||||
|
[link_system="no"])
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do
|
||||||
|
AC_CHECK_LIB($ax_lib, exit,
|
||||||
|
[BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break],
|
||||||
|
[link_system="no"])
|
||||||
|
done
|
||||||
|
|
||||||
|
fi
|
||||||
|
if test "x$ax_lib" = "x"; then
|
||||||
|
AC_MSG_ERROR(Could not find a version of the Boost::System library!)
|
||||||
|
fi
|
||||||
|
if test "x$link_system" = "xno"; then
|
||||||
|
AC_MSG_ERROR(Could not link against $ax_lib !)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
|
fi
|
||||||
|
])
|
||||||
215
m4/pkg.m4
@@ -1,60 +1,29 @@
|
|||||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||||
# serial 12 (pkg-config-0.29.2)
|
# serial 1 (pkg-config-0.24)
|
||||||
|
#
|
||||||
|
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
# General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
#
|
||||||
|
# As a special exception to the GNU General Public License, if you
|
||||||
|
# distribute this file as part of a program that contains a
|
||||||
|
# configuration script generated by Autoconf, you may include it under
|
||||||
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||||
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
|
# ----------------------------------
|
||||||
dnl
|
|
||||||
dnl This program is free software; you can redistribute it and/or modify
|
|
||||||
dnl it under the terms of the GNU General Public License as published by
|
|
||||||
dnl the Free Software Foundation; either version 2 of the License, or
|
|
||||||
dnl (at your option) any later version.
|
|
||||||
dnl
|
|
||||||
dnl This program is distributed in the hope that it will be useful, but
|
|
||||||
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
dnl General Public License for more details.
|
|
||||||
dnl
|
|
||||||
dnl You should have received a copy of the GNU General Public License
|
|
||||||
dnl along with this program; if not, write to the Free Software
|
|
||||||
dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
||||||
dnl 02111-1307, USA.
|
|
||||||
dnl
|
|
||||||
dnl As a special exception to the GNU General Public License, if you
|
|
||||||
dnl distribute this file as part of a program that contains a
|
|
||||||
dnl configuration script generated by Autoconf, you may include it under
|
|
||||||
dnl the same distribution terms that you use for the rest of that
|
|
||||||
dnl program.
|
|
||||||
|
|
||||||
dnl PKG_PREREQ(MIN-VERSION)
|
|
||||||
dnl -----------------------
|
|
||||||
dnl Since: 0.29
|
|
||||||
dnl
|
|
||||||
dnl Verify that the version of the pkg-config macros are at least
|
|
||||||
dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's
|
|
||||||
dnl installed version of pkg-config, this checks the developer's version
|
|
||||||
dnl of pkg.m4 when generating configure.
|
|
||||||
dnl
|
|
||||||
dnl To ensure that this macro is defined, also add:
|
|
||||||
dnl m4_ifndef([PKG_PREREQ],
|
|
||||||
dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])])
|
|
||||||
dnl
|
|
||||||
dnl See the "Since" comment for each macro you use to see what version
|
|
||||||
dnl of the macros you require.
|
|
||||||
m4_defun([PKG_PREREQ],
|
|
||||||
[m4_define([PKG_MACROS_VERSION], [0.29.2])
|
|
||||||
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
|
|
||||||
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
|
|
||||||
])dnl PKG_PREREQ
|
|
||||||
|
|
||||||
dnl PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
|
||||||
dnl ----------------------------------
|
|
||||||
dnl Since: 0.16
|
|
||||||
dnl
|
|
||||||
dnl Search for the pkg-config tool and set the PKG_CONFIG variable to
|
|
||||||
dnl first found in the path. Checks that the version of pkg-config found
|
|
||||||
dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is
|
|
||||||
dnl used since that's the first version where most current features of
|
|
||||||
dnl pkg-config existed.
|
|
||||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||||
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])
|
||||||
@@ -76,19 +45,18 @@ if test -n "$PKG_CONFIG"; then
|
|||||||
PKG_CONFIG=""
|
PKG_CONFIG=""
|
||||||
fi
|
fi
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])dnl PKG_PROG_PKG_CONFIG
|
])# PKG_PROG_PKG_CONFIG
|
||||||
|
|
||||||
dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||||
dnl -------------------------------------------------------------------
|
#
|
||||||
dnl Since: 0.18
|
# Check to see whether a particular set of modules exists. Similar
|
||||||
dnl
|
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||||
dnl Check to see whether a particular set of modules exists. Similar to
|
#
|
||||||
dnl PKG_CHECK_MODULES(), but does not set variables or print errors.
|
# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||||
dnl
|
# only at the first occurence in configure.ac, so if the first place
|
||||||
dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
# it's called might be skipped (such as if it is within an "if", you
|
||||||
dnl only at the first occurence in configure.ac, so if the first place
|
# have to call PKG_CHECK_EXISTS manually
|
||||||
dnl it's called might be skipped (such as if it is within an "if", you
|
# --------------------------------------------------------------
|
||||||
dnl have to call PKG_CHECK_EXISTS manually
|
|
||||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
if test -n "$PKG_CONFIG" && \
|
if test -n "$PKG_CONFIG" && \
|
||||||
@@ -98,10 +66,8 @@ m4_ifvaln([$3], [else
|
|||||||
$3])dnl
|
$3])dnl
|
||||||
fi])
|
fi])
|
||||||
|
|
||||||
dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||||
dnl ---------------------------------------------
|
# ---------------------------------------------
|
||||||
dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting
|
|
||||||
dnl pkg_failed based on the result.
|
|
||||||
m4_define([_PKG_CONFIG],
|
m4_define([_PKG_CONFIG],
|
||||||
[if test -n "$$1"; then
|
[if test -n "$$1"; then
|
||||||
pkg_cv_[]$1="$$1"
|
pkg_cv_[]$1="$$1"
|
||||||
@@ -113,11 +79,10 @@ m4_define([_PKG_CONFIG],
|
|||||||
else
|
else
|
||||||
pkg_failed=untried
|
pkg_failed=untried
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])dnl _PKG_CONFIG
|
])# _PKG_CONFIG
|
||||||
|
|
||||||
dnl _PKG_SHORT_ERRORS_SUPPORTED
|
# _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
dnl ---------------------------
|
# -----------------------------
|
||||||
dnl Internal check to see if pkg-config supports short errors.
|
|
||||||
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
|
||||||
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
||||||
@@ -125,24 +90,26 @@ if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
|||||||
else
|
else
|
||||||
_pkg_short_errors_supported=no
|
_pkg_short_errors_supported=no
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])dnl _PKG_SHORT_ERRORS_SUPPORTED
|
])# _PKG_SHORT_ERRORS_SUPPORTED
|
||||||
|
|
||||||
|
|
||||||
dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||||
dnl [ACTION-IF-NOT-FOUND])
|
# [ACTION-IF-NOT-FOUND])
|
||||||
dnl --------------------------------------------------------------
|
#
|
||||||
dnl Since: 0.4.0
|
#
|
||||||
dnl
|
# Note that if there is a possibility the first call to
|
||||||
dnl Note that if there is a possibility the first call to
|
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||||
dnl PKG_CHECK_MODULES might not happen, you should be sure to include an
|
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||||
dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
#
|
||||||
|
#
|
||||||
|
# --------------------------------------------------------------
|
||||||
AC_DEFUN([PKG_CHECK_MODULES],
|
AC_DEFUN([PKG_CHECK_MODULES],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||||
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||||
|
|
||||||
pkg_failed=no
|
pkg_failed=no
|
||||||
AC_MSG_CHECKING([for $2])
|
AC_MSG_CHECKING([for $1])
|
||||||
|
|
||||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||||
@@ -152,7 +119,7 @@ and $1[]_LIBS to avoid the need to call pkg-config.
|
|||||||
See the pkg-config man page for more details.])
|
See the pkg-config man page for more details.])
|
||||||
|
|
||||||
if test $pkg_failed = yes; then
|
if test $pkg_failed = yes; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
_PKG_SHORT_ERRORS_SUPPORTED
|
_PKG_SHORT_ERRORS_SUPPORTED
|
||||||
if test $_pkg_short_errors_supported = yes; then
|
if test $_pkg_short_errors_supported = yes; then
|
||||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
$1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1`
|
||||||
@@ -173,7 +140,7 @@ installed software in a non-standard prefix.
|
|||||||
_PKG_TEXT])[]dnl
|
_PKG_TEXT])[]dnl
|
||||||
])
|
])
|
||||||
elif test $pkg_failed = untried; then
|
elif test $pkg_failed = untried; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
m4_default([$4], [AC_MSG_FAILURE(
|
m4_default([$4], [AC_MSG_FAILURE(
|
||||||
[The pkg-config script could not be found or is too old. Make sure it
|
[The pkg-config script could not be found or is too old. Make sure it
|
||||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||||
@@ -189,40 +156,16 @@ else
|
|||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
$3
|
$3
|
||||||
fi[]dnl
|
fi[]dnl
|
||||||
])dnl PKG_CHECK_MODULES
|
])# PKG_CHECK_MODULES
|
||||||
|
|
||||||
|
|
||||||
dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
# PKG_INSTALLDIR(DIRECTORY)
|
||||||
dnl [ACTION-IF-NOT-FOUND])
|
# -------------------------
|
||||||
dnl ---------------------------------------------------------------------
|
# Substitutes the variable pkgconfigdir as the location where a module
|
||||||
dnl Since: 0.29
|
# should install pkg-config .pc files. By default the directory is
|
||||||
dnl
|
# $libdir/pkgconfig, but the default can be changed by passing
|
||||||
dnl Checks for existence of MODULES and gathers its build flags with
|
# DIRECTORY. The user can override through the --with-pkgconfigdir
|
||||||
dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags
|
# parameter.
|
||||||
dnl and VARIABLE-PREFIX_LIBS from --libs.
|
|
||||||
dnl
|
|
||||||
dnl Note that if there is a possibility the first call to
|
|
||||||
dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to
|
|
||||||
dnl include an explicit call to PKG_PROG_PKG_CONFIG in your
|
|
||||||
dnl configure.ac.
|
|
||||||
AC_DEFUN([PKG_CHECK_MODULES_STATIC],
|
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
|
||||||
_save_PKG_CONFIG=$PKG_CONFIG
|
|
||||||
PKG_CONFIG="$PKG_CONFIG --static"
|
|
||||||
PKG_CHECK_MODULES($@)
|
|
||||||
PKG_CONFIG=$_save_PKG_CONFIG[]dnl
|
|
||||||
])dnl PKG_CHECK_MODULES_STATIC
|
|
||||||
|
|
||||||
|
|
||||||
dnl PKG_INSTALLDIR([DIRECTORY])
|
|
||||||
dnl -------------------------
|
|
||||||
dnl Since: 0.27
|
|
||||||
dnl
|
|
||||||
dnl Substitutes the variable pkgconfigdir as the location where a module
|
|
||||||
dnl should install pkg-config .pc files. By default the directory is
|
|
||||||
dnl $libdir/pkgconfig, but the default can be changed by passing
|
|
||||||
dnl DIRECTORY. The user can override through the --with-pkgconfigdir
|
|
||||||
dnl parameter.
|
|
||||||
AC_DEFUN([PKG_INSTALLDIR],
|
AC_DEFUN([PKG_INSTALLDIR],
|
||||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])
|
||||||
m4_pushdef([pkg_description],
|
m4_pushdef([pkg_description],
|
||||||
@@ -233,18 +176,16 @@ AC_ARG_WITH([pkgconfigdir],
|
|||||||
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
AC_SUBST([pkgconfigdir], [$with_pkgconfigdir])
|
||||||
m4_popdef([pkg_default])
|
m4_popdef([pkg_default])
|
||||||
m4_popdef([pkg_description])
|
m4_popdef([pkg_description])
|
||||||
])dnl PKG_INSTALLDIR
|
]) dnl PKG_INSTALLDIR
|
||||||
|
|
||||||
|
|
||||||
dnl PKG_NOARCH_INSTALLDIR([DIRECTORY])
|
# PKG_NOARCH_INSTALLDIR(DIRECTORY)
|
||||||
dnl --------------------------------
|
# -------------------------
|
||||||
dnl Since: 0.27
|
# Substitutes the variable noarch_pkgconfigdir as the location where a
|
||||||
dnl
|
# module should install arch-independent pkg-config .pc files. By
|
||||||
dnl Substitutes the variable noarch_pkgconfigdir as the location where a
|
# default the directory is $datadir/pkgconfig, but the default can be
|
||||||
dnl module should install arch-independent pkg-config .pc files. By
|
# changed by passing DIRECTORY. The user can override through the
|
||||||
dnl default the directory is $datadir/pkgconfig, but the default can be
|
# --with-noarch-pkgconfigdir parameter.
|
||||||
dnl changed by passing DIRECTORY. The user can override through the
|
|
||||||
dnl --with-noarch-pkgconfigdir parameter.
|
|
||||||
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
AC_DEFUN([PKG_NOARCH_INSTALLDIR],
|
||||||
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])
|
||||||
m4_pushdef([pkg_description],
|
m4_pushdef([pkg_description],
|
||||||
@@ -255,15 +196,13 @@ AC_ARG_WITH([noarch-pkgconfigdir],
|
|||||||
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])
|
||||||
m4_popdef([pkg_default])
|
m4_popdef([pkg_default])
|
||||||
m4_popdef([pkg_description])
|
m4_popdef([pkg_description])
|
||||||
])dnl PKG_NOARCH_INSTALLDIR
|
]) dnl PKG_NOARCH_INSTALLDIR
|
||||||
|
|
||||||
|
|
||||||
dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,
|
||||||
dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||||
dnl -------------------------------------------
|
# -------------------------------------------
|
||||||
dnl Since: 0.28
|
# Retrieves the value of the pkg-config variable for the given module.
|
||||||
dnl
|
|
||||||
dnl Retrieves the value of the pkg-config variable for the given module.
|
|
||||||
AC_DEFUN([PKG_CHECK_VAR],
|
AC_DEFUN([PKG_CHECK_VAR],
|
||||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||||
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl
|
||||||
@@ -272,4 +211,4 @@ _PKG_CONFIG([$1], [variable="][$3]["], [$2])
|
|||||||
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
AS_VAR_COPY([$1], [pkg_cv_][$1])
|
||||||
|
|
||||||
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||||
])dnl PKG_CHECK_VAR
|
])# PKG_CHECK_VAR
|
||||||
|
|||||||
@@ -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.15.2],
|
[PKG_CHECK_EXISTS([Qt5Core >= 5.11],
|
||||||
[PKG_CHECK_VAR(QT_QMAKE,
|
[PKG_CHECK_VAR(QT_QMAKE,
|
||||||
[Qt5Core >= 5.15.2],
|
[Qt5Core >= 5.11],
|
||||||
[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.15.2])
|
AC_MSG_CHECKING([for Qt5 qmake >= 5.11])
|
||||||
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,8 +29,8 @@ 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.15.2])
|
[AC_MSG_CHECKING([for Qt5DBus >= 5.11])
|
||||||
PKG_CHECK_EXISTS([Qt5DBus >= 5.15.2],
|
PKG_CHECK_EXISTS([Qt5DBus >= 5.11],
|
||||||
[AC_MSG_RESULT([found])
|
[AC_MSG_RESULT([found])
|
||||||
HAVE_QTDBUS=[true]],
|
HAVE_QTDBUS=[true]],
|
||||||
[AC_MSG_RESULT([not found])
|
[AC_MSG_RESULT([not found])
|
||||||
|
|||||||
@@ -9,8 +9,6 @@ else {
|
|||||||
|
|
||||||
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.14
|
QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.14
|
||||||
|
|
||||||
DEFINES += _DARWIN_FEATURE_64_BIT_INODE
|
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -1,66 +1,47 @@
|
|||||||
macro(find_libtorrent version)
|
if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
||||||
if (UNIX AND (NOT APPLE) AND (NOT CYGWIN))
|
find_package(LibtorrentRasterbar QUIET ${minLibtorrentVersion} COMPONENTS torrent-rasterbar)
|
||||||
find_package(LibtorrentRasterbar QUIET ${version} 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>=${minLibtorrentVersion}")
|
||||||
pkg_check_modules(LibtorrentRasterbar IMPORTED_TARGET GLOBAL "libtorrent-rasterbar>=${version}")
|
if (NOT LIBTORRENT_RASTERBAR_FOUND)
|
||||||
if (NOT LibtorrentRasterbar_FOUND)
|
message(
|
||||||
message(
|
FATAL_ERROR
|
||||||
FATAL_ERROR
|
"Package LibtorrentRasterbar >= ${minLibtorrentVersion} not found"
|
||||||
"Package LibtorrentRasterbar >= ${version} 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"
|
" file in your system's pkg-config search paths (use the system environment variable PKG_CONFIG_PATH"
|
||||||
" file in your system's pkg-config search paths (use the system environment variable PKG_CONFIG_PATH"
|
" to specify additional search paths if needed)."
|
||||||
" to specify additional search paths if needed)."
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
add_library(LibtorrentRasterbar::torrent-rasterbar ALIAS PkgConfig::LibtorrentRasterbar)
|
|
||||||
# force a fake package to show up in the feature summary
|
|
||||||
set_property(GLOBAL APPEND PROPERTY
|
|
||||||
PACKAGES_FOUND
|
|
||||||
"LibtorrentRasterbar via pkg-config (version >= ${version})"
|
|
||||||
)
|
)
|
||||||
set_package_properties("LibtorrentRasterbar via pkg-config (version >= ${version})"
|
|
||||||
PROPERTIES
|
|
||||||
TYPE REQUIRED
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
set_package_properties(LibtorrentRasterbar PROPERTIES TYPE REQUIRED)
|
|
||||||
endif()
|
endif()
|
||||||
|
add_library(LibtorrentRasterbar::torrent-rasterbar ALIAS PkgConfig::LIBTORRENT_RASTERBAR)
|
||||||
|
# force a fake package to show up in the feature summary
|
||||||
|
set_property(GLOBAL APPEND PROPERTY
|
||||||
|
PACKAGES_FOUND
|
||||||
|
"LibtorrentRasterbar via pkg-config (version >= ${minLibtorrentVersion})"
|
||||||
|
)
|
||||||
|
set_package_properties("LibtorrentRasterbar via pkg-config (version >= ${minLibtorrentVersion})"
|
||||||
|
PROPERTIES
|
||||||
|
TYPE REQUIRED
|
||||||
|
)
|
||||||
else()
|
else()
|
||||||
find_package(LibtorrentRasterbar ${version} REQUIRED COMPONENTS torrent-rasterbar)
|
set_package_properties(LibtorrentRasterbar PROPERTIES TYPE REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
endmacro()
|
else()
|
||||||
|
find_package(LibtorrentRasterbar ${minLibtorrentVersion} REQUIRED COMPONENTS torrent-rasterbar)
|
||||||
find_libtorrent(${minLibtorrent1Version})
|
|
||||||
if (LibtorrentRasterbar_FOUND AND (LibtorrentRasterbar_VERSION VERSION_GREATER_EQUAL 2.0))
|
|
||||||
find_libtorrent(${minLibtorrentVersion})
|
|
||||||
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 ${minBoostVersion} REQUIRED)
|
find_package(Boost ${minBoostVersion} REQUIRED)
|
||||||
find_package(OpenSSL ${minOpenSSLVersion} REQUIRED)
|
find_package(OpenSSL ${minOpenSSLVersion} REQUIRED)
|
||||||
find_package(ZLIB ${minZlibVersion} REQUIRED)
|
find_package(ZLIB ${minZlibVersion} REQUIRED)
|
||||||
if (QT6)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS Core Network Xml LinguistTools)
|
||||||
find_package(Qt6 ${minQt6Version} REQUIRED COMPONENTS Core Network Sql Xml LinguistTools)
|
if (DBUS)
|
||||||
if (DBUS)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS DBus)
|
||||||
find_package(Qt6 ${minQt6Version} REQUIRED COMPONENTS DBus)
|
set_package_properties(Qt5DBus PROPERTIES
|
||||||
set_package_properties(Qt6DBus PROPERTIES
|
DESCRIPTION "Qt5 module for inter-process communication over the D-Bus protocol"
|
||||||
DESCRIPTION "Qt6 module for inter-process communication over the D-Bus protocol"
|
PURPOSE "Required by the DBUS feature"
|
||||||
PURPOSE "Required by the DBUS feature"
|
)
|
||||||
)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
find_package(Qt5 ${minQt5Version} REQUIRED COMPONENTS Core Network Sql Xml LinguistTools)
|
|
||||||
if (DBUS)
|
|
||||||
find_package(Qt5 ${minQt5Version} REQUIRED COMPONENTS DBus)
|
|
||||||
set_package_properties(Qt5DBus PROPERTIES
|
|
||||||
DESCRIPTION "Qt5 module for inter-process communication over the D-Bus protocol"
|
|
||||||
PURPOSE "Required by the DBUS feature"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# automatically call Qt moc, rcc and uic as needed for all targets by default
|
# automatically call Qt moc, rcc and uic as needed for all targets by default
|
||||||
@@ -79,15 +60,12 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
|
|||||||
add_subdirectory(base)
|
add_subdirectory(base)
|
||||||
|
|
||||||
if (GUI)
|
if (GUI)
|
||||||
if (QT6)
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS Widgets Svg)
|
||||||
find_package(Qt6 ${minQt6Version} REQUIRED COMPONENTS Widgets Svg)
|
if (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
else()
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS MacExtras)
|
||||||
find_package(Qt5 ${minQt5Version} REQUIRED COMPONENTS Widgets Svg)
|
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
find_package(Qt5 ${minQtVersion} REQUIRED COMPONENTS WinExtras)
|
||||||
find_package(Qt5 ${minQt5Version} REQUIRED COMPONENTS WinExtras)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory(gui)
|
add_subdirectory(gui)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,22 @@
|
|||||||
# Based on https://gist.github.com/giraldeau/546ba5512a74dfe9d8ea0862d66db412
|
# Based on https://gist.github.com/giraldeau/546ba5512a74dfe9d8ea0862d66db412
|
||||||
file(GLOB QBT_TS_FILES "${qBittorrent_SOURCE_DIR}/src/lang/*.ts")
|
file(GLOB QBT_TS_FILES "${qBittorrent_SOURCE_DIR}/src/lang/*.ts")
|
||||||
set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${qBittorrent_BINARY_DIR}/src/lang")
|
set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${qBittorrent_BINARY_DIR}/src/lang")
|
||||||
qt_add_translation(QBT_QM_FILES ${QBT_TS_FILES} OPTIONS -silent)
|
if (Qt5_VERSION VERSION_LESS 5.12)
|
||||||
|
qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
|
||||||
|
else()
|
||||||
|
qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES} OPTIONS -silent)
|
||||||
|
endif()
|
||||||
configure_file("${qBittorrent_SOURCE_DIR}/src/lang/lang.qrc" "${qBittorrent_BINARY_DIR}/src/lang/lang.qrc" COPYONLY)
|
configure_file("${qBittorrent_SOURCE_DIR}/src/lang/lang.qrc" "${qBittorrent_BINARY_DIR}/src/lang/lang.qrc" COPYONLY)
|
||||||
|
|
||||||
if (WEBUI)
|
if (WEBUI)
|
||||||
file(GLOB QBT_WEBUI_TS_FILES "${qBittorrent_SOURCE_DIR}/src/webui/www/translations/*.ts")
|
file(GLOB QBT_WEBUI_TS_FILES "${qBittorrent_SOURCE_DIR}/src/webui/www/translations/*.ts")
|
||||||
set_source_files_properties(${QBT_WEBUI_TS_FILES}
|
set_source_files_properties(${QBT_WEBUI_TS_FILES}
|
||||||
PROPERTIES OUTPUT_LOCATION "${qBittorrent_BINARY_DIR}/src/webui/www/translations")
|
PROPERTIES OUTPUT_LOCATION "${qBittorrent_BINARY_DIR}/src/webui/www/translations")
|
||||||
qt_add_translation(QBT_WEBUI_QM_FILES ${QBT_WEBUI_TS_FILES} OPTIONS -silent)
|
if (Qt5_VERSION VERSION_LESS 5.12)
|
||||||
|
qt5_add_translation(QBT_WEBUI_QM_FILES ${QBT_WEBUI_TS_FILES})
|
||||||
|
else()
|
||||||
|
qt5_add_translation(QBT_WEBUI_QM_FILES ${QBT_WEBUI_TS_FILES} OPTIONS -silent)
|
||||||
|
endif()
|
||||||
configure_file("${qBittorrent_SOURCE_DIR}/src/webui/www/translations/webui_translations.qrc"
|
configure_file("${qBittorrent_SOURCE_DIR}/src/webui/www/translations/webui_translations.qrc"
|
||||||
"${qBittorrent_BINARY_DIR}/src/webui/www/translations/webui_translations.qrc" COPYONLY)
|
"${qBittorrent_BINARY_DIR}/src/webui/www/translations/webui_translations.qrc" COPYONLY)
|
||||||
endif()
|
endif()
|
||||||
@@ -139,7 +147,11 @@ endif()
|
|||||||
if (GUI)
|
if (GUI)
|
||||||
target_link_libraries(qbt_app PRIVATE qbt_gui)
|
target_link_libraries(qbt_app PRIVATE qbt_gui)
|
||||||
if ((CMAKE_SYSTEM_NAME STREQUAL "Windows") OR (CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
|
if ((CMAKE_SYSTEM_NAME STREQUAL "Windows") OR (CMAKE_SYSTEM_NAME STREQUAL "Darwin"))
|
||||||
qt_import_plugins(qbt_app INCLUDE Qt::QSvgIconPlugin Qt::QSvgPlugin)
|
if (Qt5_VERSION VERSION_LESS 5.14)
|
||||||
|
set_property(TARGET qbt_app APPEND PROPERTY QT_PLUGINS Qt5::QSvgIconPlugin Qt5::QSvgPlugin)
|
||||||
|
else()
|
||||||
|
qt_import_plugins(qbt_app INCLUDE Qt5::QSvgIconPlugin Qt5::QSvgPlugin)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -78,9 +78,9 @@
|
|||||||
#include "base/search/searchpluginmanager.h"
|
#include "base/search/searchpluginmanager.h"
|
||||||
#include "base/settingsstorage.h"
|
#include "base/settingsstorage.h"
|
||||||
#include "base/torrentfileswatcher.h"
|
#include "base/torrentfileswatcher.h"
|
||||||
#include "base/utils/compare.h"
|
|
||||||
#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/version.h"
|
#include "base/version.h"
|
||||||
#include "applicationinstancemanager.h"
|
#include "applicationinstancemanager.h"
|
||||||
#include "filelogger.h"
|
#include "filelogger.h"
|
||||||
@@ -100,10 +100,22 @@
|
|||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
#define SETTINGS_KEY(name) "Application/" name
|
#define SETTINGS_KEY(name) "Application/" name
|
||||||
#define FILELOGGER_SETTINGS_KEY(name) (SETTINGS_KEY("FileLogger/") name)
|
|
||||||
|
// FileLogger properties keys
|
||||||
|
#define FILELOGGER_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("FileLogger/") name)
|
||||||
|
const QString KEY_FILELOGGER_ENABLED = FILELOGGER_SETTINGS_KEY("Enabled");
|
||||||
|
const QString KEY_FILELOGGER_PATH = FILELOGGER_SETTINGS_KEY("Path");
|
||||||
|
const QString KEY_FILELOGGER_BACKUP = FILELOGGER_SETTINGS_KEY("Backup");
|
||||||
|
const QString KEY_FILELOGGER_DELETEOLD = FILELOGGER_SETTINGS_KEY("DeleteOld");
|
||||||
|
const QString KEY_FILELOGGER_MAXSIZEBYTES = FILELOGGER_SETTINGS_KEY("MaxSizeBytes");
|
||||||
|
const QString KEY_FILELOGGER_AGE = FILELOGGER_SETTINGS_KEY("Age");
|
||||||
|
const QString KEY_FILELOGGER_AGETYPE = FILELOGGER_SETTINGS_KEY("AgeType");
|
||||||
|
|
||||||
|
// just a shortcut
|
||||||
|
inline SettingsStorage *settings() { return SettingsStorage::instance(); }
|
||||||
|
|
||||||
const QString LOG_FOLDER = QStringLiteral("logs");
|
const QString LOG_FOLDER = QStringLiteral("logs");
|
||||||
const QChar PARAMS_SEPARATOR = QLatin1Char('|');
|
const QChar PARAMS_SEPARATOR = '|';
|
||||||
|
|
||||||
const QString DEFAULT_PORTABLE_MODE_PROFILE_DIR = QStringLiteral("profile");
|
const QString DEFAULT_PORTABLE_MODE_PROFILE_DIR = QStringLiteral("profile");
|
||||||
|
|
||||||
@@ -121,13 +133,6 @@ Application::Application(int &argc, char **argv)
|
|||||||
, m_running(false)
|
, m_running(false)
|
||||||
, m_shutdownAct(ShutdownDialogAction::Exit)
|
, m_shutdownAct(ShutdownDialogAction::Exit)
|
||||||
, m_commandLineArgs(parseCommandLine(this->arguments()))
|
, m_commandLineArgs(parseCommandLine(this->arguments()))
|
||||||
, m_storeFileLoggerEnabled(FILELOGGER_SETTINGS_KEY("Enabled"))
|
|
||||||
, m_storeFileLoggerBackup(FILELOGGER_SETTINGS_KEY("Backup"))
|
|
||||||
, m_storeFileLoggerDeleteOld(FILELOGGER_SETTINGS_KEY("DeleteOld"))
|
|
||||||
, m_storeFileLoggerMaxSize(FILELOGGER_SETTINGS_KEY("MaxSizeBytes"))
|
|
||||||
, m_storeFileLoggerAge(FILELOGGER_SETTINGS_KEY("Age"))
|
|
||||||
, m_storeFileLoggerAgeType(FILELOGGER_SETTINGS_KEY("AgeType"))
|
|
||||||
, m_storeFileLoggerPath(FILELOGGER_SETTINGS_KEY("Path"))
|
|
||||||
{
|
{
|
||||||
qRegisterMetaType<Log::Msg>("Log::Msg");
|
qRegisterMetaType<Log::Msg>("Log::Msg");
|
||||||
qRegisterMetaType<Log::Peer>("Log::Peer");
|
qRegisterMetaType<Log::Peer>("Log::Peer");
|
||||||
@@ -136,9 +141,7 @@ Application::Application(int &argc, char **argv)
|
|||||||
setOrganizationDomain("qbittorrent.org");
|
setOrganizationDomain("qbittorrent.org");
|
||||||
#if !defined(DISABLE_GUI)
|
#if !defined(DISABLE_GUI)
|
||||||
setDesktopFileName("org.qbittorrent.qBittorrent");
|
setDesktopFileName("org.qbittorrent.qBittorrent");
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
|
||||||
setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support
|
setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support
|
||||||
#endif
|
|
||||||
setQuitOnLastWindowClosed(false);
|
setQuitOnLastWindowClosed(false);
|
||||||
QPixmapCache::setCacheLimit(PIXMAP_CACHE_SIZE);
|
QPixmapCache::setCacheLimit(PIXMAP_CACHE_SIZE);
|
||||||
#endif
|
#endif
|
||||||
@@ -149,11 +152,17 @@ Application::Application(int &argc, char **argv)
|
|||||||
const QString profileDir = portableModeEnabled
|
const QString profileDir = portableModeEnabled
|
||||||
? QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(DEFAULT_PORTABLE_MODE_PROFILE_DIR)
|
? QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(DEFAULT_PORTABLE_MODE_PROFILE_DIR)
|
||||||
: m_commandLineArgs.profileDir;
|
: m_commandLineArgs.profileDir;
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
const QString instanceId = (profileDir + (m_commandLineArgs.configurationName.isEmpty() ? QString {} : ('/' + m_commandLineArgs.configurationName))).toLower();
|
||||||
|
#else
|
||||||
|
const QString instanceId = profileDir + (m_commandLineArgs.configurationName.isEmpty() ? QString {} : ('/' + m_commandLineArgs.configurationName));
|
||||||
|
#endif
|
||||||
|
const QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString() + '@' + instanceId;
|
||||||
|
m_instanceManager = new ApplicationInstanceManager {appId, this};
|
||||||
|
|
||||||
Profile::initInstance(profileDir, m_commandLineArgs.configurationName,
|
Profile::initInstance(profileDir, m_commandLineArgs.configurationName,
|
||||||
(m_commandLineArgs.relativeFastresumePaths || portableModeEnabled));
|
(m_commandLineArgs.relativeFastresumePaths || portableModeEnabled));
|
||||||
|
|
||||||
m_instanceManager = new ApplicationInstanceManager {Profile::instance()->location(SpecialFolder::Config), this};
|
|
||||||
|
|
||||||
Logger::initInstance();
|
Logger::initInstance();
|
||||||
SettingsStorage::initInstance();
|
SettingsStorage::initInstance();
|
||||||
Preferences::initInstance();
|
Preferences::initInstance();
|
||||||
@@ -206,7 +215,7 @@ const QBtCommandLineParameters &Application::commandLineArgs() const
|
|||||||
|
|
||||||
bool Application::isFileLoggerEnabled() const
|
bool Application::isFileLoggerEnabled() const
|
||||||
{
|
{
|
||||||
return m_storeFileLoggerEnabled.get(true);
|
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerEnabled(const bool value)
|
void Application::setFileLoggerEnabled(const bool value)
|
||||||
@@ -215,48 +224,49 @@ void Application::setFileLoggerEnabled(const bool value)
|
|||||||
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()));
|
||||||
else if (!value)
|
else if (!value)
|
||||||
delete m_fileLogger;
|
delete m_fileLogger;
|
||||||
m_storeFileLoggerEnabled = value;
|
settings()->storeValue(KEY_FILELOGGER_ENABLED, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Application::fileLoggerPath() const
|
QString Application::fileLoggerPath() const
|
||||||
{
|
{
|
||||||
return m_storeFileLoggerPath.get(QDir(specialFolderLocation(SpecialFolder::Data)).absoluteFilePath(LOG_FOLDER));
|
return settings()->loadValue(KEY_FILELOGGER_PATH
|
||||||
|
, QString {specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER});
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerPath(const QString &path)
|
void Application::setFileLoggerPath(const QString &path)
|
||||||
{
|
{
|
||||||
if (m_fileLogger)
|
if (m_fileLogger)
|
||||||
m_fileLogger->changePath(path);
|
m_fileLogger->changePath(path);
|
||||||
m_storeFileLoggerPath = path;
|
settings()->storeValue(KEY_FILELOGGER_PATH, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::isFileLoggerBackup() const
|
bool Application::isFileLoggerBackup() const
|
||||||
{
|
{
|
||||||
return m_storeFileLoggerBackup.get(true);
|
return settings()->loadValue(KEY_FILELOGGER_BACKUP, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerBackup(const bool value)
|
void Application::setFileLoggerBackup(const bool value)
|
||||||
{
|
{
|
||||||
if (m_fileLogger)
|
if (m_fileLogger)
|
||||||
m_fileLogger->setBackup(value);
|
m_fileLogger->setBackup(value);
|
||||||
m_storeFileLoggerBackup = value;
|
settings()->storeValue(KEY_FILELOGGER_BACKUP, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Application::isFileLoggerDeleteOld() const
|
bool Application::isFileLoggerDeleteOld() const
|
||||||
{
|
{
|
||||||
return m_storeFileLoggerDeleteOld.get(true);
|
return settings()->loadValue(KEY_FILELOGGER_DELETEOLD, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerDeleteOld(const bool value)
|
void Application::setFileLoggerDeleteOld(const bool value)
|
||||||
{
|
{
|
||||||
if (value && m_fileLogger)
|
if (value && m_fileLogger)
|
||||||
m_fileLogger->deleteOld(fileLoggerAge(), static_cast<FileLogger::FileLogAgeType>(fileLoggerAgeType()));
|
m_fileLogger->deleteOld(fileLoggerAge(), static_cast<FileLogger::FileLogAgeType>(fileLoggerAgeType()));
|
||||||
m_storeFileLoggerDeleteOld = value;
|
settings()->storeValue(KEY_FILELOGGER_DELETEOLD, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Application::fileLoggerMaxSize() const
|
int Application::fileLoggerMaxSize() const
|
||||||
{
|
{
|
||||||
const int val = m_storeFileLoggerMaxSize.get(DEFAULT_FILELOG_SIZE);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,34 +275,34 @@ void Application::setFileLoggerMaxSize(const int bytes)
|
|||||||
const int clampedValue = std::min(std::max(bytes, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
const int clampedValue = std::min(std::max(bytes, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
|
||||||
if (m_fileLogger)
|
if (m_fileLogger)
|
||||||
m_fileLogger->setMaxSize(clampedValue);
|
m_fileLogger->setMaxSize(clampedValue);
|
||||||
m_storeFileLoggerMaxSize = clampedValue;
|
settings()->storeValue(KEY_FILELOGGER_MAXSIZEBYTES, clampedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Application::fileLoggerAge() const
|
int Application::fileLoggerAge() const
|
||||||
{
|
{
|
||||||
const int val = m_storeFileLoggerAge.get(1);
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerAge(const int value)
|
void Application::setFileLoggerAge(const int value)
|
||||||
{
|
{
|
||||||
m_storeFileLoggerAge = std::min(std::max(value, 1), 365);
|
settings()->storeValue(KEY_FILELOGGER_AGE, std::min(std::max(value, 1), 365));
|
||||||
}
|
}
|
||||||
|
|
||||||
int Application::fileLoggerAgeType() const
|
int Application::fileLoggerAgeType() const
|
||||||
{
|
{
|
||||||
const int val = m_storeFileLoggerAgeType.get(1);
|
const int val = settings()->loadValue(KEY_FILELOGGER_AGETYPE, 1);
|
||||||
return ((val < 0) || (val > 2)) ? 1 : val;
|
return ((val < 0) || (val > 2)) ? 1 : val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::setFileLoggerAgeType(const int value)
|
void Application::setFileLoggerAgeType(const int value)
|
||||||
{
|
{
|
||||||
m_storeFileLoggerAgeType = ((value < 0) || (value > 2)) ? 1 : value;
|
settings()->storeValue(KEY_FILELOGGER_AGETYPE, ((value < 0) || (value > 2)) ? 1 : value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::processMessage(const QString &message)
|
void Application::processMessage(const QString &message)
|
||||||
{
|
{
|
||||||
const QStringList params = message.split(PARAMS_SEPARATOR, Qt::SkipEmptyParts);
|
const QStringList params = message.split(PARAMS_SEPARATOR, QString::SkipEmptyParts);
|
||||||
// If Application is not running (i.e., other
|
// If Application is not running (i.e., other
|
||||||
// components are not ready) store params
|
// components are not ready) store params
|
||||||
if (m_running)
|
if (m_running)
|
||||||
@@ -340,15 +350,13 @@ void Application::runExternalProgram(const BitTorrent::Torrent *torrent) const
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case u'G':
|
case u'G':
|
||||||
program.replace(i, 2, torrent->tags().join(QLatin1String(",")));
|
{
|
||||||
|
QStringList tags = torrent->tags().values();
|
||||||
|
std::sort(tags.begin(), tags.end(), Utils::String::naturalLessThan<Qt::CaseInsensitive>);
|
||||||
|
program.replace(i, 2, tags.join(','));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case u'I':
|
case u'I':
|
||||||
program.replace(i, 2, (torrent->infoHash().v1().isValid() ? torrent->infoHash().v1().toString() : QLatin1String("-")));
|
|
||||||
break;
|
|
||||||
case u'J':
|
|
||||||
program.replace(i, 2, (torrent->infoHash().v2().isValid() ? torrent->infoHash().v2().toString() : QLatin1String("-")));
|
|
||||||
break;
|
|
||||||
case u'K':
|
|
||||||
program.replace(i, 2, torrent->id().toString());
|
program.replace(i, 2, torrent->id().toString());
|
||||||
break;
|
break;
|
||||||
case u'L':
|
case u'L':
|
||||||
@@ -425,12 +433,16 @@ void Application::runExternalProgram(const BitTorrent::Torrent *torrent) const
|
|||||||
// enable command injection via torrent name and other arguments
|
// enable command injection via torrent name and other arguments
|
||||||
// (especially when some automated download mechanism has been setup).
|
// (especially when some automated download mechanism has been setup).
|
||||||
// See: https://github.com/qbittorrent/qBittorrent/issues/10925
|
// See: https://github.com/qbittorrent/qBittorrent/issues/10925
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
|
||||||
QStringList args = QProcess::splitCommand(program);
|
QStringList args = QProcess::splitCommand(program);
|
||||||
if (args.isEmpty())
|
if (args.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const QString command = args.takeFirst();
|
const QString command = args.takeFirst();
|
||||||
QProcess::startDetached(command, args);
|
QProcess::startDetached(command, args);
|
||||||
|
#else
|
||||||
|
QProcess::startDetached(program);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -551,7 +563,7 @@ void Application::processParams(const QStringList ¶ms)
|
|||||||
|
|
||||||
if (param.startsWith(QLatin1String("@addPaused=")))
|
if (param.startsWith(QLatin1String("@addPaused=")))
|
||||||
{
|
{
|
||||||
torrentParams.addPaused = (QStringView(param).mid(11).toInt() != 0);
|
torrentParams.addPaused = (param.midRef(11).toInt() != 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -581,7 +593,7 @@ void Application::processParams(const QStringList ¶ms)
|
|||||||
|
|
||||||
if (param.startsWith(QLatin1String("@skipDialog=")))
|
if (param.startsWith(QLatin1String("@skipDialog=")))
|
||||||
{
|
{
|
||||||
skipTorrentDialog = (QStringView(param).mid(12).toInt() != 0);
|
skipTorrentDialog = (param.midRef(12).toInt() != 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,19 +657,18 @@ int Application::exec(const QStringList ¶ms)
|
|||||||
|
|
||||||
#ifdef DISABLE_GUI
|
#ifdef DISABLE_GUI
|
||||||
#ifndef DISABLE_WEBUI
|
#ifndef DISABLE_WEBUI
|
||||||
const Preferences *pref = Preferences::instance();
|
Preferences *const pref = Preferences::instance();
|
||||||
|
// Display some information to the user
|
||||||
const auto scheme = QString::fromLatin1(pref->isWebUiHttpsEnabled() ? "https" : "http");
|
|
||||||
const auto url = QString::fromLatin1("%1://localhost:%2\n").arg(scheme, QString::number(pref->getWebUiPort()));
|
|
||||||
const QString mesg = QString::fromLatin1("\n******** %1 ********\n").arg(tr("Information"))
|
const QString mesg = QString::fromLatin1("\n******** %1 ********\n").arg(tr("Information"))
|
||||||
+ tr("To control qBittorrent, access the WebUI at: %1").arg(url);
|
+ tr("To control qBittorrent, access the Web UI at %1")
|
||||||
printf("%s\n", qUtf8Printable(mesg));
|
.arg(QString("http://localhost:") + QString::number(pref->getWebUiPort())) + '\n';
|
||||||
|
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 has not been changed from the default: %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 change your password in program preferences.") + '\n';
|
+ tr("This is a security risk, please consider changing your password from program preferences.") + '\n';
|
||||||
printf("%s", qUtf8Printable(warning));
|
printf("%s", qUtf8Printable(warning));
|
||||||
}
|
}
|
||||||
#endif // DISABLE_WEBUI
|
#endif // DISABLE_WEBUI
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ class QSessionManager;
|
|||||||
using BaseApplication = QCoreApplication;
|
using BaseApplication = QCoreApplication;
|
||||||
#endif // DISABLE_GUI
|
#endif // DISABLE_GUI
|
||||||
|
|
||||||
#include "base/settingvalue.h"
|
|
||||||
#include "base/types.h"
|
#include "base/types.h"
|
||||||
#include "cmdoptions.h"
|
#include "cmdoptions.h"
|
||||||
|
|
||||||
@@ -72,7 +71,7 @@ namespace RSS
|
|||||||
class Application final : public BaseApplication
|
class Application final : public BaseApplication
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(Application)
|
Q_DISABLE_COPY(Application)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Application(int &argc, char **argv);
|
Application(int &argc, char **argv);
|
||||||
@@ -121,11 +120,6 @@ private slots:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void initializeTranslation();
|
|
||||||
void processParams(const QStringList ¶ms);
|
|
||||||
void runExternalProgram(const BitTorrent::Torrent *torrent) const;
|
|
||||||
void sendNotificationEmail(const BitTorrent::Torrent *torrent);
|
|
||||||
|
|
||||||
ApplicationInstanceManager *m_instanceManager = nullptr;
|
ApplicationInstanceManager *m_instanceManager = nullptr;
|
||||||
bool m_running;
|
bool m_running;
|
||||||
ShutdownDialogAction m_shutdownAct;
|
ShutdownDialogAction m_shutdownAct;
|
||||||
@@ -146,11 +140,8 @@ private:
|
|||||||
QTranslator m_translator;
|
QTranslator m_translator;
|
||||||
QStringList m_paramsQueue;
|
QStringList m_paramsQueue;
|
||||||
|
|
||||||
SettingValue<bool> m_storeFileLoggerEnabled;
|
void initializeTranslation();
|
||||||
SettingValue<bool> m_storeFileLoggerBackup;
|
void processParams(const QStringList ¶ms);
|
||||||
SettingValue<bool> m_storeFileLoggerDeleteOld;
|
void runExternalProgram(const BitTorrent::Torrent *torrent) const;
|
||||||
SettingValue<int> m_storeFileLoggerMaxSize;
|
void sendNotificationEmail(const BitTorrent::Torrent *torrent);
|
||||||
SettingValue<int> m_storeFileLoggerAge;
|
|
||||||
SettingValue<int> m_storeFileLoggerAgeType;
|
|
||||||
SettingValue<QString> m_storeFileLoggerPath;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -28,27 +28,24 @@
|
|||||||
|
|
||||||
#include "applicationinstancemanager.h"
|
#include "applicationinstancemanager.h"
|
||||||
|
|
||||||
#include <QtGlobal>
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QSharedMemory>
|
#include <QSharedMemory>
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "qtlocalpeer/qtlocalpeer.h"
|
#include "qtlocalpeer/qtlocalpeer.h"
|
||||||
|
|
||||||
ApplicationInstanceManager::ApplicationInstanceManager(const QString &instancePath, QObject *parent)
|
ApplicationInstanceManager::ApplicationInstanceManager(const QString &appId, QObject *parent)
|
||||||
: QObject {parent}
|
: QObject {parent}
|
||||||
, m_peer {new QtLocalPeer {instancePath, this}}
|
, m_peer {new QtLocalPeer {this, appId}}
|
||||||
, m_isFirstInstance {!m_peer->isClient()}
|
, m_isFirstInstance {!m_peer->isClient()}
|
||||||
{
|
{
|
||||||
connect(m_peer, &QtLocalPeer::messageReceived, this, &ApplicationInstanceManager::messageReceived);
|
connect(m_peer, &QtLocalPeer::messageReceived, this, &ApplicationInstanceManager::messageReceived);
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
const QString sharedMemoryKey = instancePath + QLatin1String {"/shared-memory"};
|
auto sharedMem = new QSharedMemory {appId + QLatin1String {"-shared-memory-key"}, this};
|
||||||
auto sharedMem = new QSharedMemory {sharedMemoryKey, this};
|
|
||||||
if (m_isFirstInstance)
|
if (m_isFirstInstance)
|
||||||
{
|
{
|
||||||
// First instance creates shared memory and store PID
|
// First instance creates shared memory and store PID
|
||||||
@@ -82,3 +79,8 @@ bool ApplicationInstanceManager::sendMessage(const QString &message, const int t
|
|||||||
{
|
{
|
||||||
return m_peer->sendMessage(message, timeout);
|
return m_peer->sendMessage(message, timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString ApplicationInstanceManager::appId() const
|
||||||
|
{
|
||||||
|
return m_peer->applicationId();
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,15 +32,16 @@
|
|||||||
|
|
||||||
class QtLocalPeer;
|
class QtLocalPeer;
|
||||||
|
|
||||||
class ApplicationInstanceManager final : public QObject
|
class ApplicationInstanceManager : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(ApplicationInstanceManager)
|
Q_DISABLE_COPY(ApplicationInstanceManager)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ApplicationInstanceManager(const QString &instancePath, QObject *parent = nullptr);
|
explicit ApplicationInstanceManager(const QString &appId, QObject *parent = nullptr);
|
||||||
|
|
||||||
bool isFirstInstance() const;
|
bool isFirstInstance() const;
|
||||||
|
QString appId() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
bool sendMessage(const QString &message, int timeout = 5000);
|
bool sendMessage(const QString &message, int timeout = 5000);
|
||||||
|
|||||||
@@ -526,55 +526,55 @@ QString makeUsage(const QString &prgName)
|
|||||||
QTextStream stream(&text, QIODevice::WriteOnly);
|
QTextStream stream(&text, QIODevice::WriteOnly);
|
||||||
QString indentation = QString(USAGE_INDENTATION, ' ');
|
QString indentation = QString(USAGE_INDENTATION, ' ');
|
||||||
|
|
||||||
stream << QObject::tr("Usage:") << '\n'
|
stream << QObject::tr("Usage:") << '\n';
|
||||||
<< indentation << prgName << QLatin1String(" [options] [(<filename> | <url>)...]") << '\n'
|
stream << indentation << prgName << QLatin1String(" [options] [(<filename> | <url>)...]") << '\n';
|
||||||
|
|
||||||
<< QObject::tr("Options:") << '\n'
|
stream << QObject::tr("Options:") << '\n';
|
||||||
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
#if !defined(Q_OS_WIN) || defined(DISABLE_GUI)
|
||||||
<< SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n'
|
stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n';
|
||||||
#endif
|
#endif
|
||||||
<< SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n'
|
stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n';
|
||||||
<< WEBUI_PORT_OPTION.usage(QObject::tr("port"))
|
stream << WEBUI_PORT_OPTION.usage(QObject::tr("port"))
|
||||||
<< wrapText(QObject::tr("Change the Web UI port"))
|
<< wrapText(QObject::tr("Change the Web UI port"))
|
||||||
<< '\n'
|
<< '\n';
|
||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
<< NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n'
|
stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n';
|
||||||
#elif !defined(Q_OS_WIN)
|
#elif !defined(Q_OS_WIN)
|
||||||
<< DAEMON_OPTION.usage() << wrapText(QObject::tr("Run in daemon-mode (background)")) << '\n'
|
stream << DAEMON_OPTION.usage() << wrapText(QObject::tr("Run in daemon-mode (background)")) << '\n';
|
||||||
#endif
|
#endif
|
||||||
//: Use appropriate short form or abbreviation of "directory"
|
//: Use appropriate short form or abbreviation of "directory"
|
||||||
<< PROFILE_OPTION.usage(QObject::tr("dir"))
|
stream << PROFILE_OPTION.usage(QObject::tr("dir"))
|
||||||
<< wrapText(QObject::tr("Store configuration files in <dir>")) << '\n'
|
<< wrapText(QObject::tr("Store configuration files in <dir>")) << '\n';
|
||||||
<< CONFIGURATION_OPTION.usage(QObject::tr("name"))
|
stream << CONFIGURATION_OPTION.usage(QObject::tr("name"))
|
||||||
<< wrapText(QObject::tr("Store configuration files in directories qBittorrent_<name>")) << '\n'
|
<< wrapText(QObject::tr("Store configuration files in directories qBittorrent_<name>")) << '\n';
|
||||||
<< RELATIVE_FASTRESUME.usage()
|
stream << RELATIVE_FASTRESUME.usage()
|
||||||
<< wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
|
<< wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
|
||||||
"to the profile directory")) << '\n'
|
"to the profile directory")) << '\n';
|
||||||
<< Option::padUsageText(QObject::tr("files or URLs"))
|
stream << Option::padUsageText(QObject::tr("files or URLs"))
|
||||||
<< wrapText(QObject::tr("Download the torrents passed by the user")) << '\n'
|
<< wrapText(QObject::tr("Download the torrents passed by the user")) << '\n'
|
||||||
<< '\n'
|
<< '\n';
|
||||||
|
|
||||||
<< wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n'
|
stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n';
|
||||||
<< SAVE_PATH_OPTION.usage(QObject::tr("path")) << wrapText(QObject::tr("Torrent save path")) << '\n'
|
stream << SAVE_PATH_OPTION.usage(QObject::tr("path")) << wrapText(QObject::tr("Torrent save path")) << '\n';
|
||||||
<< PAUSED_OPTION.usage() << wrapText(QObject::tr("Add torrents as started or paused")) << '\n'
|
stream << PAUSED_OPTION.usage() << wrapText(QObject::tr("Add torrents as started or paused")) << '\n';
|
||||||
<< SKIP_HASH_CHECK_OPTION.usage() << wrapText(QObject::tr("Skip hash check")) << '\n'
|
stream << SKIP_HASH_CHECK_OPTION.usage() << wrapText(QObject::tr("Skip hash check")) << '\n';
|
||||||
<< CATEGORY_OPTION.usage(QObject::tr("name"))
|
stream << CATEGORY_OPTION.usage(QObject::tr("name"))
|
||||||
<< wrapText(QObject::tr("Assign torrents to category. If the category doesn't exist, it will be "
|
<< wrapText(QObject::tr("Assign torrents to category. If the category doesn't exist, it will be "
|
||||||
"created.")) << '\n'
|
"created.")) << '\n';
|
||||||
<< SEQUENTIAL_OPTION.usage() << wrapText(QObject::tr("Download files in sequential order")) << '\n'
|
stream << SEQUENTIAL_OPTION.usage() << wrapText(QObject::tr("Download files in sequential order")) << '\n';
|
||||||
<< FIRST_AND_LAST_OPTION.usage()
|
stream << FIRST_AND_LAST_OPTION.usage()
|
||||||
<< wrapText(QObject::tr("Download first and last pieces first")) << '\n'
|
<< wrapText(QObject::tr("Download first and last pieces first")) << '\n';
|
||||||
<< SKIP_DIALOG_OPTION.usage()
|
stream << SKIP_DIALOG_OPTION.usage()
|
||||||
<< wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a "
|
<< wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a "
|
||||||
"torrent.")) << '\n'
|
"torrent.")) << '\n';
|
||||||
<< '\n'
|
stream << '\n';
|
||||||
|
|
||||||
<< wrapText(QObject::tr("Option values may be supplied via environment variables. For option named "
|
stream << wrapText(QObject::tr("Option values may be supplied via environment variables. For option named "
|
||||||
"'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper "
|
"'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper "
|
||||||
"case, '-' replaced with '_'). To pass flag values, set the variable to '1' or "
|
"case, '-' replaced with '_'). To pass flag values, set the variable to '1' or "
|
||||||
"'TRUE'. For example, to disable the splash screen: "), 0) << "\n"
|
"'TRUE'. For example, to disable the splash screen: "), 0) << "\n"
|
||||||
<< QLatin1String("QBT_NO_SPLASH=1 ") << prgName << '\n'
|
<< QLatin1String("QBT_NO_SPLASH=1 ") << prgName << '\n'
|
||||||
<< wrapText(QObject::tr("Command line parameters take precedence over environment variables"), 0) << '\n';
|
<< wrapText(QObject::tr("Command line parameters take precedence over environment variables"), 0) << '\n';
|
||||||
|
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,9 +126,7 @@ void FileLogger::addLogMessage(const Log::Msg &msg)
|
|||||||
if (!m_logFile.isOpen()) return;
|
if (!m_logFile.isOpen()) return;
|
||||||
|
|
||||||
QTextStream stream(&m_logFile);
|
QTextStream stream(&m_logFile);
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
|
||||||
stream.setCodec("UTF-8");
|
stream.setCodec("UTF-8");
|
||||||
#endif
|
|
||||||
|
|
||||||
switch (msg.type)
|
switch (msg.type)
|
||||||
{
|
{
|
||||||
@@ -179,7 +177,7 @@ 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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace Log
|
|||||||
class FileLogger : public QObject
|
class FileLogger : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(FileLogger)
|
Q_DISABLE_COPY(FileLogger)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum FileLogAgeType
|
enum FileLogAgeType
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ int main(int argc, char *argv[])
|
|||||||
// We must save it here because QApplication constructor may change it
|
// We must save it here because QApplication constructor may change it
|
||||||
bool isOneArg = (argc == 2);
|
bool isOneArg = (argc == 2);
|
||||||
|
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && !defined(DISABLE_GUI)
|
#if !defined(DISABLE_GUI) && (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
|
||||||
// Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created
|
// Attribute Qt::AA_EnableHighDpiScaling must be set before QCoreApplication is created
|
||||||
if (qgetenv("QT_ENABLE_HIGHDPI_SCALING").isEmpty() && qgetenv("QT_AUTO_SCREEN_SCALE_FACTOR").isEmpty())
|
if (qgetenv("QT_ENABLE_HIGHDPI_SCALING").isEmpty() && qgetenv("QT_AUTO_SCREEN_SCALE_FACTOR").isEmpty())
|
||||||
Application::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
Application::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
||||||
@@ -188,6 +188,7 @@ int main(int argc, char *argv[])
|
|||||||
#ifndef DISABLE_GUI
|
#ifndef DISABLE_GUI
|
||||||
if (!userAgreesWithLegalNotice())
|
if (!userAgreesWithLegalNotice())
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
#elif defined(Q_OS_WIN)
|
#elif defined(Q_OS_WIN)
|
||||||
if (_isatty(_fileno(stdin))
|
if (_isatty(_fileno(stdin))
|
||||||
&& _isatty(_fileno(stdout))
|
&& _isatty(_fileno(stdout))
|
||||||
@@ -200,8 +201,6 @@ int main(int argc, char *argv[])
|
|||||||
&& !userAgreesWithLegalNotice())
|
&& !userAgreesWithLegalNotice())
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
setCurrentMigrationVersion();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if qBittorrent is already running for this user
|
// Check if qBittorrent is already running for this user
|
||||||
@@ -236,7 +235,7 @@ int main(int argc, char *argv[])
|
|||||||
// 3. https://bugreports.qt.io/browse/QTBUG-46015
|
// 3. https://bugreports.qt.io/browse/QTBUG-46015
|
||||||
|
|
||||||
qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
|
qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
|
||||||
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) && !defined(DISABLE_GUI)
|
#if !defined(DISABLE_GUI)
|
||||||
// this is the default in Qt6
|
// this is the default in Qt6
|
||||||
app->setAttribute(Qt::AA_DisableWindowContextHelpButton);
|
app->setAttribute(Qt::AA_DisableWindowContextHelpButton);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -68,17 +68,20 @@
|
|||||||
|
|
||||||
#include "qtlocalpeer.h"
|
#include "qtlocalpeer.h"
|
||||||
|
|
||||||
#include <QtGlobal>
|
#if defined(Q_OS_UNIX)
|
||||||
|
#include <sys/types.h>
|
||||||
#if defined(Q_OS_WIN)
|
#include <time.h>
|
||||||
#include <Windows.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
#include <QDataStream>
|
#include <QDataStream>
|
||||||
#include <QFileInfo>
|
#include <QDir>
|
||||||
#include <QLocalServer>
|
#include <QLocalServer>
|
||||||
#include <QLocalSocket>
|
#include <QLocalSocket>
|
||||||
|
|
||||||
|
#include "base/utils/misc.h"
|
||||||
|
|
||||||
namespace QtLP_Private
|
namespace QtLP_Private
|
||||||
{
|
{
|
||||||
#include "qtlockedfile.cpp"
|
#include "qtlockedfile.cpp"
|
||||||
@@ -90,49 +93,75 @@ namespace QtLP_Private
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const char ACK[] = "ack";
|
const char* QtLocalPeer::ack = "ack";
|
||||||
|
|
||||||
QtLocalPeer::QtLocalPeer(const QString &path, QObject *parent)
|
QtLocalPeer::QtLocalPeer(QObject *parent, const QString &appId)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
, m_socketName(path + QLatin1String("/ipc-socket"))
|
, id(appId)
|
||||||
, m_server(new QLocalServer(this))
|
|
||||||
{
|
{
|
||||||
m_server->setSocketOptions(QLocalServer::UserAccessOption);
|
QString prefix = id;
|
||||||
|
if (id.isEmpty())
|
||||||
|
{
|
||||||
|
id = QCoreApplication::applicationFilePath();
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
id = id.toLower();
|
||||||
|
#endif
|
||||||
|
prefix = id.section(QLatin1Char('/'), -1);
|
||||||
|
}
|
||||||
|
prefix.remove(QRegExp("[^a-zA-Z]"));
|
||||||
|
prefix.truncate(6);
|
||||||
|
|
||||||
m_lockFile.setFileName(path + QLatin1String("/lockfile"));
|
QByteArray idc = id.toUtf8();
|
||||||
m_lockFile.open(QIODevice::ReadWrite);
|
quint16 idNum = qChecksum(idc.constData(), idc.size());
|
||||||
|
socketName = QLatin1String("qtsingleapp-") + prefix
|
||||||
|
+ QLatin1Char('-') + QString::number(idNum, 16);
|
||||||
|
|
||||||
|
#if defined(Q_OS_WIN)
|
||||||
|
DWORD sessionId = 0;
|
||||||
|
::ProcessIdToSessionId(GetCurrentProcessId(), &sessionId);
|
||||||
|
socketName += (QLatin1Char('-') + QString::number(sessionId, 16));
|
||||||
|
#else
|
||||||
|
socketName += (QLatin1Char('-') + QString::number(::getuid(), 16));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
server = new QLocalServer(this);
|
||||||
|
server->setSocketOptions(QLocalServer::UserAccessOption);
|
||||||
|
QString lockName = QDir(QDir::tempPath()).absolutePath()
|
||||||
|
+ QLatin1Char('/') + socketName
|
||||||
|
+ QLatin1String("-lockfile");
|
||||||
|
lockFile.setFileName(lockName);
|
||||||
|
lockFile.open(QIODevice::ReadWrite);
|
||||||
}
|
}
|
||||||
|
|
||||||
QtLocalPeer::~QtLocalPeer()
|
QtLocalPeer::~QtLocalPeer()
|
||||||
{
|
{
|
||||||
if (!isClient())
|
if (!isClient())
|
||||||
{
|
{
|
||||||
m_lockFile.unlock();
|
lockFile.unlock();
|
||||||
m_lockFile.remove();
|
lockFile.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtLocalPeer::isClient()
|
bool QtLocalPeer::isClient()
|
||||||
{
|
{
|
||||||
if (m_lockFile.isLocked())
|
if (lockFile.isLocked())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!m_lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
|
if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
bool res = m_server->listen(m_socketName);
|
bool res = server->listen(socketName);
|
||||||
#if defined(Q_OS_UNIX)
|
#if defined(Q_OS_UNIX)
|
||||||
// ### Workaround
|
// ### Workaround
|
||||||
if (!res && m_server->serverError() == QAbstractSocket::AddressInUseError)
|
if (!res && server->serverError() == QAbstractSocket::AddressInUseError)
|
||||||
{
|
{
|
||||||
QFile::remove(m_socketName);
|
QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName);
|
||||||
res = m_server->listen(m_socketName);
|
res = server->listen(socketName);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (!res)
|
if (!res)
|
||||||
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qUtf8Printable(m_server->errorString()));
|
qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString()));
|
||||||
|
connect(server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection);
|
||||||
connect(m_server, &QLocalServer::newConnection, this, &QtLocalPeer::receiveConnection);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +175,7 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
|
|||||||
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(m_socketName);
|
socket.connectToServer(socketName);
|
||||||
connOk = socket.waitForConnected(timeout/2);
|
connOk = socket.waitForConnected(timeout/2);
|
||||||
if (connOk || i)
|
if (connOk || i)
|
||||||
break;
|
break;
|
||||||
@@ -169,14 +198,19 @@ bool QtLocalPeer::sendMessage(const QString &message, const int timeout)
|
|||||||
{
|
{
|
||||||
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);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString QtLocalPeer::applicationId() const
|
||||||
|
{
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
void QtLocalPeer::receiveConnection()
|
void QtLocalPeer::receiveConnection()
|
||||||
{
|
{
|
||||||
QLocalSocket *socket = m_server->nextPendingConnection();
|
QLocalSocket* socket = server->nextPendingConnection();
|
||||||
if (!socket)
|
if (!socket)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -220,7 +254,7 @@ void QtLocalPeer::receiveConnection()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
QString message(QString::fromUtf8(uMsg));
|
QString message(QString::fromUtf8(uMsg));
|
||||||
socket->write(ACK, qstrlen(ACK));
|
socket->write(ack, qstrlen(ack));
|
||||||
socket->waitForBytesWritten(1000);
|
socket->waitForBytesWritten(1000);
|
||||||
socket->waitForDisconnected(1000); // make sure client reads ack
|
socket->waitForDisconnected(1000); // make sure client reads ack
|
||||||
delete socket;
|
delete socket;
|
||||||
|
|||||||
@@ -68,32 +68,34 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <QString>
|
|
||||||
|
|
||||||
#include "qtlockedfile.h"
|
#include "qtlockedfile.h"
|
||||||
|
|
||||||
class QLocalServer;
|
class QLocalServer;
|
||||||
|
|
||||||
class QtLocalPeer final : public QObject
|
class QtLocalPeer : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(QtLocalPeer)
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QtLocalPeer(const QString &path, QObject *parent = nullptr);
|
QtLocalPeer(QObject *parent = nullptr, const QString &appId = QString());
|
||||||
~QtLocalPeer() override;
|
~QtLocalPeer() override;
|
||||||
|
|
||||||
bool isClient();
|
bool isClient();
|
||||||
bool sendMessage(const QString &message, int timeout);
|
bool sendMessage(const QString &message, int timeout);
|
||||||
|
QString applicationId() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void messageReceived(const QString &message);
|
void messageReceived(const QString &message);
|
||||||
|
|
||||||
private slots:
|
protected slots:
|
||||||
void receiveConnection();
|
void receiveConnection();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString id;
|
||||||
|
QString socketName;
|
||||||
|
QLocalServer *server = nullptr;
|
||||||
|
QtLP_Private::QtLockedFile lockFile;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString m_socketName;
|
static const char* ack;
|
||||||
QLocalServer *m_server = nullptr;
|
|
||||||
QtLP_Private::QtLockedFile m_lockFile;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -108,7 +108,11 @@
|
|||||||
|
|
||||||
\sa QFile::QFile()
|
\sa QFile::QFile()
|
||||||
*/
|
*/
|
||||||
QtLockedFile::QtLockedFile() = default;
|
QtLockedFile::QtLockedFile()
|
||||||
|
: QFile()
|
||||||
|
{
|
||||||
|
m_lock_mode = NoLock;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Constructs an unlocked QtLockedFile object with file \a name. This
|
Constructs an unlocked QtLockedFile object with file \a name. This
|
||||||
@@ -120,6 +124,7 @@ QtLockedFile::QtLockedFile() = default;
|
|||||||
QtLockedFile::QtLockedFile(const QString &name)
|
QtLockedFile::QtLockedFile(const QString &name)
|
||||||
: QFile(name)
|
: QFile(name)
|
||||||
{
|
{
|
||||||
|
m_lock_mode = NoLock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -137,8 +142,7 @@ QtLockedFile::QtLockedFile(const QString &name)
|
|||||||
*/
|
*/
|
||||||
bool QtLockedFile::open(const OpenMode mode)
|
bool QtLockedFile::open(const OpenMode mode)
|
||||||
{
|
{
|
||||||
if (mode & QIODevice::Truncate)
|
if (mode & QIODevice::Truncate) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::open(): Truncate mode not allowed.");
|
qWarning("QtLockedFile::open(): Truncate mode not allowed.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -153,7 +157,7 @@ bool QtLockedFile::open(const OpenMode mode)
|
|||||||
*/
|
*/
|
||||||
bool QtLockedFile::isLocked() const
|
bool QtLockedFile::isLocked() const
|
||||||
{
|
{
|
||||||
return m_lockMode != NoLock;
|
return m_lock_mode != NoLock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -164,7 +168,7 @@ bool QtLockedFile::isLocked() const
|
|||||||
*/
|
*/
|
||||||
QtLockedFile::LockMode QtLockedFile::lockMode() const
|
QtLockedFile::LockMode QtLockedFile::lockMode() const
|
||||||
{
|
{
|
||||||
return m_lockMode;
|
return m_lock_mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|||||||
@@ -71,7 +71,6 @@
|
|||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
#include <QString>
|
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -101,14 +100,14 @@ namespace QtLP_Private
|
|||||||
private:
|
private:
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
Qt::HANDLE getMutexHandle(int idx, bool doCreate);
|
Qt::HANDLE getMutexHandle(int idx, bool doCreate);
|
||||||
bool waitMutex(Qt::HANDLE mutex, bool doBlock) const;
|
bool waitMutex(Qt::HANDLE mutex, bool doBlock);
|
||||||
|
|
||||||
Qt::HANDLE m_writeMutex = nullptr;
|
Qt::HANDLE wmutex = nullptr;
|
||||||
Qt::HANDLE m_readMutex = nullptr;
|
Qt::HANDLE rmutex = nullptr;
|
||||||
QVector<Qt::HANDLE> m_readMutexes;
|
QVector<Qt::HANDLE> rmutexes;
|
||||||
QString m_mutexName;
|
QString mutexname;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LockMode m_lockMode = NoLock;
|
LockMode m_lock_mode;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,10 +73,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
bool QtLockedFile::lock(const LockMode mode, const bool block)
|
bool QtLockedFile::lock(LockMode mode, bool block)
|
||||||
{
|
{
|
||||||
if (!isOpen())
|
if (!isOpen()) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::lock(): file is not opened");
|
qWarning("QtLockedFile::lock(): file is not opened");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -84,10 +83,10 @@ bool QtLockedFile::lock(const LockMode mode, const bool block)
|
|||||||
if (mode == NoLock)
|
if (mode == NoLock)
|
||||||
return unlock();
|
return unlock();
|
||||||
|
|
||||||
if (mode == m_lockMode)
|
if (mode == m_lock_mode)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (m_lockMode != NoLock)
|
if (m_lock_mode != NoLock)
|
||||||
unlock();
|
unlock();
|
||||||
|
|
||||||
struct flock fl;
|
struct flock fl;
|
||||||
@@ -98,21 +97,19 @@ bool QtLockedFile::lock(const LockMode mode, const bool block)
|
|||||||
int cmd = block ? F_SETLKW : F_SETLK;
|
int cmd = block ? F_SETLKW : F_SETLK;
|
||||||
int ret = fcntl(handle(), cmd, &fl);
|
int ret = fcntl(handle(), cmd, &fl);
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1) {
|
||||||
{
|
|
||||||
if (errno != EINTR && errno != EAGAIN)
|
if (errno != EINTR && errno != EAGAIN)
|
||||||
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lockMode = mode;
|
m_lock_mode = mode;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtLockedFile::unlock()
|
bool QtLockedFile::unlock()
|
||||||
{
|
{
|
||||||
if (!isOpen())
|
if (!isOpen()) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::unlock(): file is not opened");
|
qWarning("QtLockedFile::unlock(): file is not opened");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -127,13 +124,12 @@ bool QtLockedFile::unlock()
|
|||||||
fl.l_type = F_UNLCK;
|
fl.l_type = F_UNLCK;
|
||||||
int ret = fcntl(handle(), F_SETLKW, &fl);
|
int ret = fcntl(handle(), F_SETLKW, &fl);
|
||||||
|
|
||||||
if (ret == -1)
|
if (ret == -1) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lockMode = NoLock;
|
m_lock_mode = NoLock;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -70,73 +70,64 @@
|
|||||||
|
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
|
|
||||||
#include "base/global.h"
|
#define MUTEX_PREFIX "QtLockedFile mutex "
|
||||||
|
|
||||||
// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
|
// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS
|
||||||
const int MAX_READERS = MAXIMUM_WAIT_OBJECTS;
|
#define MAX_READERS MAXIMUM_WAIT_OBJECTS
|
||||||
|
|
||||||
Qt::HANDLE QtLockedFile::getMutexHandle(const int idx, const bool doCreate)
|
#define QT_WA(unicode, ansi) unicode
|
||||||
|
|
||||||
|
Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate)
|
||||||
{
|
{
|
||||||
if (m_mutexName.isEmpty())
|
if (mutexname.isEmpty()) {
|
||||||
{
|
|
||||||
QFileInfo fi(*this);
|
QFileInfo fi(*this);
|
||||||
m_mutexName = QString::fromLatin1("QtLockedFile mutex ") + fi.absoluteFilePath().toLower();
|
mutexname = QString::fromLatin1(MUTEX_PREFIX)
|
||||||
|
+ fi.absoluteFilePath().toLower();
|
||||||
}
|
}
|
||||||
|
QString mname(mutexname);
|
||||||
QString mname = m_mutexName;
|
|
||||||
if (idx >= 0)
|
if (idx >= 0)
|
||||||
mname += QString::number(idx);
|
mname += QString::number(idx);
|
||||||
|
|
||||||
if (doCreate)
|
Qt::HANDLE mutex;
|
||||||
{
|
if (doCreate) {
|
||||||
const Qt::HANDLE mutex = ::CreateMutexW(NULL, FALSE, reinterpret_cast<const TCHAR *>(mname.utf16()));
|
QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); },
|
||||||
if (!mutex)
|
{ mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } );
|
||||||
{
|
if (!mutex) {
|
||||||
qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
|
qErrnoWarning("QtLockedFile::lock(): CreateMutex failed");
|
||||||
return nullptr;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mutex;
|
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); },
|
||||||
const Qt::HANDLE mutex = ::OpenMutexW((SYNCHRONIZE | MUTEX_MODIFY_STATE), FALSE, reinterpret_cast<const TCHAR *>(mname.utf16()));
|
{ mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } );
|
||||||
if (!mutex)
|
if (!mutex) {
|
||||||
{
|
|
||||||
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||||
qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
|
qErrnoWarning("QtLockedFile::lock(): OpenMutex failed");
|
||||||
return nullptr;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return mutex;
|
|
||||||
}
|
}
|
||||||
|
return mutex;
|
||||||
return nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtLockedFile::waitMutex(const Qt::HANDLE mutex, const bool doBlock) const
|
bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock)
|
||||||
{
|
{
|
||||||
Q_ASSERT(mutex);
|
Q_ASSERT(mutex);
|
||||||
|
DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0);
|
||||||
const DWORD res = ::WaitForSingleObject(mutex, (doBlock ? INFINITE : 0));
|
switch (res) {
|
||||||
switch (res)
|
|
||||||
{
|
|
||||||
case WAIT_OBJECT_0:
|
case WAIT_OBJECT_0:
|
||||||
case WAIT_ABANDONED:
|
case WAIT_ABANDONED:
|
||||||
return true;
|
return true;
|
||||||
|
break;
|
||||||
case WAIT_TIMEOUT:
|
case WAIT_TIMEOUT:
|
||||||
return false;
|
break;
|
||||||
default:
|
default:
|
||||||
qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
|
qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtLockedFile::lock(const LockMode mode, const bool block)
|
bool QtLockedFile::lock(LockMode mode, bool block)
|
||||||
{
|
{
|
||||||
if (!isOpen())
|
if (!isOpen()) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::lock(): file is not opened");
|
qWarning("QtLockedFile::lock(): file is not opened");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -144,85 +135,72 @@ bool QtLockedFile::lock(const LockMode mode, const bool block)
|
|||||||
if (mode == NoLock)
|
if (mode == NoLock)
|
||||||
return unlock();
|
return unlock();
|
||||||
|
|
||||||
if (mode == m_lockMode)
|
if (mode == m_lock_mode)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (m_lockMode != NoLock)
|
if (m_lock_mode != NoLock)
|
||||||
unlock();
|
unlock();
|
||||||
|
|
||||||
if (!m_writeMutex && !(m_writeMutex = getMutexHandle(-1, true)))
|
if (!wmutex && !(wmutex = getMutexHandle(-1, true)))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!waitMutex(m_writeMutex, block))
|
if (!waitMutex(wmutex, block))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (mode == ReadLock)
|
if (mode == ReadLock) {
|
||||||
{
|
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
for (; idx < MAX_READERS; ++idx)
|
for (; idx < MAX_READERS; idx++) {
|
||||||
{
|
rmutex = getMutexHandle(idx, false);
|
||||||
m_readMutex = getMutexHandle(idx, false);
|
if (!rmutex || waitMutex(rmutex, false))
|
||||||
if (!m_readMutex || waitMutex(m_readMutex, false))
|
|
||||||
break;
|
break;
|
||||||
::CloseHandle(m_readMutex);
|
CloseHandle(rmutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = true;
|
bool ok = true;
|
||||||
if (idx >= MAX_READERS)
|
if (idx >= MAX_READERS) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::lock(): too many readers");
|
qWarning("QtLockedFile::lock(): too many readers");
|
||||||
m_readMutex = nullptr;
|
rmutex = 0;
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
else if (!m_readMutex)
|
else if (!rmutex) {
|
||||||
{
|
rmutex = getMutexHandle(idx, true);
|
||||||
m_readMutex = getMutexHandle(idx, true);
|
if (!rmutex || !waitMutex(rmutex, false))
|
||||||
if (!m_readMutex || !waitMutex(m_readMutex, false))
|
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
|
if (!ok && rmutex) {
|
||||||
if (!ok && m_readMutex)
|
CloseHandle(rmutex);
|
||||||
{
|
rmutex = 0;
|
||||||
::CloseHandle(m_readMutex);
|
|
||||||
m_readMutex = nullptr;
|
|
||||||
}
|
}
|
||||||
|
ReleaseMutex(wmutex);
|
||||||
::ReleaseMutex(m_writeMutex);
|
|
||||||
if (!ok)
|
if (!ok)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
Q_ASSERT(rmutexes.isEmpty());
|
||||||
Q_ASSERT(m_readMutexes.isEmpty());
|
for (int i = 0; i < MAX_READERS; i++) {
|
||||||
for (int i = 0; i < MAX_READERS; ++i)
|
Qt::HANDLE mutex = getMutexHandle(i, false);
|
||||||
{
|
|
||||||
const Qt::HANDLE mutex = getMutexHandle(i, false);
|
|
||||||
if (mutex)
|
if (mutex)
|
||||||
m_readMutexes.append(mutex);
|
rmutexes.append(mutex);
|
||||||
}
|
}
|
||||||
if (m_readMutexes.size())
|
if (rmutexes.size()) {
|
||||||
{
|
DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(),
|
||||||
const DWORD res = ::WaitForMultipleObjects(m_readMutexes.size(), m_readMutexes.constData(),
|
TRUE, block ? INFINITE : 0);
|
||||||
TRUE, (block ? INFINITE : 0));
|
if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) {
|
||||||
if ((res != WAIT_OBJECT_0) && (res != WAIT_ABANDONED))
|
|
||||||
{
|
|
||||||
if (res != WAIT_TIMEOUT)
|
if (res != WAIT_TIMEOUT)
|
||||||
qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
|
qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed");
|
||||||
m_lockMode = WriteLock; // trick unlock() to clean up - semiyucky
|
m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky
|
||||||
unlock();
|
unlock();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lockMode = mode;
|
m_lock_mode = mode;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QtLockedFile::unlock()
|
bool QtLockedFile::unlock()
|
||||||
{
|
{
|
||||||
if (!isOpen())
|
if (!isOpen()) {
|
||||||
{
|
|
||||||
qWarning("QtLockedFile::unlock(): file is not opened");
|
qWarning("QtLockedFile::unlock(): file is not opened");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -230,24 +208,21 @@ bool QtLockedFile::unlock()
|
|||||||
if (!isLocked())
|
if (!isLocked())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (m_lockMode == ReadLock)
|
if (m_lock_mode == ReadLock) {
|
||||||
{
|
ReleaseMutex(rmutex);
|
||||||
::ReleaseMutex(m_readMutex);
|
CloseHandle(rmutex);
|
||||||
::CloseHandle(m_readMutex);
|
rmutex = 0;
|
||||||
m_readMutex = nullptr;
|
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
foreach(Qt::HANDLE mutex, rmutexes) {
|
||||||
for (const Qt::HANDLE &mutex : asConst(m_readMutexes))
|
ReleaseMutex(mutex);
|
||||||
{
|
CloseHandle(mutex);
|
||||||
::ReleaseMutex(mutex);
|
|
||||||
::CloseHandle(mutex);
|
|
||||||
}
|
}
|
||||||
m_readMutexes.clear();
|
rmutexes.clear();
|
||||||
::ReleaseMutex(m_writeMutex);
|
ReleaseMutex(wmutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lockMode = QtLockedFile::NoLock;
|
m_lock_mode = QtLockedFile::NoLock;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,6 +230,6 @@ QtLockedFile::~QtLockedFile()
|
|||||||
{
|
{
|
||||||
if (isOpen())
|
if (isOpen())
|
||||||
unlock();
|
unlock();
|
||||||
if (m_writeMutex)
|
if (wmutex)
|
||||||
::CloseHandle(m_writeMutex);
|
CloseHandle(wmutex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ void straceWin::loadHelpStackFrame(IMAGEHLP_STACK_FRAME& ihsf, const STACKFRAME6
|
|||||||
BOOL CALLBACK straceWin::EnumSymbolsCB(PSYMBOL_INFO symInfo, ULONG size, PVOID user)
|
BOOL CALLBACK straceWin::EnumSymbolsCB(PSYMBOL_INFO symInfo, ULONG size, PVOID user)
|
||||||
{
|
{
|
||||||
Q_UNUSED(size)
|
Q_UNUSED(size)
|
||||||
auto params = static_cast<QStringList *>(user);
|
QStringList* params = (QStringList*)user;
|
||||||
if (symInfo->Flags & SYMFLAG_PARAMETER)
|
if (symInfo->Flags & SYMFLAG_PARAMETER)
|
||||||
params->append(symInfo->Name);
|
params->append(symInfo->Name);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -91,7 +91,7 @@ BOOL CALLBACK straceWin::EnumModulesCB(LPCSTR ModuleName, DWORD64 BaseOfDll, PVO
|
|||||||
{
|
{
|
||||||
Q_UNUSED(ModuleName)
|
Q_UNUSED(ModuleName)
|
||||||
IMAGEHLP_MODULE64 mod;
|
IMAGEHLP_MODULE64 mod;
|
||||||
auto context = static_cast<EnumModulesContext *>(UserContext);
|
EnumModulesContext* context = (EnumModulesContext*)UserContext;
|
||||||
mod.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
|
mod.SizeOfStruct = sizeof(IMAGEHLP_MODULE64);
|
||||||
if(SymGetModuleInfo64(context->hProcess, BaseOfDll, &mod))
|
if(SymGetModuleInfo64(context->hProcess, BaseOfDll, &mod))
|
||||||
{
|
{
|
||||||
@@ -264,7 +264,7 @@ const QString straceWin::getBacktrace()
|
|||||||
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
|
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
|
||||||
MAX_SYM_NAME * sizeof(TCHAR) +
|
MAX_SYM_NAME * sizeof(TCHAR) +
|
||||||
sizeof(ULONG64) - 1) / sizeof(ULONG64)];
|
sizeof(ULONG64) - 1) / sizeof(ULONG64)];
|
||||||
auto pSymbol = reinterpret_cast<PSYMBOL_INFO>(buffer);
|
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
|
||||||
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
||||||
pSymbol->MaxNameLen = MAX_SYM_NAME;
|
pSymbol->MaxNameLen = MAX_SYM_NAME;
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace Ui
|
|||||||
class StacktraceDialog : public QDialog
|
class StacktraceDialog : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(StacktraceDialog)
|
Q_DISABLE_COPY(StacktraceDialog)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit StacktraceDialog(QWidget *parent = nullptr);
|
explicit StacktraceDialog(QWidget *parent = nullptr);
|
||||||
|
|||||||
@@ -28,24 +28,19 @@
|
|||||||
|
|
||||||
#include "upgrade.h"
|
#include "upgrade.h"
|
||||||
|
|
||||||
|
#include <QFile>
|
||||||
#include <QMetaEnum>
|
#include <QMetaEnum>
|
||||||
|
#include <QVector>
|
||||||
|
|
||||||
#include "base/bittorrent/torrentcontentlayout.h"
|
#include "base/bittorrent/torrentcontentlayout.h"
|
||||||
#include "base/logger.h"
|
#include "base/logger.h"
|
||||||
#include "base/net/proxyconfigurationmanager.h"
|
|
||||||
#include "base/preferences.h"
|
|
||||||
#include "base/profile.h"
|
#include "base/profile.h"
|
||||||
#include "base/settingsstorage.h"
|
#include "base/settingsstorage.h"
|
||||||
#include "base/settingvalue.h"
|
|
||||||
#include "base/utils/fs.h"
|
#include "base/utils/fs.h"
|
||||||
#include "base/utils/io.h"
|
|
||||||
#include "base/utils/string.h"
|
#include "base/utils/string.h"
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
const int MIGRATION_VERSION = 3;
|
|
||||||
const char MIGRATION_VERSION_KEY[] = "Meta/MigrationVersion";
|
|
||||||
|
|
||||||
void exportWebUIHttpsFiles()
|
void exportWebUIHttpsFiles()
|
||||||
{
|
{
|
||||||
const auto migrate = [](const QString &oldKey, const QString &newKey, const QString &savePath)
|
const auto migrate = [](const QString &oldKey, const QString &newKey, const QString &savePath)
|
||||||
@@ -58,10 +53,17 @@ namespace
|
|||||||
if (!newData.isEmpty() || oldData.isEmpty())
|
if (!newData.isEmpty() || oldData.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const nonstd::expected<void, QString> result = Utils::IO::saveToFile(savePath, oldData);
|
QFile file(savePath);
|
||||||
if (!result)
|
if (!file.open(QIODevice::WriteOnly))
|
||||||
{
|
{
|
||||||
LogMsg(errorMsgFormat.arg(savePath, result.error()) , Log::WARNING);
|
LogMsg(errorMsgFormat.arg(savePath, file.errorString()) , Log::WARNING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (file.write(oldData) != oldData.size())
|
||||||
|
{
|
||||||
|
file.close();
|
||||||
|
Utils::Fs::forceRemove(savePath);
|
||||||
|
LogMsg(errorMsgFormat.arg(savePath, QLatin1String("Write incomplete.")) , Log::WARNING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,10 +77,10 @@ namespace
|
|||||||
const QString configPath {specialFolderLocation(SpecialFolder::Config)};
|
const QString configPath {specialFolderLocation(SpecialFolder::Config)};
|
||||||
migrate(QLatin1String("Preferences/WebUI/HTTPS/Certificate")
|
migrate(QLatin1String("Preferences/WebUI/HTTPS/Certificate")
|
||||||
, QLatin1String("Preferences/WebUI/HTTPS/CertificatePath")
|
, QLatin1String("Preferences/WebUI/HTTPS/CertificatePath")
|
||||||
, Utils::Fs::toNativePath(configPath + QLatin1String("/WebUICertificate.crt")));
|
, Utils::Fs::toNativePath(configPath + QLatin1String("WebUICertificate.crt")));
|
||||||
migrate(QLatin1String("Preferences/WebUI/HTTPS/Key")
|
migrate(QLatin1String("Preferences/WebUI/HTTPS/Key")
|
||||||
, QLatin1String("Preferences/WebUI/HTTPS/KeyPath")
|
, QLatin1String("Preferences/WebUI/HTTPS/KeyPath")
|
||||||
, Utils::Fs::toNativePath(configPath + QLatin1String("/WebUIPrivateKey.pem")));
|
, Utils::Fs::toNativePath(configPath + QLatin1String("WebUIPrivateKey.pem")));
|
||||||
}
|
}
|
||||||
|
|
||||||
void upgradeTorrentContentLayout()
|
void upgradeTorrentContentLayout()
|
||||||
@@ -100,308 +102,15 @@ namespace
|
|||||||
settingsStorage->storeValue(newKey, Utils::String::fromEnum(torrentContentLayout));
|
settingsStorage->storeValue(newKey, Utils::String::fromEnum(torrentContentLayout));
|
||||||
settingsStorage->removeValue(oldKey);
|
settingsStorage->removeValue(oldKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
void upgradeListenPortSettings()
|
|
||||||
{
|
|
||||||
const auto oldKey = QString::fromLatin1("BitTorrent/Session/UseRandomPort");
|
|
||||||
const auto newKey = QString::fromLatin1("Preferences/Connection/PortRangeMin");
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
|
|
||||||
if (settingsStorage->hasKey(oldKey))
|
|
||||||
{
|
|
||||||
if (settingsStorage->loadValue<bool>(oldKey))
|
|
||||||
settingsStorage->storeValue(newKey, 0);
|
|
||||||
|
|
||||||
settingsStorage->removeValue(oldKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void upgradeSchedulerDaysSettings()
|
|
||||||
{
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
const auto key = QString::fromLatin1("Preferences/Scheduler/days");
|
|
||||||
const auto value = settingsStorage->loadValue<QString>(key);
|
|
||||||
|
|
||||||
bool ok = false;
|
|
||||||
const auto number = value.toInt(&ok);
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
switch (number)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::EveryDay);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Weekday);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Weekend);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Monday);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Tuesday);
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Wednesday);
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Thursday);
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Friday);
|
|
||||||
break;
|
|
||||||
case 8:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Saturday);
|
|
||||||
break;
|
|
||||||
case 9:
|
|
||||||
settingsStorage->storeValue(key, Scheduler::Days::Sunday);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogMsg(QObject::tr("Invalid value found in configuration file, reverting it to default. Key: \"%1\". Invalid value: \"%2\".")
|
|
||||||
.arg(key, QString::number(number)), Log::WARNING);
|
|
||||||
settingsStorage->removeValue(key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void upgradeDNSServiceSettings()
|
|
||||||
{
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
const auto key = QString::fromLatin1("Preferences/DynDNS/Service");
|
|
||||||
const auto value = settingsStorage->loadValue<QString>(key);
|
|
||||||
|
|
||||||
bool ok = false;
|
|
||||||
const auto number = value.toInt(&ok);
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
switch (number)
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
settingsStorage->storeValue(key, DNS::Service::None);
|
|
||||||
break;
|
|
||||||
case 0:
|
|
||||||
settingsStorage->storeValue(key, DNS::Service::DynDNS);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
settingsStorage->storeValue(key, DNS::Service::NoIP);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogMsg(QObject::tr("Invalid value found in configuration file, reverting it to default. Key: \"%1\". Invalid value: \"%2\".")
|
|
||||||
.arg(key, QString::number(number)), Log::WARNING);
|
|
||||||
settingsStorage->removeValue(key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void upgradeTrayIconStyleSettings()
|
|
||||||
{
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
const auto key = QString::fromLatin1("Preferences/Advanced/TrayIconStyle");
|
|
||||||
const auto value = settingsStorage->loadValue<QString>(key);
|
|
||||||
|
|
||||||
bool ok = false;
|
|
||||||
const auto number = value.toInt(&ok);
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
switch (number)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
settingsStorage->storeValue(key, TrayIcon::Style::Normal);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
settingsStorage->storeValue(key, TrayIcon::Style::MonoDark);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
settingsStorage->storeValue(key, TrayIcon::Style::MonoLight);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogMsg(QObject::tr("Invalid value found in configuration file, reverting it to default. Key: \"%1\". Invalid value: \"%2\".")
|
|
||||||
.arg(key, QString::number(number)), Log::WARNING);
|
|
||||||
settingsStorage->removeValue(key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void migrateSettingKeys()
|
|
||||||
{
|
|
||||||
struct KeyMapping
|
|
||||||
{
|
|
||||||
QString newKey;
|
|
||||||
QString oldKey;
|
|
||||||
};
|
|
||||||
|
|
||||||
const KeyMapping mappings[] =
|
|
||||||
{
|
|
||||||
{"AddNewTorrentDialog/Enabled", "Preferences/Downloads/NewAdditionDialog"},
|
|
||||||
{"AddNewTorrentDialog/Expanded", "AddNewTorrentDialog/expanded"},
|
|
||||||
{"AddNewTorrentDialog/Position", "AddNewTorrentDialog/y"},
|
|
||||||
{"AddNewTorrentDialog/SavePathHistory", "TorrentAdditionDlg/save_path_history"},
|
|
||||||
{"AddNewTorrentDialog/TopLevel", "Preferences/Downloads/NewAdditionDialogFront"},
|
|
||||||
{"AddNewTorrentDialog/TreeHeaderState", "AddNewTorrentDialog/qt5/treeHeaderState"},
|
|
||||||
{"AddNewTorrentDialog/Width", "AddNewTorrentDialog/width"},
|
|
||||||
{"BitTorrent/Session/AddExtensionToIncompleteFiles", "Preferences/Downloads/UseIncompleteExtension"},
|
|
||||||
{"BitTorrent/Session/AdditionalTrackers", "Preferences/Bittorrent/TrackersList"},
|
|
||||||
{"BitTorrent/Session/AddTorrentPaused", "Preferences/Downloads/StartInPause"},
|
|
||||||
{"BitTorrent/Session/AddTrackersEnabled", "Preferences/Bittorrent/AddTrackers"},
|
|
||||||
{"BitTorrent/Session/AlternativeGlobalDLSpeedLimit", "Preferences/Connection/GlobalDLLimitAlt"},
|
|
||||||
{"BitTorrent/Session/AlternativeGlobalUPSpeedLimit", "Preferences/Connection/GlobalUPLimitAlt"},
|
|
||||||
{"BitTorrent/Session/AnnounceIP", "Preferences/Connection/InetAddress"},
|
|
||||||
{"BitTorrent/Session/AnnounceToAllTrackers", "Preferences/Advanced/AnnounceToAllTrackers"},
|
|
||||||
{"BitTorrent/Session/AnonymousModeEnabled", "Preferences/Advanced/AnonymousMode"},
|
|
||||||
{"BitTorrent/Session/BandwidthSchedulerEnabled", "Preferences/Scheduler/Enabled"},
|
|
||||||
{"BitTorrent/Session/DefaultSavePath", "Preferences/Downloads/SavePath"},
|
|
||||||
{"BitTorrent/Session/DHTEnabled", "Preferences/Bittorrent/DHT"},
|
|
||||||
{"BitTorrent/Session/DiskCacheSize", "Preferences/Downloads/DiskWriteCacheSize"},
|
|
||||||
{"BitTorrent/Session/DiskCacheTTL", "Preferences/Downloads/DiskWriteCacheTTL"},
|
|
||||||
{"BitTorrent/Session/Encryption", "Preferences/Bittorrent/Encryption"},
|
|
||||||
{"BitTorrent/Session/FinishedTorrentExportDirectory", "Preferences/Downloads/FinishedTorrentExportDir"},
|
|
||||||
{"BitTorrent/Session/ForceProxy", "Preferences/Connection/ProxyForce"},
|
|
||||||
{"BitTorrent/Session/GlobalDLSpeedLimit", "Preferences/Connection/GlobalDLLimit"},
|
|
||||||
{"BitTorrent/Session/GlobalMaxRatio", "Preferences/Bittorrent/MaxRatio"},
|
|
||||||
{"BitTorrent/Session/GlobalUPSpeedLimit", "Preferences/Connection/GlobalUPLimit"},
|
|
||||||
{"BitTorrent/Session/IgnoreLimitsOnLAN", "Preferences/Advanced/IgnoreLimitsLAN"},
|
|
||||||
{"BitTorrent/Session/IgnoreSlowTorrentsForQueueing", "Preferences/Queueing/IgnoreSlowTorrents"},
|
|
||||||
{"BitTorrent/Session/IncludeOverheadInLimits", "Preferences/Advanced/IncludeOverhead"},
|
|
||||||
{"BitTorrent/Session/Interface", "Preferences/Connection/Interface"},
|
|
||||||
{"BitTorrent/Session/InterfaceAddress", "Preferences/Connection/InterfaceAddress"},
|
|
||||||
{"BitTorrent/Session/InterfaceName", "Preferences/Connection/InterfaceName"},
|
|
||||||
{"BitTorrent/Session/IPFilter", "Preferences/IPFilter/File"},
|
|
||||||
{"BitTorrent/Session/IPFilteringEnabled", "Preferences/IPFilter/Enabled"},
|
|
||||||
{"BitTorrent/Session/LSDEnabled", "Preferences/Bittorrent/LSD"},
|
|
||||||
{"BitTorrent/Session/MaxActiveDownloads", "Preferences/Queueing/MaxActiveDownloads"},
|
|
||||||
{"BitTorrent/Session/MaxActiveTorrents", "Preferences/Queueing/MaxActiveTorrents"},
|
|
||||||
{"BitTorrent/Session/MaxActiveUploads", "Preferences/Queueing/MaxActiveUploads"},
|
|
||||||
{"BitTorrent/Session/MaxConnections", "Preferences/Bittorrent/MaxConnecs"},
|
|
||||||
{"BitTorrent/Session/MaxConnectionsPerTorrent", "Preferences/Bittorrent/MaxConnecsPerTorrent"},
|
|
||||||
{"BitTorrent/Session/MaxHalfOpenConnections", "Preferences/Connection/MaxHalfOpenConnec"},
|
|
||||||
{"BitTorrent/Session/MaxRatioAction", "Preferences/Bittorrent/MaxRatioAction"},
|
|
||||||
{"BitTorrent/Session/MaxUploads", "Preferences/Bittorrent/MaxUploads"},
|
|
||||||
{"BitTorrent/Session/MaxUploadsPerTorrent", "Preferences/Bittorrent/MaxUploadsPerTorrent"},
|
|
||||||
{"BitTorrent/Session/OutgoingPortsMax", "Preferences/Advanced/OutgoingPortsMax"},
|
|
||||||
{"BitTorrent/Session/OutgoingPortsMin", "Preferences/Advanced/OutgoingPortsMin"},
|
|
||||||
{"BitTorrent/Session/PeXEnabled", "Preferences/Bittorrent/PeX"},
|
|
||||||
{"BitTorrent/Session/Port", "Preferences/Connection/PortRangeMin"},
|
|
||||||
{"BitTorrent/Session/Preallocation", "Preferences/Downloads/PreAllocation"},
|
|
||||||
{"BitTorrent/Session/ProxyPeerConnections", "Preferences/Connection/ProxyPeerConnections"},
|
|
||||||
{"BitTorrent/Session/QueueingSystemEnabled", "Preferences/Queueing/QueueingEnabled"},
|
|
||||||
{"BitTorrent/Session/RefreshInterval", "Preferences/General/RefreshInterval"},
|
|
||||||
{"BitTorrent/Session/SaveResumeDataInterval", "Preferences/Downloads/SaveResumeDataInterval"},
|
|
||||||
{"BitTorrent/Session/SuperSeedingEnabled", "Preferences/Advanced/SuperSeeding"},
|
|
||||||
{"BitTorrent/Session/TempPath", "Preferences/Downloads/TempPath"},
|
|
||||||
{"BitTorrent/Session/TempPathEnabled", "Preferences/Downloads/TempPathEnabled"},
|
|
||||||
{"BitTorrent/Session/TorrentExportDirectory", "Preferences/Downloads/TorrentExportDir"},
|
|
||||||
{"BitTorrent/Session/TrackerFilteringEnabled", "Preferences/IPFilter/FilterTracker"},
|
|
||||||
{"BitTorrent/Session/UseAlternativeGlobalSpeedLimit", "Preferences/Connection/alt_speeds_on"},
|
|
||||||
{"BitTorrent/Session/UseOSCache", "Preferences/Advanced/osCache"},
|
|
||||||
{"BitTorrent/Session/UseRandomPort", "Preferences/General/UseRandomPort"},
|
|
||||||
{"BitTorrent/Session/uTPEnabled", "Preferences/Bittorrent/uTP"},
|
|
||||||
{"BitTorrent/Session/uTPRateLimited", "Preferences/Bittorrent/uTP_rate_limited"},
|
|
||||||
{"BitTorrent/TrackerEnabled", "Preferences/Advanced/trackerEnabled"},
|
|
||||||
{"Network/PortForwardingEnabled", "Preferences/Connection/UPnP"},
|
|
||||||
{"Network/Proxy/Authentication", "Preferences/Connection/Proxy/Authentication"},
|
|
||||||
{"Network/Proxy/IP", "Preferences/Connection/Proxy/IP"},
|
|
||||||
{"Network/Proxy/OnlyForTorrents", "Preferences/Connection/ProxyOnlyForTorrents"},
|
|
||||||
{"Network/Proxy/Password", "Preferences/Connection/Proxy/Password"},
|
|
||||||
{"Network/Proxy/Port", "Preferences/Connection/Proxy/Port"},
|
|
||||||
{"Network/Proxy/Type", "Preferences/Connection/ProxyType"},
|
|
||||||
{"Network/Proxy/Username", "Preferences/Connection/Proxy/Username"},
|
|
||||||
{"State/BannedIPs", "Preferences/IPFilter/BannedIPs"}
|
|
||||||
};
|
|
||||||
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
for (const KeyMapping &mapping : mappings)
|
|
||||||
{
|
|
||||||
if (settingsStorage->hasKey(mapping.oldKey))
|
|
||||||
{
|
|
||||||
const auto value = settingsStorage->loadValue<QVariant>(mapping.oldKey);
|
|
||||||
settingsStorage->storeValue(mapping.newKey, value);
|
|
||||||
// TODO: Remove oldKey after ~v4.4.3 and bump migration version
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void migrateProxySettingsEnum()
|
|
||||||
{
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
|
||||||
const auto key = QString::fromLatin1("Network/Proxy/Type");
|
|
||||||
const auto value = settingsStorage->loadValue<QString>(key);
|
|
||||||
|
|
||||||
bool ok = false;
|
|
||||||
const auto number = value.toInt(&ok);
|
|
||||||
|
|
||||||
if (ok)
|
|
||||||
{
|
|
||||||
switch (number)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::None);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::HTTP);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::SOCKS5);
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::HTTP_PW);
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::SOCKS5_PW);
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
settingsStorage->storeValue(key, Net::ProxyType::SOCKS4);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogMsg(QObject::tr("Invalid value found in configuration file, reverting it to default. Key: \"%1\". Invalid value: \"%2\".")
|
|
||||||
.arg(key, QString::number(number)), Log::WARNING);
|
|
||||||
settingsStorage->removeValue(key);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool upgrade(const bool /*ask*/)
|
bool upgrade(const bool /*ask*/)
|
||||||
{
|
{
|
||||||
CachedSettingValue<int> version {MIGRATION_VERSION_KEY, 0};
|
exportWebUIHttpsFiles();
|
||||||
|
upgradeTorrentContentLayout();
|
||||||
if (version != MIGRATION_VERSION)
|
|
||||||
{
|
|
||||||
if (version < 1)
|
|
||||||
{
|
|
||||||
exportWebUIHttpsFiles();
|
|
||||||
upgradeTorrentContentLayout();
|
|
||||||
upgradeListenPortSettings();
|
|
||||||
upgradeSchedulerDaysSettings();
|
|
||||||
upgradeDNSServiceSettings();
|
|
||||||
upgradeTrayIconStyleSettings();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (version < 2)
|
|
||||||
migrateSettingKeys();
|
|
||||||
|
|
||||||
if (version < 3)
|
|
||||||
migrateProxySettingsEnum();
|
|
||||||
|
|
||||||
version = MIGRATION_VERSION;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setCurrentMigrationVersion()
|
|
||||||
{
|
|
||||||
SettingsStorage::instance()->storeValue(QLatin1String(MIGRATION_VERSION_KEY), MIGRATION_VERSION);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleChangedDefaults(const DefaultPreferencesMode mode)
|
void handleChangedDefaults(const DefaultPreferencesMode mode)
|
||||||
{
|
{
|
||||||
struct DefaultValue
|
struct DefaultValue
|
||||||
@@ -411,18 +120,15 @@ void handleChangedDefaults(const DefaultPreferencesMode mode)
|
|||||||
QVariant current;
|
QVariant current;
|
||||||
};
|
};
|
||||||
|
|
||||||
const DefaultValue changedDefaults[] =
|
const QVector<DefaultValue> changedDefaults
|
||||||
{
|
{
|
||||||
{QLatin1String {"BitTorrent/Session/QueueingSystemEnabled"}, true, false}
|
{QLatin1String {"BitTorrent/Session/QueueingSystemEnabled"}, true, false}
|
||||||
};
|
};
|
||||||
|
|
||||||
auto *settingsStorage = SettingsStorage::instance();
|
SettingsStorage *settingsStorage {SettingsStorage::instance()};
|
||||||
for (const DefaultValue &value : changedDefaults)
|
for (auto it = changedDefaults.cbegin(); it != changedDefaults.cend(); ++it)
|
||||||
{
|
{
|
||||||
if (!settingsStorage->hasKey(value.name))
|
if (settingsStorage->loadValue<QVariant>(it->name).isNull())
|
||||||
{
|
settingsStorage->storeValue(it->name, (mode == DefaultPreferencesMode::Legacy ? it->legacy : it->current));
|
||||||
settingsStorage->storeValue(value.name
|
|
||||||
, (mode == DefaultPreferencesMode::Legacy ? value.legacy : value.current));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,4 +36,3 @@ enum class DefaultPreferencesMode
|
|||||||
|
|
||||||
void handleChangedDefaults(DefaultPreferencesMode mode);
|
void handleChangedDefaults(DefaultPreferencesMode mode);
|
||||||
bool upgrade(bool ask = true);
|
bool upgrade(bool ask = true);
|
||||||
void setCurrentMigrationVersion();
|
|
||||||
|
|||||||
2517
src/base/3rdparty/expected.hpp
vendored
@@ -1,31 +1,26 @@
|
|||||||
add_library(qbt_base STATIC
|
add_library(qbt_base STATIC
|
||||||
# headers
|
# headers
|
||||||
3rdparty/expected.hpp
|
|
||||||
algorithm.h
|
algorithm.h
|
||||||
asyncfilestorage.h
|
asyncfilestorage.h
|
||||||
bittorrent/abstractfilestorage.h
|
bittorrent/abstractfilestorage.h
|
||||||
bittorrent/addtorrentparams.h
|
bittorrent/addtorrentparams.h
|
||||||
bittorrent/bandwidthscheduler.h
|
bittorrent/bandwidthscheduler.h
|
||||||
bittorrent/bencoderesumedatastorage.h
|
|
||||||
bittorrent/cachestatus.h
|
bittorrent/cachestatus.h
|
||||||
bittorrent/categoryoptions.h
|
|
||||||
bittorrent/common.h
|
bittorrent/common.h
|
||||||
bittorrent/customstorage.h
|
bittorrent/customstorage.h
|
||||||
bittorrent/dbresumedatastorage.h
|
|
||||||
bittorrent/downloadpriority.h
|
bittorrent/downloadpriority.h
|
||||||
bittorrent/filesearcher.h
|
bittorrent/filesearcher.h
|
||||||
bittorrent/filterparserthread.h
|
bittorrent/filterparserthread.h
|
||||||
bittorrent/infohash.h
|
bittorrent/infohash.h
|
||||||
bittorrent/loadtorrentparams.h
|
|
||||||
bittorrent/ltqhash.h
|
bittorrent/ltqhash.h
|
||||||
bittorrent/lttypecast.h
|
bittorrent/ltunderlyingtype.h
|
||||||
bittorrent/magneturi.h
|
bittorrent/magneturi.h
|
||||||
bittorrent/nativesessionextension.h
|
bittorrent/nativesessionextension.h
|
||||||
bittorrent/nativetorrentextension.h
|
bittorrent/nativetorrentextension.h
|
||||||
bittorrent/peeraddress.h
|
bittorrent/peeraddress.h
|
||||||
bittorrent/peerinfo.h
|
bittorrent/peerinfo.h
|
||||||
bittorrent/portforwarderimpl.h
|
bittorrent/portforwarderimpl.h
|
||||||
bittorrent/resumedatastorage.h
|
bittorrent/resumedatasavingmanager.h
|
||||||
bittorrent/session.h
|
bittorrent/session.h
|
||||||
bittorrent/sessionstatus.h
|
bittorrent/sessionstatus.h
|
||||||
bittorrent/speedmonitor.h
|
bittorrent/speedmonitor.h
|
||||||
@@ -60,7 +55,6 @@ add_library(qbt_base STATIC
|
|||||||
net/proxyconfigurationmanager.h
|
net/proxyconfigurationmanager.h
|
||||||
net/reverseresolution.h
|
net/reverseresolution.h
|
||||||
net/smtp.h
|
net/smtp.h
|
||||||
orderedset.h
|
|
||||||
preferences.h
|
preferences.h
|
||||||
profile.h
|
profile.h
|
||||||
profile_p.h
|
profile_p.h
|
||||||
@@ -76,14 +70,12 @@ add_library(qbt_base STATIC
|
|||||||
search/searchhandler.h
|
search/searchhandler.h
|
||||||
search/searchpluginmanager.h
|
search/searchpluginmanager.h
|
||||||
settingsstorage.h
|
settingsstorage.h
|
||||||
tagset.h
|
|
||||||
torrentfileguard.h
|
torrentfileguard.h
|
||||||
torrentfileswatcher.h
|
torrentfileswatcher.h
|
||||||
torrentfilter.h
|
torrentfilter.h
|
||||||
types.h
|
types.h
|
||||||
unicodestrings.h
|
unicodestrings.h
|
||||||
utils/bytearray.h
|
utils/bytearray.h
|
||||||
utils/compare.h
|
|
||||||
utils/foreignapps.h
|
utils/foreignapps.h
|
||||||
utils/fs.h
|
utils/fs.h
|
||||||
utils/gzip.h
|
utils/gzip.h
|
||||||
@@ -100,10 +92,7 @@ add_library(qbt_base STATIC
|
|||||||
asyncfilestorage.cpp
|
asyncfilestorage.cpp
|
||||||
bittorrent/abstractfilestorage.cpp
|
bittorrent/abstractfilestorage.cpp
|
||||||
bittorrent/bandwidthscheduler.cpp
|
bittorrent/bandwidthscheduler.cpp
|
||||||
bittorrent/bencoderesumedatastorage.cpp
|
|
||||||
bittorrent/categoryoptions.cpp
|
|
||||||
bittorrent/customstorage.cpp
|
bittorrent/customstorage.cpp
|
||||||
bittorrent/dbresumedatastorage.cpp
|
|
||||||
bittorrent/downloadpriority.cpp
|
bittorrent/downloadpriority.cpp
|
||||||
bittorrent/filesearcher.cpp
|
bittorrent/filesearcher.cpp
|
||||||
bittorrent/filterparserthread.cpp
|
bittorrent/filterparserthread.cpp
|
||||||
@@ -114,11 +103,11 @@ add_library(qbt_base STATIC
|
|||||||
bittorrent/peeraddress.cpp
|
bittorrent/peeraddress.cpp
|
||||||
bittorrent/peerinfo.cpp
|
bittorrent/peerinfo.cpp
|
||||||
bittorrent/portforwarderimpl.cpp
|
bittorrent/portforwarderimpl.cpp
|
||||||
|
bittorrent/resumedatasavingmanager.cpp
|
||||||
bittorrent/session.cpp
|
bittorrent/session.cpp
|
||||||
bittorrent/speedmonitor.cpp
|
bittorrent/speedmonitor.cpp
|
||||||
bittorrent/statistics.cpp
|
bittorrent/statistics.cpp
|
||||||
bittorrent/torrent.cpp
|
bittorrent/torrent.cpp
|
||||||
bittorrent/torrentcontentlayout.cpp
|
|
||||||
bittorrent/torrentcreatorthread.cpp
|
bittorrent/torrentcreatorthread.cpp
|
||||||
bittorrent/torrentimpl.cpp
|
bittorrent/torrentimpl.cpp
|
||||||
bittorrent/torrentinfo.cpp
|
bittorrent/torrentinfo.cpp
|
||||||
@@ -157,12 +146,10 @@ add_library(qbt_base STATIC
|
|||||||
search/searchhandler.cpp
|
search/searchhandler.cpp
|
||||||
search/searchpluginmanager.cpp
|
search/searchpluginmanager.cpp
|
||||||
settingsstorage.cpp
|
settingsstorage.cpp
|
||||||
tagset.cpp
|
|
||||||
torrentfileguard.cpp
|
torrentfileguard.cpp
|
||||||
torrentfileswatcher.cpp
|
torrentfileswatcher.cpp
|
||||||
torrentfilter.cpp
|
torrentfilter.cpp
|
||||||
utils/bytearray.cpp
|
utils/bytearray.cpp
|
||||||
utils/compare.cpp
|
|
||||||
utils/foreignapps.cpp
|
utils/foreignapps.cpp
|
||||||
utils/fs.cpp
|
utils/fs.cpp
|
||||||
utils/gzip.cpp
|
utils/gzip.cpp
|
||||||
@@ -180,7 +167,7 @@ target_link_libraries(qbt_base
|
|||||||
ZLIB::ZLIB
|
ZLIB::ZLIB
|
||||||
PUBLIC
|
PUBLIC
|
||||||
LibtorrentRasterbar::torrent-rasterbar
|
LibtorrentRasterbar::torrent-rasterbar
|
||||||
Qt::Core Qt::Network Qt::Sql Qt::Xml
|
Qt5::Core Qt5::Network Qt5::Xml
|
||||||
qbt_common_cfg
|
qbt_common_cfg
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -207,5 +194,5 @@ if (NOT WEBUI)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DBUS)
|
if (DBUS)
|
||||||
target_link_libraries(qbt_base PUBLIC Qt::DBus)
|
target_link_libraries(qbt_base PUBLIC Qt5::DBus)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace Algorithm
|
|||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
// To be used with associative array types, such as QMap, QHash and its variants
|
// To be used with associative array types, such as QMap, QHash and it's variants
|
||||||
template <typename T, typename BinaryPredicate
|
template <typename T, typename BinaryPredicate
|
||||||
, typename std::enable_if_t<HasMappedType<T>::value, int> = 0>
|
, typename std::enable_if_t<HasMappedType<T>::value, int> = 0>
|
||||||
void removeIf(T &dict, BinaryPredicate &&p)
|
void removeIf(T &dict, BinaryPredicate &&p)
|
||||||
|
|||||||
@@ -30,8 +30,7 @@
|
|||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QMetaObject>
|
#include <QMetaObject>
|
||||||
|
#include <QSaveFile>
|
||||||
#include "base/utils/io.h"
|
|
||||||
|
|
||||||
AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *parent)
|
AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *parent)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
@@ -68,12 +67,15 @@ QDir AsyncFileStorage::storageDir() const
|
|||||||
void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &data)
|
void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &data)
|
||||||
{
|
{
|
||||||
const QString filePath = m_storageDir.absoluteFilePath(fileName);
|
const QString filePath = m_storageDir.absoluteFilePath(fileName);
|
||||||
|
QSaveFile file(filePath);
|
||||||
qDebug() << "AsyncFileStorage: Saving data to" << filePath;
|
qDebug() << "AsyncFileStorage: Saving data to" << filePath;
|
||||||
|
if (file.open(QIODevice::WriteOnly))
|
||||||
const nonstd::expected<void, QString> result = Utils::IO::saveToFile(filePath, data);
|
|
||||||
if (!result)
|
|
||||||
{
|
{
|
||||||
qDebug() << "AsyncFileStorage: Failed to save data";
|
file.write(data);
|
||||||
emit failed(filePath, result.error());
|
if (!file.commit())
|
||||||
|
{
|
||||||
|
qDebug() << "AsyncFileStorage: Failed to save data";
|
||||||
|
emit failed(filePath, file.errorString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
class AsyncFileStorage : public QObject
|
class AsyncFileStorage : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_DISABLE_COPY_MOVE(AsyncFileStorage)
|
Q_DISABLE_COPY(AsyncFileStorage)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr);
|
explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr);
|
||||||
|
|||||||
@@ -1,30 +1,25 @@
|
|||||||
HEADERS += \
|
HEADERS += \
|
||||||
$$PWD/3rdparty/expected.hpp \
|
|
||||||
$$PWD/algorithm.h \
|
$$PWD/algorithm.h \
|
||||||
$$PWD/asyncfilestorage.h \
|
$$PWD/asyncfilestorage.h \
|
||||||
$$PWD/bittorrent/abstractfilestorage.h \
|
$$PWD/bittorrent/abstractfilestorage.h \
|
||||||
$$PWD/bittorrent/addtorrentparams.h \
|
$$PWD/bittorrent/addtorrentparams.h \
|
||||||
$$PWD/bittorrent/bandwidthscheduler.h \
|
$$PWD/bittorrent/bandwidthscheduler.h \
|
||||||
$$PWD/bittorrent/bencoderesumedatastorage.h \
|
|
||||||
$$PWD/bittorrent/cachestatus.h \
|
$$PWD/bittorrent/cachestatus.h \
|
||||||
$$PWD/bittorrent/categoryoptions.h \
|
|
||||||
$$PWD/bittorrent/common.h \
|
$$PWD/bittorrent/common.h \
|
||||||
$$PWD/bittorrent/customstorage.h \
|
$$PWD/bittorrent/customstorage.h \
|
||||||
$$PWD/bittorrent/downloadpriority.h \
|
$$PWD/bittorrent/downloadpriority.h \
|
||||||
$$PWD/bittorrent/dbresumedatastorage.h \
|
|
||||||
$$PWD/bittorrent/filesearcher.h \
|
$$PWD/bittorrent/filesearcher.h \
|
||||||
$$PWD/bittorrent/filterparserthread.h \
|
$$PWD/bittorrent/filterparserthread.h \
|
||||||
$$PWD/bittorrent/infohash.h \
|
$$PWD/bittorrent/infohash.h \
|
||||||
$$PWD/bittorrent/loadtorrentparams.h \
|
|
||||||
$$PWD/bittorrent/ltqhash.h \
|
$$PWD/bittorrent/ltqhash.h \
|
||||||
$$PWD/bittorrent/lttypecast.h \
|
$$PWD/bittorrent/ltunderlyingtype.h \
|
||||||
$$PWD/bittorrent/magneturi.h \
|
$$PWD/bittorrent/magneturi.h \
|
||||||
$$PWD/bittorrent/nativesessionextension.h \
|
$$PWD/bittorrent/nativesessionextension.h \
|
||||||
$$PWD/bittorrent/nativetorrentextension.h \
|
$$PWD/bittorrent/nativetorrentextension.h \
|
||||||
$$PWD/bittorrent/peeraddress.h \
|
$$PWD/bittorrent/peeraddress.h \
|
||||||
$$PWD/bittorrent/peerinfo.h \
|
$$PWD/bittorrent/peerinfo.h \
|
||||||
$$PWD/bittorrent/portforwarderimpl.h \
|
$$PWD/bittorrent/portforwarderimpl.h \
|
||||||
$$PWD/bittorrent/resumedatastorage.h \
|
$$PWD/bittorrent/resumedatasavingmanager.h \
|
||||||
$$PWD/bittorrent/session.h \
|
$$PWD/bittorrent/session.h \
|
||||||
$$PWD/bittorrent/sessionstatus.h \
|
$$PWD/bittorrent/sessionstatus.h \
|
||||||
$$PWD/bittorrent/speedmonitor.h \
|
$$PWD/bittorrent/speedmonitor.h \
|
||||||
@@ -59,7 +54,6 @@ HEADERS += \
|
|||||||
$$PWD/net/proxyconfigurationmanager.h \
|
$$PWD/net/proxyconfigurationmanager.h \
|
||||||
$$PWD/net/reverseresolution.h \
|
$$PWD/net/reverseresolution.h \
|
||||||
$$PWD/net/smtp.h \
|
$$PWD/net/smtp.h \
|
||||||
$$PWD/orderedset.h \
|
|
||||||
$$PWD/preferences.h \
|
$$PWD/preferences.h \
|
||||||
$$PWD/profile.h \
|
$$PWD/profile.h \
|
||||||
$$PWD/profile_p.h \
|
$$PWD/profile_p.h \
|
||||||
@@ -76,14 +70,12 @@ HEADERS += \
|
|||||||
$$PWD/search/searchpluginmanager.h \
|
$$PWD/search/searchpluginmanager.h \
|
||||||
$$PWD/settingsstorage.h \
|
$$PWD/settingsstorage.h \
|
||||||
$$PWD/settingvalue.h \
|
$$PWD/settingvalue.h \
|
||||||
$$PWD/tagset.h \
|
|
||||||
$$PWD/torrentfileguard.h \
|
$$PWD/torrentfileguard.h \
|
||||||
$$PWD/torrentfileswatcher.h \
|
$$PWD/torrentfileswatcher.h \
|
||||||
$$PWD/torrentfilter.h \
|
$$PWD/torrentfilter.h \
|
||||||
$$PWD/types.h \
|
$$PWD/types.h \
|
||||||
$$PWD/unicodestrings.h \
|
$$PWD/unicodestrings.h \
|
||||||
$$PWD/utils/bytearray.h \
|
$$PWD/utils/bytearray.h \
|
||||||
$$PWD/utils/compare.h \
|
|
||||||
$$PWD/utils/foreignapps.h \
|
$$PWD/utils/foreignapps.h \
|
||||||
$$PWD/utils/fs.h \
|
$$PWD/utils/fs.h \
|
||||||
$$PWD/utils/gzip.h \
|
$$PWD/utils/gzip.h \
|
||||||
@@ -100,10 +92,7 @@ SOURCES += \
|
|||||||
$$PWD/asyncfilestorage.cpp \
|
$$PWD/asyncfilestorage.cpp \
|
||||||
$$PWD/bittorrent/abstractfilestorage.cpp \
|
$$PWD/bittorrent/abstractfilestorage.cpp \
|
||||||
$$PWD/bittorrent/bandwidthscheduler.cpp \
|
$$PWD/bittorrent/bandwidthscheduler.cpp \
|
||||||
$$PWD/bittorrent/bencoderesumedatastorage.cpp \
|
|
||||||
$$PWD/bittorrent/categoryoptions.cpp \
|
|
||||||
$$PWD/bittorrent/customstorage.cpp \
|
$$PWD/bittorrent/customstorage.cpp \
|
||||||
$$PWD/bittorrent/dbresumedatastorage.cpp \
|
|
||||||
$$PWD/bittorrent/downloadpriority.cpp \
|
$$PWD/bittorrent/downloadpriority.cpp \
|
||||||
$$PWD/bittorrent/filesearcher.cpp \
|
$$PWD/bittorrent/filesearcher.cpp \
|
||||||
$$PWD/bittorrent/filterparserthread.cpp \
|
$$PWD/bittorrent/filterparserthread.cpp \
|
||||||
@@ -114,11 +103,11 @@ SOURCES += \
|
|||||||
$$PWD/bittorrent/peeraddress.cpp \
|
$$PWD/bittorrent/peeraddress.cpp \
|
||||||
$$PWD/bittorrent/peerinfo.cpp \
|
$$PWD/bittorrent/peerinfo.cpp \
|
||||||
$$PWD/bittorrent/portforwarderimpl.cpp \
|
$$PWD/bittorrent/portforwarderimpl.cpp \
|
||||||
|
$$PWD/bittorrent/resumedatasavingmanager.cpp \
|
||||||
$$PWD/bittorrent/session.cpp \
|
$$PWD/bittorrent/session.cpp \
|
||||||
$$PWD/bittorrent/speedmonitor.cpp \
|
$$PWD/bittorrent/speedmonitor.cpp \
|
||||||
$$PWD/bittorrent/statistics.cpp \
|
$$PWD/bittorrent/statistics.cpp \
|
||||||
$$PWD/bittorrent/torrent.cpp \
|
$$PWD/bittorrent/torrent.cpp \
|
||||||
$$PWD/bittorrent/torrentcontentlayout.cpp \
|
|
||||||
$$PWD/bittorrent/torrentcreatorthread.cpp \
|
$$PWD/bittorrent/torrentcreatorthread.cpp \
|
||||||
$$PWD/bittorrent/torrentimpl.cpp \
|
$$PWD/bittorrent/torrentimpl.cpp \
|
||||||
$$PWD/bittorrent/torrentinfo.cpp \
|
$$PWD/bittorrent/torrentinfo.cpp \
|
||||||
@@ -157,12 +146,10 @@ SOURCES += \
|
|||||||
$$PWD/search/searchhandler.cpp \
|
$$PWD/search/searchhandler.cpp \
|
||||||
$$PWD/search/searchpluginmanager.cpp \
|
$$PWD/search/searchpluginmanager.cpp \
|
||||||
$$PWD/settingsstorage.cpp \
|
$$PWD/settingsstorage.cpp \
|
||||||
$$PWD/tagset.cpp \
|
|
||||||
$$PWD/torrentfileguard.cpp \
|
$$PWD/torrentfileguard.cpp \
|
||||||
$$PWD/torrentfileswatcher.cpp \
|
$$PWD/torrentfileswatcher.cpp \
|
||||||
$$PWD/torrentfilter.cpp \
|
$$PWD/torrentfilter.cpp \
|
||||||
$$PWD/utils/bytearray.cpp \
|
$$PWD/utils/bytearray.cpp \
|
||||||
$$PWD/utils/compare.cpp \
|
|
||||||
$$PWD/utils/foreignapps.cpp \
|
$$PWD/utils/foreignapps.cpp \
|
||||||
$$PWD/utils/fs.cpp \
|
$$PWD/utils/fs.cpp \
|
||||||
$$PWD/utils/gzip.cpp \
|
$$PWD/utils/gzip.cpp \
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ namespace BitTorrent
|
|||||||
|
|
||||||
virtual int filesCount() const = 0;
|
virtual int filesCount() const = 0;
|
||||||
virtual QString filePath(int index) const = 0;
|
virtual QString filePath(int index) const = 0;
|
||||||
|
virtual QString fileName(int index) const = 0;
|
||||||
virtual qlonglong fileSize(int index) const = 0;
|
virtual qlonglong fileSize(int index) const = 0;
|
||||||
|
|
||||||
virtual void renameFile(int index, const QString &name) = 0;
|
virtual void renameFile(int index, const QString &name) = 0;
|
||||||
|
|||||||
@@ -31,10 +31,10 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
|
#include <QSet>
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QVector>
|
#include <QVector>
|
||||||
|
|
||||||
#include "base/tagset.h"
|
|
||||||
#include "torrent.h"
|
#include "torrent.h"
|
||||||
#include "torrentcontentlayout.h"
|
#include "torrentcontentlayout.h"
|
||||||
|
|
||||||
@@ -46,15 +46,13 @@ namespace BitTorrent
|
|||||||
{
|
{
|
||||||
QString name;
|
QString name;
|
||||||
QString category;
|
QString category;
|
||||||
TagSet tags;
|
QSet<QString> tags;
|
||||||
QString savePath;
|
QString savePath;
|
||||||
std::optional<bool> useDownloadPath;
|
bool disableTempPath = false; // e.g. for imported torrents
|
||||||
QString downloadPath;
|
|
||||||
bool sequential = false;
|
bool sequential = false;
|
||||||
bool firstLastPiecePriority = false;
|
bool firstLastPiecePriority = false;
|
||||||
bool addForced = false;
|
bool addForced = false;
|
||||||
std::optional<bool> addPaused;
|
std::optional<bool> addPaused;
|
||||||
QStringList filePaths; // used if TorrentInfo is set
|
|
||||||
QVector<DownloadPriority> filePriorities; // used if TorrentInfo is set
|
QVector<DownloadPriority> filePriorities; // used if TorrentInfo is set
|
||||||
bool skipChecking = false;
|
bool skipChecking = false;
|
||||||
std::optional<BitTorrent::TorrentContentLayout> contentLayout;
|
std::optional<BitTorrent::TorrentContentLayout> contentLayout;
|
||||||
|
|||||||