Compare commits

...

24 Commits

Author SHA1 Message Date
Mike Tzou
d8cb552804 Merge pull request #12159 from thalieht/backportflags
Backport #12014: Use IP geolocation database by DB-IP instead of MaxMind
2020-03-13 18:38:35 +08:00
sledgehammer999
304e831b0c Use IP geolocation database by DB-IP instead of MaxMind 2020-03-12 01:05:44 +02:00
Mike Tzou
f16d219646 Merge pull request #11778 from FranciscoPombal/v4_1_x
WebUI: backport #11635 and #11756 to v4_1_x
2019-12-30 10:13:35 +08:00
FranciscoPombal
22b0160eaa WebUI: fix populating statistics window
Closes #11665
2019-12-29 14:19:57 +00:00
FranciscoPombal
d4f49c3666 WebUI: Prevent excessive sync requests
Don't sync main data if a request to do so is already in progress.

This prevents piling up of requests and bogging down slow/busy machines, since the current implementation of `/api/v2/sync/maindata` is very computationally intensive, especially with lots of torrents.

Everything gets updated on the next scheduled request anyway (via the timeout mechanism).
2019-12-29 14:19:27 +00:00
Mike Tzou
0b055d8fef Merge pull request #11472 from thalieht/backport_pausechecking
Backport
2019-11-19 12:05:31 +08:00
thalieht
21595fca9c Reallow to force recheck torrents that aren't fully started 2019-11-18 16:02:40 +02:00
thalieht
64ac48ee11 Reallow to pause checking torrents 2019-11-09 14:08:47 +02:00
Mike Tzou
5d98721593 Merge pull request #11437 from Chocobo1/backport
Fix integer narrowing on x86 (backport)
2019-11-02 11:58:50 +08:00
Chocobo1
598159552e Fix integer narrowing on x86
The f_type is an alias to `int` on 32-bit system and the switch cases
uses `unsigned int`.

Closes #11427.
2019-11-01 10:49:43 +08:00
sledgehammer999
eea38e7c9e Bump to 4.1.9.1 2019-10-31 22:12:08 +02:00
sledgehammer999
5c933c9734 Update Changelog 2019-10-31 22:05:05 +02:00
Mike Tzou
102b7fa78e Merge pull request #11417 from Chocobo1/dpi_v41x
Fix screen scaling factor calculation (backport to v4_1_x)
2019-10-29 15:56:11 +08:00
Chocobo1
b5ee908f6c Fix screen scaling factor calculation
For some users on Windows the physicalDotsPerInch() could return values
that are smaller than the normal 96 DPI which leads to big dialog sizes
taking the entire screen.
So we need to ensure it is at least 96 DPI.
Closes #11405, #11407.
2019-10-29 10:00:45 +08:00
sledgehammer999
7825d8627f Bump to 4.1.9 2019-10-27 17:26:03 +02:00
sledgehammer999
b798c591e7 Update Changelog 2019-10-27 17:13:26 +02:00
Chocobo1
9e7d21d7aa Update m4 scripts 2019-10-27 17:11:19 +02:00
Chocobo1
38a15b27f0 Regenerate build-aux scripts
It's been a while since the last update (26bf838a0b)
and there is a lot of changes in upstream.
2019-10-27 17:05:37 +02:00
sledgehammer999
cb31684a66 Merge pull request #11309 from sledgehammer999/webui_version
Bump Web API version
2019-10-20 23:07:49 +03:00
Mike Tzou
850cde19f7 Merge pull request #11328 from Chocobo1/backport
Use screen real physical DPI on Windows (backport)
2019-10-05 10:02:07 +08:00
Chocobo1
fc5b3b4f70 Use screen real physical DPI on Windows
Previously was using a hardcoded value which might lead to issues like #11234.
2019-10-04 12:05:13 +08:00
Mike Tzou
73fd4d83af Merge pull request #11319 from Chocobo1/backport
Preserve relative order when moving to top/bottom in queue (backport)
2019-10-04 12:01:33 +08:00
Chocobo1
811b525b1d Preserve relative order when moving to top/bottom in queue 2019-10-03 11:23:28 +08:00
sledgehammer999
0f8def9a49 Bump Web API version
Closes #11304
2019-10-01 17:31:55 +03:00
27 changed files with 2239 additions and 1940 deletions

View File

@@ -1,3 +1,11 @@
* Thu Oct 31 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.1.9.1
- WINDOWS: Fix a problem with bigger dialogs due to wrong DPI reported by the system (Chocobo1)
* Sun Oct 27 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.1.9
- BUGFIX: Preserve relative order when moving to top/bottom in queue (Chocobo1)
- WINDOWS: Use real physical screen DPI (Chocobo1)
- WEBUI: Bump Web API version
* Mon Sep 23 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.1.8 * Mon Sep 23 2019 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v4.1.8
- BUGFIX: Fix filename validation on non-Windows OS (Chocobo1) - BUGFIX: Fix filename validation on non-Windows OS (Chocobo1)
- BUGFIX: ScanFolders/FileSystemWatcher now detect magnet files with case insensitivity in filename (Chocobo1) - BUGFIX: ScanFolders/FileSystemWatcher now detect magnet files with case insensitivity in filename (Chocobo1)

View File

@@ -13,8 +13,7 @@ It aims to be a good alternative to all other bittorrent clients
out there. qBittorrent is fast, stable and provides unicode out there. qBittorrent is fast, stable and provides unicode
support as well as many features. support as well as many features.
This product includes GeoLite data created by MaxMind, available from The free [IP to Country Lite database](https://db-ip.com/db/download/ip-to-country-lite) by [DB-IP](https://db-ip.com/) is used for resolving the countries of peers. The database is licensed under the [Creative Commons Attribution 4.0 International License](https://creativecommons.org/licenses/by/4.0/).
https://www.maxmind.com/
### Installation: ### Installation:
For installation, follow the instructions from INSTALL file, but simple: For installation, follow the instructions from INSTALL file, but simple:

View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Wrapper for compilers which do not understand '-c -o'. # Wrapper for compilers which do not understand '-c -o'.
scriptversion=2012-10-14.11; # UTC scriptversion=2018-03-07.03; # UTC
# Copyright (C) 1999-2014 Free Software Foundation, Inc. # Copyright (C) 1999-2018 Free Software Foundation, Inc.
# Written by Tom Tromey <tromey@cygnus.com>. # Written by Tom Tromey <tromey@cygnus.com>.
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@@ -17,7 +17,7 @@ scriptversion=2012-10-14.11; # UTC
# GNU General Public License for more details. # GNU General Public License for more details.
# #
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you # As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a # distribute this file as part of a program that contains a
@@ -255,7 +255,8 @@ EOF
echo "compile $scriptversion" echo "compile $scriptversion"
exit $? exit $?
;; ;;
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \
icl | *[/\\]icl | icl.exe | *[/\\]icl.exe )
func_cl_wrapper "$@" # Doesn't return... func_cl_wrapper "$@" # Doesn't return...
;; ;;
esac esac
@@ -339,9 +340,9 @@ exit $ret
# Local Variables: # Local Variables:
# mode: shell-script # mode: shell-script
# sh-indentation: 2 # sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp) # eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC" # time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:

938
build-aux/config.guess vendored

File diff suppressed because it is too large Load Diff

2780
build-aux/config.sub vendored

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# install - install a program, script, or datafile # install - install a program, script, or datafile
scriptversion=2013-12-25.23; # UTC scriptversion=2018-03-11.20; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was # This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the # later released in X11R6 (xc/config/util/install.sh) with the
@@ -271,15 +271,18 @@ do
fi fi
dst=$dst_arg dst=$dst_arg
# If destination is a directory, append the input filename; won't work # If destination is a directory, append the input filename.
# if double slashes aren't ignored.
if test -d "$dst"; then if test -d "$dst"; then
if test "$is_target_a_directory" = never; then if test "$is_target_a_directory" = never; then
echo "$0: $dst_arg: Is a directory" >&2 echo "$0: $dst_arg: Is a directory" >&2
exit 1 exit 1
fi fi
dstdir=$dst dstdir=$dst
dst=$dstdir/`basename "$src"` dstbase=`basename "$src"`
case $dst in
*/) dst=$dst$dstbase;;
*) dst=$dst/$dstbase;;
esac
dstdir_status=0 dstdir_status=0
else else
dstdir=`dirname "$dst"` dstdir=`dirname "$dst"`
@@ -288,6 +291,11 @@ do
fi fi
fi fi
case $dstdir in
*/) dstdirslash=$dstdir;;
*) dstdirslash=$dstdir/;;
esac
obsolete_mkdir_used=false obsolete_mkdir_used=false
if test $dstdir_status != 0; then if test $dstdir_status != 0; then
@@ -324,34 +332,43 @@ do
# is incompatible with FreeBSD 'install' when (umask & 300) != 0. # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
;; ;;
*) *)
# Note that $RANDOM variable is not portable (e.g. dash); Use it
# here however when possible just to lower collision chance.
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
# Because "mkdir -p" follows existing symlinks and we likely work
# directly in world-writeable /tmp, make sure that the '$tmpdir'
# directory is successfully created first before we actually test
# 'mkdir -p' feature.
if (umask $mkdir_umask && if (umask $mkdir_umask &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 $mkdirprog $mkdir_mode "$tmpdir" &&
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
then then
if test -z "$dir_arg" || { if test -z "$dir_arg" || {
# Check for POSIX incompatibilities with -m. # Check for POSIX incompatibilities with -m.
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
# other-writable bit of parent directory when it shouldn't. # other-writable bit of parent directory when it shouldn't.
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
ls_ld_tmpdir=`ls -ld "$tmpdir"` test_tmpdir="$tmpdir/a"
ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
case $ls_ld_tmpdir in case $ls_ld_tmpdir in
d????-?r-*) different_mode=700;; d????-?r-*) different_mode=700;;
d????-?--*) different_mode=755;; d????-?--*) different_mode=755;;
*) false;; *) false;;
esac && esac &&
$mkdirprog -m$different_mode -p -- "$tmpdir" && { $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
ls_ld_tmpdir_1=`ls -ld "$tmpdir"` ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
} }
} }
then posix_mkdir=: then posix_mkdir=:
fi fi
rmdir "$tmpdir/d" "$tmpdir" rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
else else
# Remove any dirs left behind by ancient mkdir implementations. # Remove any dirs left behind by ancient mkdir implementations.
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
fi fi
trap '' 0;; trap '' 0;;
esac;; esac;;
@@ -427,8 +444,8 @@ do
else else
# Make a couple of temp file names in the proper directory. # Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_ dsttmp=${dstdirslash}_inst.$$_
rmtmp=$dstdir/_rm.$$_ rmtmp=${dstdirslash}_rm.$$_
# Trap to clean up those temp files at exit. # Trap to clean up those temp files at exit.
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
@@ -493,9 +510,9 @@ do
done done
# Local variables: # Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp) # eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC" # time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:

View File

@@ -1,9 +1,9 @@
#! /bin/sh #! /bin/sh
# Common wrapper for a few potentially missing GNU programs. # Common wrapper for a few potentially missing GNU programs.
scriptversion=2013-10-28.13; # UTC scriptversion=2018-03-07.03; # UTC
# Copyright (C) 1996-2014 Free Software Foundation, Inc. # Copyright (C) 1996-2018 Free Software Foundation, Inc.
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996. # Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@@ -17,7 +17,7 @@ scriptversion=2013-10-28.13; # UTC
# GNU General Public License for more details. # GNU General Public License for more details.
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
# As a special exception to the GNU General Public License, if you # As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a # distribute this file as part of a program that contains a
@@ -101,9 +101,9 @@ else
exit $st exit $st
fi fi
perl_URL=http://www.perl.org/ perl_URL=https://www.perl.org/
flex_URL=http://flex.sourceforge.net/ flex_URL=https://github.com/westes/flex
gnu_software_URL=http://www.gnu.org/software gnu_software_URL=https://www.gnu.org/software
program_details () program_details ()
{ {
@@ -207,9 +207,9 @@ give_advice "$1" | sed -e '1s/^/WARNING: /' \
exit $st exit $st
# Local variables: # Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp) # eval: (add-hook 'before-save-hook 'time-stamp)
# time-stamp-start: "scriptversion=" # time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-time-zone: "UTC" # time-stamp-time-zone: "UTC0"
# time-stamp-end: "; # UTC" # time-stamp-end: "; # UTC"
# End: # End:

31
configure vendored
View File

@@ -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.69 for qbittorrent v4.1.8. # Generated by GNU Autoconf 2.69 for qbittorrent v4.1.9.1.
# #
# Report bugs to <bugs.qbittorrent.org>. # Report bugs to <bugs.qbittorrent.org>.
# #
@@ -580,8 +580,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.1.8' PACKAGE_VERSION='v4.1.9.1'
PACKAGE_STRING='qbittorrent v4.1.8' PACKAGE_STRING='qbittorrent v4.1.9.1'
PACKAGE_BUGREPORT='bugs.qbittorrent.org' PACKAGE_BUGREPORT='bugs.qbittorrent.org'
PACKAGE_URL='https://www.qbittorrent.org/' PACKAGE_URL='https://www.qbittorrent.org/'
@@ -1299,7 +1299,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.1.8 to adapt to many kinds of systems. \`configure' configures qbittorrent v4.1.9.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1370,7 +1370,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.1.8:";; short | recursive ) echo "Configuration of qbittorrent v4.1.9.1:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1505,7 +1505,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.1.8 qbittorrent configure v4.1.9.1
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1644,7 +1644,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.1.8, which was It was created by qbittorrent $as_me v4.1.9.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -3822,7 +3822,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='qbittorrent' PACKAGE='qbittorrent'
VERSION='v4.1.8' VERSION='v4.1.9.1'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -4178,7 +4178,6 @@ QBT_CXX="$CXX"
# Define --wth-* and --enable-* arguments # Define --wth-* and --enable-* arguments
# Check whether --with-qtsingleapplication was given. # Check whether --with-qtsingleapplication was given.
if test "${with_qtsingleapplication+set}" = set; then : if test "${with_qtsingleapplication+set}" = set; then :
withval=$with_qtsingleapplication; withval=$with_qtsingleapplication;
@@ -4749,7 +4748,9 @@ fi
case ${host_cpu} in #( case ${host_cpu} in #(
x86_64) : x86_64) :
libsubdirs="lib64 libx32 lib lib64" ;; #( libsubdirs="lib64 libx32 lib lib64" ;; #(
ppc64|s390x|sparc64|aarch64|ppc64le) : mips*64*) :
libsubdirs="lib64 lib32 lib lib64" ;; #(
ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64) :
libsubdirs="lib64 lib lib64" ;; #( libsubdirs="lib64 lib lib64" ;; #(
*) : *) :
libsubdirs="lib" libsubdirs="lib"
@@ -5271,7 +5272,7 @@ fi
fi fi
if test "x$ax_lib" = "x"; then if test "x$ax_lib" = "x"; then
as_fn_error $? "Could not find a version of the library!" "$LINENO" 5 as_fn_error $? "Could not find a version of the Boost::System library!" "$LINENO" 5
fi fi
if test "x$link_system" = "xno"; then if test "x$link_system" = "xno"; then
as_fn_error $? "Could not link against $ax_lib !" "$LINENO" 5 as_fn_error $? "Could not link against $ax_lib !" "$LINENO" 5
@@ -6274,7 +6275,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.1.8, which was This file was extended by qbittorrent $as_me v4.1.9.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -6332,7 +6333,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
qbittorrent config.status v4.1.8 qbittorrent config.status v4.1.9.1
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
@@ -7590,7 +7591,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.1.8, which was This file was extended by qbittorrent $as_me v4.1.9.1, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -7648,7 +7649,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
qbittorrent config.status v4.1.8 qbittorrent config.status v4.1.9.1
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,4 +1,4 @@
AC_INIT([qbittorrent], [v4.1.8], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/]) AC_INIT([qbittorrent], [v4.1.9.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])
AC_PROG_CC AC_PROG_CC

2
dist/mac/Info.plist vendored
View File

@@ -55,7 +55,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>APPL</string> <string>APPL</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>4.1.8</string> <string>4.1.9</string>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>@EXECUTABLE@</string> <string>@EXECUTABLE@</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>

View File

@@ -27,7 +27,7 @@ XPStyle on
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path !define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
; Program specific ; Program specific
!define PROG_VERSION "4.1.8" !define PROG_VERSION "4.1.9.1"
!define MUI_FINISHPAGE_RUN !define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun !define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
@@ -54,7 +54,7 @@ VIAddVersionKey "LegalCopyright" "Copyright ©2006-2019 The qBittorrent project"
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client" VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
VIAddVersionKey "FileVersion" "${PROG_VERSION}" VIAddVersionKey "FileVersion" "${PROG_VERSION}"
VIProductVersion "${PROG_VERSION}.0" VIProductVersion "${PROG_VERSION}.1"
; The default installation directory. It changes depending if we install in the 64bit dir or not. ; The default installation directory. It changes depending if we install in the 64bit dir or not.
; A caveat of this is if a user has installed a 32bit version and then runs the 64bit installer ; A caveat of this is if a user has installed a 32bit version and then runs the 64bit installer

View File

@@ -33,7 +33,7 @@
# and this notice are preserved. This file is offered as-is, without any # and this notice are preserved. This file is offered as-is, without any
# warranty. # warranty.
#serial 42 #serial 47
# example boost program (need to pass version) # example boost program (need to pass version)
m4_define([_AX_BOOST_BASE_PROGRAM], m4_define([_AX_BOOST_BASE_PROGRAM],
@@ -113,7 +113,8 @@ AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
dnl are found, e.g. when only header-only libraries are installed! dnl are found, e.g. when only header-only libraries are installed!
AS_CASE([${host_cpu}], AS_CASE([${host_cpu}],
[x86_64],[libsubdirs="lib64 libx32 lib lib64"], [x86_64],[libsubdirs="lib64 libx32 lib lib64"],
[ppc64|s390x|sparc64|aarch64|ppc64le],[libsubdirs="lib64 lib lib64"], [mips*64*],[libsubdirs="lib64 lib32 lib lib64"],
[ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"],
[libsubdirs="lib"] [libsubdirs="lib"]
) )

View File

@@ -31,7 +31,7 @@
# and this notice are preserved. This file is offered as-is, without any # and this notice are preserved. This file is offered as-is, without any
# warranty. # warranty.
#serial 19 #serial 20
AC_DEFUN([AX_BOOST_SYSTEM], AC_DEFUN([AX_BOOST_SYSTEM],
[ [
@@ -108,7 +108,7 @@ AC_DEFUN([AX_BOOST_SYSTEM],
fi fi
if test "x$ax_lib" = "x"; then if test "x$ax_lib" = "x"; then
AC_MSG_ERROR(Could not find a version of the library!) AC_MSG_ERROR(Could not find a version of the Boost::System library!)
fi fi
if test "x$link_system" = "xno"; then if test "x$link_system" = "xno"; then
AC_MSG_ERROR(Could not link against $ax_lib !) AC_MSG_ERROR(Could not link against $ax_lib !)

View File

@@ -2034,7 +2034,7 @@ void Session::topTorrentsPriority(const QStringList &hashes)
{ {
std::priority_queue<QPair<int, TorrentHandle *>, std::priority_queue<QPair<int, TorrentHandle *>,
std::vector<QPair<int, TorrentHandle *>>, std::vector<QPair<int, TorrentHandle *>>,
std::greater<QPair<int, TorrentHandle *>>> torrentQueue; std::less<QPair<int, TorrentHandle *>>> torrentQueue;
// Sort torrents by priority // Sort torrents by priority
for (const InfoHash infoHash : hashes) { for (const InfoHash infoHash : hashes) {
@@ -2043,7 +2043,7 @@ void Session::topTorrentsPriority(const QStringList &hashes)
torrentQueue.push(qMakePair(torrent->queuePosition(), torrent)); torrentQueue.push(qMakePair(torrent->queuePosition(), torrent));
} }
// Top torrents priority (starting with the ones with highest priority) // Top torrents priority (starting with the ones with lowest priority)
while (!torrentQueue.empty()) { while (!torrentQueue.empty()) {
TorrentHandle *const torrent = torrentQueue.top().second; TorrentHandle *const torrent = torrentQueue.top().second;
torrentQueuePositionTop(torrent->nativeHandle()); torrentQueuePositionTop(torrent->nativeHandle());
@@ -2057,7 +2057,7 @@ void Session::bottomTorrentsPriority(const QStringList &hashes)
{ {
std::priority_queue<QPair<int, TorrentHandle *>, std::priority_queue<QPair<int, TorrentHandle *>,
std::vector<QPair<int, TorrentHandle *>>, std::vector<QPair<int, TorrentHandle *>>,
std::less<QPair<int, TorrentHandle *>>> torrentQueue; std::greater<QPair<int, TorrentHandle *>>> torrentQueue;
// Sort torrents by priority // Sort torrents by priority
for (const InfoHash infoHash : hashes) { for (const InfoHash infoHash : hashes) {
@@ -2066,7 +2066,7 @@ void Session::bottomTorrentsPriority(const QStringList &hashes)
torrentQueue.push(qMakePair(torrent->queuePosition(), torrent)); torrentQueue.push(qMakePair(torrent->queuePosition(), torrent));
} }
// Bottom torrents priority (starting with the ones with lowest priority) // Bottom torrents priority (starting with the ones with highest priority)
while (!torrentQueue.empty()) { while (!torrentQueue.empty()) {
TorrentHandle *const torrent = torrentQueue.top().second; TorrentHandle *const torrent = torrentQueue.top().second;
torrentQueuePositionBottom(torrent->nativeHandle()); torrentQueuePositionBottom(torrent->nativeHandle());

View File

@@ -1273,17 +1273,18 @@ void TorrentHandle::forceDHTAnnounce()
void TorrentHandle::forceRecheck() void TorrentHandle::forceRecheck()
{ {
if (m_startupState != Started) return;
if (!hasMetadata()) return; if (!hasMetadata()) return;
m_nativeHandle.force_recheck(); m_nativeHandle.force_recheck();
m_unchecked = false; m_unchecked = false;
if (isPaused()) { if ((m_startupState != Started) || isPaused()) {
m_nativeHandle.stop_when_ready(true); m_nativeHandle.stop_when_ready(true);
m_nativeHandle.auto_managed(true); m_nativeHandle.auto_managed(true);
m_pauseWhenReady = true;
} }
if ((m_startupState == Started) && isPaused())
m_pauseWhenReady = true;
} }
void TorrentHandle::setSequentialDownload(bool b) void TorrentHandle::setSequentialDownload(bool b)
@@ -1351,30 +1352,27 @@ void TorrentHandle::toggleFirstLastPiecePriority()
void TorrentHandle::pause() void TorrentHandle::pause()
{ {
if (m_startupState != Started) return;
if (m_pauseWhenReady) return;
if (isChecking()) {
m_pauseWhenReady = true;
return;
}
if (isPaused()) return; if (isPaused()) return;
m_nativeHandle.auto_managed(false); m_nativeHandle.auto_managed(false);
m_nativeHandle.pause(); m_nativeHandle.pause();
if (m_startupState == Started) {
if (m_pauseWhenReady) {
m_nativeHandle.stop_when_ready(false);
m_pauseWhenReady = false;
}
// Libtorrent doesn't emit a torrent_paused_alert when the // Libtorrent doesn't emit a torrent_paused_alert when the
// torrent is queued (no I/O) // torrent is queued (no I/O)
// We test on the cached m_nativeStatus // We test on the cached m_nativeStatus
if (isQueued()) if (isQueued())
m_session->handleTorrentPaused(this); m_session->handleTorrentPaused(this);
}
} }
void TorrentHandle::resume(bool forced) void TorrentHandle::resume(bool forced)
{ {
if (m_startupState != Started) return;
m_pauseWhenReady = false;
resume_impl(forced); resume_impl(forced);
} }

View File

@@ -44,10 +44,9 @@
#include "downloadmanager.h" #include "downloadmanager.h"
#include "private/geoipdatabase.h" #include "private/geoipdatabase.h"
static const char DATABASE_URL[] = "https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz"; static const QString DATABASE_URL = QStringLiteral("https://download.db-ip.com/free/dbip-country-lite-%1.mmdb.gz");
static const char GEOIP_FOLDER[] = "GeoIP"; static const char GEODB_FOLDER[] = "GeoDB";
static const char GEOIP_FILENAME[] = "GeoLite2-Country.mmdb"; static const char GEODB_FILENAME[] = "dbip-country-lite.mmdb";
static const int UPDATE_INTERVAL = 30; // Days between database updates
using namespace Net; using namespace Net;
@@ -96,29 +95,45 @@ void GeoIPManager::loadDatabase()
} }
QString filepath = Utils::Fs::expandPathAbs( QString filepath = Utils::Fs::expandPathAbs(
QString("%1%2/%3").arg(specialFolderLocation(SpecialFolder::Data), GEOIP_FOLDER, GEOIP_FILENAME)); QString("%1%2/%3").arg(specialFolderLocation(SpecialFolder::Data), GEODB_FOLDER, GEODB_FILENAME));
QString error; QString error;
m_geoIPDatabase = GeoIPDatabase::load(filepath, error); m_geoIPDatabase = GeoIPDatabase::load(filepath, error);
if (m_geoIPDatabase) if (m_geoIPDatabase)
Logger::instance()->addMessage(tr("GeoIP database loaded. Type: %1. Build time: %2.") Logger::instance()->addMessage(tr("IP geolocation database loaded. Type: %1. Build time: %2.")
.arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()), .arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()),
Log::INFO); Log::INFO);
else else
Logger::instance()->addMessage(tr("Couldn't load GeoIP database. Reason: %1").arg(error), Log::WARNING); Logger::instance()->addMessage(tr("Couldn't load IP geolocation database. Reason: %1").arg(error), Log::WARNING);
manageDatabaseUpdate(); manageDatabaseUpdate();
} }
void GeoIPManager::manageDatabaseUpdate() void GeoIPManager::manageDatabaseUpdate()
{ {
if (!m_geoIPDatabase || (m_geoIPDatabase->buildEpoch().daysTo(QDateTime::currentDateTimeUtc()) >= UPDATE_INTERVAL)) const auto expired = [](const QDateTime &testDateTime)
{
const QDate testDate = testDateTime.date();
const QDate curDate = QDateTime::currentDateTimeUtc().date();
if ((testDate.year() < curDate.year()) && (curDate.day() > 1))
return true;
if ((testDate.month() < curDate.month()) && (curDate.day() > 1))
return true;
return false;
};
if (!m_geoIPDatabase || expired(m_geoIPDatabase->buildEpoch()))
downloadDatabaseFile(); downloadDatabaseFile();
} }
void GeoIPManager::downloadDatabaseFile() void GeoIPManager::downloadDatabaseFile()
{ {
DownloadHandler *handler = DownloadManager::instance()->download({DATABASE_URL}); const QDate curDate = QDateTime::currentDateTimeUtc().date();
const QString curUrl = DATABASE_URL.arg(curDate.toString("yyyy-MM"));
DownloadHandler *handler = DownloadManager::instance()->download({curUrl});
connect(handler, static_cast<void (Net::DownloadHandler::*)(const QString &, const QByteArray &)>(&Net::DownloadHandler::downloadFinished) connect(handler, static_cast<void (Net::DownloadHandler::*)(const QString &, const QByteArray &)>(&Net::DownloadHandler::downloadFinished)
, this, &GeoIPManager::downloadFinished); , this, &GeoIPManager::downloadFinished);
connect(handler, &Net::DownloadHandler::downloadFailed, this, &GeoIPManager::downloadFailed); connect(handler, &Net::DownloadHandler::downloadFailed, this, &GeoIPManager::downloadFailed);
@@ -420,7 +435,7 @@ void GeoIPManager::downloadFinished(const QString &url, QByteArray data)
bool ok = false; bool ok = false;
data = Utils::Gzip::decompress(data, &ok); data = Utils::Gzip::decompress(data, &ok);
if (!ok) { if (!ok) {
Logger::instance()->addMessage(tr("Could not decompress GeoIP database file."), Log::WARNING); LogMsg(tr("Could not decompress IP geolocation database file."), Log::WARNING);
return; return;
} }
@@ -431,28 +446,25 @@ void GeoIPManager::downloadFinished(const QString &url, QByteArray data)
if (m_geoIPDatabase) if (m_geoIPDatabase)
delete m_geoIPDatabase; delete m_geoIPDatabase;
m_geoIPDatabase = geoIPDatabase; m_geoIPDatabase = geoIPDatabase;
Logger::instance()->addMessage(tr("GeoIP database loaded. Type: %1. Build time: %2.") LogMsg(tr("IP geolocation database loaded. Type: %1. Build time: %2.")
.arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()), .arg(m_geoIPDatabase->type(), m_geoIPDatabase->buildEpoch().toString()),
Log::INFO); Log::INFO);
QString targetPath = Utils::Fs::expandPathAbs( const QString targetPath = Utils::Fs::expandPathAbs(
specialFolderLocation(SpecialFolder::Data) + GEOIP_FOLDER); specialFolderLocation(SpecialFolder::Data) + GEODB_FOLDER);
if (!QDir(targetPath).exists()) if (!QDir(targetPath).exists())
QDir().mkpath(targetPath); QDir().mkpath(targetPath);
QFile targetFile(QString("%1/%2").arg(targetPath, GEOIP_FILENAME)); QFile targetFile(QString("%1/%2").arg(targetPath, GEODB_FILENAME));
if (!targetFile.open(QFile::WriteOnly) || (targetFile.write(data) == -1)) { if (!targetFile.open(QFile::WriteOnly) || (targetFile.write(data) == -1))
Logger::instance()->addMessage( LogMsg(tr("Couldn't save downloaded IP geolocation database file."), Log::WARNING);
tr("Couldn't save downloaded GeoIP database file."), Log::WARNING); else
} LogMsg(tr("Successfully updated IP geolocation database."), Log::INFO);
else {
Logger::instance()->addMessage(tr("Successfully updated GeoIP database."), Log::INFO);
}
} }
else { else {
delete geoIPDatabase; delete geoIPDatabase;
} }
} }
else { else {
Logger::instance()->addMessage(tr("Couldn't load GeoIP database. Reason: %1").arg(error), Log::WARNING); LogMsg(tr("Couldn't load IP geolocation database. Reason: %1").arg(error), Log::WARNING);
} }
} }

View File

@@ -38,7 +38,6 @@
namespace namespace
{ {
const qint32 MAX_FILE_SIZE = 67108864; // 64MB const qint32 MAX_FILE_SIZE = 67108864; // 64MB
const char DB_TYPE[] = "GeoLite2-Country";
const quint32 MAX_METADATA_SIZE = 131072; // 128KB const quint32 MAX_METADATA_SIZE = 131072; // 128KB
const char METADATA_BEGIN_MARK[] = "\xab\xcd\xefMaxMind.com"; const char METADATA_BEGIN_MARK[] = "\xab\xcd\xefMaxMind.com";
const char DATA_SECTION_SEPARATOR[16] = {0}; const char DATA_SECTION_SEPARATOR[16] = {0};
@@ -144,7 +143,7 @@ GeoIPDatabase::~GeoIPDatabase()
QString GeoIPDatabase::type() const QString GeoIPDatabase::type() const
{ {
return DB_TYPE; return m_dbType;
} }
quint16 GeoIPDatabase::ipVersion() const quint16 GeoIPDatabase::ipVersion() const
@@ -255,11 +254,7 @@ bool GeoIPDatabase::parseMetadata(const QVariantHash &metadata, QString &error)
m_indexSize = m_nodeCount * m_nodeSize; m_indexSize = m_nodeCount * m_nodeSize;
CHECK_METADATA_REQ(database_type, QString); CHECK_METADATA_REQ(database_type, QString);
QString dbType = metadata.value("database_type").toString(); m_dbType = metadata.value("database_type").toString();
if (dbType != DB_TYPE) {
error = tr("Invalid database type: %1").arg(dbType);
return false;
}
CHECK_METADATA_REQ(build_epoch, ULongLong); CHECK_METADATA_REQ(build_epoch, ULongLong);
m_buildEpoch = QDateTime::fromTime_t(metadata.value("build_epoch").toULongLong()); m_buildEpoch = QDateTime::fromTime_t(metadata.value("build_epoch").toULongLong());
@@ -272,7 +267,7 @@ bool GeoIPDatabase::parseMetadata(const QVariantHash &metadata, QString &error)
bool GeoIPDatabase::loadDB(QString &error) const bool GeoIPDatabase::loadDB(QString &error) const
{ {
qDebug() << "Parsing MaxMindDB index tree..."; qDebug() << "Parsing IP geolocation database index tree...";
const int nodeSize = m_recordSize / 4; // in bytes const int nodeSize = m_recordSize / 4; // in bytes
const int indexSize = m_nodeCount * nodeSize; const int indexSize = m_nodeCount * nodeSize;

View File

@@ -93,6 +93,7 @@ private:
int m_indexSize; int m_indexSize;
int m_recordBytes; int m_recordBytes;
QDateTime m_buildEpoch; QDateTime m_buildEpoch;
QString m_dbType;
// Search data // Search data
mutable QHash<quint32, QString> m_countries; mutable QHash<quint32, QString> m_countries;
quint32 m_size; quint32 m_size;

View File

@@ -354,7 +354,7 @@ bool Utils::Fs::isNetworkFileSystem(const QString &path)
// Magic number references: // Magic number references:
// 1. /usr/include/linux/magic.h // 1. /usr/include/linux/magic.h
// 2. https://github.com/coreutils/coreutils/blob/master/src/stat.c // 2. https://github.com/coreutils/coreutils/blob/master/src/stat.c
switch (buf.f_type) { switch (static_cast<unsigned int>(buf.f_type)) {
case 0xFF534D42: // CIFS_MAGIC_NUMBER case 0xFF534D42: // CIFS_MAGIC_NUMBER
case 0x6969: // NFS_SUPER_MAGIC case 0x6969: // NFS_SUPER_MAGIC
case 0x517B: // SMB_SUPER_MAGIC case 0x517B: // SMB_SUPER_MAGIC

View File

@@ -102,6 +102,14 @@ public:
labelLibtVer->setText(Utils::Misc::libtorrentVersionString()); labelLibtVer->setText(Utils::Misc::libtorrentVersionString());
labelBoostVer->setText(Utils::Misc::boostVersionString()); labelBoostVer->setText(Utils::Misc::boostVersionString());
const QString DBIPText = QString(
"<html><head/><body><p>"
"%1"
" (<a href=\"https://db-ip.com/\">https://db-ip.com/</a>)</p></body></html>")
.arg(tr("The free IP to Country Lite database by DB-IP is used for resolving the countries of peers. "
"The database is licensed under the Creative Commons Attribution 4.0 International License"));
labelDBIP->setText(DBIPText);
Utils::Gui::resize(this); Utils::Gui::resize(this);
show(); show();
} }

View File

@@ -314,11 +314,11 @@
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="librariesTab"> <widget class="QWidget" name="SoftwareUsedTab">
<attribute name="title"> <attribute name="title">
<string>Libraries</string> <string>Software Used</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="librariesTabLayout"> <layout class="QVBoxLayout" name="SoftwareUsedTabLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
@@ -430,6 +430,22 @@
</property> </property>
</widget> </widget>
</item> </item>
<item>
<widget class="QLabel" name="labelDBIP">
<property name="text">
<string notr="true">DB-IP license text</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="openExternalLinks">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse</set>
</property>
</widget>
</item>
<item> <item>
<spacer name="verticalSpacer_2"> <spacer name="verticalSpacer_2">
<property name="orientation"> <property name="orientation">

View File

@@ -419,7 +419,7 @@ void AdvancedSettings::loadAdvancedSettings()
addRow(LIST_REFRESH, tr("Transfer list refresh interval"), &spinBoxListRefresh); addRow(LIST_REFRESH, tr("Transfer list refresh interval"), &spinBoxListRefresh);
// Resolve Peer countries // Resolve Peer countries
checkBoxResolveCountries.setChecked(pref->resolvePeerCountries()); checkBoxResolveCountries.setChecked(pref->resolvePeerCountries());
addRow(RESOLVE_COUNTRIES, tr("Resolve peer countries (GeoIP)"), &checkBoxResolveCountries); addRow(RESOLVE_COUNTRIES, tr("Resolve peer countries"), &checkBoxResolveCountries);
// Resolve peer hosts // Resolve peer hosts
checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames()); checkBoxResolveHosts.setChecked(pref->resolvePeerHostNames());
addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &checkBoxResolveHosts); addRow(RESOLVE_HOSTS, tr("Resolve peer host names"), &checkBoxResolveHosts);

View File

@@ -50,8 +50,12 @@ qreal Utils::Gui::screenScalingFactor(const QWidget *widget)
return 1; return 1;
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
const int screen = qApp->desktop()->screenNumber(widget); const int screenNumber = qApp->desktop()->screenNumber(widget);
return (QApplication::screens()[screen]->logicalDotsPerInch() / 96); const QScreen *screen = QApplication::screens()[screenNumber];
// Workaround for QScreen::physicalDotsPerInch() that could return
// values that are smaller than the normal 96 DPI on Windows
const qreal physicalDPI = qMax<qreal>(screen->physicalDotsPerInch(), 96);
return (screen->logicalDotsPerInch() / physicalDPI);
#elif defined(Q_OS_MAC) #elif defined(Q_OS_MAC)
return 1; return 1;
#else #else

View File

@@ -43,8 +43,8 @@
#include "base/utils/net.h" #include "base/utils/net.h"
#include "base/utils/version.h" #include "base/utils/version.h"
constexpr Utils::Version<int, 3, 2> API_VERSION {2, 2, 0}; constexpr Utils::Version<int, 3, 2> API_VERSION {2, 2, 1};
constexpr int COMPAT_API_VERSION = 23; constexpr int COMPAT_API_VERSION = 24;
constexpr int COMPAT_API_VERSION_MIN = 23; constexpr int COMPAT_API_VERSION_MIN = 23;
class APIController; class APIController;

View File

@@ -41,6 +41,7 @@ var queueing_enabled = true;
var serverSyncMainDataInterval = 1500; var serverSyncMainDataInterval = 1500;
var customSyncMainDataInterval = null; var customSyncMainDataInterval = null;
let syncRequestInProgress = false;
var clipboardEvent; var clipboardEvent;
var CATEGORIES_ALL = 1; var CATEGORIES_ALL = 1;
@@ -334,7 +335,7 @@ window.addEvent('load', function() {
var syncMainData = function() { var syncMainData = function() {
var url = new URI('api/v2/sync/maindata'); var url = new URI('api/v2/sync/maindata');
url.setData('rid', syncMainDataLastResponseId); url.setData('rid', syncMainDataLastResponseId);
new Request.JSON({ const request = new Request.JSON({
url: url, url: url,
noCache: true, noCache: true,
method: 'get', method: 'get',
@@ -342,8 +343,8 @@ window.addEvent('load', function() {
var errorDiv = $('error_div'); var errorDiv = $('error_div');
if (errorDiv) if (errorDiv)
errorDiv.set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]'); errorDiv.set('html', 'QBT_TR(qBittorrent client is not reachable)QBT_TR[CONTEXT=HttpServer]');
clearTimeout(syncMainDataTimer); syncRequestInProgress = false;
syncMainDataTimer = syncMainData.delay(2000); syncData(2000);
}, },
onSuccess: function(response) { onSuccess: function(response) {
$('error_div').set('html', ''); $('error_div').set('html', '');
@@ -426,18 +427,26 @@ window.addEvent('load', function() {
// re-select previously selected rows // re-select previously selected rows
torrentsTable.reselectRows(torrentsTableSelectedRows); torrentsTable.reselectRows(torrentsTableSelectedRows);
} }
clearTimeout(syncMainDataTimer); syncRequestInProgress = false;
syncMainDataTimer = syncMainData.delay(getSyncMainDataInterval()); syncData(getSyncMainDataInterval())
} }
}).send(); });
syncRequestInProgress = true;
request.send();
}; };
updateMainData = function() { updateMainData = function() {
torrentsTable.updateTable(); torrentsTable.updateTable();
clearTimeout(syncMainDataTimer); syncData(100);
syncMainDataTimer = syncMainData.delay(100);
}; };
const syncData = function(delay) {
if (!syncRequestInProgress){
clearTimeout(syncMainDataTimer);
syncMainDataTimer = syncMainData.delay(delay);
}
}
var processServerState = function() { var processServerState = function() {
var transfer_info = friendlyUnit(serverState.dl_info_speed, true); var transfer_info = friendlyUnit(serverState.dl_info_speed, true);
if (serverState.dl_rate_limit > 0) if (serverState.dl_rate_limit > 0)
@@ -459,7 +468,7 @@ window.addEvent('load', function() {
$('DHTNodes').set('html', 'QBT_TR(DHT: %1 nodes)QBT_TR[CONTEXT=StatusBar]'.replace("%1", serverState.dht_nodes)); $('DHTNodes').set('html', 'QBT_TR(DHT: %1 nodes)QBT_TR[CONTEXT=StatusBar]'.replace("%1", serverState.dht_nodes));
// Statistics dialog // Statistics dialog
if (document.getElementById("statisticspage")) { if (document.getElementById("statisticsContent")) {
$('AlltimeDL').set('html', friendlyUnit(serverState.alltime_dl, false)); $('AlltimeDL').set('html', friendlyUnit(serverState.alltime_dl, false));
$('AlltimeUL').set('html', friendlyUnit(serverState.alltime_ul, false)); $('AlltimeUL').set('html', friendlyUnit(serverState.alltime_ul, false));
$('TotalWastedSession').set('html', friendlyUnit(serverState.total_wasted_session, false)); $('TotalWastedSession').set('html', friendlyUnit(serverState.total_wasted_session, false));
@@ -607,8 +616,7 @@ window.addEvent('load', function() {
$("mainColumn").removeClass("invisible"); $("mainColumn").removeClass("invisible");
customSyncMainDataInterval = null; customSyncMainDataInterval = null;
clearTimeout(syncMainDataTimer); syncData(100);
syncMainDataTimer = syncMainData.delay(100);
hideSearchTab(); hideSearchTab();
}; };

View File

@@ -1,5 +1,6 @@
<h3>QBT_TR(User statistics)QBT_TR[CONTEXT=StatsDialog]</h3> <div id="statisticsContent">
<table style="width:100%"> <h3>QBT_TR(User statistics)QBT_TR[CONTEXT=StatsDialog]</h3>
<table style="width:100%">
<tr> <tr>
<td>QBT_TR(All-time upload:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(All-time upload:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="AlltimeUL" class="statisticsValue"></td> <td id="AlltimeUL" class="statisticsValue"></td>
@@ -20,10 +21,9 @@
<td>QBT_TR(Connected peers:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(Connected peers:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="TotalPeerConnections" class="statisticsValue"></td> <td id="TotalPeerConnections" class="statisticsValue"></td>
</tr> </tr>
</table> </table>
<h3>QBT_TR(Cache statistics)QBT_TR[CONTEXT=StatsDialog]</h3>
<h3>QBT_TR(Cache statistics)QBT_TR[CONTEXT=StatsDialog]</h3> <table style="width:100%">
<table style="width:100%">
<tr> <tr>
<td>QBT_TR(Read cache hits:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(Read cache hits:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="ReadCacheHits" class="statisticsValue"></td> <td id="ReadCacheHits" class="statisticsValue"></td>
@@ -32,10 +32,9 @@
<td>QBT_TR(Total buffer size:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(Total buffer size:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="TotalBuffersSize" class="statisticsValue"></td> <td id="TotalBuffersSize" class="statisticsValue"></td>
</tr> </tr>
</table> </table>
<h3>QBT_TR(Performance statistics)QBT_TR[CONTEXT=StatsDialog]</h3>
<h3>QBT_TR(Performance statistics)QBT_TR[CONTEXT=StatsDialog]</h3> <table style="width:100%">
<table style="width:100%">
<tr> <tr>
<td>QBT_TR(Write cache overload:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(Write cache overload:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="WriteCacheOverload" class="statisticsValue"></td> <td id="WriteCacheOverload" class="statisticsValue"></td>
@@ -56,4 +55,5 @@
<td>QBT_TR(Total queued size:)QBT_TR[CONTEXT=StatsDialog]</td> <td>QBT_TR(Total queued size:)QBT_TR[CONTEXT=StatsDialog]</td>
<td id="TotalQueuedSize" class="statisticsValue"></td> <td id="TotalQueuedSize" class="statisticsValue"></td>
</tr> </tr>
</table> </table>
</div>

View File

@@ -4,8 +4,8 @@ PROJECT_NAME = qbittorrent
# Define version numbers here # Define version numbers here
VER_MAJOR = 4 VER_MAJOR = 4
VER_MINOR = 1 VER_MINOR = 1
VER_BUGFIX = 8 VER_BUGFIX = 9
VER_BUILD = 0 VER_BUILD = 1
VER_STATUS = # Should be empty for stable releases! VER_STATUS = # Should be empty for stable releases!
# Don't touch the rest part # Don't touch the rest part