You've already forked qBittorrent
mirror of
https://github.com/qbittorrent/qBittorrent
synced 2025-10-09 18:32:15 +02:00
Compare commits
206 Commits
release-4.
...
release-3.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6fc3c04dca | ||
![]() |
ae150b25ae | ||
![]() |
36ddf0fd2f | ||
![]() |
06d59cab2d | ||
![]() |
8f519d00e7 | ||
![]() |
ce58a3fd4b | ||
![]() |
303dbd7dbe | ||
![]() |
c9abcbfbd4 | ||
![]() |
baab8ddf75 | ||
![]() |
982d4a685a | ||
![]() |
52ff7a92fb | ||
![]() |
8a4a3b33f8 | ||
![]() |
aec4f1d343 | ||
![]() |
32ea862584 | ||
![]() |
9f1bd86c47 | ||
![]() |
d2853b3a98 | ||
![]() |
64cf3afe67 | ||
![]() |
7729035598 | ||
![]() |
021cf9fb65 | ||
![]() |
c2e9ce5966 | ||
![]() |
75e4a004f7 | ||
![]() |
ac60072ded | ||
![]() |
9cac51d9b0 | ||
![]() |
14d590b3be | ||
![]() |
86d1dc300c | ||
![]() |
6787623ff3 | ||
![]() |
636ff89e23 | ||
![]() |
568950e63e | ||
![]() |
b3b973d54b | ||
![]() |
ff64a79594 | ||
![]() |
26b635ca33 | ||
![]() |
7e63908977 | ||
![]() |
5c9ce2952b | ||
![]() |
6ca7ff0e25 | ||
![]() |
3091c30ff6 | ||
![]() |
1086b940a2 | ||
![]() |
9465f358c4 | ||
![]() |
f8cb9d09f6 | ||
![]() |
01d8b24982 | ||
![]() |
b7604b1c82 | ||
![]() |
4da4457f5f | ||
![]() |
858909bf19 | ||
![]() |
d3bdb52b8f | ||
![]() |
d804445de7 | ||
![]() |
5187899d7e | ||
![]() |
67ad8ef7d6 | ||
![]() |
cbd9ccef17 | ||
![]() |
d6420e6876 | ||
![]() |
f76b1eb2fb | ||
![]() |
e474f53910 | ||
![]() |
ccac6cb5a9 | ||
![]() |
92bb94ecca | ||
![]() |
b286351305 | ||
![]() |
3873a36338 | ||
![]() |
f989708e31 | ||
![]() |
2dbeda5985 | ||
![]() |
9d5d1dfea8 | ||
![]() |
3738302a3c | ||
![]() |
7f58ff4c8f | ||
![]() |
4c079ede83 | ||
![]() |
1ee91ddb13 | ||
![]() |
03fd0a36a6 | ||
![]() |
266c96f03b | ||
![]() |
a088657619 | ||
![]() |
7c164dfcb9 | ||
![]() |
20f4b95180 | ||
![]() |
8ac4cccc25 | ||
![]() |
d990af4a79 | ||
![]() |
8e73c262f9 | ||
![]() |
7804faa34d | ||
![]() |
0bb0a5ea13 | ||
![]() |
d5b9e3449b | ||
![]() |
753b33b8a3 | ||
![]() |
eb12d63d2d | ||
![]() |
b21ab50221 | ||
![]() |
34f89d3174 | ||
![]() |
54227c20ff | ||
![]() |
515c578188 | ||
![]() |
74bba9ecfe | ||
![]() |
41e052498b | ||
![]() |
3a51c5bf85 | ||
![]() |
cad542f3f4 | ||
![]() |
54a444d37f | ||
![]() |
1c5e6980e8 | ||
![]() |
8b7d995447 | ||
![]() |
0b83ea9fcf | ||
![]() |
04e582793e | ||
![]() |
07e2e88e79 | ||
![]() |
e120a6764b | ||
![]() |
c4a311cc09 | ||
![]() |
278872eb12 | ||
![]() |
c3d9321865 | ||
![]() |
882f5e325a | ||
![]() |
bf7bec61c2 | ||
![]() |
72af954b65 | ||
![]() |
514abca0ea | ||
![]() |
643224800f | ||
![]() |
8e25ec7dbf | ||
![]() |
07b36f313b | ||
![]() |
34d2bdadc0 | ||
![]() |
92ef98080b | ||
![]() |
34bf09b539 | ||
![]() |
06f46eae24 | ||
![]() |
ae5b2fa4a4 | ||
![]() |
9b7c2e669e | ||
![]() |
e6e087d391 | ||
![]() |
bf6b723206 | ||
![]() |
0bce0fc6c1 | ||
![]() |
4d913d123c | ||
![]() |
a00bbf349a | ||
![]() |
c61566d133 | ||
![]() |
a675a13587 | ||
![]() |
ebe0e7bb71 | ||
![]() |
e30df4ed70 | ||
![]() |
9dcb9848ae | ||
![]() |
7034d14eba | ||
![]() |
08c8b6f77d | ||
![]() |
be91f749ee | ||
![]() |
4ec2a37f5d | ||
![]() |
cc471dbd3c | ||
![]() |
ab62cbdf3f | ||
![]() |
cd708bb665 | ||
![]() |
c1a47279af | ||
![]() |
fec6c8af27 | ||
![]() |
fc605b119e | ||
![]() |
7892f37d3e | ||
![]() |
26cb71458d | ||
![]() |
069bd05d37 | ||
![]() |
c4f043a14d | ||
![]() |
16b9a28531 | ||
![]() |
1da29a450c | ||
![]() |
9095545425 | ||
![]() |
01dbc01635 | ||
![]() |
bd7fd47d9f | ||
![]() |
429dad3f70 | ||
![]() |
ca70f2ce5c | ||
![]() |
98a4b8c199 | ||
![]() |
6dd94ccc1d | ||
![]() |
e83a8393a4 | ||
![]() |
8fa79a0690 | ||
![]() |
0423a28f30 | ||
![]() |
18f32fae90 | ||
![]() |
057b998e0f | ||
![]() |
855ac43aca | ||
![]() |
5a6302af59 | ||
![]() |
174861274b | ||
![]() |
718983a4d6 | ||
![]() |
a77e550bf9 | ||
![]() |
aac6a4526c | ||
![]() |
23842a8ec3 | ||
![]() |
422db313de | ||
![]() |
07bbe70baf | ||
![]() |
f46eafc9fd | ||
![]() |
86df2520ad | ||
![]() |
640e0ea34d | ||
![]() |
cd03c511a5 | ||
![]() |
98533ede13 | ||
![]() |
09dedd0f22 | ||
![]() |
639f5b2d20 | ||
![]() |
e758f4ec26 | ||
![]() |
aae1a3564d | ||
![]() |
68e29df2ae | ||
![]() |
183643d77b | ||
![]() |
d8838363b8 | ||
![]() |
a0877fd57c | ||
![]() |
271b37885f | ||
![]() |
00b32a0996 | ||
![]() |
75979cc4d5 | ||
![]() |
cf41f41b16 | ||
![]() |
12ad2c7368 | ||
![]() |
86b21dacfd | ||
![]() |
7ce343c28f | ||
![]() |
fc3e85f449 | ||
![]() |
fb32408ba1 | ||
![]() |
32eec624a1 | ||
![]() |
8122ae4739 | ||
![]() |
49cce9b2fc | ||
![]() |
bded737c3c | ||
![]() |
a94b317150 | ||
![]() |
6d34f86c51 | ||
![]() |
6dfd962a13 | ||
![]() |
89cfd41c5f | ||
![]() |
9fbd19b2ca | ||
![]() |
1577a366e0 | ||
![]() |
19506ea323 | ||
![]() |
b0d321d729 | ||
![]() |
a63648b769 | ||
![]() |
cfe5f8e518 | ||
![]() |
56f842dd6d | ||
![]() |
95c8d078f1 | ||
![]() |
4b3d3f6ea6 | ||
![]() |
d783787ceb | ||
![]() |
1ef9a1151d | ||
![]() |
baa586a6f7 | ||
![]() |
c0454fbd02 | ||
![]() |
03fb897717 | ||
![]() |
43cd295b0c | ||
![]() |
80b2d00c7a | ||
![]() |
83e4059cea | ||
![]() |
92a250cdb3 | ||
![]() |
1a52368f79 | ||
![]() |
cbc0e2527a | ||
![]() |
52f8f9beb4 | ||
![]() |
3f110dabed | ||
![]() |
5af4dde3f3 | ||
![]() |
10880e10f1 |
9
.gitignore
vendored
9
.gitignore
vendored
@@ -2,13 +2,19 @@ src/gui/geoip/GeoIP.dat
|
||||
src/gui/geoip/GeoIP.dat.gz
|
||||
src/qbittorrent
|
||||
src/qbittorrent-nox
|
||||
src/release
|
||||
src/debug
|
||||
qbittorrent.pro.user*
|
||||
conf.pri
|
||||
Makefile
|
||||
Makefile*
|
||||
*.pyc
|
||||
*.log
|
||||
|
||||
# Compiled object files
|
||||
*.o
|
||||
*.pdb
|
||||
*.exe
|
||||
|
||||
# Generated MOC, resource and UI files
|
||||
moc_*.cpp
|
||||
qrc_*.cpp
|
||||
@@ -19,6 +25,7 @@ src/lang/qbittorrent_*.qm
|
||||
.qmake.stash
|
||||
src/qbittorrent.app
|
||||
*.dmg
|
||||
|
||||
#Autotools junk
|
||||
aclocal.m4
|
||||
autom4te.cache/*
|
||||
|
108
.travis.yml
108
.travis.yml
@@ -1,16 +1,17 @@
|
||||
language:
|
||||
- cpp
|
||||
language: cpp
|
||||
|
||||
env:
|
||||
# use libtorrent 0.15.10
|
||||
# uncomment when Travis doesn't use Ubuntu 12.04 LTS, which has libtorrent 0.15.10 as package
|
||||
#- lt_source=from_dist gui=true
|
||||
#- lt_source=from_dist gui=false
|
||||
# use libtorrent 0.16.X from RC_0_16 svn branch
|
||||
- lt_source=from_svnRC_0_16 gui=true
|
||||
- lt_source=from_svnRC_0_16 gui=false
|
||||
- lt_source=from_svnRC_1_0 gui=true
|
||||
- lt_source=from_svnRC_1_0 gui=false
|
||||
matrix:
|
||||
# Uncomment when Travis upgraded "Ubuntu 12.04 LTS" to a newer version whose repo will have a more up-to-date libtorrent package
|
||||
#- lt_branch=dist gui=true
|
||||
#- lt_branch=dist gui=false
|
||||
- lt_branch=RC_0_16 gui=true
|
||||
- lt_branch=RC_0_16 gui=false
|
||||
- lt_branch=RC_1_0 gui=true
|
||||
- lt_branch=RC_1_0 gui=false
|
||||
global:
|
||||
- secure: "OI9CUjj4lTb0HwwIZU5PbECU3hLlAL6KC8KsbwohG8/O3j5fLcnmDsK4Ad9us5cC39sS11Jcd1kDP2qRcCuST/glVNhLkcjKkiQerOfd5nQ/qL4JYfz/1mfP5mdpz9jHKzpLUIG+TXkbSTjP6VVmsb5KPT+3pKEdRFZB+Pu9+J8="
|
||||
- coverity_branch: coverity_scan
|
||||
|
||||
branches:
|
||||
except:
|
||||
@@ -20,41 +21,76 @@ branches:
|
||||
notifications:
|
||||
email:
|
||||
on_success: change
|
||||
on_failure: change
|
||||
on_failure: change
|
||||
|
||||
# container-based builds
|
||||
sudo: false
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.ccache
|
||||
|
||||
addons:
|
||||
coverity_scan:
|
||||
project:
|
||||
name: "qbittorrent/qBittorrent"
|
||||
description: "Build submitted via Travis CI"
|
||||
build_command_prepend: "./bootstrap.sh && ./configure $qbtconf"
|
||||
build_command: make
|
||||
branch_pattern: $coverity_branch
|
||||
notification_email: sledgehammer999@qbittorrent.org
|
||||
apt:
|
||||
packages:
|
||||
# packages list: https://github.com/travis-ci/apt-package-whitelist/blob/master/ubuntu-precise
|
||||
- autoconf
|
||||
- automake
|
||||
- colormake
|
||||
- libssl-dev
|
||||
- libboost-dev
|
||||
- libboost-system-dev
|
||||
- libgeoip-dev
|
||||
- libqt4-dev
|
||||
# Uncomment when Travis upgraded "Ubuntu 12.04 LTS" to a newer version whose repo will have a more up-to-date libtorrent package
|
||||
#- libtorrent-rasterbar6
|
||||
#- libboost-filesystem-dev
|
||||
|
||||
before_install:
|
||||
# Only allow specific build for coverity scan, others will stop
|
||||
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ] && ! [[ "$lt_branch" == "RC_1_0" && "$gui" == "true" ]]; then exit ; fi
|
||||
|
||||
- shopt -s expand_aliases
|
||||
- alias sudo="sudo "
|
||||
# Using nprocs/2 sometimes may fail (gcc is killed by system), just use two threads
|
||||
- alias make="colormake -j2 "
|
||||
- if ! [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then dpkg-query -L ccache && export PATH="/usr/lib/ccache/:$PATH" ; fi
|
||||
- alias make="colormake -j3" # Using nprocs/2 sometimes may fail (gcc is killed by system)
|
||||
|
||||
- libt_path="$HOME/libt_install"
|
||||
- qbt_path="$HOME/qbt_install"
|
||||
- ltconf="$ltconf --prefix="$libt_path" --with-libgeoip=system"
|
||||
- qbtconf="$qbtconf --prefix="$qbt_path" PKG_CONFIG_PATH="$libt_path/lib/pkgconfig":$PKG_CONFIG_PATH"
|
||||
|
||||
# Options for specific branches
|
||||
- if [[ "$lt_branch" == "RC_0_16" ]]; then qbtconf="$qbtconf --with-libtorrent-rasterbar0.16" ; fi
|
||||
# Also setup a virtual display for after_success target when gui == true
|
||||
- if ! $gui; then qbtconf="$qbtconf --disable-gui"; else export "DISPLAY=:99.0" && /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 ; fi
|
||||
- qbtconf="$qbtconf --with-qt4"
|
||||
- ltconf=" --with-libgeoip=system"
|
||||
- if ! $gui; then qbtconf="$qbtconf --disable-gui" ; else export "DISPLAY=:99.0" && /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1280x1024x16 ; fi
|
||||
|
||||
- echo settings
|
||||
- echo $lt_source
|
||||
- echo $ltconf
|
||||
# Print settings
|
||||
- echo $lt_branch
|
||||
- echo $gui
|
||||
- echo $ltconf
|
||||
- echo $qbtconf
|
||||
|
||||
- sudo apt-get -qq update
|
||||
# Travis can stall during heavy load if these packages are installed in one step - split the command
|
||||
- sudo apt-get -qq install debhelper autoconf automake colormake libssl-dev libgeoip-dev
|
||||
# uncomment when Travis doesn't use Ubuntu 12.04 LTS, which has libtorrent 0.15.10 as package
|
||||
#- sudo apt-get -qq install libboost-dev libboost-filesystem-dev libboost-system-dev
|
||||
- sudo apt-get -qq install libboost-dev libboost-system-dev
|
||||
- sudo apt-get -qq install libqt4-dev
|
||||
- ccache -V && ccache --show-stats && ccache --zero-stats
|
||||
|
||||
install:
|
||||
#- if [[ "$lt_source" == "from_dist" ]]; then sudo apt-get -qq install libtorrent-rasterbar-dev; fi
|
||||
- if [[ "$lt_source" == "from_svnRC_0_16" ]]; then qbtconf="$qbtconf --with-libtorrent-rasterbar0.16" && cd .. && svn co svn://svn.code.sf.net/p/libtorrent/code/branches/RC_0_16 ./libtorrent && (cd libtorrent && ./autotool.sh && ./configure $ltconf && sudo make install) && sudo ldconfig /usr/local/lib && cd $TRAVIS_BUILD_DIR ; fi
|
||||
- if [[ "$lt_source" == "from_svnRC_1_0" ]]; then cd .. && svn co svn://svn.code.sf.net/p/libtorrent/code/branches/RC_1_0 ./libtorrent && (cd libtorrent && ./autotool.sh && ./configure $ltconf && sudo make install) && sudo ldconfig /usr/local/lib && cd $TRAVIS_BUILD_DIR ; fi
|
||||
- if ! [ "$lt_branch" == "dist" ]; then cd "$HOME" && pwd && git clone --depth 1 https://github.com/arvidn/libtorrent.git --branch $lt_branch --single-branch ; fi
|
||||
- if ! [ "$lt_branch" == "dist" ]; then cd libtorrent && ./autotool.sh && ./configure $ltconf && make install && cd "$TRAVIS_BUILD_DIR" ; fi
|
||||
|
||||
script:
|
||||
- ./bootstrap.sh
|
||||
- ./configure $qbtconf && sudo make install
|
||||
|
||||
- if [ "$TRAVIS_BRANCH" = "$coverity_branch" ]; then exit ; fi # Skip usual build when running coverity scan
|
||||
- ./bootstrap.sh && ./configure $qbtconf
|
||||
- make install
|
||||
|
||||
after_success:
|
||||
- if $gui ; then qbittorrent --version ; else qbittorrent-nox --version ; fi
|
||||
- cd "$qbt_path/bin"
|
||||
- export LD_PRELOAD="$libt_path/lib/libtorrent-rasterbar.so:$LD_PRELOAD"
|
||||
- if $gui ; then ./qbittorrent --version ; else ./qbittorrent-nox --version ; fi
|
||||
|
||||
after_script:
|
||||
- ccache --show-stats
|
||||
|
@@ -1,7 +1,7 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[qbittorrent.qbittorrent_master]
|
||||
[qbittorrent.qbittorrent_v3_2_x]
|
||||
file_filter = src/lang/qbittorrent_<lang>.ts
|
||||
source_file = src/lang/qbittorrent_en.ts
|
||||
source_lang = en
|
||||
|
108
Changelog
108
Changelog
@@ -1,3 +1,111 @@
|
||||
* Sat Aug 01 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.2
|
||||
- FEATURE: Allow to force reannounce DHT too (Chocobo1)
|
||||
- FEATURE: Implement an option to disable confirmation of torrent recheck (blaxspirit)
|
||||
- FEATURE: Allow to copy all the trackers with a keyboard shortcut (pmzqla)
|
||||
- BUGFIX: Fix torrent renaming. Closes #3398 (ngosang)
|
||||
- BUGFIX: Fix localhost address (::ffff:127.0.0.1) is not recognized when connecting to WebUI (Chocobo1)
|
||||
- BUGFIX: Fix '&' character in label name becomes accelerator key, closes #3454. (Chocobo1)
|
||||
- BUGFIX: Fix HTTP header parsing when torrent filename contains a semicolon. Closes #3511.
|
||||
- BUGFIX: Fix installing search plugin from local file. (sledgehammer999)
|
||||
- BUGFIX: Fix installing search plugin by drag-n-dropping file. (sledgehammer999)
|
||||
- COSMETIC: Update color scheme of completed.png icon. (sledgehammer999)
|
||||
- COSMETIC: Fix printing of the copyright symbol in the About dialog. (sledgehammer999)
|
||||
- COSMETIC: Minor changes in Preview File dialog (ngosang)
|
||||
- COSMETIC: Add Force Resume icon (ngosang)
|
||||
- COSMETIC: Add count of unread items to RSS tab label (pmzqla)
|
||||
- WEBUI: Ports between 1 and 65535 as in the GUI. Closes #1602 (ngosang)
|
||||
- WEBUI: Fix an error in Content tab when the torrent doesn't have metadata (ngosang)
|
||||
- WEBUI: New option Web UI port UPNP. Closes #3358 (ngosang)
|
||||
- WEBUI: Fix API Content Types. Closes #3393 (ngosang)
|
||||
- WEBUI: Fix empty trackers addition (ngosang)
|
||||
- WEBUI: Torrent download from hash. Closes #1173 (ngosang)
|
||||
- WEBUI: Fix sort by queue number (ngosang)
|
||||
- WEBUI: Open external links in a new window/tab (ngosang)
|
||||
- WEBUI: Massive increase in performance. (ngosang)
|
||||
- SEARCH: Search status per tab (DoumanAsh)
|
||||
- SEARCH: Remove the word 'torrent' in ExtraTorrent results (ngosang)
|
||||
- SEARCH: Prefer python3 over python2 on Linux and OS X (pmzqla)
|
||||
- SEARCH: Show notification if Python is not found and a search is started (pmzqla)
|
||||
- SEARCH: Update link to the Windows Python installer (pmzqla)
|
||||
- SEARCH: Improve checks for python. Print python version and path to log. (sledgehammer999)
|
||||
- SEARCH: Improve Python detection (ngosang)
|
||||
- OTHER: Improvements on the build system (Chocobo1)
|
||||
- OTHER: Bump minimum libtorrent version required to 1.0.6/0.16.19. (sledgehammer999)
|
||||
- OTHER: New translation: Slovenian
|
||||
|
||||
* Sat Jul 11 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.1
|
||||
- FEATURE: Change default preferences (ngosang)
|
||||
- FEATURE: Add "Add link to torrent" menu in TrayIconMenu. Closes #2918. (Chocobo1)
|
||||
- FEATURE: Allow to Open files from the properties pane by pressing "Enter" (pmzqla)
|
||||
- FEATURE: Add checkbox option for IpFilterTrackers. (Chocobo1)
|
||||
- FEATURE: Download-from-URL textbox change focus on tab key (Mayank Asthana)
|
||||
- FEATURE: Increase priority value of "High" (pmzqla)
|
||||
- FEATURE: Add 16 KiB, 8 MiB and 16 MiB piece sizes in Torrent Creator (ngosang)
|
||||
- BUGFIX: Disable Auto piece size when creating a new torrent (ngosang)
|
||||
- BUGFIX: Set default focus to cancel button in delete confirm dlg, closes #3085 (Chocobo1)
|
||||
- BUGFIX: Set default focus to ok button in add new torrent dlg (Chocobo1)
|
||||
- BUGFIX: Set default focus to no button in exit confirm box (Chocobo1)
|
||||
- BUGFIX: Fix Start Minimized checkbox in Options (ngosang)
|
||||
- BUGFIX: Remove limits on alternative speeds setting (LazyBui)
|
||||
- BUGFIX: Fix sorting torrents by ETA (pmzqla)
|
||||
- BUGFIX: Improve ratio calculation formula. Closes #3096. (Chocobo1)
|
||||
- BUGFIX: Clear missing files flag when resuming or force rechecking. Fixes issues in #2750. (sledgehammer999)
|
||||
- BUGFIX: Delete tempfile when downloading favicon.ico. Closes #3257. (sledgehammer999)
|
||||
- BUGFIX: Don't close downloadFromURL dialog when showing empty url warning (Chocobo1)
|
||||
- BUGFIX: Minimize to tray only if the relevant option is enabled. (sledgehammer999)
|
||||
- BUGFIX: Update disk space label after changing partition, closes #3309. (Chocobo1)
|
||||
- BUGFIX: Don't use a default upload limit. Closes #3275. (sledgehammer999)
|
||||
- BUGFIX: Fix Properties bar size when started minimized to tray. Closes #3206. (sledgehammer999)
|
||||
- COSMETIC: Change option text "Confirmation on exit when torrents are active" (Chocobo1)
|
||||
- COSMETIC: Enable to choose dark/light tray icons on all platforms. (Chocobo1)
|
||||
- COSMETIC: Use AllUppercase for label text (Chocobo1)
|
||||
- COSMETIC: changes in typography (ngosang)
|
||||
- COSMETIC: Menu revamp (Chocobo1)
|
||||
- COSMETIC: Revamp general tab info (Chocobo1)
|
||||
- COSMETIC: Better update message for users (Chocobo1)
|
||||
- COSMETIC: Fix ugly 'C++' wrapping in About dialog. (glassez)
|
||||
- WEBUI: Fix login and logout relative URLs (ngosang)
|
||||
- WEBUI: Fix resumeAll and pauseAll. Closes #3016 (ngosang)
|
||||
- WEBUI: Changes in title bar (ngosang)
|
||||
- WEBUI: Complete translatable strings (ngosang)
|
||||
- WEBUI: Minor changes in style (ngosang)
|
||||
- WEBUI: Fix Max connections and Time active in transfer information (ngosang)
|
||||
- WEBUI: New config - Global maximum number of upload slots (ngosang)
|
||||
- WEBUI: Display wasted data with friendly units. Closes #2994 (ngosang)
|
||||
- WEBUI: add delay in shutdown command in order to send out response msg (Chocobo1)
|
||||
- WEBUI: Option to hide Top Toolbar (ngosang)
|
||||
- WEBUI: Reorder the tabs/groups in Options window (ngosang)
|
||||
- WEBUI: Add new options (ngosang)
|
||||
- WEBUI: Increase API_VERSION due to changes in #3279, #3197, #3226 and #3040 (ngosang)
|
||||
- WEBUI: Add Web Seeds (HTTP Sources) tab (ngosang)
|
||||
- WEBUI: Don't update the tabs if tab's panel is collapsed (ngosang)
|
||||
- WEBUI: Fix alternative global rate limits. (ngosang)
|
||||
- SEARCH: Fix thepiratebay. Closes #3012 (ngosang)
|
||||
- SEARCH: Improve torrentz engine to return more results (ngosang)
|
||||
- SEARCH: Change width of columns in search tab. Closes #764 (ngosang)
|
||||
- SEARCH: Make strings translatable in seach engine (ngosang)
|
||||
- SEARCH: Aborting search engine process during closure. Close #2671 (DoumanAsh)
|
||||
- SEARCH: Perform searches in parallel (DoumanAsh)
|
||||
- SEARCH: Add Demonoid search engine (ngosang)
|
||||
- SEARCH: Minor fixes in search engines (ngosang)
|
||||
- SEARCH: Show the version of search engines (ngosang)
|
||||
- SEARCH: Update Legit Torrent to remove sgmllib (DoumanAsh)
|
||||
- SEARCH: Update KickassTorrents (ngosang)
|
||||
- SEARCH: Update BTDigg (ngosang)
|
||||
- SEARCH: Update Torrentz (ngosang)
|
||||
- SEARCH: Update ExtraTorrent (ngosang)
|
||||
- SEARCH: Update TorrentReactor (ngosang)
|
||||
- SEARCH: Fix Python 2 implementation of Torrentz (ngosang)
|
||||
- SEARCH: Cosmetic changes in search engine (ngosang)
|
||||
- SEARCH: Fix column sort in search engine. Closes #2621 (ngosang)
|
||||
- RSS: Update matching RSS articles while editing rules (pmzqla)
|
||||
- WINDOWS: Fix python detection from registry when multiple versions are installed (sledgehammer999)
|
||||
- LINUX: Fixes Linux issue for when the theme doesn't have a corresponding icon. (sledgehammer999)
|
||||
- OTHER: Correctly detect FreeBSD when configuring. (sledgehammer999, yurivict)
|
||||
- OTHER: Add translator to credits.
|
||||
- OTHER: New translation: Indonesian.
|
||||
- OTHER: Split Chinese locales into Chinese Simplified, Chinese Traditional(Taiwan), Chinese Traditional(Hong Kong). (sledgehammer999)
|
||||
|
||||
* Sun May 10 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.0
|
||||
- FEATURE: Show actual protocol for listen success/failure in the log. Needs libtorrent v1.0.0 (Gelmir)
|
||||
- FEATURE: Support per tracker re-announce. Needs libtorrent v1.0.0 (Gelmir)
|
||||
|
@@ -1,9 +1,10 @@
|
||||
qBittorrent - A BitTorrent client in Qt
|
||||
------------------------------------------
|
||||
|
||||
[](https://travis-ci.org/qbittorrent/qBittorrent)
|
||||
[](https://travis-ci.org/qbittorrent/qBittorrent)
|
||||
[](https://scan.coverity.com/projects/5494)
|
||||
********************************
|
||||
###Description:
|
||||
### Description:
|
||||
qBittorrent is a bittorrent client programmed in C++ / Qt that uses
|
||||
libtorrent (sometimes called libtorrent-rasterbar) by Arvid Norberg.
|
||||
|
||||
@@ -39,4 +40,3 @@ You can also meet me (sledgehammer_999) on IRC:
|
||||
|
||||
------------------------------------------
|
||||
sledgehammer999 <sledgehammer999@qbittorrent.org>
|
||||
|
||||
|
60
configure
vendored
60
configure
vendored
@@ -1390,13 +1390,13 @@ Optional Packages:
|
||||
--with-geoip-database-embedded
|
||||
Embed the GeoIP database in the qBittorrent
|
||||
executable (please follow instructions in
|
||||
src/geoip/README) (default=no)
|
||||
src/gui/geoip/README) (default=no)
|
||||
--with-qtsingleapplication=[system|shipped]
|
||||
Use the shipped qtsingleapplication library or the
|
||||
system one (default=shipped)
|
||||
--with-qjson=[system|shipped]
|
||||
Use the shipped qjson library or the system one
|
||||
(default=shipped) (Qt4 only
|
||||
(default=shipped) (Qt4 only)
|
||||
--with-boost[=ARG] use Boost library from a standard location
|
||||
(ARG=yes), from the specified location (ARG=<path>),
|
||||
or disable it (ARG=no) [ARG=yes]
|
||||
@@ -3275,7 +3275,7 @@ IFS=$ac_save_IFS
|
||||
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
|
||||
|
||||
|
||||
am__api_version='1.14'
|
||||
am__api_version='1.15'
|
||||
|
||||
# Find a good install program. We prefer a C program (faster),
|
||||
# so one script is as good as another. But avoid the broken or
|
||||
@@ -3464,7 +3464,7 @@ else
|
||||
$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
|
||||
fi
|
||||
|
||||
if test x"${install_sh}" != xset; then
|
||||
if test x"${install_sh+set}" != xset; then
|
||||
case $am_aux_dir in
|
||||
*\ * | *\ *)
|
||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||
@@ -3855,8 +3855,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
|
||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||
mkdir_p='$(MKDIR_P)'
|
||||
|
||||
# We need awk for the "check" target. The system "awk" is bad on
|
||||
# some platforms.
|
||||
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||
# system "awk" is bad on some platforms.
|
||||
# Always define AMTAR for backward compatibility. Yes, it's still used
|
||||
# in the wild :-( We should find a proper way to deprecate it ...
|
||||
AMTAR='$${TAR-tar}'
|
||||
@@ -4263,7 +4263,7 @@ fi
|
||||
# Detect OS
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OS is FreeBSD" >&5
|
||||
$as_echo_n "checking whether OS is FreeBSD... " >&6; }
|
||||
if test "x$host_os" = "x*FreeBSD*"; then :
|
||||
if expr "$host_os" : ".*freebsd.*" > /dev/null; then :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
|
||||
$as_echo "yes" >&6; }
|
||||
LIBS="-lexecinfo $LIBS"
|
||||
@@ -5294,8 +5294,8 @@ $as_echo "$as_me: Boost.System LIB: $BOOST_SYSTEM_LIB" >&6;}
|
||||
LIBS="$BOOST_SYSTEM_LIB $LIBS"
|
||||
fi
|
||||
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile using libtorrent-raser 0.16.x" >&5
|
||||
$as_echo_n "checking whether to compile using libtorrent-raser 0.16.x... " >&6; }
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to compile using libtorrent-rasterbar 0.16.x" >&5
|
||||
$as_echo_n "checking whether to compile using libtorrent-rasterbar 0.16.x... " >&6; }
|
||||
case "x$with_libtorrent_rasterbar0_16" in #(
|
||||
"xno") :
|
||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||
@@ -5309,12 +5309,12 @@ if test -n "$libtorrent_CFLAGS"; then
|
||||
pkg_cv_libtorrent_CFLAGS="$libtorrent_CFLAGS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 1.0.0\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 1.0.0") 2>&5
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 1.0.6\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 1.0.6") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_libtorrent_CFLAGS=`$PKG_CONFIG --cflags "libtorrent-rasterbar >= 1.0.0" 2>/dev/null`
|
||||
pkg_cv_libtorrent_CFLAGS=`$PKG_CONFIG --cflags "libtorrent-rasterbar >= 1.0.6" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
@@ -5326,12 +5326,12 @@ if test -n "$libtorrent_LIBS"; then
|
||||
pkg_cv_libtorrent_LIBS="$libtorrent_LIBS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 1.0.0\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 1.0.0") 2>&5
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 1.0.6\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 1.0.6") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_libtorrent_LIBS=`$PKG_CONFIG --libs "libtorrent-rasterbar >= 1.0.0" 2>/dev/null`
|
||||
pkg_cv_libtorrent_LIBS=`$PKG_CONFIG --libs "libtorrent-rasterbar >= 1.0.6" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
@@ -5352,14 +5352,14 @@ else
|
||||
_pkg_short_errors_supported=no
|
||||
fi
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent-rasterbar >= 1.0.0" 2>&1`
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent-rasterbar >= 1.0.6" 2>&1`
|
||||
else
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent-rasterbar >= 1.0.0" 2>&1`
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent-rasterbar >= 1.0.6" 2>&1`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$libtorrent_PKG_ERRORS" >&5
|
||||
|
||||
as_fn_error $? "Package requirements (libtorrent-rasterbar >= 1.0.0) were not met:
|
||||
as_fn_error $? "Package requirements (libtorrent-rasterbar >= 1.0.6) were not met:
|
||||
|
||||
$libtorrent_PKG_ERRORS
|
||||
|
||||
@@ -5404,12 +5404,12 @@ if test -n "$libtorrent_CFLAGS"; then
|
||||
pkg_cv_libtorrent_CFLAGS="$libtorrent_CFLAGS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 0.16.0\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 0.16.0") 2>&5
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 0.16.19\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 0.16.19") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_libtorrent_CFLAGS=`$PKG_CONFIG --cflags "libtorrent-rasterbar >= 0.16.0" 2>/dev/null`
|
||||
pkg_cv_libtorrent_CFLAGS=`$PKG_CONFIG --cflags "libtorrent-rasterbar >= 0.16.19" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
@@ -5421,12 +5421,12 @@ if test -n "$libtorrent_LIBS"; then
|
||||
pkg_cv_libtorrent_LIBS="$libtorrent_LIBS"
|
||||
elif test -n "$PKG_CONFIG"; then
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 0.16.0\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 0.16.0") 2>&5
|
||||
{ { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtorrent-rasterbar >= 0.16.19\""; } >&5
|
||||
($PKG_CONFIG --exists --print-errors "libtorrent-rasterbar >= 0.16.19") 2>&5
|
||||
ac_status=$?
|
||||
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
|
||||
test $ac_status = 0; }; then
|
||||
pkg_cv_libtorrent_LIBS=`$PKG_CONFIG --libs "libtorrent-rasterbar >= 0.16.0" 2>/dev/null`
|
||||
pkg_cv_libtorrent_LIBS=`$PKG_CONFIG --libs "libtorrent-rasterbar >= 0.16.19" 2>/dev/null`
|
||||
test "x$?" != "x0" && pkg_failed=yes
|
||||
else
|
||||
pkg_failed=yes
|
||||
@@ -5447,14 +5447,14 @@ else
|
||||
_pkg_short_errors_supported=no
|
||||
fi
|
||||
if test $_pkg_short_errors_supported = yes; then
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent-rasterbar >= 0.16.0" 2>&1`
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libtorrent-rasterbar >= 0.16.19" 2>&1`
|
||||
else
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent-rasterbar >= 0.16.0" 2>&1`
|
||||
libtorrent_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libtorrent-rasterbar >= 0.16.19" 2>&1`
|
||||
fi
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$libtorrent_PKG_ERRORS" >&5
|
||||
|
||||
as_fn_error $? "Package requirements (libtorrent-rasterbar >= 0.16.0) were not met:
|
||||
as_fn_error $? "Package requirements (libtorrent-rasterbar >= 0.16.19) were not met:
|
||||
|
||||
$libtorrent_PKG_ERRORS
|
||||
|
||||
@@ -5801,15 +5801,15 @@ _ACEOF
|
||||
|
||||
# Original extract() function contributed by pmzqla
|
||||
# $*: Strings to parse
|
||||
# Set $DEFINES, $INCLUDES, $OTHER
|
||||
# Set $QBT_CONF_DEFINES, $QBT_CONF_INCLUDES, $QBT_CONF_EXTRA_CFLAGS
|
||||
extract() {
|
||||
if [ -z "$*" ]; then
|
||||
echo "Input string required"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Convert " -" to "\n" if not between quotes
|
||||
string=$(echo " $*" | $SED -e 's: -:\n:g' -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g")
|
||||
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
||||
string=$(echo " $*" | $SED -e 's: -:\n:g' -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[:space:]*//')
|
||||
SAVEIFS=$IFS
|
||||
IFS=$(printf "\n\b")
|
||||
for i in $string; do
|
||||
|
18
configure.ac
18
configure.ac
@@ -26,7 +26,7 @@ AC_ARG_WITH(libtorrent-rasterbar0.16,
|
||||
|
||||
AC_ARG_WITH(geoip-database-embedded,
|
||||
[AS_HELP_STRING([--with-geoip-database-embedded],
|
||||
[Embed the GeoIP database in the qBittorrent executable (please follow instructions in src/geoip/README) (default=no)])],
|
||||
[Embed the GeoIP database in the qBittorrent executable (please follow instructions in src/gui/geoip/README) (default=no)])],
|
||||
[],
|
||||
[with_geoip_database_embedded=no])
|
||||
|
||||
@@ -38,7 +38,7 @@ AC_ARG_WITH(qtsingleapplication,
|
||||
|
||||
AC_ARG_WITH(qjson,
|
||||
[AS_HELP_STRING([--with-qjson=@<:@system|shipped@:>@],
|
||||
[Use the shipped qjson library or the system one (default=shipped) (Qt4 only])],
|
||||
[Use the shipped qjson library or the system one (default=shipped) (Qt4 only)])],
|
||||
[],
|
||||
[with_qjson=shipped])
|
||||
|
||||
@@ -74,7 +74,7 @@ AC_ARG_ENABLE(qt-dbus,
|
||||
|
||||
# Detect OS
|
||||
AC_MSG_CHECKING([whether OS is FreeBSD])
|
||||
AS_IF([test "x$host_os" = "x*FreeBSD*"],
|
||||
AS_IF([expr "$host_os" : ".*freebsd.*" > /dev/null],
|
||||
[AC_MSG_RESULT([yes])
|
||||
LIBS="-lexecinfo $LIBS"],
|
||||
[AC_MSG_RESULT([no])])
|
||||
@@ -181,18 +181,18 @@ AS_IF([test "x$BOOST_SYSTEM_LIB" = "x"],
|
||||
[AC_MSG_NOTICE([Boost.System LIB: $BOOST_SYSTEM_LIB])
|
||||
LIBS="$BOOST_SYSTEM_LIB $LIBS"])
|
||||
|
||||
AC_MSG_CHECKING([whether to compile using libtorrent-raser 0.16.x])
|
||||
AC_MSG_CHECKING([whether to compile using libtorrent-rasterbar 0.16.x])
|
||||
AS_CASE(["x$with_libtorrent_rasterbar0_16"],
|
||||
["xno"],
|
||||
[AC_MSG_RESULT([no])
|
||||
PKG_CHECK_MODULES(libtorrent,
|
||||
[libtorrent-rasterbar >= 1.0.0],
|
||||
[libtorrent-rasterbar >= 1.0.6],
|
||||
[CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS"
|
||||
LIBS="$libtorrent_LIBS $LIBS"])],
|
||||
["xyes"],
|
||||
[AC_MSG_RESULT([yes])
|
||||
PKG_CHECK_MODULES(libtorrent,
|
||||
[libtorrent-rasterbar >= 0.16.0],
|
||||
[libtorrent-rasterbar >= 0.16.19],
|
||||
[CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS"
|
||||
LIBS="$libtorrent_LIBS $LIBS"])],
|
||||
[AC_MSG_RESULT([$with_libtorrent_rasterbar0_16])
|
||||
@@ -251,15 +251,15 @@ AX_DEFINE_DIR([EXPAND_MANDIR], [mandir])
|
||||
|
||||
# Original extract() function contributed by pmzqla
|
||||
# $*: Strings to parse
|
||||
# Set $DEFINES, $INCLUDES, $OTHER
|
||||
# Set $QBT_CONF_DEFINES, $QBT_CONF_INCLUDES, $QBT_CONF_EXTRA_CFLAGS
|
||||
extract() {
|
||||
if [[ -z "$*" ]]; then
|
||||
echo "Input string required"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Convert " -" to "\n" if not between quotes
|
||||
string=$(echo " $*" | $SED -e 's: -:\n:g' -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g")
|
||||
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
|
||||
string=$(echo " $*" | $SED -e 's: -:\n:g' -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//')
|
||||
SAVEIFS=$IFS
|
||||
IFS=$(printf "\n\b")
|
||||
for i in $string; do
|
||||
|
4
dist/mac/Info.plist
vendored
4
dist/mac/Info.plist
vendored
@@ -45,7 +45,7 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>3.2.0</string>
|
||||
<string>3.2.2</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>qBit</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
@@ -59,7 +59,7 @@
|
||||
<key>NSAppleScriptEnabled</key>
|
||||
<string>YES</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>Copyright © 2006-2013 The qBittorrent project</string>
|
||||
<string>Copyright © 2006-2015 The qBittorrent project</string>
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
|
2
dist/unix/qBittorrent.appdata.xml
vendored
2
dist/unix/qBittorrent.appdata.xml
vendored
@@ -57,5 +57,5 @@
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<url type="homepage">http://www.qbittorrent.org/</url>
|
||||
<updatecontact>sledgehammer999@qbittorrent.org</updatecontact>
|
||||
<update_contact>sledgehammer999@qbittorrent.org</update_contact>
|
||||
</component>
|
||||
|
4
dist/windows/options.nsi
vendored
4
dist/windows/options.nsi
vendored
@@ -19,7 +19,7 @@ XPStyle on
|
||||
!define CSIDL_APPDATA '0x1A' ;Application Data path
|
||||
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
|
||||
|
||||
!define PROG_VERSION "3.2.0"
|
||||
!define PROG_VERSION "3.2.2"
|
||||
!define MUI_FINISHPAGE_RUN
|
||||
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
|
||||
!define MUI_FINISHPAGE_RUN_TEXT $(launch_qbt)
|
||||
@@ -33,7 +33,7 @@ OutFile "qbittorrent_${PROG_VERSION}_setup.exe"
|
||||
;Installer Version Information
|
||||
VIAddVersionKey "ProductName" "qBittorrent"
|
||||
VIAddVersionKey "CompanyName" "The qBittorrent project"
|
||||
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2014 The qBittorrent project"
|
||||
VIAddVersionKey "LegalCopyright" "Copyright ©2006-2015 The qBittorrent project"
|
||||
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
|
||||
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
|
||||
|
||||
|
@@ -222,10 +222,10 @@ bool Application::event(QEvent *ev)
|
||||
// Get the url instead
|
||||
path = static_cast<QFileOpenEvent *>(ev)->url().toString();
|
||||
qDebug("Received a mac file open event: %s", qPrintable(path));
|
||||
if (running_)
|
||||
if (m_running)
|
||||
processParams(QStringList(path));
|
||||
else
|
||||
paramsQueue_.append(path);
|
||||
m_paramsQueue.append(path);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
@@ -253,6 +253,7 @@ void Application::initializeTranslation()
|
||||
Preferences* const pref = Preferences::instance();
|
||||
// Load translation
|
||||
QString locale = pref->getLocale();
|
||||
|
||||
if (locale.isEmpty()) {
|
||||
locale = QLocale::system().name();
|
||||
pref->setLocale(locale);
|
||||
|
@@ -379,7 +379,7 @@ QString makeUsage(const QString &prg_name)
|
||||
#endif
|
||||
text += QLatin1String("\t-h | --help\t\t") + QObject::tr("Displays this help message") + QLatin1Char('\n');
|
||||
text += QLatin1String("\t--webui-port=<port>\t")
|
||||
+ QObject::tr("Changes the webui port (current: %1)").arg(QString::number(Preferences::instance()->getWebUiPort()))
|
||||
+ QObject::tr("Changes the Web UI port (current: %1)").arg(QString::number(Preferences::instance()->getWebUiPort()))
|
||||
+ QLatin1Char('\n');
|
||||
#ifndef DISABLE_GUI
|
||||
text += QLatin1String("\t--no-splash\t\t") + QObject::tr("Disable splash screen") + QLatin1Char('\n');
|
||||
|
@@ -41,6 +41,7 @@
|
||||
|
||||
#include "qtlocalpeer.h"
|
||||
#include <QCoreApplication>
|
||||
#include <QDataStream>
|
||||
#include <QTime>
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
|
@@ -23,7 +23,8 @@ HEADERS += \
|
||||
$$PWD/http/responsegenerator.h \
|
||||
$$PWD/http/server.h \
|
||||
$$PWD/http/types.h \
|
||||
$$PWD/http/responsebuilder.h
|
||||
$$PWD/http/responsebuilder.h \
|
||||
$$PWD/unicodestrings.h
|
||||
|
||||
SOURCES += \
|
||||
$$PWD/downloadthread.cpp \
|
||||
|
@@ -76,7 +76,7 @@ void DNSUpdater::checkPublicIP()
|
||||
m_lastIPCheckTime = QDateTime::currentDateTime();
|
||||
QNetworkRequest request;
|
||||
request.setUrl(QUrl("http://checkip.dyndns.org"));
|
||||
request.setRawHeader("User-Agent", "qBittorrent/" VERSION" chris@qbittorrent.org");
|
||||
request.setRawHeader("User-Agent", "qBittorrent/" VERSION);
|
||||
manager->get(request);
|
||||
}
|
||||
|
||||
@@ -123,7 +123,7 @@ void DNSUpdater::updateDNSService()
|
||||
m_lastIPCheckTime = QDateTime::currentDateTime();
|
||||
QNetworkRequest request;
|
||||
request.setUrl(getUpdateUrl());
|
||||
request.setRawHeader("User-Agent", "qBittorrent/" VERSION" chris@qbittorrent.org");
|
||||
request.setRawHeader("User-Agent", "qBittorrent/" VERSION);
|
||||
manager->get(request);
|
||||
}
|
||||
|
||||
|
@@ -191,9 +191,8 @@ QNetworkReply* DownloadThread::downloadUrl(const QString &url, const QList<QNetw
|
||||
qDebug("url is %s", qPrintable(url));
|
||||
const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
|
||||
QNetworkRequest request(qurl);
|
||||
// Spoof Firefox 3.5 user agent to avoid
|
||||
// Web server banning
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5");
|
||||
// Spoof Firefox 38 user agent to avoid web server banning
|
||||
request.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:38.0) Gecko/20100101 Firefox/38.0");
|
||||
qDebug("Downloading %s...", request.url().toEncoded().data());
|
||||
qDebug("%d cookies for this URL", m_networkManager.cookieJar()->cookiesForUrl(url).size());
|
||||
for (int i=0; i<m_networkManager.cookieJar()->cookiesForUrl(url).size(); ++i) {
|
||||
|
@@ -187,6 +187,27 @@ bool fsutils::forceRemove(const QString& file_path) {
|
||||
return f.remove();
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes directory and its content recursively.
|
||||
*
|
||||
*/
|
||||
void fsutils::removeDirRecursive(const QString& dirName) {
|
||||
QDir dir(dirName);
|
||||
|
||||
if (!dir.exists()) return;
|
||||
|
||||
Q_FOREACH(QFileInfo info, dir.entryInfoList(QDir::NoDotAndDotDot |
|
||||
QDir::System |
|
||||
QDir::Hidden |
|
||||
QDir::AllDirs |
|
||||
QDir::Files, QDir::DirsFirst)) {
|
||||
if (info.isDir()) removeDirRecursive(info.absoluteFilePath());
|
||||
else forceRemove(info.absoluteFilePath());
|
||||
}
|
||||
|
||||
dir.rmdir(dirName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the size of a file.
|
||||
* If the file is a folder, it will compute its size based on its content.
|
||||
|
@@ -57,6 +57,7 @@ namespace fsutils
|
||||
bool isValidTorrentFile(const QString& path);
|
||||
bool smartRemoveEmptyFolderTree(const QString& dir_path);
|
||||
bool forceRemove(const QString& file_path);
|
||||
void removeDirRecursive(const QString& dirName);
|
||||
|
||||
/* Ported from Qt4 to drop dependency on QtGui */
|
||||
QString QDesktopServicesDataLocation();
|
||||
|
@@ -79,9 +79,8 @@ RequestParser::ErrorCode RequestParser::parseHttpRequest(const QByteArray& data,
|
||||
}
|
||||
|
||||
// Parse HTTP request message
|
||||
int content_length = 0;
|
||||
if (m_request.headers.contains("content-length")) {
|
||||
content_length = m_request.headers["content-length"].toInt();
|
||||
int content_length = m_request.headers["content-length"].toInt();
|
||||
if (content_length > static_cast<int>(m_maxContentLength)) {
|
||||
qWarning() << Q_FUNC_INFO << "bad request: message too long";
|
||||
return BadRequest;
|
||||
@@ -331,16 +330,22 @@ bool RequestParser::parseFormData(const QByteArray& data)
|
||||
|
||||
bool RequestParser::parseHeaderValue(const QString& value, QStringMap& out)
|
||||
{
|
||||
QStringList items = value.split(QLatin1Char(';'));
|
||||
out[""] = items[0];
|
||||
|
||||
for (QStringList::size_type i = 1; i < items.size(); ++i) {
|
||||
int pos = items[i].indexOf("=");
|
||||
if (pos < 0)
|
||||
return false;
|
||||
|
||||
out[items[i].left(pos).trimmed()] = unquoted(items[i].mid(pos + 1).trimmed());
|
||||
int pos = value.indexOf(QLatin1Char(';'));
|
||||
if (pos == -1) {
|
||||
out[""] = value.trimmed();
|
||||
return true;
|
||||
}
|
||||
|
||||
out[""] = value.left(pos).trimmed();
|
||||
|
||||
QRegExp rx(";\\s*([^=;\"]+)\\s*=\\s*(\"[^\"]*\"|[^\";\\s]+)\\s*");
|
||||
while (rx.indexIn(value, pos) == pos) {
|
||||
out[rx.cap(1).trimmed()] = unquoted(rx.cap(2));
|
||||
pos += rx.cap(0).length();
|
||||
}
|
||||
|
||||
if (pos != value.length())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@@ -47,7 +47,8 @@ const QString HEADER_CACHE_CONTROL = "Cache-Control";
|
||||
const QString CONTENT_TYPE_CSS = "text/css; charset=UTF-8";
|
||||
const QString CONTENT_TYPE_GIF = "image/gif";
|
||||
const QString CONTENT_TYPE_HTML = "text/html; charset=UTF-8";
|
||||
const QString CONTENT_TYPE_JS = "text/javascript; charset=UTF-8";
|
||||
const QString CONTENT_TYPE_JS = "application/javascript; charset=UTF-8";
|
||||
const QString CONTENT_TYPE_JSON = "application/json";
|
||||
const QString CONTENT_TYPE_PNG = "image/png";
|
||||
const QString CONTENT_TYPE_TXT = "text/plain; charset=UTF-8";
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* Bittorrent Client using Qt4 and libtorrent.
|
||||
* Copyright (C) 2006 Christophe Dumez
|
||||
*
|
||||
@@ -28,6 +28,8 @@
|
||||
* Contact : chris@qbittorrent.org
|
||||
*/
|
||||
|
||||
#include "core/unicodestrings.h"
|
||||
#include "core/logger.h"
|
||||
#include "misc.h"
|
||||
|
||||
#include <cmath>
|
||||
@@ -183,9 +185,7 @@ void misc::shutdownComputer(shutDownAction action)
|
||||
AppleEvent eventReply = {typeNull, NULL};
|
||||
AppleEvent appleEventToSend = {typeNull, NULL};
|
||||
|
||||
OSStatus error = noErr;
|
||||
|
||||
error = AECreateDesc(typeProcessSerialNumber, &kPSNOfSystemProcess,
|
||||
OSStatus error = AECreateDesc(typeProcessSerialNumber, &kPSNOfSystemProcess,
|
||||
sizeof(kPSNOfSystemProcess), &targetDesc);
|
||||
|
||||
if (error != noErr)
|
||||
@@ -264,26 +264,78 @@ QPoint misc::screenCenter(QWidget *win)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Detects the version of python by calling
|
||||
* "python --version" and parsing the output.
|
||||
* Detects the python version.
|
||||
*/
|
||||
int misc::pythonVersion()
|
||||
{
|
||||
static int version = -1;
|
||||
if (version < 0) {
|
||||
QProcess python_proc;
|
||||
python_proc.start("python", QStringList() << "--version", QIODevice::ReadOnly);
|
||||
if (!python_proc.waitForFinished()) return -1;
|
||||
if (python_proc.exitCode() < 0) return -1;
|
||||
QByteArray output = python_proc.readAllStandardOutput();
|
||||
if (output.isEmpty())
|
||||
output = python_proc.readAllStandardError();
|
||||
const QByteArray version_str = output.split(' ').last();
|
||||
qDebug() << "Python version is:" << version_str.trimmed();
|
||||
if (version_str.startsWith("3."))
|
||||
version = 3;
|
||||
QString versionComplete = pythonVersionComplete().trimmed();
|
||||
QStringList splitted = versionComplete.split('.');
|
||||
if (splitted.size() > 1) {
|
||||
int highVer = splitted.at(0).toInt();
|
||||
if ((highVer == 2) || (highVer == 3))
|
||||
version = highVer;
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detects the python executable by calling "python --version".
|
||||
*/
|
||||
QString misc::pythonExecutable()
|
||||
{
|
||||
static QString executable;
|
||||
if (executable.isEmpty()) {
|
||||
QProcess pythonProc;
|
||||
#if defined(Q_OS_UNIX)
|
||||
/*
|
||||
* On Unix-Like Systems python2 and python3 should always exist
|
||||
* http://legacy.python.org/dev/peps/pep-0394/
|
||||
*/
|
||||
pythonProc.start("python3", QStringList() << "--version", QIODevice::ReadOnly);
|
||||
if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) {
|
||||
executable = "python3";
|
||||
return executable;
|
||||
}
|
||||
pythonProc.start("python2", QStringList() << "--version", QIODevice::ReadOnly);
|
||||
if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) {
|
||||
executable = "python2";
|
||||
return executable;
|
||||
}
|
||||
#endif
|
||||
// Look for "python" in Windows and in UNIX if "python2" and "python3" are
|
||||
// not detected.
|
||||
pythonProc.start("python", QStringList() << "--version", QIODevice::ReadOnly);
|
||||
if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0)
|
||||
executable = "python";
|
||||
else
|
||||
version = 2;
|
||||
Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python not detected"), Log::INFO);
|
||||
}
|
||||
return executable;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the complete python version
|
||||
* eg 2.7.9
|
||||
* Make sure to have setup python first
|
||||
*/
|
||||
QString misc::pythonVersionComplete() {
|
||||
static QString version;
|
||||
if (version.isEmpty()) {
|
||||
if (pythonExecutable().isEmpty())
|
||||
return version;
|
||||
QProcess pythonProc;
|
||||
pythonProc.start(pythonExecutable(), QStringList() << "--version", QIODevice::ReadOnly);
|
||||
if (pythonProc.waitForFinished() && pythonProc.exitCode() == 0) {
|
||||
QByteArray output = pythonProc.readAllStandardOutput();
|
||||
if (output.isEmpty())
|
||||
output = pythonProc.readAllStandardError();
|
||||
const QByteArray versionStr = output.split(' ').last();
|
||||
version = versionStr.trimmed();
|
||||
Logger::instance()->addMessage(QCoreApplication::translate("misc", "Python version: %1").arg(version), Log::INFO);
|
||||
}
|
||||
}
|
||||
return version;
|
||||
}
|
||||
@@ -298,8 +350,10 @@ QString misc::friendlyUnit(qreal val, bool is_speed)
|
||||
if (val < 0)
|
||||
return QCoreApplication::translate("misc", "Unknown", "Unknown (size)");
|
||||
int i = 0;
|
||||
while(val >= 1024. && i++<6)
|
||||
while(val >= 1024. && i < 4) {
|
||||
val /= 1024.;
|
||||
++i;
|
||||
}
|
||||
QString ret;
|
||||
if (i == 0)
|
||||
ret = QString::number((long)val) + " " + QCoreApplication::translate("misc", units[0].source, units[0].comment);
|
||||
@@ -405,7 +459,7 @@ QString misc::magnetUriToHash(const QString& magnet_uri)
|
||||
QString misc::userFriendlyDuration(qlonglong seconds)
|
||||
{
|
||||
if (seconds < 0 || seconds >= MAX_ETA)
|
||||
return QString::fromUtf8("∞");
|
||||
return QString::fromUtf8(C_INFINITY);
|
||||
if (seconds == 0)
|
||||
return "0";
|
||||
if (seconds < 60)
|
||||
@@ -421,7 +475,7 @@ QString misc::userFriendlyDuration(qlonglong seconds)
|
||||
hours = hours - days * 24;
|
||||
if (days < 100)
|
||||
return QCoreApplication::translate("misc", "%1d %2h", "e.g: 2days 10hours").arg(QString::number(days)).arg(QString::number(hours));
|
||||
return QString::fromUtf8("∞");
|
||||
return QString::fromUtf8(C_INFINITY);
|
||||
}
|
||||
|
||||
QString misc::getUserIDString()
|
||||
@@ -527,12 +581,14 @@ QString misc::parseHtmlLinks(const QString &raw_text)
|
||||
static QRegExp reNoScheme("<a\\s+href=\"(?!http(s?))([a-zA-Z0-9\\?%=&/_\\.-:#]+)\\s*\">");
|
||||
result.replace(reNoScheme, "<a href=\"http://\\1\">");
|
||||
|
||||
// to preserve plain text formatting
|
||||
result = "<p style=\"white-space: pre-wrap;\">" + result + "</p>";
|
||||
return result;
|
||||
}
|
||||
|
||||
QString misc::toQString(time_t t)
|
||||
QString misc::toQString(time_t t, Qt::DateFormat f)
|
||||
{
|
||||
return QDateTime::fromTime_t(t).toString(Qt::DefaultLocaleLongDate);
|
||||
return QDateTime::fromTime_t(t).toString(f);
|
||||
}
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
|
@@ -64,6 +64,7 @@ namespace misc
|
||||
{
|
||||
QString toQString(const std::string &str);
|
||||
QString toQString(const char* str);
|
||||
QString toQString(time_t t, Qt::DateFormat f = Qt::DefaultLocaleLongDate);
|
||||
QString toQStringU(const std::string &str);
|
||||
QString toQStringU(const char* str);
|
||||
QString toQString(const libtorrent::sha1_hash &hash);
|
||||
@@ -81,6 +82,8 @@ namespace misc
|
||||
QPoint screenCenter(QWidget *win);
|
||||
#endif
|
||||
int pythonVersion();
|
||||
QString pythonExecutable();
|
||||
QString pythonVersionComplete();
|
||||
// return best userfriendly storage unit (B, KiB, MiB, GiB, TiB)
|
||||
// use Binary prefix standards from IEC 60027-2
|
||||
// see http://en.wikipedia.org/wiki/Kilobyte
|
||||
@@ -100,7 +103,6 @@ namespace misc
|
||||
QList<int> intListfromStringList(const QStringList &l);
|
||||
QList<bool> boolListfromStringList(const QStringList &l);
|
||||
|
||||
QString toQString(time_t t);
|
||||
QString accurateDoubleToString(const double &n, const int &precision);
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
|
@@ -295,7 +295,7 @@ void Preferences::setMinimizeToTray(bool b)
|
||||
|
||||
bool Preferences::closeToTray() const
|
||||
{
|
||||
return value("Preferences/General/CloseToTray", false).toBool();
|
||||
return value("Preferences/General/CloseToTray", true).toBool();
|
||||
}
|
||||
|
||||
void Preferences::setCloseToTray(bool b)
|
||||
@@ -627,7 +627,7 @@ int Preferences::getSessionPort() const
|
||||
QReadLocker locker(&lock);
|
||||
if (useRandomPort())
|
||||
return m_randomPort;
|
||||
return value("Preferences/Connection/PortRangeMin", 6881).toInt();
|
||||
return value("Preferences/Connection/PortRangeMin", 8999).toInt();
|
||||
}
|
||||
|
||||
void Preferences::setSessionPort(int port)
|
||||
@@ -659,7 +659,7 @@ void Preferences::setGlobalDownloadLimit(int limit)
|
||||
|
||||
int Preferences::getGlobalUploadLimit() const
|
||||
{
|
||||
return value("Preferences/Connection/GlobalUPLimit", 50).toInt();
|
||||
return value("Preferences/Connection/GlobalUPLimit", -1).toInt();
|
||||
}
|
||||
|
||||
void Preferences::setGlobalUploadLimit(int limit)
|
||||
@@ -858,7 +858,7 @@ void Preferences::setMaxConnecsPerTorrent(int val)
|
||||
|
||||
int Preferences::getMaxUploads() const
|
||||
{
|
||||
return value("Preferences/Bittorrent/MaxUploads", 8).toInt();
|
||||
return value("Preferences/Bittorrent/MaxUploads", -1).toInt();
|
||||
}
|
||||
|
||||
void Preferences::setMaxUploads(int val)
|
||||
@@ -870,7 +870,7 @@ void Preferences::setMaxUploads(int val)
|
||||
|
||||
int Preferences::getMaxUploadsPerTorrent() const
|
||||
{
|
||||
return value("Preferences/Bittorrent/MaxUploadsPerTorrent", 4).toInt();
|
||||
return value("Preferences/Bittorrent/MaxUploadsPerTorrent", -1).toInt();
|
||||
}
|
||||
|
||||
void Preferences::setMaxUploadsPerTorrent(int val)
|
||||
@@ -971,6 +971,16 @@ void Preferences::setFilteringEnabled(bool enabled)
|
||||
setValue("Preferences/IPFilter/Enabled", enabled);
|
||||
}
|
||||
|
||||
bool Preferences::isFilteringTrackerEnabled() const
|
||||
{
|
||||
return value("Preferences/IPFilter/FilterTracker", false).toBool();
|
||||
}
|
||||
|
||||
void Preferences::setFilteringTrackerEnabled(bool enabled)
|
||||
{
|
||||
setValue("Preferences/IPFilter/FilterTracker", enabled);
|
||||
}
|
||||
|
||||
QString Preferences::getFilter() const
|
||||
{
|
||||
return fsutils::fromNativePath(value("Preferences/IPFilter/File").toString());
|
||||
@@ -1020,7 +1030,7 @@ void Preferences::setExecutionLogEnabled(bool b)
|
||||
// Queueing system
|
||||
bool Preferences::isQueueingSystemEnabled() const
|
||||
{
|
||||
return value("Preferences/Queueing/QueueingEnabled", false).toBool();
|
||||
return value("Preferences/Queueing/QueueingEnabled", true).toBool();
|
||||
}
|
||||
|
||||
void Preferences::setQueueingSystemEnabled(bool enabled)
|
||||
@@ -1479,7 +1489,7 @@ void Preferences::resolvePeerHostNames(bool resolve)
|
||||
|
||||
int Preferences::getMaxHalfOpenConnections() const
|
||||
{
|
||||
const int val = value("Preferences/Connection/MaxHalfOpenConnec", 50).toInt();
|
||||
const int val = value("Preferences/Connection/MaxHalfOpenConnec", 20).toInt();
|
||||
if (val <= 0)
|
||||
return -1;
|
||||
return val;
|
||||
@@ -1554,7 +1564,7 @@ void Preferences::enableSuperSeeding(bool enabled)
|
||||
|
||||
bool Preferences::announceToAllTrackers() const
|
||||
{
|
||||
return value("Preferences/Advanced/AnnounceToAllTrackers", false).toBool();
|
||||
return value("Preferences/Advanced/AnnounceToAllTrackers", true).toBool();
|
||||
}
|
||||
|
||||
void Preferences::setAnnounceToAllTrackers(bool enabled)
|
||||
@@ -1636,7 +1646,7 @@ namespace {
|
||||
|
||||
for (DWORD i = 0; i < cSubKeys; ++i) {
|
||||
cName = cMaxSubKeyLen;
|
||||
res = ::RegEnumKeyExW(handle, 0, lpName, &cName, NULL, NULL, NULL, NULL);
|
||||
res = ::RegEnumKeyExW(handle, i, lpName, &cName, NULL, NULL, NULL, NULL);
|
||||
if (res == ERROR_SUCCESS)
|
||||
keys.push_back(QString::fromWCharArray(lpName));
|
||||
}
|
||||
@@ -1750,11 +1760,12 @@ QString Preferences::getPythonPath()
|
||||
return path;
|
||||
|
||||
// Fallback: Detect python from default locations
|
||||
QStringList supported_versions;
|
||||
supported_versions << "32" << "31" << "30" << "27" << "26" << "25";
|
||||
foreach (const QString &v, supported_versions)
|
||||
if (QFile::exists("C:/Python" + v + "/python.exe"))
|
||||
return "C:/Python" + v;
|
||||
const QStringList dirs = QDir("C:/").entryList(QStringList("Python*"), QDir::Dirs, QDir::Name | QDir::Reversed);
|
||||
foreach (const QString &dir, dirs) {
|
||||
const QString path("C:/" + dir + "/");
|
||||
if (QFile::exists(path + "python.exe"))
|
||||
return path;
|
||||
}
|
||||
|
||||
return QString();
|
||||
}
|
||||
@@ -1881,6 +1892,16 @@ void Preferences::setConfirmTorrentDeletion(bool enabled)
|
||||
setValue("Preferences/Advanced/confirmTorrentDeletion", enabled);
|
||||
}
|
||||
|
||||
bool Preferences::confirmTorrentRecheck() const
|
||||
{
|
||||
return value("Preferences/Advanced/confirmTorrentRecheck", true).toBool();
|
||||
}
|
||||
|
||||
void Preferences::setConfirmTorrentRecheck(bool enabled)
|
||||
{
|
||||
setValue("Preferences/Advanced/confirmTorrentRecheck", enabled);
|
||||
}
|
||||
|
||||
TrayIcon::Style Preferences::trayIconStyle() const
|
||||
{
|
||||
return TrayIcon::Style(value("Preferences/Advanced/TrayIconStyle", TrayIcon::NORMAL).toInt());
|
||||
|
@@ -282,6 +282,8 @@ public:
|
||||
// IP Filter
|
||||
bool isFilteringEnabled() const;
|
||||
void setFilteringEnabled(bool enabled);
|
||||
bool isFilteringTrackerEnabled() const;
|
||||
void setFilteringTrackerEnabled(bool enabled);
|
||||
QString getFilter() const;
|
||||
void setFilter(const QString &path);
|
||||
QStringList bannedIPs() const;
|
||||
@@ -424,6 +426,8 @@ public:
|
||||
#endif
|
||||
bool confirmTorrentDeletion() const;
|
||||
void setConfirmTorrentDeletion(bool enabled);
|
||||
bool confirmTorrentRecheck() const;
|
||||
void setConfirmTorrentRecheck(bool enabled);
|
||||
TrayIcon::Style trayIconStyle() const;
|
||||
void setTrayIconStyle(TrayIcon::Style style);
|
||||
|
||||
|
@@ -105,10 +105,7 @@ void QAlertDispatcher::dispatch(QSharedPointer<Tag> tag,
|
||||
return;
|
||||
|
||||
bool was_empty = that->alerts.empty();
|
||||
|
||||
that->alerts.push_back(alert_ptr.get());
|
||||
alert_ptr.release();
|
||||
|
||||
that->alerts.push_back(alert_ptr.release());
|
||||
if (was_empty)
|
||||
that->alerts_condvar.wakeAll();
|
||||
|
||||
|
@@ -131,7 +131,7 @@ QBtSession::QBtSession()
|
||||
// Construct session
|
||||
s = new session(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)), 0);
|
||||
//std::cout << "Peer ID: " << fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string() << std::endl;
|
||||
Logger::instance()->addMessage("Peer ID: "+misc::toQString(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string()));
|
||||
Logger::instance()->addMessage(tr("Peer ID: ")+misc::toQString(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string()));
|
||||
|
||||
// Set severity level of libtorrent session
|
||||
s->set_alert_mask(alert::error_notification | alert::peer_notification | alert::port_mapping_notification | alert::storage_notification | alert::tracker_notification | alert::status_notification | alert::ip_block_notification | alert::progress_notification | alert::stats_notification);
|
||||
@@ -414,9 +414,9 @@ void QBtSession::configureSession() {
|
||||
// * Session settings
|
||||
session_settings sessionSettings = s->settings();
|
||||
sessionSettings.user_agent = "qBittorrent " VERSION;
|
||||
//std::cout << "HTTP user agent is " << sessionSettings.user_agent << std::endl;
|
||||
logger->addMessage(tr("HTTP user agent is %1").arg(misc::toQString(sessionSettings.user_agent)));
|
||||
logger->addMessage(tr("HTTP User-Agent is %1").arg(misc::toQString(sessionSettings.user_agent)));
|
||||
|
||||
sessionSettings.apply_ip_filter_to_trackers = pref->isFilteringTrackerEnabled();
|
||||
sessionSettings.upnp_ignore_nonrouters = true;
|
||||
sessionSettings.use_dht_as_fallback = false;
|
||||
// Disable support for SSL torrents for now
|
||||
@@ -1253,9 +1253,9 @@ void QBtSession::loadTorrentTempData(QTorrentHandle &h, QString savePath, bool m
|
||||
|
||||
// Update file names
|
||||
const QStringList files_path = TorrentTempData::getFilesPath(hash);
|
||||
bool force_recheck = false;
|
||||
QDir base_dir(h.save_path());
|
||||
if (files_path.size() == h.num_files()) {
|
||||
bool force_recheck = false;
|
||||
for (int i=0; i<h.num_files(); ++i) {
|
||||
const QString &path = files_path.at(i);
|
||||
if (!force_recheck && base_dir.exists(path))
|
||||
@@ -1552,36 +1552,21 @@ void QBtSession::enableDHT(bool b) {
|
||||
}
|
||||
|
||||
qreal QBtSession::getRealRatio(const libtorrent::torrent_status &status) const {
|
||||
libtorrent::size_type all_time_upload = status.all_time_upload;
|
||||
libtorrent::size_type all_time_download = status.all_time_download;
|
||||
libtorrent::size_type total_done = status.total_done;
|
||||
libtorrent::size_type upload = status.all_time_upload;
|
||||
// special case for a seeder who lost its stats, also assume nobody will import a 99% done torrent
|
||||
libtorrent::size_type download = (status.all_time_download < status.total_done * 0.01) ? status.total_done : status.all_time_download;
|
||||
|
||||
if (all_time_download < total_done) {
|
||||
// We have more data on disk than we downloaded
|
||||
// either because the user imported the file
|
||||
// or because of crash the download histroy was lost.
|
||||
// Otherwise will get weird ratios
|
||||
// eg when downloaded 1KB and uploaded 700MB of a
|
||||
// 700MB torrent.
|
||||
all_time_download = total_done;
|
||||
}
|
||||
if (download == 0)
|
||||
return (upload == 0) ? 0.0 : MAX_RATIO;
|
||||
|
||||
if (all_time_download == 0) {
|
||||
if (all_time_upload == 0)
|
||||
return 0.0;
|
||||
return MAX_RATIO+1;
|
||||
}
|
||||
|
||||
qreal ratio = all_time_upload / (float) all_time_download;
|
||||
Q_ASSERT(ratio >= 0.);
|
||||
if (ratio > MAX_RATIO)
|
||||
ratio = MAX_RATIO;
|
||||
return ratio;
|
||||
qreal ratio = upload / (qreal) download;
|
||||
Q_ASSERT(ratio >= 0.0);
|
||||
return (ratio > MAX_RATIO) ? MAX_RATIO : ratio;
|
||||
}
|
||||
|
||||
// Called periodically
|
||||
void QBtSession::saveTempFastResumeData() {
|
||||
std::vector<torrent_handle> torrents = s->get_torrents();
|
||||
std::vector<torrent_handle> torrents = s->get_torrents();
|
||||
|
||||
std::vector<torrent_handle>::iterator torrentIT = torrents.begin();
|
||||
std::vector<torrent_handle>::iterator torrentITend = torrents.end();
|
||||
@@ -2209,15 +2194,7 @@ void QBtSession::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert*
|
||||
qDebug("Emitting finishedTorrent() signal");
|
||||
emit finishedTorrent(h);
|
||||
qDebug("Received finished alert for %s", qPrintable(h.name()));
|
||||
#ifndef DISABLE_GUI
|
||||
bool will_shutdown = (pref->shutdownWhenDownloadsComplete() ||
|
||||
pref->shutdownqBTWhenDownloadsComplete() ||
|
||||
pref->suspendWhenDownloadsComplete() ||
|
||||
pref->hibernateWhenDownloadsComplete())
|
||||
&& !hasDownloadingTorrents();
|
||||
#else
|
||||
bool will_shutdown = false;
|
||||
#endif
|
||||
|
||||
// AutoRun program
|
||||
if (pref->isAutoRunEnabled())
|
||||
autoRunExternalProgram(h);
|
||||
@@ -2227,8 +2204,15 @@ void QBtSession::handleTorrentFinishedAlert(libtorrent::torrent_finished_alert*
|
||||
// Mail notification
|
||||
if (pref->isMailNotificationEnabled())
|
||||
sendNotificationEmail(h);
|
||||
|
||||
#ifndef DISABLE_GUI
|
||||
// Auto-Shutdown
|
||||
bool will_shutdown = (pref->shutdownWhenDownloadsComplete() ||
|
||||
pref->shutdownqBTWhenDownloadsComplete() ||
|
||||
pref->suspendWhenDownloadsComplete() ||
|
||||
pref->hibernateWhenDownloadsComplete())
|
||||
&& !hasDownloadingTorrents();
|
||||
|
||||
if (will_shutdown) {
|
||||
bool suspend = pref->suspendWhenDownloadsComplete();
|
||||
bool hibernate = pref->hibernateWhenDownloadsComplete();
|
||||
@@ -2622,7 +2606,7 @@ void QBtSession::handleFastResumeRejectedAlert(libtorrent::fastresume_rejected_a
|
||||
}
|
||||
|
||||
void QBtSession::handleUrlSeedAlert(libtorrent::url_seed_alert* p) {
|
||||
Logger::instance()->addMessage(tr("Url seed lookup failed for url: %1, message: %2").arg(misc::toQString(p->url)).arg(misc::toQStringU(p->message())), Log::CRITICAL);
|
||||
Logger::instance()->addMessage(tr("URL seed lookup failed for url: %1, message: %2").arg(misc::toQString(p->url)).arg(misc::toQStringU(p->message())), Log::CRITICAL);
|
||||
}
|
||||
|
||||
void QBtSession::handleListenSucceededAlert(libtorrent::listen_succeeded_alert *p) {
|
||||
|
@@ -533,6 +533,7 @@ void QTorrentHandle::resume(const bool force) const
|
||||
bool has_persistant_error = TorPersistent->hasError(torrent_hash);
|
||||
TorPersistent->setErrorState(torrent_hash, false);
|
||||
bool temp_path_enabled = Preferences::instance()->isTempPathEnabled();
|
||||
TorPersistent->setHasMissingFiles(torrent_hash, false);
|
||||
if (has_persistant_error && temp_path_enabled) {
|
||||
// Torrent was supposed to be seeding, checking again in final destination
|
||||
qDebug("Resuming a torrent with error...");
|
||||
@@ -732,8 +733,8 @@ void QTorrentHandle::prioritize_first_last_piece(bool b) const
|
||||
{
|
||||
if (!has_metadata()) return;
|
||||
// Download first and last pieces first for all media files in the torrent
|
||||
const uint nbfiles = num_files();
|
||||
for (uint index = 0; index < nbfiles; ++index) {
|
||||
const int nbfiles = num_files();
|
||||
for (int index = 0; index < nbfiles; ++index) {
|
||||
const QString path = filepath_at(index);
|
||||
const QString ext = fsutils::fileExtension(path);
|
||||
if (misc::isPreviewable(ext) && torrent_handle::file_priority(index) > 0) {
|
||||
|
@@ -418,8 +418,8 @@ QVariant TorrentModel::headerData(int section, Qt::Orientation orientation,
|
||||
if (orientation == Qt::Horizontal) {
|
||||
if (role == Qt::DisplayRole) {
|
||||
switch(section) {
|
||||
case TorrentModelItem::TR_NAME: return tr("Name", "i.e: torrent name");
|
||||
case TorrentModelItem::TR_PRIORITY: return "#";
|
||||
case TorrentModelItem::TR_NAME: return tr("Name", "i.e: torrent name");
|
||||
case TorrentModelItem::TR_SIZE: return tr("Size", "i.e: torrent size");
|
||||
case TorrentModelItem::TR_PROGRESS: return tr("Done", "% Done");
|
||||
case TorrentModelItem::TR_STATUS: return tr("Status", "Torrent status (e.g. downloading, seeding, paused)");
|
||||
|
@@ -54,7 +54,7 @@ class TorrentModelItem : public QObject {
|
||||
|
||||
public:
|
||||
enum State {STATE_DOWNLOADING, STATE_DOWNLOADING_META, STATE_ALLOCATING, STATE_STALLED_DL, STATE_SEEDING, STATE_STALLED_UP, STATE_QUEUED_DL, STATE_QUEUED_UP, STATE_CHECKING_UP, STATE_CHECKING_DL, STATE_QUEUED_CHECK, STATE_QUEUED_FASTCHECK, STATE_PAUSED_DL, STATE_PAUSED_UP, STATE_PAUSED_MISSING, STATE_FORCED_DL, STATE_FORCED_UP, STATE_INVALID};
|
||||
enum Column {TR_NAME, TR_PRIORITY, TR_SIZE, TR_TOTAL_SIZE, TR_PROGRESS, TR_STATUS, TR_SEEDS, TR_PEERS, TR_DLSPEED, TR_UPSPEED, TR_ETA, TR_RATIO, TR_LABEL, TR_ADD_DATE, TR_SEED_DATE, TR_TRACKER, TR_DLLIMIT, TR_UPLIMIT, TR_AMOUNT_DOWNLOADED, TR_AMOUNT_UPLOADED, TR_AMOUNT_LEFT, TR_TIME_ELAPSED, TR_SAVE_PATH, TR_COMPLETED, TR_RATIO_LIMIT, TR_SEEN_COMPLETE_DATE, TR_LAST_ACTIVITY, TR_AMOUNT_DOWNLOADED_SESSION, TR_AMOUNT_UPLOADED_SESSION, NB_COLUMNS};
|
||||
enum Column {TR_PRIORITY, TR_NAME, TR_SIZE, TR_TOTAL_SIZE, TR_PROGRESS, TR_STATUS, TR_SEEDS, TR_PEERS, TR_DLSPEED, TR_UPSPEED, TR_ETA, TR_RATIO, TR_LABEL, TR_ADD_DATE, TR_SEED_DATE, TR_TRACKER, TR_DLLIMIT, TR_UPLIMIT, TR_AMOUNT_DOWNLOADED, TR_AMOUNT_UPLOADED, TR_AMOUNT_DOWNLOADED_SESSION, TR_AMOUNT_UPLOADED_SESSION, TR_AMOUNT_LEFT, TR_TIME_ELAPSED, TR_SAVE_PATH, TR_COMPLETED, TR_RATIO_LIMIT, TR_SEEN_COMPLETE_DATE, TR_LAST_ACTIVITY, NB_COLUMNS};
|
||||
|
||||
public:
|
||||
TorrentModelItem(const QTorrentHandle& h);
|
||||
|
84
src/core/unicodestrings.h
Normal file
84
src/core/unicodestrings.h
Normal file
@@ -0,0 +1,84 @@
|
||||
/*
|
||||
* Bittorrent Client using Qt and libtorrent.
|
||||
* Copyright (C) 2015 Mike Tzou
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* In addition, as a special exception, the copyright holders give permission to
|
||||
* link this program with the OpenSSL project's "OpenSSL" library (or with
|
||||
* modified versions of it that use the same license as the "OpenSSL" library),
|
||||
* and distribute the linked executables. You must obey the GNU General Public
|
||||
* License in all respects for all of the code used other than "OpenSSL". If you
|
||||
* modify file(s), you may extend this exception to your version of the file(s),
|
||||
* but you are not obligated to do so. If you do not wish to do so, delete this
|
||||
* exception statement from your version.
|
||||
*/
|
||||
|
||||
// This file must be encoded in "UTF-8 with BOM"
|
||||
#ifdef _MSC_VER
|
||||
#pragma execution_character_set("utf-8")
|
||||
#endif
|
||||
|
||||
// Because of the poor handling of UTF-8 characters in MSVC (emits warning C4819),
|
||||
// we put all problematic UTF-8 chars/strings in this file.
|
||||
// See issue #3059 for more details (https://github.com/qbittorrent/qBittorrent/issues/3059).
|
||||
const char C_INFINITY[] = "∞";
|
||||
const char C_UP[] = "▲";
|
||||
const char C_DOWN[] = "▼";
|
||||
const char C_COPYRIGHT[] = "©";
|
||||
const char C_LOCALE_ENGLISH[] = "English";
|
||||
const char C_LOCALE_ENGLISH_AUSTRALIA[] = "English(Australia)";
|
||||
const char C_LOCALE_ENGLISH_UNITEDKINGDOM[] = "English(United Kingdom)";
|
||||
const char C_LOCALE_FRENCH[] = "Français";
|
||||
const char C_LOCALE_GERMAN[] = "Deutsch";
|
||||
const char C_LOCALE_HUNGARIAN[] = "Magyar";
|
||||
const char C_LOCALE_INDONESIAN[] = "Bahasa Indonesia";
|
||||
const char C_LOCALE_ITALIAN[] = "Italiano";
|
||||
const char C_LOCALE_DUTCH[] = "Nederlands";
|
||||
const char C_LOCALE_SPANISH[] = "Español";
|
||||
const char C_LOCALE_CATALAN[] = "Català";
|
||||
const char C_LOCALE_GALICIAN[] = "Galego";
|
||||
const char C_LOCALE_PORTUGUESE[] = "Português";
|
||||
const char C_LOCALE_PORTUGUESE_BRAZIL[] = "Português brasileiro";
|
||||
const char C_LOCALE_POLISH[] = "Polski";
|
||||
const char C_LOCALE_LITHUANIAN[] = "Lietuvių";
|
||||
const char C_LOCALE_CZECH[] = "Čeština";
|
||||
const char C_LOCALE_SLOVAK[] = "Slovenčina";
|
||||
const char C_LOCALE_SLOVENIAN[] = "Slovenščina";
|
||||
const char C_LOCALE_SERBIAN[] = "Српски";
|
||||
const char C_LOCALE_CROATIAN[] = "Hrvatski";
|
||||
const char C_LOCALE_ARMENIAN[] = "Հայերեն";
|
||||
const char C_LOCALE_ROMANIAN[] = "Română";
|
||||
const char C_LOCALE_TURKISH[] = "Türkçe";
|
||||
const char C_LOCALE_GREEK[] = "Ελληνικά";
|
||||
const char C_LOCALE_SWEDISH[] = "Svenska";
|
||||
const char C_LOCALE_FINNISH[] = "Suomi";
|
||||
const char C_LOCALE_NORWEGIAN[] = "Norsk";
|
||||
const char C_LOCALE_DANISH[] = "Dansk";
|
||||
const char C_LOCALE_BULGARIAN[] = "Български";
|
||||
const char C_LOCALE_UKRAINIAN[] = "Українська";
|
||||
const char C_LOCALE_RUSSIAN[] = "Русский";
|
||||
const char C_LOCALE_JAPANESE[] = "日本語";
|
||||
const char C_LOCALE_HEBREW[] = "עברית";
|
||||
const char C_LOCALE_HINDI[] = "हिन्दी, हिंदी";
|
||||
const char C_LOCALE_ARABIC[] = "عربي";
|
||||
const char C_LOCALE_GEORGIAN[] = "ქართული";
|
||||
const char C_LOCALE_BYELORUSSIAN[] = "Беларуская";
|
||||
const char C_LOCALE_BASQUE[] = "Euskara";
|
||||
const char C_LOCALE_VIETNAMESE[] = "tiếng Việt";
|
||||
const char C_LOCALE_CHINESE_TRADITIONAL_TW[] = "正體中文 (臺灣)";
|
||||
const char C_LOCALE_CHINESE_TRADITIONAL_HK[] = "繁體中文 (香港)";
|
||||
const char C_LOCALE_CHINESE_SIMPLIFIED[] = "简体中文";
|
||||
const char C_LOCALE_KOREAN[] = "한글";
|
@@ -1,6 +1,8 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource>
|
||||
<file>gpl.html</file>
|
||||
<file>thanks.html</file>
|
||||
<file>translators.html</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
|
@@ -89,7 +89,7 @@
|
||||
<string/>
|
||||
</property>
|
||||
<property name="pixmap">
|
||||
<pixmap resource="icons.qrc">:/icons/skin/mascot.png</pixmap>
|
||||
<pixmap resource="../icons.qrc">:/icons/skin/mascot.png</pixmap>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -369,7 +369,11 @@
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="te_thanks"/>
|
||||
<widget class="QTextBrowser" name="te_thanks">
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
@@ -517,7 +521,7 @@
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<resources>
|
||||
<include location="icons.qrc"/>
|
||||
<include location="../icons.qrc"/>
|
||||
</resources>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user