You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-11-02 08:10:54 +01:00 
			
		
		
		
	Compare commits
	
		
			215 Commits
		
	
	
		
			v4_6_x
			...
			release-3.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8bf23e8087 | ||
| 
						 | 
					6bdfe77c80 | ||
| 
						 | 
					15c785d298 | ||
| 
						 | 
					577582ee0b | ||
| 
						 | 
					60ab8f87e9 | ||
| 
						 | 
					4420ae1996 | ||
| 
						 | 
					778046439c | ||
| 
						 | 
					be47c35cba | ||
| 
						 | 
					a51a855870 | ||
| 
						 | 
					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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								Changelog
									
									
									
									
									
								
							@@ -1,3 +1,115 @@
 | 
			
		||||
* Sun Aug 02 2015 - sledgehammer999 <sledgehammer999@qbittorrent.org> - v3.2.3
 | 
			
		||||
    - BUGFIX: Fix crash when closing a search tab while search is running (pmzqla)
 | 
			
		||||
    - SEARCH: Other minor search fixes and improvements (pmzqla)
 | 
			
		||||
    
 | 
			
		||||
* 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.3</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.3"
 | 
			
		||||
!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