You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-10-30 23:30:54 +01:00 
			
		
		
		
	Compare commits
	
		
			215 Commits
		
	
	
		
			release-4.
			...
			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/* | ||||
|   | ||||
							
								
								
									
										104
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								.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: | ||||
| @@ -22,39 +23,74 @@ notifications: | ||||
|     on_success: 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,31 +1552,16 @@ 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 | ||||
| @@ -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