You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-10-30 23:30:54 +01:00 
			
		
		
		
	Compare commits
	
		
			77 Commits
		
	
	
		
			release-5.
			...
			release-4.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 92f810873a | ||
|   | 6739f59e5f | ||
|   | d6e888a877 | ||
|   | 1fb329c0ef | ||
|   | ffe085dc8a | ||
|   | 267d504ec0 | ||
|   | b824889d07 | ||
|   | 59d968e116 | ||
|   | 43300d97e2 | ||
|   | 3007762864 | ||
|   | 786c09e981 | ||
|   | 2c2252d7d9 | ||
|   | c7dfc1ded2 | ||
|   | c2dd53cee6 | ||
|   | 903173b8f1 | ||
|   | 837d39dac7 | ||
|   | 54dffa1051 | ||
|   | a14b50e48c | ||
|   | b284d40430 | ||
|   | ee853d8751 | ||
|   | d5c0c094f2 | ||
|   | 3c0747fb87 | ||
|   | 31e0ab2c70 | ||
|   | bb6d69f8b7 | ||
|   | a396e0df26 | ||
|   | a1317e24f9 | ||
|   | 42d7465cba | ||
|   | 4b56bdd36f | ||
|   | dc31e82d00 | ||
|   | 7b73d3fb5c | ||
|   | 6b3da26af8 | ||
|   | 488c022d89 | ||
|   | d512d6dead | ||
|   | a1ff1c8227 | ||
|   | 7bc49423c7 | ||
|   | 3d3ce1c5d7 | ||
|   | 832d68d5cb | ||
|   | ec8802203d | ||
|   | 4beee27701 | ||
|   | 716aca17f8 | ||
|   | d85ed84e83 | ||
|   | 20985f9960 | ||
|   | e6cde0b4b4 | ||
|   | a84259dd1a | ||
|   | 4f3dbf7f59 | ||
|   | d877215018 | ||
|   | 7512b92a36 | ||
|   | 81a3479fd7 | ||
|   | edeb62c25d | ||
|   | 45f0b27ed1 | ||
|   | ffb3f60a22 | ||
|   | c14b08bd1d | ||
|   | 91560e6e60 | ||
|   | 7df54ad534 | ||
|   | 1e88650bae | ||
|   | 604986e90f | ||
|   | c77466abb0 | ||
|   | a9d8cf2ea9 | ||
|   | 22420339a5 | ||
|   | 9076ff8876 | ||
|   | af20233dfc | ||
|   | dfd735f2dc | ||
|   | 2a04a4d077 | ||
|   | 67d340ad63 | ||
|   | 2b69cabc2c | ||
|   | 062e35e6b0 | ||
|   | 3088b38d7e | ||
|   | f5b5570a3b | ||
|   | 80bb19701c | ||
|   | 8376707379 | ||
|   | 483ccb39bf | ||
|   | 41e44d22ea | ||
|   | 766fce82b1 | ||
|   | 938adca47d | ||
|   | 5bb02cbd90 | ||
|   | 66777f3304 | ||
|   | 508896c4f2 | 
							
								
								
									
										2
									
								
								.github/workflows/ci_ubuntu.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/ci_ubuntu.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -117,6 +117,8 @@ jobs: | |||||||
|       - name: Run CodeQL analysis |       - name: Run CodeQL analysis | ||||||
|         uses: github/codeql-action/analyze@v2 |         uses: github/codeql-action/analyze@v2 | ||||||
|         if: startsWith(matrix.libt_version, 2) && (matrix.qbt_gui == 'GUI=ON') && startsWith(matrix.qt_version, 6) |         if: startsWith(matrix.libt_version, 2) && (matrix.qbt_gui == 'GUI=ON') && startsWith(matrix.qt_version, 6) | ||||||
|  |         with: | ||||||
|  |           category: ${{ github.base_ref || github.ref_name }} | ||||||
|  |  | ||||||
|       - name: Prepare build artifacts |       - name: Prepare build artifacts | ||||||
|         run: | |         run: | | ||||||
|   | |||||||
							
								
								
									
										9
									
								
								.github/workflows/ci_windows.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								.github/workflows/ci_windows.yaml
									
									
									
									
										vendored
									
									
								
							| @@ -90,34 +90,35 @@ jobs: | |||||||
|             --recurse-submodules ` |             --recurse-submodules ` | ||||||
|             https://github.com/arvidn/libtorrent.git |             https://github.com/arvidn/libtorrent.git | ||||||
|           cd libtorrent |           cd libtorrent | ||||||
|  |           $env:CXXFLAGS+=" /guard:cf" | ||||||
|  |           $env:LDFLAGS+=" /guard:cf" | ||||||
|           cmake ` |           cmake ` | ||||||
|             -B build ` |             -B build ` | ||||||
|             -G "Ninja" ` |             -G "Ninja" ` | ||||||
|             -DCMAKE_BUILD_TYPE=RelWithDebInfo ` |             -DCMAKE_BUILD_TYPE=RelWithDebInfo ` | ||||||
|             -DCMAKE_CXX_FLAGS=/guard:cf ` |  | ||||||
|             -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ` |             -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ` | ||||||
|             -DCMAKE_INSTALL_PREFIX="${{ env.libtorrent_path }}" ` |             -DCMAKE_INSTALL_PREFIX="${{ env.libtorrent_path }}" ` | ||||||
|             -DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ` |             -DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ` | ||||||
|             -DBOOST_ROOT="${{ env.boost_path }}" ` |             -DBOOST_ROOT="${{ env.boost_path }}" ` | ||||||
|             -DBUILD_SHARED_LIBS=OFF ` |             -DBUILD_SHARED_LIBS=OFF ` | ||||||
|             -Ddeprecated-functions=OFF ` |             -Ddeprecated-functions=OFF ` | ||||||
|             -Dstatic_runtime=ON ` |             -Dstatic_runtime=OFF ` | ||||||
|             -DVCPKG_TARGET_TRIPLET=x64-windows-static-release |             -DVCPKG_TARGET_TRIPLET=x64-windows-static-release | ||||||
|           cmake --build build |           cmake --build build | ||||||
|           cmake --install build |           cmake --install build | ||||||
|  |  | ||||||
|       - name: Build qBittorrent |       - name: Build qBittorrent | ||||||
|         run: | |         run: | | ||||||
|  |           $env:CXXFLAGS+=" /WX" | ||||||
|           cmake ` |           cmake ` | ||||||
|             -B build ` |             -B build ` | ||||||
|             -G "Ninja" ` |             -G "Ninja" ` | ||||||
|             -DCMAKE_BUILD_TYPE=RelWithDebInfo ` |             -DCMAKE_BUILD_TYPE=RelWithDebInfo ` | ||||||
|             -DCMAKE_CXX_FLAGS="/WX" ` |  | ||||||
|             -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ` |             -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ` | ||||||
|             -DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ` |             -DCMAKE_TOOLCHAIN_FILE="${{ env.RUNVCPKG_VCPKG_ROOT }}/scripts/buildsystems/vcpkg.cmake" ` | ||||||
|             -DBOOST_ROOT="${{ env.boost_path }}" ` |             -DBOOST_ROOT="${{ env.boost_path }}" ` | ||||||
|             -DLibtorrentRasterbar_DIR="${{ env.libtorrent_path }}/lib/cmake/LibtorrentRasterbar" ` |             -DLibtorrentRasterbar_DIR="${{ env.libtorrent_path }}/lib/cmake/LibtorrentRasterbar" ` | ||||||
|             -DMSVC_RUNTIME_DYNAMIC=OFF ` |             -DMSVC_RUNTIME_DYNAMIC=ON ` | ||||||
|             -DQT6=ON ` |             -DQT6=ON ` | ||||||
|             -DTESTING=ON ` |             -DTESTING=ON ` | ||||||
|             -DVCPKG_TARGET_TRIPLET=x64-windows-static-release ` |             -DVCPKG_TARGET_TRIPLET=x64-windows-static-release ` | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| [main] | [main] | ||||||
| host = https://www.transifex.com | host = https://www.transifex.com | ||||||
|  |  | ||||||
| [o:sledgehammer999:p:qbittorrent:r:qbittorrent_master] | [o:sledgehammer999:p:qbittorrent:r:qbittorrent_v46x] | ||||||
| file_filter  = src/lang/qbittorrent_<lang>.ts | file_filter  = src/lang/qbittorrent_<lang>.ts | ||||||
| source_file  = src/lang/qbittorrent_en.ts | source_file  = src/lang/qbittorrent_en.ts | ||||||
| source_lang  = en | source_lang  = en | ||||||
| @@ -9,7 +9,7 @@ type         = QT | |||||||
| minimum_perc = 23 | minimum_perc = 23 | ||||||
| lang_map     = pt: pt_PT, zh: zh_CN | lang_map     = pt: pt_PT, zh: zh_CN | ||||||
|  |  | ||||||
| [o:sledgehammer999:p:qbittorrent:r:qbittorrent_webui] | [o:sledgehammer999:p:qbittorrent:r:qbittorrent_webui_v46x] | ||||||
| file_filter  = src/webui/www/translations/webui_<lang>.ts | file_filter  = src/webui/www/translations/webui_<lang>.ts | ||||||
| source_file  = src/webui/www/translations/webui_en.ts | source_file  = src/webui/www/translations/webui_en.ts | ||||||
| source_lang  = en | source_lang  = en | ||||||
|   | |||||||
| @@ -30,16 +30,21 @@ feature_option(STACKTRACE "Enable stacktrace support" ON) | |||||||
| feature_option(TESTING "Build internal testing suite" OFF) | feature_option(TESTING "Build internal testing suite" OFF) | ||||||
| feature_option(VERBOSE_CONFIGURE "Show information about PACKAGES_FOUND and PACKAGES_NOT_FOUND in the configure output (only useful for debugging the CMake build scripts)" OFF) | feature_option(VERBOSE_CONFIGURE "Show information about PACKAGES_FOUND and PACKAGES_NOT_FOUND in the configure output (only useful for debugging the CMake build scripts)" OFF) | ||||||
|  |  | ||||||
| if (CMAKE_SYSTEM_NAME STREQUAL "Linux") | if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") | ||||||
|     feature_option_dependent(DBUS |     feature_option_dependent(DBUS | ||||||
|         "Enable support for notifications and power-management features via D-Bus on Linux" |         "Enable support for notifications and power-management features via D-Bus" | ||||||
|         ON "GUI" OFF |         ON "GUI" OFF | ||||||
|     ) |     ) | ||||||
|  | endif() | ||||||
|  |  | ||||||
|  | if (CMAKE_SYSTEM_NAME STREQUAL "Linux") | ||||||
|     feature_option_dependent(SYSTEMD |     feature_option_dependent(SYSTEMD | ||||||
|         "Install systemd service file. Target directory is overridable with `SYSTEMD_SERVICES_INSTALL_DIR` variable" |         "Install systemd service file. Target directory is overridable with `SYSTEMD_SERVICES_INSTALL_DIR` variable" | ||||||
|         OFF "NOT GUI" OFF |         OFF "NOT GUI" OFF | ||||||
|     ) |     ) | ||||||
| elseif (MSVC) | endif() | ||||||
|  |  | ||||||
|  | if (MSVC) | ||||||
|     feature_option(MSVC_RUNTIME_DYNAMIC "Use MSVC dynamic runtime library (-MD) instead of static (-MT)" ON) |     feature_option(MSVC_RUNTIME_DYNAMIC "Use MSVC dynamic runtime library (-MD) instead of static (-MT)" ON) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										82
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										82
									
								
								Changelog
									
									
									
									
									
								
							| @@ -1,3 +1,85 @@ | |||||||
|  | Mon Nov 20th 2023 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.6.1 | ||||||
|  |     - FEATURE: Add option to enable previous Add new torrent dialog behavior (glassez) | ||||||
|  |     - BUGFIX: Prevent crash due to race condition when adding magnet link (glassez) | ||||||
|  |     - BUGFIX: Fix Enter key behavior when add new torrent (glassez) | ||||||
|  |     - BUGFIX: Add missing main window icon (iomezk) | ||||||
|  |     - BUGFIX: Update size of selected files when selection is changed (glassez) | ||||||
|  |     - BUGFIX: Correctly handle changing save path of torrent w/o metadata (glassez) | ||||||
|  |     - BUGFIX: Use appropriate icon for "moving" torrents in transfer list (xavier2k6) | ||||||
|  |     - WEBUI: Drop WebUI default credentials (glassez) | ||||||
|  |     - WEBUI: Add I2P settings to WebUI (thalieht) | ||||||
|  |     - WEBUI: Fix duplicate scrollbar on Transfer List (AgentConDier) | ||||||
|  |     - WEBUI: Fix .torrent file upload on iPadOS (Vitaly Cheptsov) | ||||||
|  |     - WEBUI: Fix incorrect subcategory sorting (Bartu Özen) | ||||||
|  |     - WEBUI: Correctly set save path in RSS rules (glassez) | ||||||
|  |     - WEBUI: Allow to request torrents count via WebAPI (glassez) | ||||||
|  |     - WEBUI: Improve performance of getting torrent numbers via WebAPI (Chocobo1) | ||||||
|  |     - WEBUI: Improve free disk space checking for WebAPI (glassez) | ||||||
|  |     - WINDOWS: NSIS: Fixed typo in the installer's hungarian translation (MartinKing01) | ||||||
|  |     - LINUX: Fix invisible tray icon with Qt5 in Linux (thalieht) | ||||||
|  |     - MACOS: Remove "Physical memory (RAM) usage limit" option (Chocobo1) | ||||||
|  |  | ||||||
|  | Sun Oct 22nd 2023 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.6.0 | ||||||
|  |     - FEATURE: Add (experimental) I2P support (glassez) | ||||||
|  |     - FEATURE: Provide UI editor for the default theme (glassez) | ||||||
|  |     - FEATURE: Various UI theming improvements (glassez) | ||||||
|  |     - FEATURE: Implement torrent tags editing dialog (glassez) | ||||||
|  |     - FEATURE: Revamp "Watched folder options" and "Automated RSS downloader" dialog (glassez) | ||||||
|  |     - FEATURE: Allow to use another icons in dark mode (glassez) | ||||||
|  |     - FEATURE: Allow to add new torrents to queue top (glassez) | ||||||
|  |     - FEATURE: Allow to filter torrent list by save path (Tom) | ||||||
|  |     - FEATURE: Expose 'socket send/receive buffer size' options (Chocobo1) | ||||||
|  |     - FEATURE: Expose 'max torrent file size' setting (Chocobo1) | ||||||
|  |     - FEATURE: Expose 'bdecode limits' settings (Chocobo1) | ||||||
|  |     - FEATURE: Add options to adjust behavior of merging trackers to existing torrent (glassez) | ||||||
|  |     - FEATURE: Add option to stop seeding when torrent has been inactive (Christopher) | ||||||
|  |     - FEATURE: Allow to use proxy per subsystem (glassez) | ||||||
|  |     - FEATURE: Expand the scope of "Proxy hostname lookup" option (glassez) | ||||||
|  |     - FEATURE: Add shortcut for "Ban peer permanently" function (Luka Čelebić) | ||||||
|  |     - FEATURE: Add option to auto hide zero status filters (glassez) | ||||||
|  |     - FEATURE: Allow to disable confirmation of Pause/Resume All (glassez) | ||||||
|  |     - FEATURE: Add alternative shortcut CTRL+E for CTRL+F (Luka Čelebić) | ||||||
|  |     - FEATURE: Show filtered port numbers in logs (Hanabishi) | ||||||
|  |     - FEATURE: Add button to copy library versions to clipboard (Chocobo1) | ||||||
|  |     - BUGFIX: Ensure ongoing storage moving job will be completed when shutting down (Chocobo1) | ||||||
|  |     - BUGFIX: Refactored many areas to call non UI blocking code (glassez) | ||||||
|  |     - BUGFIX: Various improvements to the SQLite backend (glassez) | ||||||
|  |     - BUGFIX: Improve startup window state handling (glassez) | ||||||
|  |     - BUGFIX: Use tray icon from system theme only if option is set (glassez) | ||||||
|  |     - BUGFIX: Inhibit system sleep while torrents are moving (Sentox6) | ||||||
|  |     - BUGFIX: Use hostname instead of domain name in tracker filter list (tearfur) | ||||||
|  |     - BUGFIX: Visually validate input path in torrent creator dialog (Chocobo1) | ||||||
|  |     - BUGFIX: Disable symlink resolving in Torrent creator (Ignat Loskutov) | ||||||
|  |     - BUGFIX: Change default value for `file pool size` and `stop tracker timeout` settings (stalkerok) | ||||||
|  |     - BUGFIX: Log when duplicate torrents are being added (glassez) | ||||||
|  |     - BUGFIX: Inhibit suspend instead of screen idle (axet) | ||||||
|  |     - BUGFIX: Ensure file name is valid when exporting torrents (glassez) | ||||||
|  |     - BUGFIX: Open "Save path" if torrent has no metadata (Xu Chao) | ||||||
|  |     - BUGFIX: Prevent torrent starting unexpectedly edge case with magnet (Xu Chao) | ||||||
|  |     - BUGFIX: Better ergonomics of the "Add new torrent" dialog (Xu Chao, glassez) | ||||||
|  |     - WEBUI: Add log viewer (brvphoenix) | ||||||
|  |     - WEBUI: WebAPI: Allow to specify session cookie name (glassez) | ||||||
|  |     - WEBUI: Improve sync API performance (glassez) | ||||||
|  |     - WEBUI: Add filelog settings (brvphoenix) | ||||||
|  |     - WEBUI: Add multi-file renaming (loligans) | ||||||
|  |     - WEBUI: Add "Add to top of queue" option (thalieht) | ||||||
|  |     - WEBUI: Implement subcategories (Bartu Özen) | ||||||
|  |     - WEBUI: Set "SameSite=None" if CSRF Protection is disabled (七海千秋) | ||||||
|  |     - WEBUI: Show only hosts in tracker filter list (ttys3) | ||||||
|  |     - WEBUI: Set Connection status and Speed limits tooltips (Raymond Ha) | ||||||
|  |     - WEBUI: set Cross Origin Opener Policy to `same-origin` (Chocobo1) | ||||||
|  |     - WEBUI: Fix response for HTTP HEAD method (Chocobo1) | ||||||
|  |     - WEBUI: Preserve the network interfaces when connection is down (Fabricio Silva) | ||||||
|  |     - WEBUI: Add "Add Tags" field for RSS rules (Matic Babnik) | ||||||
|  |     - WEBUI: Fix missing error icon (Trim21) | ||||||
|  |     - RSS: Add "Rename rule" button to RSS Downloader (BallsOfSpaghetti) | ||||||
|  |     - RSS: Allow to edit RSS feed URL (glassez) | ||||||
|  |     - RSS: Allow to assign priority to RSS download rule (glassez) | ||||||
|  |     - SEARCH: Use python isolate mode (Chocobo1) | ||||||
|  |     - SEARCH: Bump python version minimum requirement to 3.7.0 (Chocobo1) | ||||||
|  |     - OTHER: Enable DBUS cmake option on FreeBSD (yuri@FreeBSD) | ||||||
|  |     - OTHER: Numerous code improvements and refactorings (glassez, Chocobo1) | ||||||
|  |  | ||||||
| Unreleased - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.5.0 | Unreleased - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.5.0 | ||||||
|     - FEATURE: Add `Auto resize columns` functionality (Chocobo1) |     - FEATURE: Add `Auto resize columns` functionality (Chocobo1) | ||||||
|     - FEATURE: Allow to use Category paths in `Manual` mode (glassez) |     - FEATURE: Allow to use Category paths in `Manual` mode (glassez) | ||||||
|   | |||||||
							
								
								
									
										20
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										20
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| #! /bin/sh | #! /bin/sh | ||||||
| # Guess values for system-dependent variables and create Makefiles. | # Guess values for system-dependent variables and create Makefiles. | ||||||
| # Generated by GNU Autoconf 2.71 for qbittorrent v4.6.0beta2. | # Generated by GNU Autoconf 2.71 for qbittorrent v4.6.1. | ||||||
| # | # | ||||||
| # Report bugs to <bugs.qbittorrent.org>. | # Report bugs to <bugs.qbittorrent.org>. | ||||||
| # | # | ||||||
| @@ -611,8 +611,8 @@ MAKEFLAGS= | |||||||
| # Identity of this package. | # Identity of this package. | ||||||
| PACKAGE_NAME='qbittorrent' | PACKAGE_NAME='qbittorrent' | ||||||
| PACKAGE_TARNAME='qbittorrent' | PACKAGE_TARNAME='qbittorrent' | ||||||
| PACKAGE_VERSION='v4.6.0beta2' | PACKAGE_VERSION='v4.6.1' | ||||||
| PACKAGE_STRING='qbittorrent v4.6.0beta2' | PACKAGE_STRING='qbittorrent v4.6.1' | ||||||
| PACKAGE_BUGREPORT='bugs.qbittorrent.org' | PACKAGE_BUGREPORT='bugs.qbittorrent.org' | ||||||
| PACKAGE_URL='https://www.qbittorrent.org/' | PACKAGE_URL='https://www.qbittorrent.org/' | ||||||
|  |  | ||||||
| @@ -1329,7 +1329,7 @@ if test "$ac_init_help" = "long"; then | |||||||
|   # Omit some internal or obsolete options to make the list less imposing. |   # Omit some internal or obsolete options to make the list less imposing. | ||||||
|   # This message is too long to be a string in the A/UX 3.1 sh. |   # This message is too long to be a string in the A/UX 3.1 sh. | ||||||
|   cat <<_ACEOF |   cat <<_ACEOF | ||||||
| \`configure' configures qbittorrent v4.6.0beta2 to adapt to many kinds of systems. | \`configure' configures qbittorrent v4.6.1 to adapt to many kinds of systems. | ||||||
|  |  | ||||||
| Usage: $0 [OPTION]... [VAR=VALUE]... | Usage: $0 [OPTION]... [VAR=VALUE]... | ||||||
|  |  | ||||||
| @@ -1400,7 +1400,7 @@ fi | |||||||
|  |  | ||||||
| if test -n "$ac_init_help"; then | if test -n "$ac_init_help"; then | ||||||
|   case $ac_init_help in |   case $ac_init_help in | ||||||
|      short | recursive ) echo "Configuration of qbittorrent v4.6.0beta2:";; |      short | recursive ) echo "Configuration of qbittorrent v4.6.1:";; | ||||||
|    esac |    esac | ||||||
|   cat <<\_ACEOF |   cat <<\_ACEOF | ||||||
|  |  | ||||||
| @@ -1533,7 +1533,7 @@ fi | |||||||
| test -n "$ac_init_help" && exit $ac_status | test -n "$ac_init_help" && exit $ac_status | ||||||
| if $ac_init_version; then | if $ac_init_version; then | ||||||
|   cat <<\_ACEOF |   cat <<\_ACEOF | ||||||
| qbittorrent configure v4.6.0beta2 | qbittorrent configure v4.6.1 | ||||||
| generated by GNU Autoconf 2.71 | generated by GNU Autoconf 2.71 | ||||||
|  |  | ||||||
| Copyright (C) 2021 Free Software Foundation, Inc. | Copyright (C) 2021 Free Software Foundation, Inc. | ||||||
| @@ -1648,7 +1648,7 @@ cat >config.log <<_ACEOF | |||||||
| This file contains any messages produced by compilers while | This file contains any messages produced by compilers while | ||||||
| running configure, to aid debugging if configure makes a mistake. | running configure, to aid debugging if configure makes a mistake. | ||||||
|  |  | ||||||
| It was created by qbittorrent $as_me v4.6.0beta2, which was | It was created by qbittorrent $as_me v4.6.1, which was | ||||||
| generated by GNU Autoconf 2.71.  Invocation command line was | generated by GNU Autoconf 2.71.  Invocation command line was | ||||||
|  |  | ||||||
|   $ $0$ac_configure_args_raw |   $ $0$ac_configure_args_raw | ||||||
| @@ -4779,7 +4779,7 @@ fi | |||||||
|  |  | ||||||
| # Define the identity of the package. | # Define the identity of the package. | ||||||
|  PACKAGE='qbittorrent' |  PACKAGE='qbittorrent' | ||||||
|  VERSION='v4.6.0beta2' |  VERSION='v4.6.1' | ||||||
|  |  | ||||||
|  |  | ||||||
| printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h | printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h | ||||||
| @@ -7237,7 +7237,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 | |||||||
| # report actual input values of CONFIG_FILES etc. instead of their | # report actual input values of CONFIG_FILES etc. instead of their | ||||||
| # values after options handling. | # values after options handling. | ||||||
| ac_log=" | ac_log=" | ||||||
| This file was extended by qbittorrent $as_me v4.6.0beta2, which was | This file was extended by qbittorrent $as_me v4.6.1, which was | ||||||
| generated by GNU Autoconf 2.71.  Invocation command line was | generated by GNU Autoconf 2.71.  Invocation command line was | ||||||
|  |  | ||||||
|   CONFIG_FILES    = $CONFIG_FILES |   CONFIG_FILES    = $CONFIG_FILES | ||||||
| @@ -7297,7 +7297,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ | |||||||
| cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | ||||||
| ac_cs_config='$ac_cs_config_escaped' | ac_cs_config='$ac_cs_config_escaped' | ||||||
| ac_cs_version="\\ | ac_cs_version="\\ | ||||||
| qbittorrent config.status v4.6.0beta2 | qbittorrent config.status v4.6.1 | ||||||
| configured by $0, generated by GNU Autoconf 2.71, | configured by $0, generated by GNU Autoconf 2.71, | ||||||
|   with options \\"\$ac_cs_config\\" |   with options \\"\$ac_cs_config\\" | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,4 +1,4 @@ | |||||||
| AC_INIT([qbittorrent], [v4.6.0beta2], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/]) | AC_INIT([qbittorrent], [v4.6.1], [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=""} | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								dist/mac/Info.plist
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/mac/Info.plist
									
									
									
									
										vendored
									
									
								
							| @@ -55,7 +55,7 @@ | |||||||
| 	<key>CFBundlePackageType</key> | 	<key>CFBundlePackageType</key> | ||||||
| 	<string>APPL</string> | 	<string>APPL</string> | ||||||
| 	<key>CFBundleShortVersionString</key> | 	<key>CFBundleShortVersionString</key> | ||||||
| 	<string>4.5.0</string> | 	<string>4.6.1</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-2023 The qBittorrent project</string> | ||||||
| 	<key>UTExportedTypeDeclarations</key> | 	<key>UTExportedTypeDeclarations</key> | ||||||
| 	<array> | 	<array> | ||||||
| 		<dict> | 		<dict> | ||||||
|   | |||||||
| @@ -74,6 +74,6 @@ | |||||||
|   <url type="translate">https://github.com/qbittorrent/qBittorrent/wiki/How-to-translate-qBittorrent</url> |   <url type="translate">https://github.com/qbittorrent/qBittorrent/wiki/How-to-translate-qBittorrent</url> | ||||||
|   <content_rating type="oars-1.1"/> |   <content_rating type="oars-1.1"/> | ||||||
|   <releases> |   <releases> | ||||||
|     <release version="4.5.0" date="2022-01-06"/> |     <release version="4.6.1" date="2023-11-20"/> | ||||||
|   </releases> |   </releases> | ||||||
| </component> | </component> | ||||||
|   | |||||||
							
								
								
									
										138
									
								
								dist/unix/org.qbittorrent.qBittorrent.desktop
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										138
									
								
								dist/unix/org.qbittorrent.qBittorrent.desktop
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4
									
								
								dist/windows/config.nsi
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/windows/config.nsi
									
									
									
									
										vendored
									
									
								
							| @@ -25,7 +25,7 @@ | |||||||
| ; 4.5.1.3 -> good | ; 4.5.1.3 -> good | ||||||
| ; 4.5.1.3.2 -> bad | ; 4.5.1.3.2 -> bad | ||||||
| ; 4.5.0beta -> bad | ; 4.5.0beta -> bad | ||||||
| !define /ifndef QBT_VERSION "4.5.0" | !define /ifndef QBT_VERSION "4.6.1" | ||||||
|  |  | ||||||
| ; Option that controls the installer's window name | ; Option that controls the installer's window name | ||||||
| ; If set, its value will be used like this: | ; If set, its value will be used like this: | ||||||
| @@ -112,7 +112,7 @@ OutFile "qbittorrent_${QBT_INSTALLER_FILENAME}_setup.exe" | |||||||
| ;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-2023 The qBittorrent project" | ||||||
| VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" | VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" | ||||||
| VIAddVersionKey "FileVersion" "${QBT_VERSION}" | VIAddVersionKey "FileVersion" "${QBT_VERSION}" | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								dist/windows/installer-translations/french.nsi
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								dist/windows/installer-translations/french.nsi
									
									
									
									
										vendored
									
									
								
							| @@ -7,7 +7,7 @@ LangString inst_desktop ${LANG_FRENCH} "Créer un Raccourci sur le Bureau" | |||||||
| ;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut" | ;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut" | ||||||
| LangString inst_startmenu ${LANG_FRENCH} "Créer un Raccourci dans le Menu Démarrer" | LangString inst_startmenu ${LANG_FRENCH} "Créer un Raccourci dans le Menu Démarrer" | ||||||
| ;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_FRENCH} "Démarrez qBittorrent au démarrage de Windows" | LangString inst_startup ${LANG_FRENCH} "Démarrer qBittorrent au démarrage de Windows" | ||||||
| ;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent" | ;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent" | ||||||
| LangString inst_torrent ${LANG_FRENCH} "Ouvrir les fichiers .torrent avec qBittorrent" | LangString inst_torrent ${LANG_FRENCH} "Ouvrir les fichiers .torrent avec 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_FRENCH} "Ouvrir les liens magnet avec qBittorrent" | |||||||
| ;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule" | ;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule" | ||||||
| LangString inst_firewall ${LANG_FRENCH} "Ajouter une règle au Pare-Feu de Windows" | LangString inst_firewall ${LANG_FRENCH} "Ajouter une règle au Pare-Feu de 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_FRENCH} "Désactiver la limite de taille du chemin de Windows (limitation de MAX_PATH 260 caractères, nécessite Windows 10 1607 ou plus)" | LangString inst_pathlimit ${LANG_FRENCH} "Désactiver la limite de taille des chemins de Windows (limite MAX_PATH de 260 caractères, nécessite Windows 10 1607 ou plus)" | ||||||
| ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ||||||
| LangString inst_firewallinfo ${LANG_FRENCH} "Ajout d'une règle au Pare-Feu de Windows" | LangString inst_firewallinfo ${LANG_FRENCH} "Ajout d'une règle au Pare-Feu de 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." | ||||||
| @@ -31,7 +31,7 @@ LangString inst_requires_64bit ${LANG_FRENCH} "Cet installateur ne fonctionne qu | |||||||
| ;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_FRENCH} "Cette version de qBittorrent nécessite au moins Windows 7." | LangString inst_requires_win7 ${LANG_FRENCH} "Cette version de qBittorrent nécessite au moins Windows 7." | ||||||
| ;LangString inst_requires_win10 ${LANG_ENGLISH} "This installer requires at least Windows 10 1809." | ;LangString inst_requires_win10 ${LANG_ENGLISH} "This installer requires at least Windows 10 1809." | ||||||
| LangString inst_requires_win10 ${LANG_FRENCH}  "This installer requires at least Windows 10 1809." | LangString inst_requires_win10 ${LANG_FRENCH}  "Cet installateur nécessite au moins Windows 10 1809." | ||||||
| ;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent" | ;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent" | ||||||
| LangString inst_uninstall_link_description ${LANG_FRENCH} "Désinstaller qBittorrent" | LangString inst_uninstall_link_description ${LANG_FRENCH} "Désinstaller qBittorrent" | ||||||
|  |  | ||||||
| @@ -53,9 +53,9 @@ LangString remove_firewall ${LANG_FRENCH} "Supprimer la règle du Pare-Feu de Wi | |||||||
| ;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule" | ;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule" | ||||||
| LangString remove_firewallinfo ${LANG_FRENCH} "Suppression de la règle du Pare-Feu de Windows" | LangString remove_firewallinfo ${LANG_FRENCH} "Suppression de la règle du Pare-Feu de 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_FRENCH} "Supprimer les torrents et données cachées" | LangString remove_cache ${LANG_FRENCH} "Supprimer les torrents et données en cache" | ||||||
| ;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling." | ;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling." | ||||||
| LangString uninst_warning ${LANG_FRENCH} "qBittorrent est en cours d'exécution. Veuillez fermer l'application avant la désinstallation." | LangString uninst_warning ${LANG_FRENCH} "qBittorrent est en cours d'exécution. Fermez l'application avant de la désinstaller." | ||||||
| ;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_FRENCH} "Ne peut pas supprimer l'association du .torrent. Elle est associée avec :" | LangString uninst_tor_warn ${LANG_FRENCH} "Ne peut pas supprimer l'association du .torrent. Elle est associée avec :" | ||||||
| ;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:" | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ LangString inst_pathlimit ${LANG_HUNGARIAN} "A Windows elérési útvonalak hoss | |||||||
| ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ||||||
| LangString inst_firewallinfo ${LANG_HUNGARIAN} "Windows Tűzfal szabály hozzáadása folyamatban" | LangString inst_firewallinfo ${LANG_HUNGARIAN} "Windows Tűzfal szabály hozzáadása folyamatban" | ||||||
| ;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_HUNGARIAN} "A qBittorrent fut. Kérem zárjba be az alkalmazást a telepítés előtt." | LangString inst_warning ${LANG_HUNGARIAN} "A qBittorrent fut. Kérem zárja be az alkalmazást a telepítés előtt." | ||||||
| ;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_HUNGARIAN} "A jelenlegi verzió el lesz távolítva. A felhasználói beállítások és a torrentek megmaradnak." | LangString inst_uninstall_question ${LANG_HUNGARIAN} "A jelenlegi verzió el lesz távolítva. A felhasználói beállítások és a torrentek megmaradnak." | ||||||
| ;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version." | ;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version." | ||||||
|   | |||||||
							
								
								
									
										56
									
								
								dist/windows/installer-translations/romanian.nsi
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										56
									
								
								dist/windows/installer-translations/romanian.nsi
									
									
									
									
										vendored
									
									
								
							| @@ -1,62 +1,62 @@ | |||||||
| ;Installer strings | ;Installer strings | ||||||
|  |  | ||||||
| ;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)" | ;LangString inst_qbt_req ${LANG_ENGLISH} "qBittorrent (required)" | ||||||
| LangString inst_qbt_req ${LANG_ROMANIAN} "qBittorrent (required)" | LangString inst_qbt_req ${LANG_ROMANIAN} "qBittorrent (obligatoriu)" | ||||||
| ;LangString inst_desktop ${LANG_ENGLISH} "Create Desktop Shortcut" | ;LangString inst_desktop ${LANG_ENGLISH} "Create Desktop Shortcut" | ||||||
| LangString inst_desktop ${LANG_ROMANIAN} "Create Desktop Shortcut" | LangString inst_desktop ${LANG_ROMANIAN} "Creați o comandă rapidă pe Desktop" | ||||||
| ;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut" | ;LangString inst_startmenu ${LANG_ENGLISH} "Create Start Menu Shortcut" | ||||||
| LangString inst_startmenu ${LANG_ROMANIAN} "Create Start Menu Shortcut" | LangString inst_startmenu ${LANG_ROMANIAN} "Creați o comandă rapidă în meniul 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_ROMANIAN} "Start qBittorrent on Windows start up" | LangString inst_startup ${LANG_ROMANIAN} "Porniți qBittorrent la pornirea Windows" | ||||||
| ;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent" | ;LangString inst_torrent ${LANG_ENGLISH} "Open .torrent files with qBittorrent" | ||||||
| LangString inst_torrent ${LANG_ROMANIAN} "Open .torrent files with qBittorrent" | LangString inst_torrent ${LANG_ROMANIAN} "Deschideți fișierele .torrent cu 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_ROMANIAN} "Open magnet links with qBittorrent" | LangString inst_magnet ${LANG_ROMANIAN} "Deschideți linkurile magnet cu qBittorrent" | ||||||
| ;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule" | ;LangString inst_firewall ${LANG_ENGLISH} "Add Windows Firewall rule" | ||||||
| LangString inst_firewall ${LANG_ROMANIAN} "Add Windows Firewall rule" | LangString inst_firewall ${LANG_ROMANIAN} "Adăugați regula Windows Firewall" | ||||||
| ;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_ROMANIAN} "Disable Windows path length limit (260 character MAX_PATH limitation, requires Windows 10 1607 or later)" | LangString inst_pathlimit ${LANG_ROMANIAN} "Dezactivați limita de lungime a căii Windows (260 de caractere limită MAX_PATH, necesită Windows 10 1607 sau o versiune ulterioară)" | ||||||
| ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ;LangString inst_firewallinfo ${LANG_ENGLISH} "Adding Windows Firewall rule" | ||||||
| LangString inst_firewallinfo ${LANG_ROMANIAN} "Adding Windows Firewall rule" | LangString inst_firewallinfo ${LANG_ROMANIAN} "Adăugarea regulii Windows Firewall" | ||||||
| ;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_ROMANIAN} "qBittorrent is running. Please close the application before installing." | LangString inst_warning ${LANG_ROMANIAN} "qBittorrent rulează. Vă rugăm să închideți aplicația înainte de instalare." | ||||||
| ;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_ROMANIAN} "Current version will be uninstalled. User settings and torrents will remain intact." | LangString inst_uninstall_question ${LANG_ROMANIAN} "Versiunea actuală va fi dezinstalată. Setările utilizatorului și torrentele vor rămâne intacte." | ||||||
| ;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version." | ;LangString inst_unist ${LANG_ENGLISH} "Uninstalling previous version." | ||||||
| LangString inst_unist ${LANG_ROMANIAN} "Uninstalling previous version." | LangString inst_unist ${LANG_ROMANIAN} "Se dezinstalează versiunea anterioară." | ||||||
| ;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent." | ;LangString launch_qbt ${LANG_ENGLISH} "Launch qBittorrent." | ||||||
| LangString launch_qbt ${LANG_ROMANIAN} "Launch qBittorrent." | LangString launch_qbt ${LANG_ROMANIAN} "Lansați 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_ROMANIAN} "This installer works only in 64-bit Windows versions." | LangString inst_requires_64bit ${LANG_ROMANIAN} "Acest program de instalare funcționează doar pe versiunile Windows pe 64 de biți." | ||||||
| ;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_ROMANIAN} "This qBittorrent version requires at least Windows 7." | LangString inst_requires_win7 ${LANG_ROMANIAN} "Această versiune de qBittorrent necesită cel puțin Windows 7." | ||||||
| ;LangString inst_requires_win10 ${LANG_ENGLISH} "This installer requires at least Windows 10 1809." | ;LangString inst_requires_win10 ${LANG_ENGLISH} "This installer requires at least Windows 10 1809." | ||||||
| LangString inst_requires_win10 ${LANG_ROMANIAN}  "This installer requires at least Windows 10 1809." | LangString inst_requires_win10 ${LANG_ROMANIAN}  "Acest program de instalare necesită cel puțin Windows 10 1809." | ||||||
| ;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent" | ;LangString inst_uninstall_link_description ${LANG_ENGLISH} "Uninstall qBittorrent" | ||||||
| LangString inst_uninstall_link_description ${LANG_ROMANIAN} "Uninstall qBittorrent" | LangString inst_uninstall_link_description ${LANG_ROMANIAN} "Dezinstalați qBittorrent" | ||||||
|  |  | ||||||
| ;------------------------------------ | ;------------------------------------ | ||||||
| ;Uninstaller strings | ;Uninstaller strings | ||||||
|  |  | ||||||
| ;LangString remove_files ${LANG_ENGLISH} "Remove files" | ;LangString remove_files ${LANG_ENGLISH} "Remove files" | ||||||
| LangString remove_files ${LANG_ROMANIAN} "Remove files" | LangString remove_files ${LANG_ROMANIAN} "Eliminați fișierele" | ||||||
| ;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts" | ;LangString remove_shortcuts ${LANG_ENGLISH} "Remove shortcuts" | ||||||
| LangString remove_shortcuts ${LANG_ROMANIAN} "Remove shortcuts" | LangString remove_shortcuts ${LANG_ROMANIAN} "Eliminați comenzile rapide" | ||||||
| ;LangString remove_associations ${LANG_ENGLISH} "Remove file associations" | ;LangString remove_associations ${LANG_ENGLISH} "Remove file associations" | ||||||
| LangString remove_associations ${LANG_ROMANIAN} "Remove file associations" | LangString remove_associations ${LANG_ROMANIAN} "Eliminați asocierile de fișiere" | ||||||
| ;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys" | ;LangString remove_registry ${LANG_ENGLISH} "Remove registry keys" | ||||||
| LangString remove_registry ${LANG_ROMANIAN} "Remove registry keys" | LangString remove_registry ${LANG_ROMANIAN} "Eliminați cheile din registru" | ||||||
| ;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files" | ;LangString remove_conf ${LANG_ENGLISH} "Remove configuration files" | ||||||
| LangString remove_conf ${LANG_ROMANIAN} "Remove configuration files" | LangString remove_conf ${LANG_ROMANIAN} "Eliminați fișierele de configurare" | ||||||
| ;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule" | ;LangString remove_firewall ${LANG_ENGLISH} "Remove Windows Firewall rule" | ||||||
| LangString remove_firewall ${LANG_ROMANIAN} "Remove Windows Firewall rule" | LangString remove_firewall ${LANG_ROMANIAN} "Eliminați regula Windows Firewall" | ||||||
| ;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule" | ;LangString remove_firewallinfo ${LANG_ENGLISH} "Removing Windows Firewall rule" | ||||||
| LangString remove_firewallinfo ${LANG_ROMANIAN} "Removing Windows Firewall rule" | LangString remove_firewallinfo ${LANG_ROMANIAN} "Se elimină regula Windows Firewall" | ||||||
| ;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data" | ;LangString remove_cache ${LANG_ENGLISH} "Remove torrents and cached data" | ||||||
| LangString remove_cache ${LANG_ROMANIAN} "Remove torrents and cached data" | LangString remove_cache ${LANG_ROMANIAN} "Eliminați torrentele și datele din cache" | ||||||
| ;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling." | ;LangString uninst_warning ${LANG_ENGLISH} "qBittorrent is running. Please close the application before uninstalling." | ||||||
| LangString uninst_warning ${LANG_ROMANIAN} "qBittorrent is running. Please close the application before uninstalling." | LangString uninst_warning ${LANG_ROMANIAN} "qBittorrent rulează. Vă rugăm să închideți aplicația înainte de a o dezinstala." | ||||||
| ;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_ROMANIAN} "Not removing .torrent association. It is associated with:" | LangString uninst_tor_warn ${LANG_ROMANIAN} "Nu se elimină asocierea .torrent. Este asociat cu:" | ||||||
| ;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_ROMANIAN} "Not removing magnet association. It is associated with:" | LangString uninst_mag_warn ${LANG_ROMANIAN} "Nu se elimină asocierea magnet. Este asociat cu:" | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								dist/windows/installer.nsi
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/windows/installer.nsi
									
									
									
									
										vendored
									
									
								
							| @@ -109,7 +109,7 @@ Section $(inst_torrent) ;"Open .torrent files with qBittorrent" | |||||||
|  |  | ||||||
|   !insertmacro UAC_AsUser_Call Function inst_torrent_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} |   !insertmacro UAC_AsUser_Call Function inst_torrent_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} | ||||||
|  |  | ||||||
|   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, p 0, p 0)' | ||||||
|  |  | ||||||
| SectionEnd | SectionEnd | ||||||
|  |  | ||||||
| @@ -142,7 +142,7 @@ Section $(inst_magnet) ;"Open magnet links with qBittorrent" | |||||||
|  |  | ||||||
|   !insertmacro UAC_AsUser_Call Function inst_magnet_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} |   !insertmacro UAC_AsUser_Call Function inst_magnet_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} | ||||||
|  |  | ||||||
|   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, p 0, p 0)' | ||||||
|  |  | ||||||
| SectionEnd | SectionEnd | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										11
									
								
								dist/windows/uninstaller.nsi
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								dist/windows/uninstaller.nsi
									
									
									
									
										vendored
									
									
								
							| @@ -26,17 +26,17 @@ Section "un.$(remove_associations)" ;"un.Remove file associations" | |||||||
|   DetailPrint "$(uninst_tor_warn) $0" |   DetailPrint "$(uninst_tor_warn) $0" | ||||||
|   DeleteRegValue HKLM "Software\Classes\.torrent" "" |   DeleteRegValue HKLM "Software\Classes\.torrent" "" | ||||||
|   DeleteRegKey /ifempty HKLM "Software\Classes\.torrent" |   DeleteRegKey /ifempty HKLM "Software\Classes\.torrent" | ||||||
|  |  | ||||||
|   torrent_end: |   torrent_end: | ||||||
|  |  | ||||||
|   ReadRegStr $0 HKLM "Software\Classes\magnet\shell\open\command" "" |   ReadRegStr $0 HKLM "Software\Classes\magnet\shell\open\command" "" | ||||||
|   StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end |   StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end | ||||||
|   DetailPrint "$(uninst_mag_warn) $0" |   DetailPrint "$(uninst_mag_warn) $0" | ||||||
|   DeleteRegKey HKLM "Software\Classes\magnet" |   DeleteRegKey HKLM "Software\Classes\magnet" | ||||||
|  |  | ||||||
|   magnet_end: |   magnet_end: | ||||||
|  |  | ||||||
|   !insertmacro UAC_AsUser_Call Function un.remove_associations_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} |   !insertmacro UAC_AsUser_Call Function un.remove_associations_user ${UAC_SYNCREGISTERS}|${UAC_SYNCOUTDIR}|${UAC_SYNCINSTDIR} | ||||||
|  |  | ||||||
|   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, p 0, p 0)' | ||||||
| SectionEnd | SectionEnd | ||||||
|  |  | ||||||
| Function un.remove_associations_user | Function un.remove_associations_user | ||||||
| @@ -45,13 +45,12 @@ Function un.remove_associations_user | |||||||
|   DetailPrint "$(uninst_tor_warn) $0" |   DetailPrint "$(uninst_tor_warn) $0" | ||||||
|   DeleteRegValue HKCU "Software\Classes\.torrent" "" |   DeleteRegValue HKCU "Software\Classes\.torrent" "" | ||||||
|   DeleteRegKey /ifempty HKCU "Software\Classes\.torrent" |   DeleteRegKey /ifempty HKCU "Software\Classes\.torrent" | ||||||
|  |  | ||||||
|   torrent_end: |   torrent_end: | ||||||
|  |  | ||||||
|   ReadRegStr $0 HKCU "Software\Classes\magnet\shell\open\command" "" |   ReadRegStr $0 HKCU "Software\Classes\magnet\shell\open\command" "" | ||||||
|   StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end |   StrCmp $0 '"$INSTDIR\qbittorrent.exe" "%1"' 0 magnet_end | ||||||
|   DetailPrint "$(uninst_mag_warn) $0" |   DetailPrint "$(uninst_mag_warn) $0" | ||||||
|   DeleteRegKey HKCU "Software\Classes\magnet" |   DeleteRegKey HKCU "Software\Classes\magnet" | ||||||
|  |  | ||||||
|   magnet_end: |   magnet_end: | ||||||
| FunctionEnd | FunctionEnd | ||||||
|  |  | ||||||
| @@ -62,7 +61,7 @@ Section "un.$(remove_registry)" ;"un.Remove registry keys" | |||||||
|   DeleteRegKey HKLM "Software\qBittorrent" |   DeleteRegKey HKLM "Software\qBittorrent" | ||||||
|   DeleteRegKey HKLM "Software\Classes\qBittorrent" |   DeleteRegKey HKLM "Software\Classes\qBittorrent" | ||||||
|  |  | ||||||
|   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, i 0, i 0)' |   System::Call 'Shell32::SHChangeNotify(i ${SHCNE_ASSOCCHANGED}, i ${SHCNF_IDLIST}, p 0, p 0)' | ||||||
| SectionEnd | SectionEnd | ||||||
|  |  | ||||||
| Section "un.$(remove_firewall)" ; | Section "un.$(remove_firewall)" ; | ||||||
|   | |||||||
| @@ -96,12 +96,18 @@ | |||||||
| #include "gui/mainwindow.h" | #include "gui/mainwindow.h" | ||||||
| #include "gui/shutdownconfirmdialog.h" | #include "gui/shutdownconfirmdialog.h" | ||||||
| #include "gui/uithememanager.h" | #include "gui/uithememanager.h" | ||||||
| #include "gui/utils.h" |  | ||||||
| #include "gui/windowstate.h" | #include "gui/windowstate.h" | ||||||
|  |  | ||||||
|  | #ifdef Q_OS_WIN | ||||||
|  | #include "base/utils/os.h" | ||||||
|  | #endif  // Q_OS_WIN | ||||||
| #endif // DISABLE_GUI | #endif // DISABLE_GUI | ||||||
|  |  | ||||||
| #ifndef DISABLE_WEBUI | #ifndef DISABLE_WEBUI | ||||||
| #include "webui/webui.h" | #include "webui/webui.h" | ||||||
|  | #ifdef DISABLE_GUI | ||||||
|  | #include "base/utils/password.h" | ||||||
|  | #endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| namespace | namespace | ||||||
| @@ -306,8 +312,8 @@ Application::Application(int &argc, char **argv) | |||||||
|     if (isFileLoggerEnabled()) |     if (isFileLoggerEnabled()) | ||||||
|         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())); | ||||||
|  |  | ||||||
|     if (m_commandLineArgs.webUiPort > 0) // it will be -1 when user did not set any value |     if (m_commandLineArgs.webUIPort > 0) // it will be -1 when user did not set any value | ||||||
|         Preferences::instance()->setWebUiPort(m_commandLineArgs.webUiPort); |         Preferences::instance()->setWebUIPort(m_commandLineArgs.webUIPort); | ||||||
|  |  | ||||||
|     if (m_commandLineArgs.torrentingPort > 0) // it will be -1 when user did not set any value |     if (m_commandLineArgs.torrentingPort > 0) // it will be -1 when user did not set any value | ||||||
|     { |     { | ||||||
| @@ -371,7 +377,7 @@ void Application::setMemoryWorkingSetLimit(const int size) | |||||||
|         return; |         return; | ||||||
|  |  | ||||||
|     m_storeMemoryWorkingSetLimit = size; |     m_storeMemoryWorkingSetLimit = size; | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) | ||||||
|     applyMemoryWorkingSetLimit(); |     applyMemoryWorkingSetLimit(); | ||||||
| #endif | #endif | ||||||
| } | } | ||||||
| @@ -763,14 +769,13 @@ void Application::processParams(const QBtCommandLineParameters ¶ms) | |||||||
| } | } | ||||||
|  |  | ||||||
| int Application::exec() | int Application::exec() | ||||||
| try |  | ||||||
| { | { | ||||||
| #if !defined(DISABLE_WEBUI) && defined(DISABLE_GUI) | #if !defined(DISABLE_WEBUI) && defined(DISABLE_GUI) | ||||||
|     const QString loadingStr = tr("WebUI will be started shortly after internal preparations. Please wait..."); |     const QString loadingStr = tr("WebUI will be started shortly after internal preparations. Please wait..."); | ||||||
|     printf("%s\n", qUtf8Printable(loadingStr)); |     printf("%s\n", qUtf8Printable(loadingStr)); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) | ||||||
|     applyMemoryWorkingSetLimit(); |     applyMemoryWorkingSetLimit(); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -878,14 +883,14 @@ try | |||||||
|         delete m_startupProgressDialog; |         delete m_startupProgressDialog; | ||||||
| #ifdef Q_OS_WIN | #ifdef Q_OS_WIN | ||||||
|         auto *pref = Preferences::instance(); |         auto *pref = Preferences::instance(); | ||||||
|         if (!pref->neverCheckFileAssoc() && (!Preferences::isTorrentFileAssocSet() || !Preferences::isMagnetLinkAssocSet())) |         if (!pref->neverCheckFileAssoc() && (!Utils::OS::isTorrentFileAssocSet() || !Utils::OS::isMagnetLinkAssocSet())) | ||||||
|         { |         { | ||||||
|             if (QMessageBox::question(m_window, tr("Torrent file association") |             if (QMessageBox::question(m_window, tr("Torrent file association") | ||||||
|                                       , tr("qBittorrent is not the default application for opening torrent files or Magnet links.\nDo you want to make qBittorrent the default application for these?") |                                       , tr("qBittorrent is not the default application for opening torrent files or Magnet links.\nDo you want to make qBittorrent the default application for these?") | ||||||
|                                       , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) |                                       , QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) | ||||||
|             { |             { | ||||||
|                 pref->setTorrentFileAssoc(true); |                 Utils::OS::setTorrentFileAssoc(true); | ||||||
|                 pref->setMagnetLinkAssoc(true); |                 Utils::OS::setMagnetLinkAssoc(true); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
| @@ -896,25 +901,28 @@ try | |||||||
| #endif // DISABLE_GUI | #endif // DISABLE_GUI | ||||||
|  |  | ||||||
| #ifndef DISABLE_WEBUI | #ifndef DISABLE_WEBUI | ||||||
|  | #ifndef DISABLE_GUI | ||||||
|         m_webui = new WebUI(this); |         m_webui = new WebUI(this); | ||||||
| #ifdef DISABLE_GUI | #else | ||||||
|  |         const Preferences *pref = Preferences::instance(); | ||||||
|  |         const QString tempPassword = pref->getWebUIPassword().isEmpty() | ||||||
|  |                 ? Utils::Password::generate() : QString(); | ||||||
|  |         m_webui = new WebUI(this, (!tempPassword.isEmpty() ? Utils::Password::PBKDF2::generate(tempPassword) : QByteArray())); | ||||||
|         if (m_webui->isErrored()) |         if (m_webui->isErrored()) | ||||||
|             QCoreApplication::exit(EXIT_FAILURE); |             QCoreApplication::exit(EXIT_FAILURE); | ||||||
|         connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(EXIT_FAILURE); }); |         connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(EXIT_FAILURE); }); | ||||||
|  |  | ||||||
|         const Preferences *pref = Preferences::instance(); |         const auto scheme = pref->isWebUIHttpsEnabled() ? u"https"_s : u"http"_s; | ||||||
|  |         const auto url = u"%1://localhost:%2\n"_s.arg(scheme, QString::number(pref->getWebUIPort())); | ||||||
|         const auto scheme = pref->isWebUiHttpsEnabled() ? u"https"_s : u"http"_s; |  | ||||||
|         const auto url = u"%1://localhost:%2\n"_s.arg(scheme, QString::number(pref->getWebUiPort())); |  | ||||||
|         const QString mesg = u"\n******** %1 ********\n"_s.arg(tr("Information")) |         const QString mesg = u"\n******** %1 ********\n"_s.arg(tr("Information")) | ||||||
|                 + tr("To control qBittorrent, access the WebUI at: %1").arg(url); |                 + tr("To control qBittorrent, access the WebUI at: %1").arg(url); | ||||||
|         printf("%s\n", qUtf8Printable(mesg)); |         printf("%s\n", qUtf8Printable(mesg)); | ||||||
|  |  | ||||||
|         if (pref->getWebUIPassword() == QByteArrayLiteral("ARQ77eY1NUZaQsuDHbIMCA==:0WMRkYTUWVT9wVvdDtHAjU9b3b7uB8NR1Gur2hmQCvCDpm39Q+PsJRJPaCU51dEiz+dTzh8qbPsL8WkFljQYFQ==")) |         if (!tempPassword.isEmpty()) | ||||||
|         { |         { | ||||||
|             const QString warning = tr("The Web UI administrator username is: %1").arg(pref->getWebUiUsername()) + u'\n' |             const QString warning = tr("The WebUI administrator username is: %1").arg(pref->getWebUIUsername()) + u'\n' | ||||||
|                     + tr("The Web UI administrator password has not been changed from the default: %1").arg(u"adminadmin"_s) + u'\n' |                     + tr("The WebUI administrator password was not set. A temporary password is provided for this session: %1").arg(tempPassword) + u'\n' | ||||||
|                     + tr("This is a security risk, please change your password in program preferences.") + u'\n'; |                     + tr("You should set your own password in program preferences.") + u'\n'; | ||||||
|             printf("%s", qUtf8Printable(warning)); |             printf("%s", qUtf8Printable(warning)); | ||||||
|         } |         } | ||||||
| #endif // DISABLE_GUI | #endif // DISABLE_GUI | ||||||
| @@ -932,21 +940,6 @@ try | |||||||
|  |  | ||||||
|     return BaseApplication::exec(); |     return BaseApplication::exec(); | ||||||
| } | } | ||||||
| catch (const RuntimeError &err) |  | ||||||
| { |  | ||||||
| #ifdef DISABLE_GUI |  | ||||||
|     fprintf(stderr, "%s", qPrintable(err.message())); |  | ||||||
| #else |  | ||||||
|     QMessageBox msgBox; |  | ||||||
|     msgBox.setIcon(QMessageBox::Critical); |  | ||||||
|     msgBox.setText(QCoreApplication::translate("Application", "Application failed to start.")); |  | ||||||
|     msgBox.setInformativeText(err.message()); |  | ||||||
|     msgBox.show(); // Need to be shown or to moveToCenter does not work |  | ||||||
|     msgBox.move(Utils::Gui::screenCenter(&msgBox)); |  | ||||||
|     msgBox.exec(); |  | ||||||
| #endif |  | ||||||
|     return EXIT_FAILURE; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool Application::isRunning() | bool Application::isRunning() | ||||||
| { | { | ||||||
| @@ -1092,7 +1085,7 @@ void Application::shutdownCleanup(QSessionManager &manager) | |||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) | ||||||
| void Application::applyMemoryWorkingSetLimit() const | void Application::applyMemoryWorkingSetLimit() const | ||||||
| { | { | ||||||
|     const size_t MiB = 1024 * 1024; |     const size_t MiB = 1024 * 1024; | ||||||
| @@ -1312,3 +1305,10 @@ void Application::cleanup() | |||||||
|         Utils::Misc::shutdownComputer(m_shutdownAct); |         Utils::Misc::shutdownComputer(m_shutdownAct); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #ifndef DISABLE_WEBUI | ||||||
|  | WebUI *Application::webUI() const | ||||||
|  | { | ||||||
|  |     return m_webui; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|   | |||||||
| @@ -149,12 +149,16 @@ private slots: | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| private: | private: | ||||||
|  | #ifndef DISABLE_WEBUI | ||||||
|  |     WebUI *webUI() const override; | ||||||
|  | #endif | ||||||
|  |  | ||||||
|     void initializeTranslation(); |     void initializeTranslation(); | ||||||
|     void processParams(const QBtCommandLineParameters ¶ms); |     void processParams(const QBtCommandLineParameters ¶ms); | ||||||
|     void runExternalProgram(const QString &programTemplate, const BitTorrent::Torrent *torrent) const; |     void runExternalProgram(const QString &programTemplate, const BitTorrent::Torrent *torrent) const; | ||||||
|     void sendNotificationEmail(const BitTorrent::Torrent *torrent); |     void sendNotificationEmail(const BitTorrent::Torrent *torrent); | ||||||
|  |  | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #if defined(QBT_USES_LIBTORRENT2) && !defined(Q_OS_MACOS) | ||||||
|     void applyMemoryWorkingSetLimit() const; |     void applyMemoryWorkingSetLimit() const; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   | |||||||
| @@ -349,7 +349,7 @@ QBtCommandLineParameters::QBtCommandLineParameters(const QProcessEnvironment &en | |||||||
| #elif !defined(Q_OS_WIN) | #elif !defined(Q_OS_WIN) | ||||||
|     , shouldDaemonize(DAEMON_OPTION.value(env)) |     , shouldDaemonize(DAEMON_OPTION.value(env)) | ||||||
| #endif | #endif | ||||||
|     , webUiPort(WEBUI_PORT_OPTION.value(env, -1)) |     , webUIPort(WEBUI_PORT_OPTION.value(env, -1)) | ||||||
|     , torrentingPort(TORRENTING_PORT_OPTION.value(env, -1)) |     , torrentingPort(TORRENTING_PORT_OPTION.value(env, -1)) | ||||||
|     , skipDialog(SKIP_DIALOG_OPTION.value(env)) |     , skipDialog(SKIP_DIALOG_OPTION.value(env)) | ||||||
|     , profileDir(PROFILE_OPTION.value(env)) |     , profileDir(PROFILE_OPTION.value(env)) | ||||||
| @@ -373,7 +373,7 @@ QBtCommandLineParameters parseCommandLine(const QStringList &args) | |||||||
|  |  | ||||||
|         if ((arg.startsWith(u"--") && !arg.endsWith(u".torrent")) |         if ((arg.startsWith(u"--") && !arg.endsWith(u".torrent")) | ||||||
|             || (arg.startsWith(u'-') && (arg.size() == 2))) |             || (arg.startsWith(u'-') && (arg.size() == 2))) | ||||||
|             { |         { | ||||||
|             // Parse known parameters |             // Parse known parameters | ||||||
|             if (arg == SHOW_HELP_OPTION) |             if (arg == SHOW_HELP_OPTION) | ||||||
|             { |             { | ||||||
| @@ -387,8 +387,8 @@ QBtCommandLineParameters parseCommandLine(const QStringList &args) | |||||||
| #endif | #endif | ||||||
|             else if (arg == WEBUI_PORT_OPTION) |             else if (arg == WEBUI_PORT_OPTION) | ||||||
|             { |             { | ||||||
|                 result.webUiPort = WEBUI_PORT_OPTION.value(arg); |                 result.webUIPort = WEBUI_PORT_OPTION.value(arg); | ||||||
|                 if ((result.webUiPort < 1) || (result.webUiPort > 65535)) |                 if ((result.webUIPort < 1) || (result.webUIPort > 65535)) | ||||||
|                     throw CommandLineParameterError(QCoreApplication::translate("CMD Options", "%1 must specify a valid port (1 to 65535).") |                     throw CommandLineParameterError(QCoreApplication::translate("CMD Options", "%1 must specify a valid port (1 to 65535).") | ||||||
|                                                     .arg(u"--webui-port"_s)); |                                                     .arg(u"--webui-port"_s)); | ||||||
|             } |             } | ||||||
| @@ -509,7 +509,7 @@ QString makeUsage(const QString &prgName) | |||||||
| #endif | #endif | ||||||
|         + SHOW_HELP_OPTION.usage() + wrapText(QCoreApplication::translate("CMD Options", "Display this help message and exit")) + u'\n' |         + SHOW_HELP_OPTION.usage() + wrapText(QCoreApplication::translate("CMD Options", "Display this help message and exit")) + u'\n' | ||||||
|         + WEBUI_PORT_OPTION.usage(QCoreApplication::translate("CMD Options", "port")) |         + WEBUI_PORT_OPTION.usage(QCoreApplication::translate("CMD Options", "port")) | ||||||
|         + wrapText(QCoreApplication::translate("CMD Options", "Change the Web UI port")) |         + wrapText(QCoreApplication::translate("CMD Options", "Change the WebUI port")) | ||||||
|         + u'\n' |         + u'\n' | ||||||
|         + TORRENTING_PORT_OPTION.usage(QCoreApplication::translate("CMD Options", "port")) |         + TORRENTING_PORT_OPTION.usage(QCoreApplication::translate("CMD Options", "port")) | ||||||
|         + wrapText(QCoreApplication::translate("CMD Options", "Change the torrenting port")) |         + wrapText(QCoreApplication::translate("CMD Options", "Change the torrenting port")) | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ struct QBtCommandLineParameters | |||||||
| #elif !defined(Q_OS_WIN) | #elif !defined(Q_OS_WIN) | ||||||
|     bool shouldDaemonize = false; |     bool shouldDaemonize = false; | ||||||
| #endif | #endif | ||||||
|     int webUiPort = -1; |     int webUIPort = -1; | ||||||
|     int torrentingPort = -1; |     int torrentingPort = -1; | ||||||
|     std::optional<bool> skipDialog; |     std::optional<bool> skipDialog; | ||||||
|     Path profileDir; |     Path profileDir; | ||||||
|   | |||||||
| @@ -46,7 +46,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <QCoreApplication> | #include <QCoreApplication> | ||||||
| #include <QDebug> | #include <QString> | ||||||
| #include <QThread> | #include <QThread> | ||||||
|  |  | ||||||
| #ifndef DISABLE_GUI | #ifndef DISABLE_GUI | ||||||
| @@ -86,6 +86,7 @@ using namespace std::chrono_literals; | |||||||
| void displayVersion(); | void displayVersion(); | ||||||
| bool userAgreesWithLegalNotice(); | bool userAgreesWithLegalNotice(); | ||||||
| void displayBadArgMessage(const QString &message); | void displayBadArgMessage(const QString &message); | ||||||
|  | void displayErrorMessage(const QString &message); | ||||||
|  |  | ||||||
| #ifndef DISABLE_GUI | #ifndef DISABLE_GUI | ||||||
| void showSplashScreen(); | void showSplashScreen(); | ||||||
| @@ -114,10 +115,12 @@ int main(int argc, char *argv[]) | |||||||
|         Application::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); |         Application::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |     // `app` must be declared out of try block to allow display message box in case of exception | ||||||
|  |     std::unique_ptr<Application> app; | ||||||
|     try |     try | ||||||
|     { |     { | ||||||
|         // Create Application |         // Create Application | ||||||
|         auto app = std::make_unique<Application>(argc, argv); |         app = std::make_unique<Application>(argc, argv); | ||||||
|  |  | ||||||
| #ifdef Q_OS_WIN | #ifdef Q_OS_WIN | ||||||
|         // QCoreApplication::applicationDirPath() needs an Application object instantiated first |         // QCoreApplication::applicationDirPath() needs an Application object instantiated first | ||||||
| @@ -268,7 +271,7 @@ int main(int argc, char *argv[]) | |||||||
|     } |     } | ||||||
|     catch (const RuntimeError &er) |     catch (const RuntimeError &er) | ||||||
|     { |     { | ||||||
|         qDebug() << er.message(); |         displayErrorMessage(er.message()); | ||||||
|         return EXIT_FAILURE; |         return EXIT_FAILURE; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @@ -311,6 +314,30 @@ void displayBadArgMessage(const QString &message) | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void displayErrorMessage(const QString &message) | ||||||
|  | { | ||||||
|  | #ifndef DISABLE_GUI | ||||||
|  |     if (QApplication::instance()) | ||||||
|  |     { | ||||||
|  |         QMessageBox msgBox; | ||||||
|  |         msgBox.setIcon(QMessageBox::Critical); | ||||||
|  |         msgBox.setText(QCoreApplication::translate("Main", "An unrecoverable error occurred.")); | ||||||
|  |         msgBox.setInformativeText(message); | ||||||
|  |         msgBox.show(); // Need to be shown or to moveToCenter does not work | ||||||
|  |         msgBox.move(Utils::Gui::screenCenter(&msgBox)); | ||||||
|  |         msgBox.exec(); | ||||||
|  |     } | ||||||
|  |     else | ||||||
|  |     { | ||||||
|  |         const QString errMsg = QCoreApplication::translate("Main", "qBittorrent has encountered an unrecoverable error.") + u'\n' + message + u'\n'; | ||||||
|  |         fprintf(stderr, "%s", qUtf8Printable(errMsg)); | ||||||
|  |     } | ||||||
|  | #else | ||||||
|  |     const QString errMsg = QCoreApplication::translate("Main", "qBittorrent has encountered an unrecoverable error.") + u'\n' + message + u'\n'; | ||||||
|  |     fprintf(stderr, "%s", qUtf8Printable(errMsg)); | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
| bool userAgreesWithLegalNotice() | bool userAgreesWithLegalNotice() | ||||||
| { | { | ||||||
|     Preferences *const pref = Preferences::instance(); |     Preferences *const pref = Preferences::instance(); | ||||||
|   | |||||||
| @@ -43,6 +43,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #include <QCoreApplication> | #include <QCoreApplication> | ||||||
|  | #include <QMetaObject> | ||||||
|  |  | ||||||
| #include "base/version.h" | #include "base/version.h" | ||||||
|  |  | ||||||
| @@ -89,7 +90,7 @@ namespace | |||||||
|         const char *msgs[] = {"Catching signal: ", sysSigName[signum], "\nExiting cleanly\n"}; |         const char *msgs[] = {"Catching signal: ", sysSigName[signum], "\nExiting cleanly\n"}; | ||||||
|         std::for_each(std::begin(msgs), std::end(msgs), safePrint); |         std::for_each(std::begin(msgs), std::end(msgs), safePrint); | ||||||
|         signal(signum, SIG_DFL); |         signal(signum, SIG_DFL); | ||||||
|         QCoreApplication::exit();  // unsafe, but exit anyway |         QMetaObject::invokeMethod(qApp, [] { QCoreApplication::exit(); }, Qt::QueuedConnection);  // unsafe, but exit anyway | ||||||
|     } |     } | ||||||
|  |  | ||||||
| #ifdef STACKTRACE | #ifdef STACKTRACE | ||||||
|   | |||||||
| @@ -99,6 +99,7 @@ add_library(qbt_base STATIC | |||||||
|     utils/io.h |     utils/io.h | ||||||
|     utils/misc.h |     utils/misc.h | ||||||
|     utils/net.h |     utils/net.h | ||||||
|  |     utils/os.h | ||||||
|     utils/password.h |     utils/password.h | ||||||
|     utils/random.h |     utils/random.h | ||||||
|     utils/string.h |     utils/string.h | ||||||
| @@ -184,6 +185,7 @@ add_library(qbt_base STATIC | |||||||
|     utils/io.cpp |     utils/io.cpp | ||||||
|     utils/misc.cpp |     utils/misc.cpp | ||||||
|     utils/net.cpp |     utils/net.cpp | ||||||
|  |     utils/os.cpp | ||||||
|     utils/password.cpp |     utils/password.cpp | ||||||
|     utils/random.cpp |     utils/random.cpp | ||||||
|     utils/string.cpp |     utils/string.cpp | ||||||
|   | |||||||
| @@ -99,6 +99,7 @@ HEADERS += \ | |||||||
|     $$PWD/utils/io.h \ |     $$PWD/utils/io.h \ | ||||||
|     $$PWD/utils/misc.h \ |     $$PWD/utils/misc.h \ | ||||||
|     $$PWD/utils/net.h \ |     $$PWD/utils/net.h \ | ||||||
|  |     $$PWD/utils/os.h \ | ||||||
|     $$PWD/utils/password.h \ |     $$PWD/utils/password.h \ | ||||||
|     $$PWD/utils/random.h \ |     $$PWD/utils/random.h \ | ||||||
|     $$PWD/utils/string.h \ |     $$PWD/utils/string.h \ | ||||||
| @@ -184,6 +185,7 @@ SOURCES += \ | |||||||
|     $$PWD/utils/io.cpp \ |     $$PWD/utils/io.cpp \ | ||||||
|     $$PWD/utils/misc.cpp \ |     $$PWD/utils/misc.cpp \ | ||||||
|     $$PWD/utils/net.cpp \ |     $$PWD/utils/net.cpp \ | ||||||
|  |     $$PWD/utils/os.cpp \ | ||||||
|     $$PWD/utils/password.cpp \ |     $$PWD/utils/password.cpp \ | ||||||
|     $$PWD/utils/random.cpp \ |     $$PWD/utils/random.cpp \ | ||||||
|     $$PWD/utils/string.cpp \ |     $$PWD/utils/string.cpp \ | ||||||
|   | |||||||
| @@ -288,7 +288,7 @@ namespace BitTorrent | |||||||
|         Q_DISABLE_COPY_MOVE(Worker) |         Q_DISABLE_COPY_MOVE(Worker) | ||||||
|  |  | ||||||
|     public: |     public: | ||||||
|         Worker(const Path &dbPath, QReadWriteLock &dbLock); |         Worker(const Path &dbPath, QReadWriteLock &dbLock, QObject *parent = nullptr); | ||||||
|  |  | ||||||
|         void run() override; |         void run() override; | ||||||
|         void requestInterruption(); |         void requestInterruption(); | ||||||
| @@ -332,7 +332,7 @@ BitTorrent::DBResumeDataStorage::DBResumeDataStorage(const Path &dbPath, QObject | |||||||
|             updateDB(dbVersion); |             updateDB(dbVersion); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     m_asyncWorker = new Worker(dbPath, m_dbLock); |     m_asyncWorker = new Worker(dbPath, m_dbLock, this); | ||||||
|     m_asyncWorker->start(); |     m_asyncWorker->start(); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -611,10 +611,15 @@ void BitTorrent::DBResumeDataStorage::updateDB(const int fromVersion) const | |||||||
|  |  | ||||||
|         if (fromVersion <= 4) |         if (fromVersion <= 4) | ||||||
|         { |         { | ||||||
|             const auto alterTableTorrentsQuery = u"ALTER TABLE %1 ADD %2"_s |             const auto testQuery = u"SELECT COUNT(%1) FROM %2;"_s | ||||||
|                     .arg(quoted(DB_TABLE_TORRENTS), makeColumnDefinition(DB_COLUMN_INACTIVE_SEEDING_TIME_LIMIT, "INTEGER NOT NULL DEFAULT -2")); |                     .arg(quoted(DB_COLUMN_INACTIVE_SEEDING_TIME_LIMIT.name), quoted(DB_TABLE_TORRENTS)); | ||||||
|             if (!query.exec(alterTableTorrentsQuery)) |             if (!query.exec(testQuery)) | ||||||
|                 throw RuntimeError(query.lastError().text()); |             { | ||||||
|  |                 const auto alterTableTorrentsQuery = u"ALTER TABLE %1 ADD %2"_s | ||||||
|  |                         .arg(quoted(DB_TABLE_TORRENTS), makeColumnDefinition(DB_COLUMN_INACTIVE_SEEDING_TIME_LIMIT, "INTEGER NOT NULL DEFAULT -2")); | ||||||
|  |                 if (!query.exec(alterTableTorrentsQuery)) | ||||||
|  |                     throw RuntimeError(query.lastError().text()); | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         const QString updateMetaVersionQuery = makeUpdateStatement(DB_TABLE_META, {DB_COLUMN_NAME, DB_COLUMN_VALUE}); |         const QString updateMetaVersionQuery = makeUpdateStatement(DB_TABLE_META, {DB_COLUMN_NAME, DB_COLUMN_VALUE}); | ||||||
| @@ -653,8 +658,9 @@ void BitTorrent::DBResumeDataStorage::enableWALMode() const | |||||||
|         throw RuntimeError(tr("WAL mode is probably unsupported due to filesystem limitations.")); |         throw RuntimeError(tr("WAL mode is probably unsupported due to filesystem limitations.")); | ||||||
| } | } | ||||||
|  |  | ||||||
| BitTorrent::DBResumeDataStorage::Worker::Worker(const Path &dbPath, QReadWriteLock &dbLock) | BitTorrent::DBResumeDataStorage::Worker::Worker(const Path &dbPath, QReadWriteLock &dbLock, QObject *parent) | ||||||
|     : m_path {dbPath} |     : QThread(parent) | ||||||
|  |     , m_path {dbPath} | ||||||
|     , m_dbLock {dbLock} |     , m_dbLock {dbLock} | ||||||
| { | { | ||||||
| } | } | ||||||
|   | |||||||
| @@ -2435,6 +2435,11 @@ bool SessionImpl::cancelDownloadMetadata(const TorrentID &id) | |||||||
|         return false; |         return false; | ||||||
|  |  | ||||||
|     const lt::torrent_handle nativeHandle = downloadedMetadataIter.value(); |     const lt::torrent_handle nativeHandle = downloadedMetadataIter.value(); | ||||||
|  |     m_downloadedMetadata.erase(downloadedMetadataIter); | ||||||
|  |  | ||||||
|  |     if (!nativeHandle.is_valid()) | ||||||
|  |         return true; | ||||||
|  |  | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #ifdef QBT_USES_LIBTORRENT2 | ||||||
|     const InfoHash infoHash {nativeHandle.info_hashes()}; |     const InfoHash infoHash {nativeHandle.info_hashes()}; | ||||||
|     if (infoHash.isHybrid()) |     if (infoHash.isHybrid()) | ||||||
| @@ -2445,7 +2450,7 @@ bool SessionImpl::cancelDownloadMetadata(const TorrentID &id) | |||||||
|         m_downloadedMetadata.remove((altID == downloadedMetadataIter.key()) ? id : altID); |         m_downloadedMetadata.remove((altID == downloadedMetadataIter.key()) ? id : altID); | ||||||
|     } |     } | ||||||
| #endif | #endif | ||||||
|     m_downloadedMetadata.erase(downloadedMetadataIter); |  | ||||||
|     m_nativeSession->remove_torrent(nativeHandle, lt::session::delete_files); |     m_nativeSession->remove_torrent(nativeHandle, lt::session::delete_files); | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| @@ -2950,7 +2955,7 @@ bool SessionImpl::addTorrent_impl(const std::variant<MagnetUri, TorrentInfo> &so | |||||||
| } | } | ||||||
|  |  | ||||||
| void SessionImpl::findIncompleteFiles(const TorrentInfo &torrentInfo, const Path &savePath | void SessionImpl::findIncompleteFiles(const TorrentInfo &torrentInfo, const Path &savePath | ||||||
|                                   , const Path &downloadPath, const PathList &filePaths) const |         , const Path &downloadPath, const PathList &filePaths) const | ||||||
| { | { | ||||||
|     Q_ASSERT(filePaths.isEmpty() || (filePaths.size() == torrentInfo.filesCount())); |     Q_ASSERT(filePaths.isEmpty() || (filePaths.size() == torrentInfo.filesCount())); | ||||||
|  |  | ||||||
| @@ -3143,8 +3148,16 @@ void SessionImpl::generateResumeData() | |||||||
| void SessionImpl::saveResumeData() | void SessionImpl::saveResumeData() | ||||||
| { | { | ||||||
|     for (const TorrentImpl *torrent : asConst(m_torrents)) |     for (const TorrentImpl *torrent : asConst(m_torrents)) | ||||||
|         torrent->nativeHandle().save_resume_data(lt::torrent_handle::only_if_modified); |     { | ||||||
|     m_numResumeData += m_torrents.size(); |         // When the session is terminated due to unrecoverable error | ||||||
|  |         // some of the torrent handles can be corrupted | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             torrent->nativeHandle().save_resume_data(lt::torrent_handle::only_if_modified); | ||||||
|  |             ++m_numResumeData; | ||||||
|  |         } | ||||||
|  |         catch (const std::exception &) {} | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // clear queued storage move jobs except the current ongoing one |     // clear queued storage move jobs except the current ongoing one | ||||||
|     if (m_moveStorageQueue.size() > 1) |     if (m_moveStorageQueue.size() > 1) | ||||||
| @@ -5547,10 +5560,13 @@ void SessionImpl::handleAlert(const lt::alert *a) | |||||||
|             dispatchTorrentAlert(static_cast<const lt::torrent_alert *>(a)); |             dispatchTorrentAlert(static_cast<const lt::torrent_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::state_update_alert::alert_type: |         case lt::state_update_alert::alert_type: | ||||||
|             handleStateUpdateAlert(static_cast<const lt::state_update_alert*>(a)); |             handleStateUpdateAlert(static_cast<const lt::state_update_alert *>(a)); | ||||||
|  |             break; | ||||||
|  |         case lt::session_error_alert::alert_type: | ||||||
|  |             handleSessionErrorAlert(static_cast<const lt::session_error_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::session_stats_alert::alert_type: |         case lt::session_stats_alert::alert_type: | ||||||
|             handleSessionStatsAlert(static_cast<const lt::session_stats_alert*>(a)); |             handleSessionStatsAlert(static_cast<const lt::session_stats_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::tracker_announce_alert::alert_type: |         case lt::tracker_announce_alert::alert_type: | ||||||
|         case lt::tracker_error_alert::alert_type: |         case lt::tracker_error_alert::alert_type: | ||||||
| @@ -5559,56 +5575,59 @@ void SessionImpl::handleAlert(const lt::alert *a) | |||||||
|             handleTrackerAlert(static_cast<const lt::tracker_alert *>(a)); |             handleTrackerAlert(static_cast<const lt::tracker_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::file_error_alert::alert_type: |         case lt::file_error_alert::alert_type: | ||||||
|             handleFileErrorAlert(static_cast<const lt::file_error_alert*>(a)); |             handleFileErrorAlert(static_cast<const lt::file_error_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::add_torrent_alert::alert_type: |         case lt::add_torrent_alert::alert_type: | ||||||
|             // handled separately |             // handled separately | ||||||
|             break; |             break; | ||||||
|         case lt::torrent_removed_alert::alert_type: |         case lt::torrent_removed_alert::alert_type: | ||||||
|             handleTorrentRemovedAlert(static_cast<const lt::torrent_removed_alert*>(a)); |             handleTorrentRemovedAlert(static_cast<const lt::torrent_removed_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::torrent_deleted_alert::alert_type: |         case lt::torrent_deleted_alert::alert_type: | ||||||
|             handleTorrentDeletedAlert(static_cast<const lt::torrent_deleted_alert*>(a)); |             handleTorrentDeletedAlert(static_cast<const lt::torrent_deleted_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::torrent_delete_failed_alert::alert_type: |         case lt::torrent_delete_failed_alert::alert_type: | ||||||
|             handleTorrentDeleteFailedAlert(static_cast<const lt::torrent_delete_failed_alert*>(a)); |             handleTorrentDeleteFailedAlert(static_cast<const lt::torrent_delete_failed_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::portmap_error_alert::alert_type: |         case lt::portmap_error_alert::alert_type: | ||||||
|             handlePortmapWarningAlert(static_cast<const lt::portmap_error_alert*>(a)); |             handlePortmapWarningAlert(static_cast<const lt::portmap_error_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::portmap_alert::alert_type: |         case lt::portmap_alert::alert_type: | ||||||
|             handlePortmapAlert(static_cast<const lt::portmap_alert*>(a)); |             handlePortmapAlert(static_cast<const lt::portmap_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::peer_blocked_alert::alert_type: |         case lt::peer_blocked_alert::alert_type: | ||||||
|             handlePeerBlockedAlert(static_cast<const lt::peer_blocked_alert*>(a)); |             handlePeerBlockedAlert(static_cast<const lt::peer_blocked_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::peer_ban_alert::alert_type: |         case lt::peer_ban_alert::alert_type: | ||||||
|             handlePeerBanAlert(static_cast<const lt::peer_ban_alert*>(a)); |             handlePeerBanAlert(static_cast<const lt::peer_ban_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::url_seed_alert::alert_type: |         case lt::url_seed_alert::alert_type: | ||||||
|             handleUrlSeedAlert(static_cast<const lt::url_seed_alert*>(a)); |             handleUrlSeedAlert(static_cast<const lt::url_seed_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::listen_succeeded_alert::alert_type: |         case lt::listen_succeeded_alert::alert_type: | ||||||
|             handleListenSucceededAlert(static_cast<const lt::listen_succeeded_alert*>(a)); |             handleListenSucceededAlert(static_cast<const lt::listen_succeeded_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::listen_failed_alert::alert_type: |         case lt::listen_failed_alert::alert_type: | ||||||
|             handleListenFailedAlert(static_cast<const lt::listen_failed_alert*>(a)); |             handleListenFailedAlert(static_cast<const lt::listen_failed_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::external_ip_alert::alert_type: |         case lt::external_ip_alert::alert_type: | ||||||
|             handleExternalIPAlert(static_cast<const lt::external_ip_alert*>(a)); |             handleExternalIPAlert(static_cast<const lt::external_ip_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::alerts_dropped_alert::alert_type: |         case lt::alerts_dropped_alert::alert_type: | ||||||
|             handleAlertsDroppedAlert(static_cast<const lt::alerts_dropped_alert *>(a)); |             handleAlertsDroppedAlert(static_cast<const lt::alerts_dropped_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::storage_moved_alert::alert_type: |         case lt::storage_moved_alert::alert_type: | ||||||
|             handleStorageMovedAlert(static_cast<const lt::storage_moved_alert*>(a)); |             handleStorageMovedAlert(static_cast<const lt::storage_moved_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::storage_moved_failed_alert::alert_type: |         case lt::storage_moved_failed_alert::alert_type: | ||||||
|             handleStorageMovedFailedAlert(static_cast<const lt::storage_moved_failed_alert*>(a)); |             handleStorageMovedFailedAlert(static_cast<const lt::storage_moved_failed_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|         case lt::socks5_alert::alert_type: |         case lt::socks5_alert::alert_type: | ||||||
|             handleSocks5Alert(static_cast<const lt::socks5_alert *>(a)); |             handleSocks5Alert(static_cast<const lt::socks5_alert *>(a)); | ||||||
|             break; |             break; | ||||||
|  |         case lt::i2p_alert::alert_type: | ||||||
|  |             handleI2PAlert(static_cast<const lt::i2p_alert *>(a)); | ||||||
|  |             break; | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #ifdef QBT_USES_LIBTORRENT2 | ||||||
|         case lt::torrent_conflict_alert::alert_type: |         case lt::torrent_conflict_alert::alert_type: | ||||||
|             handleTorrentConflictAlert(static_cast<const lt::torrent_conflict_alert *>(a)); |             handleTorrentConflictAlert(static_cast<const lt::torrent_conflict_alert *>(a)); | ||||||
| @@ -5915,6 +5934,12 @@ void SessionImpl::handleExternalIPAlert(const lt::external_ip_alert *p) | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SessionImpl::handleSessionErrorAlert(const lt::session_error_alert *p) const | ||||||
|  | { | ||||||
|  |     LogMsg(tr("BitTorrent session encountered a serious error. Reason: \"%1\"") | ||||||
|  |         .arg(QString::fromStdString(p->message())), Log::CRITICAL); | ||||||
|  | } | ||||||
|  |  | ||||||
| void SessionImpl::handleSessionStatsAlert(const lt::session_stats_alert *p) | void SessionImpl::handleSessionStatsAlert(const lt::session_stats_alert *p) | ||||||
| { | { | ||||||
|     if (m_refreshEnqueued) |     if (m_refreshEnqueued) | ||||||
| @@ -6109,6 +6134,15 @@ void SessionImpl::handleSocks5Alert(const lt::socks5_alert *p) const | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void SessionImpl::handleI2PAlert(const lt::i2p_alert *p) const | ||||||
|  | { | ||||||
|  |     if (p->error) | ||||||
|  |     { | ||||||
|  |         LogMsg(tr("I2P error. Message: \"%1\".") | ||||||
|  |             .arg(QString::fromStdString(p->message())), Log::WARNING); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void SessionImpl::handleTrackerAlert(const lt::tracker_alert *a) | void SessionImpl::handleTrackerAlert(const lt::tracker_alert *a) | ||||||
| { | { | ||||||
|     TorrentImpl *torrent = m_torrents.value(a->handle.info_hash()); |     TorrentImpl *torrent = m_torrents.value(a->handle.info_hash()); | ||||||
|   | |||||||
| @@ -564,11 +564,13 @@ namespace BitTorrent | |||||||
|         void handleListenSucceededAlert(const lt::listen_succeeded_alert *p); |         void handleListenSucceededAlert(const lt::listen_succeeded_alert *p); | ||||||
|         void handleListenFailedAlert(const lt::listen_failed_alert *p); |         void handleListenFailedAlert(const lt::listen_failed_alert *p); | ||||||
|         void handleExternalIPAlert(const lt::external_ip_alert *p); |         void handleExternalIPAlert(const lt::external_ip_alert *p); | ||||||
|  |         void handleSessionErrorAlert(const lt::session_error_alert *p) const; | ||||||
|         void handleSessionStatsAlert(const lt::session_stats_alert *p); |         void handleSessionStatsAlert(const lt::session_stats_alert *p); | ||||||
|         void handleAlertsDroppedAlert(const lt::alerts_dropped_alert *p) const; |         void handleAlertsDroppedAlert(const lt::alerts_dropped_alert *p) const; | ||||||
|         void handleStorageMovedAlert(const lt::storage_moved_alert *p); |         void handleStorageMovedAlert(const lt::storage_moved_alert *p); | ||||||
|         void handleStorageMovedFailedAlert(const lt::storage_moved_failed_alert *p); |         void handleStorageMovedFailedAlert(const lt::storage_moved_failed_alert *p); | ||||||
|         void handleSocks5Alert(const lt::socks5_alert *p) const; |         void handleSocks5Alert(const lt::socks5_alert *p) const; | ||||||
|  |         void handleI2PAlert(const lt::i2p_alert *p) const; | ||||||
|         void handleTrackerAlert(const lt::tracker_alert *a); |         void handleTrackerAlert(const lt::tracker_alert *a); | ||||||
| #ifdef QBT_USES_LIBTORRENT2 | #ifdef QBT_USES_LIBTORRENT2 | ||||||
|         void handleTorrentConflictAlert(const lt::torrent_conflict_alert *a); |         void handleTorrentConflictAlert(const lt::torrent_conflict_alert *a); | ||||||
|   | |||||||
| @@ -51,6 +51,7 @@ | |||||||
| #include <QStringList> | #include <QStringList> | ||||||
| #include <QUrl> | #include <QUrl> | ||||||
|  |  | ||||||
|  | #include "base/exceptions.h" | ||||||
| #include "base/global.h" | #include "base/global.h" | ||||||
| #include "base/logger.h" | #include "base/logger.h" | ||||||
| #include "base/preferences.h" | #include "base/preferences.h" | ||||||
| @@ -599,6 +600,9 @@ void TorrentImpl::replaceTrackers(QVector<TrackerEntry> trackers) | |||||||
| { | { | ||||||
|     // TODO: use std::erase_if() in C++20 |     // TODO: use std::erase_if() in C++20 | ||||||
|     trackers.erase(std::remove_if(trackers.begin(), trackers.end(), [](const TrackerEntry &entry) { return entry.url.isEmpty(); }), trackers.end()); |     trackers.erase(std::remove_if(trackers.begin(), trackers.end(), [](const TrackerEntry &entry) { return entry.url.isEmpty(); }), trackers.end()); | ||||||
|  |     // Filter out duplicate trackers | ||||||
|  |     const auto uniqueTrackers = QSet<TrackerEntry>(trackers.cbegin(), trackers.cend()); | ||||||
|  |     trackers = QVector<TrackerEntry>(uniqueTrackers.cbegin(), uniqueTrackers.cend()); | ||||||
|     std::sort(trackers.begin(), trackers.end() |     std::sort(trackers.begin(), trackers.end() | ||||||
|         , [](const TrackerEntry &lhs, const TrackerEntry &rhs) { return lhs.tier < rhs.tier; }); |         , [](const TrackerEntry &lhs, const TrackerEntry &rhs) { return lhs.tier < rhs.tier; }); | ||||||
|  |  | ||||||
| @@ -1602,7 +1606,8 @@ void TorrentImpl::applyFirstLastPiecePriority(const bool enabled) | |||||||
|  |  | ||||||
| void TorrentImpl::fileSearchFinished(const Path &savePath, const PathList &fileNames) | void TorrentImpl::fileSearchFinished(const Path &savePath, const PathList &fileNames) | ||||||
| { | { | ||||||
|     endReceivedMetadataHandling(savePath, fileNames); |     if (m_maintenanceJob == MaintenanceJob::HandleMetadata) | ||||||
|  |         endReceivedMetadataHandling(savePath, fileNames); | ||||||
| } | } | ||||||
|  |  | ||||||
| TrackerEntry TorrentImpl::updateTrackerEntry(const lt::announce_entry &announceEntry, const QMap<TrackerEntry::Endpoint, int> &updateInfo) | TrackerEntry TorrentImpl::updateTrackerEntry(const lt::announce_entry &announceEntry, const QMap<TrackerEntry::Endpoint, int> &updateInfo) | ||||||
| @@ -1635,7 +1640,13 @@ std::shared_ptr<const libtorrent::torrent_info> TorrentImpl::nativeTorrentInfo() | |||||||
|  |  | ||||||
| void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathList &fileNames) | void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathList &fileNames) | ||||||
| { | { | ||||||
|  |     Q_ASSERT(m_maintenanceJob == MaintenanceJob::HandleMetadata); | ||||||
|  |     if (Q_UNLIKELY(m_maintenanceJob != MaintenanceJob::HandleMetadata)) | ||||||
|  |         return; | ||||||
|  |  | ||||||
|     Q_ASSERT(m_filePaths.isEmpty()); |     Q_ASSERT(m_filePaths.isEmpty()); | ||||||
|  |     if (Q_UNLIKELY(!m_filePaths.isEmpty())) | ||||||
|  |         m_filePaths.clear(); | ||||||
|  |  | ||||||
|     lt::add_torrent_params &p = m_ltAddTorrentParams; |     lt::add_torrent_params &p = m_ltAddTorrentParams; | ||||||
|  |  | ||||||
| @@ -1644,7 +1655,7 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi | |||||||
|     m_filePriorities.reserve(filesCount()); |     m_filePriorities.reserve(filesCount()); | ||||||
|     const auto nativeIndexes = m_torrentInfo.nativeIndexes(); |     const auto nativeIndexes = m_torrentInfo.nativeIndexes(); | ||||||
|     p.file_priorities = resized(p.file_priorities, metadata->files().num_files() |     p.file_priorities = resized(p.file_priorities, metadata->files().num_files() | ||||||
|                                 , LT::toNative(p.file_priorities.empty() ? DownloadPriority::Normal : DownloadPriority::Ignored)); |             , LT::toNative(p.file_priorities.empty() ? DownloadPriority::Normal : DownloadPriority::Ignored)); | ||||||
|  |  | ||||||
|     m_completedFiles.fill(static_cast<bool>(p.flags & lt::torrent_flags::seed_mode), filesCount()); |     m_completedFiles.fill(static_cast<bool>(p.flags & lt::torrent_flags::seed_mode), filesCount()); | ||||||
|     m_filesProgress.resize(filesCount()); |     m_filesProgress.resize(filesCount()); | ||||||
| @@ -1694,6 +1705,7 @@ void TorrentImpl::endReceivedMetadataHandling(const Path &savePath, const PathLi | |||||||
| } | } | ||||||
|  |  | ||||||
| void TorrentImpl::reload() | void TorrentImpl::reload() | ||||||
|  | try | ||||||
| { | { | ||||||
|     m_completedFiles.fill(false); |     m_completedFiles.fill(false); | ||||||
|     m_filesProgress.fill(0); |     m_filesProgress.fill(0); | ||||||
| @@ -1736,6 +1748,11 @@ void TorrentImpl::reload() | |||||||
|  |  | ||||||
|     updateState(); |     updateState(); | ||||||
| } | } | ||||||
|  | catch (const lt::system_error &err) | ||||||
|  | { | ||||||
|  |     throw RuntimeError(tr("Failed to reload torrent. Torrent: %1. Reason: %2") | ||||||
|  |             .arg(id().toString(), QString::fromLocal8Bit(err.what()))); | ||||||
|  | } | ||||||
|  |  | ||||||
| void TorrentImpl::pause() | void TorrentImpl::pause() | ||||||
| { | { | ||||||
| @@ -1794,6 +1811,7 @@ void TorrentImpl::moveStorage(const Path &newPath, const MoveStorageContext cont | |||||||
| { | { | ||||||
|     if (!hasMetadata()) |     if (!hasMetadata()) | ||||||
|     { |     { | ||||||
|  |         m_savePath = newPath; | ||||||
|         m_session->handleTorrentSavePathChanged(this); |         m_session->handleTorrentSavePathChanged(this); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -36,6 +36,7 @@ | |||||||
| class QString; | class QString; | ||||||
|  |  | ||||||
| class Path; | class Path; | ||||||
|  | class WebUI; | ||||||
| struct QBtCommandLineParameters; | struct QBtCommandLineParameters; | ||||||
|  |  | ||||||
| #ifdef Q_OS_WIN | #ifdef Q_OS_WIN | ||||||
| @@ -83,4 +84,8 @@ public: | |||||||
|     virtual MemoryPriority processMemoryPriority() const = 0; |     virtual MemoryPriority processMemoryPriority() const = 0; | ||||||
|     virtual void setProcessMemoryPriority(MemoryPriority priority) = 0; |     virtual void setProcessMemoryPriority(MemoryPriority priority) = 0; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #ifndef DISABLE_WEBUI | ||||||
|  |     virtual WebUI *webUI() const = 0; | ||||||
|  | #endif | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -62,11 +62,10 @@ public: | |||||||
|     { |     { | ||||||
|         const QDateTime now = QDateTime::currentDateTime(); |         const QDateTime now = QDateTime::currentDateTime(); | ||||||
|         QList<QNetworkCookie> cookies = Preferences::instance()->getNetworkCookies(); |         QList<QNetworkCookie> cookies = Preferences::instance()->getNetworkCookies(); | ||||||
|         for (const QNetworkCookie &cookie : asConst(Preferences::instance()->getNetworkCookies())) |         cookies.erase(std::remove_if(cookies.begin(), cookies.end(), [&now](const QNetworkCookie &cookie) | ||||||
|         { |         { | ||||||
|             if (cookie.isSessionCookie() || (cookie.expirationDate() <= now)) |             return cookie.isSessionCookie() || (cookie.expirationDate() <= now); | ||||||
|                 cookies.removeAll(cookie); |         }), cookies.end()); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         setAllCookies(cookies); |         setAllCookies(cookies); | ||||||
|     } |     } | ||||||
| @@ -75,11 +74,10 @@ public: | |||||||
|     { |     { | ||||||
|         const QDateTime now = QDateTime::currentDateTime(); |         const QDateTime now = QDateTime::currentDateTime(); | ||||||
|         QList<QNetworkCookie> cookies = allCookies(); |         QList<QNetworkCookie> cookies = allCookies(); | ||||||
|         for (const QNetworkCookie &cookie : asConst(allCookies())) |         cookies.erase(std::remove_if(cookies.begin(), cookies.end(), [&now](const QNetworkCookie &cookie) | ||||||
|         { |         { | ||||||
|             if (cookie.isSessionCookie() || (cookie.expirationDate() <= now)) |             return cookie.isSessionCookie() || (cookie.expirationDate() <= now); | ||||||
|                 cookies.removeAll(cookie); |         }), cookies.end()); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         Preferences::instance()->setNetworkCookies(cookies); |         Preferences::instance()->setNetworkCookies(cookies); | ||||||
|     } |     } | ||||||
| @@ -91,11 +89,10 @@ public: | |||||||
|     { |     { | ||||||
|         const QDateTime now = QDateTime::currentDateTime(); |         const QDateTime now = QDateTime::currentDateTime(); | ||||||
|         QList<QNetworkCookie> cookies = QNetworkCookieJar::cookiesForUrl(url); |         QList<QNetworkCookie> cookies = QNetworkCookieJar::cookiesForUrl(url); | ||||||
|         for (const QNetworkCookie &cookie : asConst(QNetworkCookieJar::cookiesForUrl(url))) |         cookies.erase(std::remove_if(cookies.begin(), cookies.end(), [&now](const QNetworkCookie &cookie) | ||||||
|         { |         { | ||||||
|             if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now)) |             return !cookie.isSessionCookie() && (cookie.expirationDate() <= now); | ||||||
|                 cookies.removeAll(cookie); |         }), cookies.end()); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return cookies; |         return cookies; | ||||||
|     } |     } | ||||||
| @@ -104,11 +101,10 @@ public: | |||||||
|     { |     { | ||||||
|         const QDateTime now = QDateTime::currentDateTime(); |         const QDateTime now = QDateTime::currentDateTime(); | ||||||
|         QList<QNetworkCookie> cookies = cookieList; |         QList<QNetworkCookie> cookies = cookieList; | ||||||
|         for (const QNetworkCookie &cookie : cookieList) |         cookies.erase(std::remove_if(cookies.begin(), cookies.end(), [&now](const QNetworkCookie &cookie) | ||||||
|         { |         { | ||||||
|             if (!cookie.isSessionCookie() && (cookie.expirationDate() <= now)) |             return !cookie.isSessionCookie() && (cookie.expirationDate() <= now); | ||||||
|                 cookies.removeAll(cookie); |         }), cookies.end()); | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return QNetworkCookieJar::setCookiesFromUrl(cookies, url); |         return QNetworkCookieJar::setCookiesFromUrl(cookies, url); | ||||||
|     } |     } | ||||||
|   | |||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -169,26 +169,26 @@ public: | |||||||
|     void setSearchEnabled(bool enabled); |     void setSearchEnabled(bool enabled); | ||||||
|  |  | ||||||
|     // HTTP Server |     // HTTP Server | ||||||
|     bool isWebUiEnabled() const; |     bool isWebUIEnabled() const; | ||||||
|     void setWebUiEnabled(bool enabled); |     void setWebUIEnabled(bool enabled); | ||||||
|     QString getServerDomains() const; |     QString getServerDomains() const; | ||||||
|     void setServerDomains(const QString &str); |     void setServerDomains(const QString &str); | ||||||
|     QString getWebUiAddress() const; |     QString getWebUIAddress() const; | ||||||
|     void setWebUiAddress(const QString &addr); |     void setWebUIAddress(const QString &addr); | ||||||
|     quint16 getWebUiPort() const; |     quint16 getWebUIPort() const; | ||||||
|     void setWebUiPort(quint16 port); |     void setWebUIPort(quint16 port); | ||||||
|     bool useUPnPForWebUIPort() const; |     bool useUPnPForWebUIPort() const; | ||||||
|     void setUPnPForWebUIPort(bool enabled); |     void setUPnPForWebUIPort(bool enabled); | ||||||
|  |  | ||||||
|     // Authentication |     // Authentication | ||||||
|     bool isWebUiLocalAuthEnabled() const; |     bool isWebUILocalAuthEnabled() const; | ||||||
|     void setWebUiLocalAuthEnabled(bool enabled); |     void setWebUILocalAuthEnabled(bool enabled); | ||||||
|     bool isWebUiAuthSubnetWhitelistEnabled() const; |     bool isWebUIAuthSubnetWhitelistEnabled() const; | ||||||
|     void setWebUiAuthSubnetWhitelistEnabled(bool enabled); |     void setWebUIAuthSubnetWhitelistEnabled(bool enabled); | ||||||
|     QVector<Utils::Net::Subnet> getWebUiAuthSubnetWhitelist() const; |     QVector<Utils::Net::Subnet> getWebUIAuthSubnetWhitelist() const; | ||||||
|     void setWebUiAuthSubnetWhitelist(QStringList subnets); |     void setWebUIAuthSubnetWhitelist(QStringList subnets); | ||||||
|     QString getWebUiUsername() const; |     QString getWebUIUsername() const; | ||||||
|     void setWebUiUsername(const QString &username); |     void setWebUIUsername(const QString &username); | ||||||
|     QByteArray getWebUIPassword() const; |     QByteArray getWebUIPassword() const; | ||||||
|     void setWebUIPassword(const QByteArray &password); |     void setWebUIPassword(const QByteArray &password); | ||||||
|     int getWebUIMaxAuthFailCount() const; |     int getWebUIMaxAuthFailCount() const; | ||||||
| @@ -201,26 +201,26 @@ public: | |||||||
|     void setWebAPISessionCookieName(const QString &cookieName); |     void setWebAPISessionCookieName(const QString &cookieName); | ||||||
|  |  | ||||||
|     // WebUI security |     // WebUI security | ||||||
|     bool isWebUiClickjackingProtectionEnabled() const; |     bool isWebUIClickjackingProtectionEnabled() const; | ||||||
|     void setWebUiClickjackingProtectionEnabled(bool enabled); |     void setWebUIClickjackingProtectionEnabled(bool enabled); | ||||||
|     bool isWebUiCSRFProtectionEnabled() const; |     bool isWebUICSRFProtectionEnabled() const; | ||||||
|     void setWebUiCSRFProtectionEnabled(bool enabled); |     void setWebUICSRFProtectionEnabled(bool enabled); | ||||||
|     bool isWebUiSecureCookieEnabled () const; |     bool isWebUISecureCookieEnabled () const; | ||||||
|     void setWebUiSecureCookieEnabled(bool enabled); |     void setWebUISecureCookieEnabled(bool enabled); | ||||||
|     bool isWebUIHostHeaderValidationEnabled() const; |     bool isWebUIHostHeaderValidationEnabled() const; | ||||||
|     void setWebUIHostHeaderValidationEnabled(bool enabled); |     void setWebUIHostHeaderValidationEnabled(bool enabled); | ||||||
|  |  | ||||||
|     // HTTPS |     // HTTPS | ||||||
|     bool isWebUiHttpsEnabled() const; |     bool isWebUIHttpsEnabled() const; | ||||||
|     void setWebUiHttpsEnabled(bool enabled); |     void setWebUIHttpsEnabled(bool enabled); | ||||||
|     Path getWebUIHttpsCertificatePath() const; |     Path getWebUIHttpsCertificatePath() const; | ||||||
|     void setWebUIHttpsCertificatePath(const Path &path); |     void setWebUIHttpsCertificatePath(const Path &path); | ||||||
|     Path getWebUIHttpsKeyPath() const; |     Path getWebUIHttpsKeyPath() const; | ||||||
|     void setWebUIHttpsKeyPath(const Path &path); |     void setWebUIHttpsKeyPath(const Path &path); | ||||||
|     bool isAltWebUiEnabled() const; |     bool isAltWebUIEnabled() const; | ||||||
|     void setAltWebUiEnabled(bool enabled); |     void setAltWebUIEnabled(bool enabled); | ||||||
|     Path getWebUiRootFolder() const; |     Path getWebUIRootFolder() const; | ||||||
|     void setWebUiRootFolder(const Path &path); |     void setWebUIRootFolder(const Path &path); | ||||||
|  |  | ||||||
|     // WebUI custom HTTP headers |     // WebUI custom HTTP headers | ||||||
|     bool isWebUICustomHTTPHeadersEnabled() const; |     bool isWebUICustomHTTPHeadersEnabled() const; | ||||||
| @@ -290,17 +290,8 @@ public: | |||||||
| #ifdef Q_OS_WIN | #ifdef Q_OS_WIN | ||||||
|     bool neverCheckFileAssoc() const; |     bool neverCheckFileAssoc() const; | ||||||
|     void setNeverCheckFileAssoc(bool check = true); |     void setNeverCheckFileAssoc(bool check = true); | ||||||
|     static bool isTorrentFileAssocSet(); |  | ||||||
|     static void setTorrentFileAssoc(bool set); |  | ||||||
|     static bool isMagnetLinkAssocSet(); |  | ||||||
|     static void setMagnetLinkAssoc(bool set); |  | ||||||
| #endif |  | ||||||
| #ifdef Q_OS_MACOS |  | ||||||
|     static bool isTorrentFileAssocSet(); |  | ||||||
|     static void setTorrentFileAssoc(); |  | ||||||
|     static bool isMagnetLinkAssocSet(); |  | ||||||
|     static void setMagnetLinkAssoc(); |  | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     int getTrackerPort() const; |     int getTrackerPort() const; | ||||||
|     void setTrackerPort(int port); |     void setTrackerPort(int port); | ||||||
|     bool isTrackerPortForwardingEnabled() const; |     bool isTrackerPortForwardingEnabled() const; | ||||||
|   | |||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user