diff -Nru qbittorrent-4.1.3/.appveyor.yml qbittorrent-3.3.15/.appveyor.yml
--- qbittorrent-4.1.3/.appveyor.yml 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/.appveyor.yml 2017-08-03 20:30:10.000000000 +0000
@@ -5,10 +5,6 @@
image: Visual Studio 2017
-branches:
- except: # blacklist
- - coverity_scan
-
environment:
REPO_DIR: &REPO_DIR c:\qbittorrent
CACHE_DIR: &CACHE_DIR c:\qbt_cache
@@ -24,8 +20,6 @@
cache:
- *CACHE_DIR
-clone_depth: 50
-
install:
# check if library needs update
- appveyor DownloadFile "%QBT_VER_URL%" -FileName "c:\version_new" && SET /P newVersion=<"c:\version_new"
@@ -45,7 +39,8 @@
- CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
- SET PATH=%PATH%;c:\qbt\qt5_32\bin;%CACHE_DIR%\jom;
# setup project
- - COPY /Y "%CACHE_DIR%\conf.pri" "%REPO_DIR%"
+ - COPY /Y "%CACHE_DIR%\winconf.pri" "%REPO_DIR%"
+ - COPY /Y "%CACHE_DIR%\winconf-msvc.pri" "%REPO_DIR%"
# workarounds
- MKLINK /J "c:\qbt\base" "%CACHE_DIR%\base"
diff -Nru qbittorrent-4.1.3/AUTHORS qbittorrent-3.3.15/AUTHORS
--- qbittorrent-4.1.3/AUTHORS 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/AUTHORS 2017-08-03 20:30:10.000000000 +0000
@@ -34,14 +34,6 @@
license: GPLv2/3
Images Authors:
-* files: src/icons/skin/qbittorrent-tray.svg (and related pngs)
- copyright: Provided by HVS (raster first proposal) and Atif Afzal(@atfzl github) (vectorized and modified)
- license: GPLv2+
-
-* files: src/qbittorrent_file.ico src/icons/fileicon.svg
- copyright: 'uknown.svg' (LGPLv3+) from Oxygen Icon Theme was used as base which was slightly modified and 'qbittorrent-tray.svg' (GPLv2+) was overlayed above it.
- license: GPLv3+
-
* files: src/icons/*.png
copyright: Gnome Icon Theme
license: GPLv2
@@ -52,10 +44,10 @@
license: LGPL
url: http://www.oxygen-icons.org
-* files: src/icons/flags/*.svg
- copyright: lipis/flag-icon-css
- license: MIT
- url: https://github.com/lipis/flag-icon-css/
+* files: src/icons/flags/*.png
+ copyright: Mark James
+ license: Public Domain
+ url: http://www.famfamfam.com
* files: src/icons/skin/*.png
files: src/menuicons/YYxYY/*.png
diff -Nru qbittorrent-4.1.3/Changelog qbittorrent-3.3.15/Changelog
--- qbittorrent-4.1.3/Changelog 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/Changelog 2017-08-03 20:30:10.000000000 +0000
@@ -1,349 +1,21 @@
-* Tue Sep 18 2018 - sledgehammer999 - v4.1.3
- - FEATURE: Preselect name without extension when renaming files (thalieht)
- - FEATURE: Allow setting seq & first/last from context menu without metadata (thalieht)
- - BUGFIX: Show "N/A" if there is no scrape (thalieht)
- - BUGFIX: Save option about tracker favicons under correct key (sledgehammer999)
- - BUGFIX: When file data are unreachable pause torrent and show "Missing Files" status (temporary fix) (sledgehammer999)
- - BUGFIX: Don't disable DHT when using force proxy (Thomas Piccirello)
- - BUGFIX: Correctly save torrent queue position/state/priority changes in fastresume (glassez, thalieht, sledgehammer999)
- - BUGFIX: Fix icon height/width ratio (Chocobo1)
- - BUGFIX: Fix values sorted wrong in "Last Activity" column (Chocobo1)
- - BUGFIX: Replace png icons with svg (Chocobo1)
- - WEBUI: Allow WebUI sidebar filters to be hidden (Thomas Piccirello)
- - WEBUI: Increase WebUI Options initial height (Thomas Piccirello)
- - WEBUI: Adjust WebUI Options form alignment (Thomas Piccirello)
- - WEBUI: Fix WebUI unreachable issue (Chocobo1)
- - WEBUI: Require torrent category creation to be explicit (Thomas Piccirello)
- - WEBUI: Include category save path in web api sync data (Thomas Piccirello)
- - WEBUI: Add save path and editing to WebUI new category dialog (Thomas Piccirello)
- - WEBUI: Bump Web API version
- - SEARCH: Refactor in searchjob to always color visited entries (thalieht)
- - SEARCH: Set "enter" as shortcut to download the selected torrents in search job (thalieht)
- - SEARCH: Add regex option in the search filter's context menu (thalieht)
- - LINUX: Fix GUI scaling issue on Linux (Chocobo1)
- - LINUX: Fix regression that broke installing desktop file (Eli Schwartz)
- - OPENBSD: Better filesystem support for filewatcher (Elias M. Mariani)
-
-* Sun Aug 12 2018 - sledgehammer999 - v4.1.2
- - FEATURE: New options for "inhibit sleep" (Lukas Greib)
- - FEATURE: Add option for regexps in the transferlist search filter's context menu (thalieht)
- - FEATURE: Add async io threads option to AdvancedSettings (tjjh89017)
- - FEATURE: Allow save resume interval to be disabled (Chocobo1)
- - FEATURE: Add checkbox for recursive download dialog (Chocobo1)
- - FEATURE: Add changelog link in program updater (Chocobo1)
- - BUGFIX: Avoid allocating large memory when loading a .torrent file (Couchy)
- - BUGFIX: Notify users on 1st time close/minimize to tray (sledgehammer999)
- - BUGFIX: Fix I/O error after fetching magnet metadata (Chocobo1)
- - BUGFIX: Never save resume data for already paused torrents (glassez)
- - BUGFIX: Make ProgramUpdater upgrade to 64-bit qbt when running on 64-bit Windows (Chocobo1)
- - BUGFIX: Put temporary files in qbt own temp folder (Chocobo1)
- - BUGFIX: Avoid potentially setting the wrong piece priorities (Chocobo1)
- - BUGFIX: Various code refactorings/improvements (Chocobo1, thalieht, glassez)
- - BUGFIX: Add options "Download in sequential order" and "Download first and last pieces first" in AddNewTorrentDialog (Chocobo1)
- - BUGFIX: Download favicon using appropriate protocol (glassez)
- - BUGFIX: Apply proxy settings on DownloadManager creation (glassez)
- - BUGFIX: Improve torrent initialization (glassez)
- - BUGFIX: Save resume data on torrent change events (glassez)
- - BUGFIX: Increase default resume data save interval (Chocobo1)
- - BUGFIX: Work around crash when procesing recursive download. Closes #9086 (Chocobo1)
- - BUGFIX: Reduce queries to python version (Chocobo1)
- - BUGFIX: Disable certain mouse wheel events in Options dialog (Chocobo1)
- - WEBUI: Send all rechecks in one request (Thomas Piccirello)
- - WEBUI: Add WebUI Force Reannounce option (Thomas Piccirello)
- - WEBUI: Create non-existing path in setLocationAction() (Goshik)
- - WEBUI: Add WebUI support for Mac ⌘ (Command) key (Thomas Piccirello)
- - WEBUI: Show current save path in 'Set location' window (Goshik)
- - WEBUI: Fix WebUI cache behavior for css files (Chocobo1)
- - WEBUI: Send Cache-Control header in WebUI responses (Chocobo1)
- - WEBUI: Add form-action to CSP (Thomas Piccirello)
- - WEBUI: Add upgrade-insecure-requests to CSP when HTTPS is enabled (Thomas Piccirello)
- - WEBUI: Reset WebUI ban counter on login success (Chocobo1)
- - WEBUI: Add logging messages in WebUI login action (Chocobo1)
- - WEBUI: Add option to control CSRF protection (Chocobo1)
- - WEBUI: Add option to control WebUI clickjacking protection (Chocobo1)
- - RSS: Implement "Sequential downloading" feature. Closes #6835 (glassez)
- - RSS: Don't use RSS feed URLs as base for file names. Closes #8399 (glassez)
- - SEARCH: Add a name filter for search results (thalieht)
- - SEARCH: Fix python version detection (Chocobo1)
- - SEARCH: Clear python cache conditionally (Chocobo1)
- - SEARCH: Properly normalize version string before parsing it (hannsen)
- - WINDOWS: Turn on Control Flow Guard for MSVC builds (Chocobo1)
- - MACOS: Replace deprecated function IOPMAssertionCreate() on macOS (Chocobo1)
- - OTHER: Fix CMake build with QtSingleApplication. Fixes #9196 (Eugene Shalygin)
-
-* Sun May 27 2018 - sledgehammer999 - v4.1.1
- - FEATURE: Add 'Moving' state for torrents being relocated/moved (sledgehammer999)
- - FEATURE: Show rechecking progress (sledgehammer999)
- - FEATURE: Add option to remember last used save path (glassez)
- - FEATURE: Torrent name is also renamed if the content was renamed in the "Add New Torrent" dialog (glassez)
- - FEATURE: Relax behavior of "Download first and last piece first". It applies to all files and not only to the previewable. (Chocobo1)
- - BUGFIX: Fix issues with translatable strings (Chocobo1)
- - BUGFIX: Fix displayed tracker messages (Chocobo1)
- - BUGFIX: Make settings file recovery more robust (Chocobo1)
- - BUGFIX: Retry saving settings when operation failed (Chocobo1)
- - BUGFIX: Log successful torrent move (sledgehammer999)
- - BUGFIX: Fix deletion of old logs (sledgehammer999)
- - BUGFIX: Delete non-commited fastresume files (sledgehammer999)
- - BUGFIX: Don't migrate torrents that have newer fastresumes (sledgehammer999)
- - BUGFIX: Fix adding multiple torrents at once from WebUI (glassez)
- - BUGFIX: Improve "Run External Program" behavior. On Windows, a backslash isn't appended to paths from path variables (Chocobo1)
- - BUGFIX: Suppress multiple I/O errors for the same torrent (sledgehammer999)
- - BUGFIX: Replace raster qbt logo with vector version (Chocobo1)
- - WEBUI: Fix wrong API method names (glassez)
- - WEBUI: Filter torrent info endpoint by hashes (Marcel Petersen)
- - WEBUI: Fix invalid API calls in WebUI (glassez)
- - WEBUI: Improve legacy API params handling (glassez)
- - WEBUI: Fix params handling for some legacy API methods (glassez)
- - WEBUI: Apply locale changes immediately in WebUI (Chocobo1)
- - WEBUI: Use 32px icons for favicon (Chocobo1)
- - WEBUI/RSS: Properly set RSS settings via API (glassez)
- - RSS: Fix auto-downloading rule when Smart filter with regular Episode filter are used (glassez)
- - RSS: Make "Ignoring days" to behave like other filters (glassez)
- - RSS: Place "Use Smart Episode Filter" more correctly (glassez)
- - RSS: Use RSS feed update time as a fallback (glassez)
- - COSMETIC: Fix Stats dialog size (sledgehammer999)
- - MACOS: Fix GUI scaling factor on macOS (Chocobo1)
- - WINDOWS: Update icons (adem4ik)
- - LINUX: Fix open destination folder with Nautilus > 3.28 (Evgeny Lensky)
- - OTHER: Code improvements and refactoring (thalieht, Nick Korotysh, Chocobo1)
-
-* Sat May 05 2018 - sledgehammer999 - v4.1.0
- - FEATURE: Add "Coalesce reads & writes" checkbox in advanced options (Chocobo1)
- - FEATURE: Smart Filter for RSS (Stephen Dawkins)
- - FEATURE: Possibility to configure at which speed a torrent is considered slow (thalieht)
- - FEATURE: When creating a torrent you can choose to preserve the file order (toster, Chocobo1)
- - FEATURE: A new, redesigned and refactored WebAPI (glassez)
- - BUGFIX: Redefine CacheStatus.readRatio field. (Chocobo1)
- - BUGFIX: Clarify some terms in stats dialog (Chocobo1)
- - BUGFIX: Fix possible crash when using both share limits (thalieht)
- - BUGFIX: Disable options when `Disable connections not supported by proxies` is enabled (Thomas Piccirello)
- - BUGFIX: Add link to an explanation of `Disable connections not supported by proxies` (Thomas Piccirello)
- - BUGFIX: Fix typo in a log message (Andrei Stepanov)
- - BUGFIX: Fix loading very large torrents. Closes #8449. (Chocobo1)
- - BUGFIX: Fix reverting backslashes to slashes in run external program. Closes #7800 (Chocobo1)
- - BUGFIX: Use https for documentation links (Chocobo1)
- - BUGFIX: Use original scheme when downloading favicons (Chocobo1)
- - BUGFIX: Parse URL query string at application level (glassez)
- - BUGFIX: Properly reply to announce request (embedded tracker) (glassez)
- - BUGFIX: Add `Tags` parameter to "Run External Program" (Chocobo1)
- - BUGFIX: Fix various typos (Chocobo1)
- - BUGFIX: Refactor filesystem watcher. Delay before processing new files. (Chocobo1)
- - BUGFIX: Don't strip empty arguments passed to external program. Closes #8454. (Chocobo1)
- - BUGFIX: Stop creating Download folder on start (Chocobo1)
- - BUGFIX: Avoid data corruption when rechecking paused torrents (sledgehammer999)
- - BUGFIX: Fix crashes due to invalid iterator use (Luís Pereira)
- - BUGFIX: Fix renaming completed files (Chocobo1)
- - BUGFIX: Fix path separator in log messages (Chocobo1)
- - WEBUI: Switch built-in Web UI html to HTML5 (glassez)
- - WEBUI: WebUI Save user's resized window sizes (Thomas Piccirello)
- - WEBUI: Make download + upload windows resizable (Thomas Piccirello)
- - WEBUI: Add option to show/hide webui status bar (Thomas Piccirello)
- - WEBUI: Add "Use proxy only for torrents" option to webui (Thomas Piccirello)
- - WEBUI: Various fixes in the html code (Thomas Piccirello)
- - WEBUI: Don't unselect selected torrents after a few seconds (Thomas Piccirello)
- - WEBUI: Enable Http/1.1 persistence connection (Chocobo1)
- - WEBUI: Format Read cache hits as percentage (Thomas Piccirello)
- - WEBUI: Re-order and rename stats (Thomas Piccirello)
- - WEBUI: Right align stat values (Thomas Piccirello)
- - WEBUI: Enable Statistics window to be scrolled and resized (Tom Piccirello)
- - WEBUI: Save WebUI Statistics window size (Thomas Piccirello)
- - WEBUI: Make WebUI iframe windows scrollable on iOS (Thomas Piccirello)
- - WEBUI: Remove unused CSS from WebUI login page (Thomas Piccirello)
- - WEBUI: Consolidate CSS into style.css (Thomas Piccirello)
- - WEBUI: Resolve JavaScript errors (Thomas Piccirello)
- - WEBUI: Fix spacing in login form(Thomas Piccirello)
- - WEBUI: Update WebUI to be more compliant with HTML5 standard (Chocobo1)
- - WEBUI: Update clipboard.js to v2.0.0 (Chocobo1)
- - WEBUI: Remove unused JavaScript library (Chocobo1)
- - WEBUI: Fix setting preferences via WebAPI (glassez)
- - WEBUI: Rename property to match its definition (Thomas Piccirello)
- - WEBUI: Add Limit Share Ratio context menu option (Thomas Piccirello)
- - RSS: Disable Auto TMM when RSS rule has save path (glassez)
- - RSS: Process loaded RSS articles in case of error (glassez)
- - RSS: Resolve (X)HTML entities in RSS content (glassez)
- - SEARCH: Improve Search handling (glassez)
- - SEARCH: Calculate supported categories based on selected plugin (Thomas Piccirello)
- - SEARCH: Fix memory leak (Chocobo1)
- - COSMETIC: Use spinbox suffix to display rate/time units (thalieht)
- - COSMETIC: Avoid showing an empty row in AdvancedSettings (Chocobo1)
- - OTHER: Various code optimizations and fixes (Luís Pereira, Chocobo1)
- - OTHER: Fix build when using Clang under CMake (Luís Pereira)
- - OTHER: Allow to disable Stacktrace support (Nick Korotysh)
- - OTHER: Use RNG provided by OS (Chocobo1)
-
-* Fri Feb 16 2018 - sledgehammer999 - v4.0.4
- - FEATURE: Add source field in Torrent creator. Closes #7965. (Chocobo1)
- - FEATURE: Torrent creator: raise maximum piece size to 32 MiB (Chocobo1)
- - FEATURE: Add a force reannounce option in the transfer list context menu. Closes #6448. (Jesse Bryan)
- - BUGFIX: Fix sorting of country flags column in Peers tab. (sledgehammer999)
- - BUGFIX: Fix natural sorting when the common part of 2 strings ends partially in a number which continues in the uncommon part. Closes #8080 #6732. (sledgehammer999)
- - BUGFIX: Fix application of speed limits on LAN and μTP connections. Closes #7745. (sledgehammer999)
- - BUGFIX: Make peer information flags in peerlist more readable. (thalieht)
- - BUGFIX: Fix gui issues on high DPI monitor. (Chocobo1)
- - BUGFIX: Fix dialog and column size on high DPI monitors. (Chocobo1)
- - BUGFIX: Fix constant status of '[F] Downloading'. Closes #7628. (sledgehammer999)
- - BUGFIX: Fix translation context. Closes #8211. (sledgehammer999)
- - BUGFIX: Separate subnet whitelist options into two lines. (Thomas Piccirello)
- - BUGFIX: Don't set application name twice. (Luís Pereira)
- - BUGFIX: Set default file log size to 65 KiB and delete backup logs older than 1 month. (sledgehammer999)
- - WEBUI: Only prepend scheme when it is not present. Closes #8057. (Chocobo1)
- - WEBUI: Add "Remaining" and "Availability" columns to webui Content tab. (Thomas Piccirello)
- - WEBUI: Make value formatting consistent with GUI (Thomas Piccirello)
- - WEBUI: Reposition Total Size column to match gui (Thomas Piccirello)
- - WEBUI: Add Tags and Time Active columns (Thomas Piccirello)
- - WEBUI: Use https for www.qbittorrent.org (Thomas Piccirello)
- - WEBUI: Match webui statuses to gui, closes #7516 (Thomas Piccirello)
- - WEBUI: Right-align stat values (Thomas Piccirello)
- - WEBUI: Add missing units. (Thomas Piccirello)
- - RSS: Fix crash when deleting rule because it tries to update. Closes #8094 (glassez)
- - RSS: Don't process new/updated RSS rules when disabled (glassez)
- - RSS: Remove legacy and corrupted RSS settings (glassez)
- - SEARCH: Search only when category is supported by plugin. Closes #8053. (jan.karberg)
- - SEARCH: Only add search separators as needed. (Thomas Piccirello)
- - COSMETIC: Tweak spacing in torrent properties widget and speed widget. (Chocobo1)
- - WINDOWS: Use standard folder icon for open file behavior on Windows. Closes #7880. (Chocobo1)
- - WINDOWS: Revert "Run external program" function. Now you will not be able to directly run batch scripts. (Chocobo1)
- - MACOS: Fix torrent file selection in Finder on mac (vit9696)
- - MACOS: Fix Finder reveal in preview and torrent contents (vit9696)
- - MACOS: Fix cmd+w not closing the main window on macOS (vit9696)
- - OTHER: Fix splitting of compiler flags in configure. Autoconf removes a set of [] during script translation, resulting in a wrong sed command. (sledgehammer999)
- - OTHER: configure: Parse all compiler related flags together. (sledgehammer999)
- - OTHER: Update copyright year. (sledgehammer999)
-
-* Sun Dec 17 2017 - sledgehammer999 - v4.0.3
- - BUGFIX: Add height padding to the transfer list icons. Closes #7951. (sledgehammer999)
- - BUGFIX: Allow to drag-n-drop URLs into mainwindow to initiate download. (Chocobo1)
- - BUGFIX: Fix crash when fitlering search results. Stable sorting is removed. Closes #7952.(Chocobo1)
- - WEBUI: Fix missing qbt logo on login page in webUI. Closes #7953. (Chocobo1)
- - WEBUI: Add check to avoid type error after logout. (Chocobo1)
- - WEBUI: Use POST for logout command. This is to avoid browser being smart to prefetch the link then logging out the user. (Chocobo1)
- - WEBUI: Fix WebUI is not reachable via IPv6. (glassez)
- - WINDOWS: Disable the "?" help button in all dialogs on Windows. Closes #7365. Requires Qt 5.10. (Chocobo1)
-
-* Fri Dec 01 2017 - sledgehammer999 - v4.0.2
- - BUGFIX: Fix crash on some systems when creating address object for 255.255.255.255. Closes #7735. (sledgehammer999)
- - PERFORMANCE: Change MixedModeAlgorithm default to TCP. This was the v3_3_x default and should sustain higher speeds. Closes #7779. (Chocobo1)
- - PERFORMANCE: Stop logging IP filter parsing errors after a while, otherwise the GUI freezes or qBittorrent doesn't start. (sledgehammer999)
- - GUI: Implement stable sort. Rows in transfer list shouldn't flicker anymore. (Chocobo1)
- - WEBUI: Fix build when webui is disabled. (Heiko Becker)
- - RSS: Fix build because of missing header. Closes #7805. (thoradia)
- - RSS: Fix RSS parser. (glassez)
- - RSS: Implement Import/Export RSS rules in legacy(aka v3_3_x) format. (glassez)
- - RSS: Implement Import/Export RSS rules in JSON format. (glassez)
- - WINDOWS: Fixed blurry text under Windows by setting DPI awareness to default. (TheNicker)
- - LINUX: Fix i386 build. (Evgeny Lensky)
-
-* Wed Nov 22 2017 - sledgehammer999 - v4.0.1
- - BUGFIX: Fix crash on opening torrent/magnet (uninitialized pointer). Closes #7739 #7723. (sledgehammer999)
- - BUGFIX: Enable preferences Apply button when ip banlist is modified (Thomas Piccirello)
- - BUGFIX: Allow drag-n-drop magnet links to mainwindow. Closes #7742. (Chocobo1)
- - BUGFIX: Fix crash when aborting a torrent creation process. Closes #7783. (Chocobo1)
- - BUGFIX: Correctly check if torrent passed during application start already exists. (sledgehammer999)
- - WEBUI: Add ip subnet whitelist for bypassing webui auth (Thomas Piccirello)
- - WEBUI: Fix logo missing in login page (Chocobo1)
- - COSMETIC: Fix english typo. (sledgehammer999)
- - OTHER: cmake: qtsingleapplication should always be built statically (luigino)
-
-* Mon Nov 20 2017 - sledgehammer999 - v4.0.0
- - FEATURE: Change qbittorrent logo. Issue #6467. (HVS, Atif Afzal, sledgehammer999)
- - FEATURE: New icon theme with SVG source, so we can scale it appropriately in the future. (Bert Verhelst)
- - FEATURE: Drop Qt 4 support. Raise minimum Qt version to 5.5.1 (evsh)
- - FEATURE: UI for managing locally banned IP list (dzmat)
- - FEATURE: Support for specifying where to save/load config files. Support for portable mode. (evsh)
- - FEATURE: It is now possible to pass options via ENV variables instead of cmd options. (evsh)
- - FEATURE: Allow to strip subfolder in multifile torrents. (glassez, sledgehammer999)
- - FEATURE: Allow cmd args to specify options when adding torrents. (Brian Kendall)
- - FEATURE: Widget for showing filesystem paths while typing. Used in the Add New Torrent and Options dialogs. (evsh)
- - FEATURE: Trackerlist: Allow to toggle columns (thalieht)
- - FEATURE: Add availability column to torrent content model and torrent properties window (evsh)
- - FEATURE: Implemented share limit by seeding time (naikel)
- - FEATURE: Revamp Torrent creator (Chocobo1)
- - FEATURE: Enable drag n drop to create torrent on mainwindow (Chocobo1)
- - FEATURE: Add show/hide statusbar option (takiz)
- - FEATURE: Show number of pieces. Closes #6774. (Chocobo1)
- - FEATURE: Allow to select & delete multiple entries in "Manage Cookies" dialog (Chocobo1)
- - FEATURE: Fetch Favicons via google as a final fallback (KingLucius)
- - FEATURE: Add a Tags (multi-label) feature to the GUI. Closes #13. (tgregerson)
- - FEATURE: Use the system icons for each file type in the Content tab (evsh)
- - FEATURE: Use SVG files for monochrome tray icons. Closes #6085. (evsh)
- - FEATURE: Prefill torrent name when creating a new torrent. Closes #7229. (Chocobo1)
- - FEATURE: Expose more libtorrent options in advanced settings (Chocobo1)
- - FEATURE: Add comboBox for selecting BitTorrent protocol. Closes #6316. (Chocobo1)
- - FEATURE: Allow SMTP sender to be set. Closes #7575. (Chocobo1)
- - FEATURE: Allow to specify if announcing to all tiers is desired. (sledgehammer999)
- - FEATURE: Configurable number of history of paths in Add New Torrent dialog. (evsh)
- - BUGFIX: Adjust icons names to better fit FDO scheme (evsh)
- - BUGFIX: Optimized IP filter parsing, making blazingly fast (sledgehammer999, evsh)
- - BUGFIX: Fix dialogs didn't position on the correct screen which qBittorrent window is on. Closes #1690, #2474, #3538. (Chocobo1)
- - BUGFIX: Refactor and improve StatusBar (glassez)
- - BUGFIX: Set expiration date for newly added cookie to +2 years from now, instead of +99 years. (Chocobo1)
- - BUGFIX: Don't create subfolder inside temp folder (glassez)
- - BUGFIX: Don't replace existing files when relocating torrent (glassez)
- - BUGFIX: Fix explicit Torrent Management Mode in Add New Torrent dialog. Closes #5602. (sledgehammer999)
- - BUGFIX: Fix calculation of 'Average time in queue' stat under libtorrent 1.1.x (sledgehammer999)
- - BUGFIX: Don't disable bandwidth scheduler when manually switching speed limits. Closes #7306. (glassez)
- - BUGFIX: Fix dereferencing freed pointer. Closes #7420. (Chocobo1)
- - BUGFIX: Change the default cache size to 64MiB. (Chocobo1)
- - BUGFIX: The previous "Disk write cache size" is not accurate since it is also being used for read cache, so rename it to "Disk cache". (Chocobo1)
- - BUGFIX: Replace dialog ok-cancel buttons with QDialogButtonBox, which follows the platform specific button order. (Chocobo1)
- - BUGFIX: Better reporting of success/failure of torrent and file deletion. (sledgehammer999)
- - BUGFIX: Fix last activity calculation. Closes #7461. (Chocobo1)
- - BUGFIX: Save state of options windows on cancel too. (silverqx)
- - BUGFIX: Persist size and treeview header state in preview dialog. (silverqx)
- - BUGFIX: Show torrent name in "add new torrent" dialog on merging trackers (Chocobo1)
- - BUGFIX: Properly pre-select the selected torrent's current ratio limiting options in UpDownRatioDlg dialogs. Fixes #7352 (thalieht)
- - BUGFIX: Optimize code for SpeedWidget. (dzmat)
- - BUGFIX: Disable processing events when adding torrents(prevents crashes). Closes #7436. (Chocobo1)
- - BUGFIX: Open links in browser. Closes #7651. (Chocobo1)
- - BUGFIX: Change default settings for tracker/tier announces to mimic μTorrent behavior. (sledgehammer999)
- - BUGFIX: Explicitly set UPnP state on start-up. Closes #7338. (Chocobo1)
- - BUGFIX: Include/print caught signal in stackdump (Chocobo1)
- - COSMETIC: Trackerlist: Set text alignment of columns with numbers to the right (thalieht)
- - COSMETIC: Enable alternatingRowColors for "Manage Cookie" dialog (Chocobo1)
- - COSMETIC: Remove indentation for category/tag filter widgets in all platforms (thalieht)
- - COSMETIC: Add space between widgets in left side panel. Closes #7224. (Chocobo1, glassez)
- - COSMETIC: Unify preference window borders across the tabs (vit9696)
- - COSMETIC: Center Options dialog when showed. (silverqx)
- - COSMETIC: Show delete accelerator key in menu. closes #7508 (Nick Korotysh)
- - COSMETIC: Set QTextOption::NoWrap property in "Download from URLs" dialog (Chocobo1)
- - COSMETIC: Use SVG icons for the country flags. Closes #6223. (sledgehammer999)
- - WEBUI: Allow to load/use ECDSA certificate in webUI. (Chocobo1)
- - WEBUI: Add copy options to webui context menu (addresses #6815) (#7036) (Tom Piccirello)
- - WEBUI: Set torrent location from webui context menu (addresses #6815) (#7062) (Tom Piccirello)
- - WEBUI: Add option to rename torrent from WebUI (Thomas Piccirello)
- - WEBUI: Add auto torrent management to webui context menu (addresses #6815) (Thomas Piccirello)
- - WEBUI: Option for "Create subfolder" when adding new torrent. (thalieht)
- - WEBUI: Fix addPaused wrong default behavior. (Chocobo1)
- - WEBUI: Reposition "Priority" menu option in WebUI to match gui. Closes #7072. (Thomas Piccirello)
- - WEBUI: Report TCPServer errorString() if webui fails to listen to port. (Matthew Fioravante)
- - WEBUI: Exit gracefully when failed to initialize web server with qbt-nox (Chocobo1)
- - WEBUI: Add file-to-piece-index mappings in /query/propertiesFiles command (Chocobo1)
- - WEBUI: Add optional parameters for /command/download & /command/upload (Chocobo1)
- - WEBUI: Print error messages upon receiving invalid header fields. (Chocobo1)
- - WEBUI: Add WebUi\Address config option. (Matthew Fioravante)
- - WEBUI: Reinitialize webUI server when "IP address" setting changed. An app restart won't be necessary from now on. (Chocobo1)
- - WEBUI: Improve log and error messages (Chocobo1)
- - SEARCH: Use explicit class for search plugin versions (evsh)
- - SEARCH: Remove all search plugins from repo. There is another repo named 'search-plugins'. (sledgehammer999)
- - SEARCH: Update the backend when a new plugin favicon is downloaded. (sledgehammer999)
- - SEARCH: Allow search plugins sorting. Closes #7526. (Nick Korotysh)
- - RSS: Redesigned RSS subsystem (glassez)
- - RSS: Do not use hardcoded colors in RSS feed view (evsh)
- - RSS: Improve RSS events logging (glassez)
- - WINDOWS: Use dpiawareness=1 on Windows. Closes #5393. (sledgehammer999)
- - WINDOWS: Reformat Windows build configuration files. (glassez)
- - LINUX: Allow custom tray icons when system icon theme is used. Closes #7403. (evsh)
- - MACOS: Various macOS UI improvements (vit9696)
- - MACOS: Fix main menu item location on macOS (vit9696)
- - MACOS: Fix macOS window restoration after using hide icon (vit9696)
- - MACOS: Fix notification display on macOS (vit9696)
- - OTHER: Use new classes/methods from libtorrent and stop using deprecate ones. (glassez)
- - OTHER: Various string fixes (Allan Nordhøy, sledgehammer999)
- - OTHER: cmake: do not use Qt5Widgets when locating QtSingleApplication. Closes #7551. (evsh)
- - OTHER: Update BOOST m4 macros and simplify AX_BOOST_BASE usage (Chocobo1)
- - OTHER: Drop OS/2 support. (sledgehammer999)
- - OTHER: Optimize file size of PNG and SVG files. (sledgehammer999)
- - OTHER: Add new translators in the About page.
+* Thu Aug 03 2017 - sledgehammer999 - v3.3.15
+ - BUGFIX: Temporary subfolder wasn't being deleted. (glassez)
+
+* Tue Jul 18 2017 - sledgehammer999 - v3.3.14
+ - BUGFIX: Set interface for outgoing traffic(libtorrent 1.1.x series). (evsh)
+ - WEBUI: Fix KEEP_ALIVE_DURATION value (Chocobo1)
+ - WEBUI: Relax CSRF defense. Closes #6882. Allow HTTP request which has neither Origin nor Referer header included. (Chocobo1)
+ - WEBUI: Skip username/password check for active sessions (closes #6860) (Thomas Piccirello)
+ - WEBUI: Fix javascript errors and follow best practices (Thomas Piccirello)
+ - WEBUI: Fix value comparison. Closes #7081. (Chocobo1)
+ - WEBUI: Avoid modifying request headers (Chocobo1)
+ - WEBUI: Implement HTTP host header filtering. This filtering is required to defend against DNS rebinding attack. Fixes security issues reported by @beardog108 privately. (Chocobo1)
+ - WEBUI: Add Status column to webui (addresses #6815) (#7032) (Tom Piccirello)
+ - WEBUI: Bump API_VERSION and API_VERSION_MIN to 15.
+ - SEARCH: Pad shorter python versions. Closes #6877. (sledgehammer999)
+ - WINDOWS: Updated Arabic, Turkish, Greek, Russian, Danish languages of the installer. (KingLucius, BouRock, thalieht, Andrei Stepanov, scootergrisen)
+ - WINDOWS: Raise total stack size on Windows to 8 MB. Closes #7021. (Chocobo1)
+ - LINUX: Systemd service with user switch and other fixes/optimizations. (anton.latukha)
* Thu Jun 01 2017 - sledgehammer999 - v3.3.13
- BUGFIX: Fixed UI glitch about torrent numbers in the sidepanel. Fixes #6454. (evsh)
@@ -426,7 +98,7 @@
- FEATURE: Use Ctrl+F to search torrents. Closes #5797. (Tim Delaney)
- FEATURE: Transferlist: add hotkeys for double click and recheck selected torrents (thalieht)
- FEATURE: Add hotkey for execution log tab, Trackerlist, Peerlist etc (thalieht)
- - FEATURE: Separate seeds from peers for DHT, PeX and LSD (thalieht)
+ - FEATURE: Seperate seeds from peers for DHT, PeX and LSD (thalieht)
- BUGFIX: Do not remove added files unconditionally. Closes #6248 (Eugene Shalygin)
- BUGFIX: Ignore mouse wheel events in Advanced Settings. Closes #866. (Chocobo1)
- BUGFIX: Add queue repair code. It should fix missing torrents after restarting. (Eugene Shalygin, nxd4)
@@ -438,7 +110,7 @@
- BUGFIX: TransferListWidget: keep columns width even if they are hidden on qBittorrent startup (unless something goes wrong) (thalieht)
- BUGFIX: fix index overflow for torrents with invalid meta data or empty progress (Falco)
- BUGFIX: Immediately update torrent_status after manipulating super seeding mode. Partially fixes #6072. (sledgehammer999)
- - BUGFIX: Use case-insensitive comparison for torrent content window. Closes #6327. (Chocobo1)
+ - BUGFIX: Use case-insensitive comparsion for torrent content window. Closes #6327. (Chocobo1)
- BUGFIX: Fixed sort order for datetime columns with empty values (closes #2988) (Vladimir Sinenko)
- BUGFIX: Disable proxy in WebUI HTTP server. Closes #6349. (Eugene Shalygin)
- COSMETIC: Use a disabled progressbar's palette for unselected files. (sledgehammer999)
@@ -566,12 +238,12 @@
- FEATURE: Add option to automatically remove .torrent files upon adding (Eugene Shalygin)
- FEATURE: Add option to bind directly to an IP instead of using a network Interface (Sjoerd van der Berg, sledgehammer999)
- FEATURE: Detailed tooltips on the progress and availability bars in the General button of each torrent. (Eugene Shalygin)
- - FEATURE: Let user able to specify a filter when choosing an IP filter file (Chocobo1)
+ - FEATURE: Let user able to specifiy a filter when choosing an IP filter file (Chocobo1)
- FEATURE: Improve usability of "Run External Program". Users can write (platform dependent) shell scripts now. (Chocobo1)
- PERFORMANCE: Optimize drawing in speed graph (Anton Lashkov, Chocobo1)
- BUGFIX: Fix memory leak. (sledgehammer999)
- BUGFIX: Fix resizing bug in "add torrent dialog". Closes #5036. (Chocobo1)
- - BUGFIX: Fix qBittorrent doesn't exit immediately when "all downloads are done -> exit" option enabled. (glassez, Chocobo1)
+ - BUGFIX: Fix qBittorrent doesn't exit immediately when "all donwloads are done -> exit" option enabled. (glassez, Chocobo1)
- BUGFIX: Display the filepath when a torrent fails to load. Closes #100 and #805. (sledgehammer999)
- BUGFIX: Fix Add tracker dialog empty trackers (ngosang)
- BUGFIX: Fix Add tracker dialog URL download (ngosang)
@@ -624,9 +296,10 @@
- OTHER: Enable access to shutdown functions when configured with `--disable-gui` option (Chocobo1)
- OTHER: Delete Import Torrent Dialog. Just use the "add new torrent" dialog. (glassez)
- OTHER: Optimize code for natural sorting (Chocobo1)
- - OTHER: Use new alert dispatching API for libtorrent 1.1.x (glassez)
+ - OTHER: Use new alert dispathing API for libtorrent 1.1.x (glassez)
- OTHER: Fix gcc 6 compilation with qmake. See #5237. (sledgehammer999)
+
* Tue Mar 29 2016 - sledgehammer999 - v3.3.4
- FEATURE: Download more pieces in "Download first and last pieces first" feature (ngosang)
- FEATURE: Unlock first column in peerlist too (thalieht)
@@ -758,6 +431,7 @@
- COSMETIC: Use QLineEdit built-in ClearButton (Qt5 only) (Chocobo1)
- COSMETIC: Change text description for half-open connection (Chocobo1)
- OTHER: Change update URL to FossHub. Closes #4188. (sledgehammer999)
+
* Sun Nov 29 2015 - sledgehammer999 - v3.3.0
- FEATURE: Huge core code refactoring. Problems with labels, temp folders etc should be eliminated. Smoother UI should be observed too. (glassez)
@@ -811,166 +485,6 @@
- OTHER: Reduce max value of "Disk cache size" to 1536MB for 32bit. Closes to #4028. (Chocobo1)
- OTHER: Make "Download in sequential order" and "Download first and last piece first" options independent. (glassez)
-* Sat Oct 31 2015 - sledgehammer999 - v3.2.5
- - BUGFIX: Fix difficult to reproduce crash. (glassez)
- - OTHER: Fix Windows' Qt5 build. (Gelmir)
-
-* Sat Oct 10 2015 - sledgehammer999 - v3.2.4
- - FEATURE: Select the file of single file torrents when opening destination folder (pmzqla)
- - BUGFIX: Fix crash with invalid favicon. Closes #3632. (glassez)
- - BUGFIX: Try to download favicon.png when the download of favicon.ico fails (pmzqla)
- - BUGFIX: Try to avoid loading a corrupted configuration file. Also log errors encountered while saving/loading the configuration. Closes #3503. (sledgehammer999)
- - BUGFIX: Allow adding torrent link from Torcache (jsayol)
- - BUGFIX: Don't limit the number of torrents that can be announced to the tracker/dht/lsd. Closes #3473. (sledgehammer999)
- - BUGFIX: Fix potential crash when memory allocation failed. Closes #3877. (Chocobo1)
- - COSMETIC: Change Queue buttons order in the Toolbar (GUI & Web UI) (ngosang)
- - COSMETIC: Move option "Ignore transfer limits on local network" to Speed page (Chocobo1)
- - COSMETIC: Move option "Confirm torrent deletion" to Behavior page (Chocobo1)
- - COSMETIC: Fix typos. Make `μTP` untranslatable. Use American variation of words. Closes #3654. (sledgehammer999)
- - COSMETIC: Optimize text color for dark themes. Closes #3633 and #3815. (sledgehammer999)
- - COSMETIC: Show current label in the torrent context menu. Closes #3776. (sledgehammer999)
- - WEBUI: Add save_path to /query/torrents (Casey Bodley)
- - WEBUI: Bump API_VERSION to 5
- - SEARCH: Fix python detection when the 'Anaconda' software is installed. Closes #3731. (sledgehammer999)
- - RSS: Handle magnet links as torrents instead of news URLs. Closes #3560 (ngosang)
- - RSS: Trim elements text in RSS articles (ngosang)
- - RSS: Fix contextual menu in RSS torrents list (ngosang)
- - RSS: Improve error handling when a RSS feed doesn't contain torrents (ngosang)
- - RSS: More precise message and code simplification in RSS feeds deletion (ngosang)
- - RSS: Don't hide the elements in Unread list when clicked (ngosang)
- - RSS: Allow multiple selection in RSS torrents list (ngosang)
- - RSS: Simplify string translation (ngosang)
- - RSS: Handle more types of RSS feeds (ngosang)
- - RSS: Fix RSS panel position not saved (ngosang)
- - RSS: Fix forgetting label changes to first item in RSS rule list. (Gelmir)
- - RSS: Add label to UI when a new one is creating during rule addition. (Gelmir)
- - RSS: Removes refresh message when adding a new feed (ngosang)
- - RSS: Fix RSS crash when deleting RSS feeds. Closes #997, #2152, #2461, #3718, #3747, #3766, #3806, #3814, #3829 and #3846. (ngosang)
- - RSS: Sort labels in RSS Downloader dialog, closes #3140. (Chocobo1)
- - WINDOWS: Correctly show german letters in the installer. Closes #3574, #3566. (sledgehammer999)
- - WINDOWS: Fix file selection on Explorer when the filename contains weird characters. Closes #3185. (sledgehammer999)
- - WINDOWS: Fix wrong default download directory in Windows. Closes #2625. (Chocobo1)
- - WINDOWS: Fix German translation of the installer. (netswap)
- - LINUX: Fix broken .desktop file icon for some locales. See #3905. (sledgehammer999)
- - OTHER: Fix ppc64le detection during configure (sledgehammer999)
- - OTHER: Don't use sed in configure. Closes #3169. (pmzqla)
- - OTHER: Fix broken donation link. Closes #3771. (sledgehammer999)
- - OTHER: Add forum link in README. Closes #3853. (sledgehammer999)
- - OTHER: New translation: Esperanto
- - OTHER: Fix Qt5 nox build on non-Windows. (sledgehammer999)
-
-* Sun Aug 02 2015 - sledgehammer999 - 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 - 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 - 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 search 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 - 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)
@@ -1061,208 +575,6 @@
- OTHER: Backtrace generation now works on MinGW. (Gelmir)
- OTHER: New translation: Hindi(India).
-* Wed Feb 22 2015 - sledgehammer999 - v3.1.12
- - OSX: Fix build to work with older machines. (sledgehammer999, Noctem)
- - WINDOWS: Fix automatic Python download. (sledgehammer999)
- - WINDOWS: Fix crashes due to memory corruption and improve Python registry searching. (glassez)
-
-* Wed Oct 22 2014 - sledgehammer999 - v3.1.11
- - FEATURE: Allow relative torrent paths when qBittorrent is already running (pmzqla)
- - FEATURE: Make Windows icons suitable for high dpi screens (pmzqla)
- - FEATURE: Increase maximum size of system icons (pmzqla)
- - BUGFIX: Fix crash in the "Content" widget when user would right click in it without a torrent selected (Ivan Sorokin)
- - BUGFIX: Don't show multiple unlock UI dialogs. Closes #2040. (sledgehammer999)
- - SEARCH: Fix bug where python would falsely be detected and nothing worked (paolo-sz)
- - SEARCH: Fix TorrentReactor search plugin (Bruno Barbieri)
- - SEARCH: Fix search engine encoding issues with python3 on Windows (Bruno Barbieri)
- - SEARCH: Pirate bay search engine update (DoumanAsh)
- - SEARCH: Internal improvements in the python code (Bruno Barbieri)
- - WINDOWS: Fix magnet link association. Closes #1952. (sledgehammer999)
- - WINDOWS and OSX: Fix again the program updater. The url was changed by sourceforge.net. Closes #1954. (sledgehammer999)
- - OSX: Fix compilation (sledgehammer999)
- - WEBUI: Set correct HTTP Content-Type in case of forbidden access. (pmzqla)
- - COSMETIC: Remove unneeded tooltip (pmzqla)
- - COSMETIC: Don't stretch the last section in the transfer list (pmzqla)
- - COSMETIC: Set minimum width of the left panel in the preferences (pmzqla)
- - OTHER: Optimize sorting of rows. This should have less CPU impact when many torrents are present. (Ivan Sorokin)
- - OTHER: Use the correct character encoding for exceptions coming from libtorrent. (sledgehammer999)
- - OTHER: Use boost:bind() as the docs show. Allows compilation with older gcc versions. (sledgehammer999)
-
-* Sun Sep 21 2014 - sledgehammer999 - v3.1.10
- - FEATURE: Allow disabling of OS cache. This will prevent RAM increases on Windows when seeding many files. Closes #1699. (sledgehammer999)
- - FEATURE: Add 'Completed' column. Closes #1241. (sledgehammer999)
- - FEATURE: Added 'Ratio Limit' column. Closes #936. (sledgehammer999)
- - FEATURE: Add 'Open' and 'Open Containing Folder' entries in the content's right-click menu. Closes #1143. (sledgehammer999)
- - FEATURE: Don't listen on IPv6 address by default. Prevents network connectivity problems. Closes #1880. (sledgehammer999)
- - FEATURE: Added 'Shutdown now' button in shutdown confirmation dialog. Closes #969. (sledgehammer999)
- - FEATURE: Add peer port column to PeerListWidget. Closes #1650. (Ivanov Juriy)
- - COSMETIC: Fix weird ratio values when torrent was imported or downloaded history was lost due to crash. (sledgehammer999)
- - COSMETIC: Use 'μTP' instead of 'uTP'. (sledgehammer999)
- - COSMETIC: Show the loaded torrents in the transferlist when qBT is launched with a torrent/magnet and the AddNewTorrentDialog is showing. Closes #1564. (sledgehammer999)
- - COSMETIC: Don't mix finished/unifinished torrents when sorting by ETA. Closes #1688. (sledgehammer999)
- - COSMETIC: Sort finished torrents by completed date when sorting by queue number. (sledgehammer999)
- - COSMETIC: Right align numerical values in the transfer list. Partially revert 51a9a9aab. Closes #1903. (sledgehammer999)
- - COSMETIC: Don't display the Search Engine tab by default. (sledgehammer999)
- - WINDOWS: Correctly associate torrents and magnet links with qBittorrent under non-admin accounts. Closes #291 #527 #579 #614 #964. (glassez, sledgehammer999)
- - WINDOWS: Check for python before creating the search engine tab. Prevents the creation of python specific files in the user's PC if no python is found. Closes #1370. (sledgehammer999)
- - WINDOWS: Don't create keys in the registry if python isn't found. Closes #1370. (sledgehammer999)
- - WINDOWS: Can now correctly detect 64bit and 32bit python installations on 64bit Windows. Closes #1148 #445 #795 #1708. (sledgehammer999)
- - WINDOWS: Search first in PATH for python. Closes #956. (sledgehammer999)
- - OSX: Enable system tray in MACOSX (Nick Korotysh).
- - OSX: Fix headless (nox) build. (sledgehammer999)
- - WEBUI: Correctly save/load settings and other improvements (glassez)
- - WEBUI: Removed broken 'Report a bug' iframe. Closes #1343 (Benjamin Hutchins)
- - WEBUI: Removed broken 'Documentation'. Improves fix for #1343 (Benjamin Hutchins)
- - WEBUI: Removed essentially useless 'Visit website' iframe and changed it to a regular link. Improves fix for #1343 (Benjamin Hutchins)
- - BUGFIX: Fix RSS feed icon. The tmp file gets deleted in the feed destructor. Closes #1639 (sledgehammer999)
- - BUGFIX: fix issue #1674: AddNewTorrentDialog is shown again and again even if checkbox "don't ask me again" is set (Ivan Sorokin)
- - BUGFIX: Don't show availability bar for magnet links (Ivan Sorokin)
- - BUGFIX: Fix crash when the selected torrent disappears from the transfer list. Closes #1661 (sledgehammer999)
- - BUGFIX: Fix tracker announcing problem(hit-and-run) when many torrents are being active. Closes #1571 (sledgehammer999)
- - BUGFIX: Count magnet links in the 'downloading' filter and make them prevent system inhibition. Closes #1558 (sledgehammer999)
- - BUGFIX: Pick up updated plugins. Closes #1745. (sledgehammer999)
- - BUGFIX: Bring mainwindow in front when notification is clicked and other windows are in front. (sledgehammer999)
- - BUGFIX: Speedup torrent moving (Ivan Sorokin)
- - BUGFIX: Fix bug when moving a torrent before the previous move is completed (Ivan Sorokin)
- - BUGFIX: Add option to hibernate computer in Auto-Shutdown menu (Bruno Barbieri)
- - BUGFIX: Fix column resizing issues (Bryan Roscoe)
- - BUGFIX: Fix possible crashes. Closes #1814. (sledgehammer999)
- - BUGFIX: Limit max cache to 1800MiB for 32bits compiled binaries and to 4GiB for other. Closes #1698. (sledgehammer999)
- - BUGFIX: Don't localize double numbers in the webui. Closes #1525. (sledgehammer999)
- - BUGFIX: Don't shrink transferlist rows when scrolling horizontally. Closes #1613. (sledgehammer999)
- - BUGFIX: When qBT is launched with a magnet don't show it in the transferlist while the metadata are being loaded in the background. (sledgehammer999)
- - BUGFIX: Show disk space while retrieving metadata. Closes #1693. (sledgehammer999)
- - BUGFIX: Don't disable DHT/LSD/UPnP in the GUI when anonymous mode is enabled. (sledgehammer999)
- - BUGFIX: Possible fix for crash in RSS code. Closes #1901. (sledgehammer999)
- - BUGFIX: Fixed SMTP emailing code (Ivanov Juriy, sledgehammer999)
- - BUGFIX: Don't display the context menu in 'Content' and 'HTTP Sources' buttons when no torrent is selected. It prevents crashes. Closes #1906, #1900. (sledgehammer999)
- - BUGFIX: Don't translate file extensions. Closes #1907. (sledgehammer999)
- - BUGFIX: Fix available disk space label on single file torrents. (sledgehammer999)
- - BUGFIX: Show stalled downloads that are uploading under the 'Active' filter. Closes #1654." (sledgehammer999)
- - BUGFIX: fix import torrent with "Keep incomplete torrents in:" enabled (lojack5)
- - BUGFIX: Send a spoofed user agent for the search engines(fixes some of them) (Martin Janco)
- - BUGFIX: Support URLs that redirect to magnet links (Gelmir)
- - BUGFIX: Consider queued items before deciding to 'auto-shutdown on downloads completion'. Closes #1942. (sledgehammer999)
-
-* Tue Apr 29 2014 - sledgehammer999 - v3.1.9.2
- - OTHER: The v3.1.9.1 Windows build was broken
-
-* Mon Apr 28 2014 - sledgehammer999 - v3.1.9.1
- - OTHER: This is an excuse to produce new builds with an OpenSSL version that isn't affected by the heartbleed bug for Windows and Mac. This bug should only affect the WebUI and only if HTTPS/SSL authentication was enabled.
-
-* Sat Mar 01 2014 - sledgehammer999 - v3.1.9
- - BUGFIX: Fix nox build. Closes #1368 (bob23450)
- - BUGFIX: Fix build with libtorrent 0.15.x (sledgehammer999)
- - BUGFIX: Fix missing percentage signs. Closes #1392. (sledgehammer999)
- - BUGFIX: Fix queue sorting order. (alfrix)
- - BUGFIX: Fix build using qt < 4.7 Closes #1385. (Evgeny Lensky)
- - BUGFIX: Fix autoupdater. Send our user-agent to sourceforge.net (sledgehammer999)
- - FEATURE: Add button for links in toolbar (alfrix)
-
-* Sun Feb 02 2014 - sledgehammer999 - v3.1.8
- - BUGFIX: Really fix build of v3.1.6
-
-* Sun Feb 02 2014 - sledgehammer999 - v3.1.7
- - BUGFIX: Fix build of v3.1.6
-
-* Sun Feb 02 2014 - sledgehammer999 - v3.1.6
- - BUGFIX: Fix 'preview file' regression. Closes #1285. (sledgehammer999)
- - BUGFIX: Fix peers and seeds sorting in transfer list. (Angel Alonso)
- - BUGFIX: Fix btdigg search engine. (BTDigg research team)
- - BUGFIX: Save statistics every 15min and only if there was new traffic. Fixes #1288 and partially #1272. (sledgehammer999)
- - BUGFIX: Fix share ratio text in the 'general' tab. (sledgehammer999)
- - BUGFIX: Output a more generic message when blocking IPs and don't use italics in the log. (sledgehammer999)
- - BUGFIX: Allow 2 decimals when setting the share ratio. Closes #1303. (sledgehammer999)
- - BUGFIX: Fix extratorrents search plugin. (sledgehammer999)
- - BUGFIX: Use shorter names for amount columns in main UI (Gelmir)
- - BUGFIX: Fix overstretched options dialog. Closes #1293. (sledgehammer999)
- - BUGFIX: Don't show a popup menu when no torrent is selected. (sledgehammer999)
- - BUGFIX: Launch external programs async and don't block. Closes #1252. (sledgehammer999)
- - BUGFIX: Don't re-announce to trackers when torrent is paused. Closes #1310. (sledgehammer999)
- - BUGFIX: Bring dialog boxes in the front when qbt doesn't have focus. (sledgehammer999)
- - BUGFIX: Correctly resize 'name' column of the content tab. Closes #1360. (sledgehammer999)
- - BUGFIX: Correctly restore 'name' column width when loading magnet links in the 'Add new torrent dialog'. Closes #1334. (sledgehammer999)
- - WEBUI: Fix sorting by size in WebUI when non-default locale used. (Vladimir Golovnev)
- - UI: Reposition statistics menu item. (sledgehammer999)
- - UI: Convert more accurately decimal numbers to text. (sledgehammer999)
- - WINDOWS/OSX: Improvements on the behavior of the program updater(closes #1282) (sledgehammer999)
- - LINUX: Explicitle tell that we don't support freedesktop's startup notify standard. Fixes GNOME issues. Closes #1217. (sledgehammer999)
- - LINUX: Add our WM_CLASS in the .desktop file so window managers know how to group our windows. (sledgehammer999)
- - OTHER: Sync translations from Transifex.
-
-* Thu 16 Jan 2014 - sledgehammer999 - v3.1.5
- - BUGFIX: Fix compilation with Qt 4.7. Closes #1215. (sledgehammer999)
- - BUGFIX: Third attempt at fixing saving settings on OS shutdown. (sledgehammer999)
- - BUGFIX: Preview now correctly uses the selected file. Closes #1222 #1182. (sledgehammer999)
- - BUGFIX: Allow to resize the columns in Add New Torrent dialog. Closes #1207 #676 (sledgehammer999)
- - BUGFIX: Ensure that at least one column in the tranferlist is always visible. Closes #1165. (sledgehammer999)
- - BUGFIX: Ensure that the options window will always be placed onscreen. Closes #1226. (sledgehammer999)
- - BUGFIX: Delete temporary files after they aren't needed. Closes #1188. (sledgehammer999)
- - BUGFIX: Correctly detect libtorrent version. (sledgehammer999)
- - BUGFIX: Various code cppcheck fixes (Konstantin Goncharik)
- - BUGFIX: Remove isohunt search engine and update thepiratebay url (sledgehammer999)
- - BUGFIX: Fix rss settings corruption when checking regexp and going to other rule. (Gelmir)
- - BUGFIX: Don't count paused torrents for the autoshutdown. Closes #1280. (sledgehammer999)
- - LINUX: Fix notifications with xfce4-notifyd.
- - OSX: Added basic retina support. Closes #1251. (Sébastien Lavoie)
- - OTHER: Sync translations from Transifex.
-
-* Sun 29 Dec 2013 - sledgehammer999 - v3.1.4
- - FEATURE: Statistics dialog (Gelmir)
- - FEATURE: Tooltips explaining each peer's connection flags (sledgehammer999)
- - FEATURE: Win/Mac Check for program updates every 15min and allow the user to manually check for updates through the help menu. (sledgehammer999)
- - BUGFIX: Better dialog message for torrent delete confirmation (sledgehammer999)
- - BUGFIX: Fix resizing grip location. Closes #1146. (sledgehammer999)
- - BUGFIX: Lock toolbar in place. Closes #1144. (sledgehammer999)
- - BUGFIX: Second attempt at fixing saving settings on shutdown. (sledgehammer999)
- - BUGFIX: Sort labels in 'Add new torrent' dialog. Closes #1150 #411. (sledgehammer999)
- - LINUX: Fix build under Ubuntu 13.10 (sledgehammer999)
- - LINUX: Make sleep and shutdown functions work on systemd's logind (Faheem Pervez)
-
-* Mon Nov 20 2013 - sledgehammer999 - v3.1.3
- - FEATURE: Add a key shortcut to "Add link to torrent..." (Angel Alonso)
- - BUGFIX: Make all columns and headers use the same text alignment in the transferlist. (sledgehammer999)
- - BUGFIX: Fix build system for Unix/Linux. (sledgehammer999)
- - BUGFIX: Case insensitive sort in Peers list. Closes #1066. (sledgehammer999)
- - BUGFIX: Small optimization of WebUI responses when there isn't a data payload. (sledgehammer999)
- - BUGFIX: Hide empty folders after filtering. Closes #74. (sledgehammer999)
- - BUGFIX: Expand folders when filtering files. Closes #1076. (sledgehammer999)
- - BUGFIX: Updated search plugin's URL (Zach Thibeau)
- - BUGFIX: Strip some png to fix incorrect sRGB profiles. (Angel Alonso)
- - BUGFIX: Fixed font issues on OSX Mavericks (Zach Thibeau)
- - BUGFIX: Improve text in the About dialog (Artem S. Tashkinov)
- - BUGFIX: Always show a peer IP address as a tool tip (Artem S. Tashkinov)
- - BUGFIX: Fix inhibit system functionality. Closes #766. (sledgehammer999)
- - BUGFIX: WebUI: Don't gzip too small payloads. (sledgehammer999)
- - BUGFIX: Correctly detect if the browser supports gzip compression. (sledgehammer999)
- - BUGFIX: Fix WebUI link to 'Anonymous mode' explanation. Closes #1093. (sledgehammer999)
- - BUGFIX: Correctly update tracker tier number in the trackers tab. Closes #1075. (sledgehammer999)
- - BUGFIX: Speed improvements.(sledgehammer999)
- - OTHER: Updated translations.
-
-* Tue Nov 05 2013 - sledgehammer999 - v3.1.2
- - BUGFIX: Fix WebUI gzip compression. Closes #1037. (sledgehammer999)
- - BUGFIX: Fix compilation with qt < 4.8.0. Closes #1043. (sledgehammer999)
- - OTHER: Updated translations.
-
-* Mon Oct 28 2013 - sledgehammer999 - v3.1.1
- - FEATURE: Show external IP in the log. Closes #968. (sledgehammer999)
- - FEATURE: Enable gzip compression in the webui. It should be faster now. (sledgehammer999)
- - FEATURE: Torrents show more states(queued for checking, downloading metadata, allocating, checking resume). (sledgehammer999)
- - FEATURE: Re-enable "force reannounce" to all trackers. (sledgehammer999)
- - FEATURE: Allow to clear the UI lock password. Closes #973. (sledgehammer999)
- - FEATURE: New translations: English(Australia) and English(United Kingdom)
- - BUGFIX: Expose all available translation in the WebUI. Closes #976. (sledgehammer999)
- - BUGFIX: Copy IP copied wrong data. Closes #970 (sledgehammer999)
- - BUGFIX: "Preview file..." didn't work on single file torrents. (sledgehammer999)
- - BUGFIX: Fix and improve the scheduler (Gelmir and sledgehammer999)
- - BUGFIX: RSS fixes. Closes #960, #998 (Gelmir)
- - BUGFIX: Fix 'append label to save path' with magnet links. (sledgehammer999)
- - BUGFIX: Can download up to 10MB .torrent file when a link is provided. Closes #879 (sledgehammer999)
- - OTHER: Updated translations.
- - LINUX: Fix missing conf.pri error (leigh123linux)
- - WINDOWS: Don't remove file associations if they aren't our own. (sledgehammer999)
-
* Sat Oct 12 2013 - Christophe Dumez and sledgehammer999 - v3.1.0
- FEATURE: Add command line option to daemonize qbittorrent-nox (ngaro)
- FEATURE: Add "Shutdown qBittorrent" button to Web UI (ngaro)
@@ -1298,120 +610,8 @@
- OTHER: Make peer tab sortable by ip too (Gelmir)
- OTHER: Translations moved to Transifex(https://www.transifex.com/projects/p/qbittorrent/)
- OTHER: New Translation - Vietnamese (Anh Phan)
- - PERFORMANCE: Improve drawing speed of tranferlist when there are many torrents(>100)
- - PERFORMANCE: Improve drawing speed of peers list when there are many peers
-
-* Mon Jul 29 2013 - sledgehammer999 - v3.0.11
- - FEATURE: Allow more fine tuning of upload slots. It should improve speed (sledgehammer999)
- - FEATURE: Enable edit/rename via F2 or double click in various places (Gelmir)
- - BUGFIX: Fix Spanish and Basque translations being messed up on Windows (sledgehammer999)
- - BUGFIX: Don't allow newlines in rename dialog (Gelmir)
- - BUGFIX: Treat unfinished dates as the newest ones when sorting (sledgehammer999)
- - BUGFIX: Fix text size problem on Windows with custom DPI (sledgehammer999)
- - BUGFIX: Respect UI lock when clicking on tray notification (sledgehammer999)
- - BUGFIX: Fix kickass torrents search plugin (Gelmir)
- - BUGFIX: Use system language as default language. Closes #780 (sledgehammer999)
- - BUGFIX: Move completed files to .unwanted folder when they are unselected by the user (constantined)
- - BUGFIX: Show delete action when multiple feeds are selected (Gelmir)
- - BUGFIX: Use Unicode for libtorrent alert messages (Gelmir)
- - OTHER: Update translations
- - WINDOWS: Shave off ~4MB from the binary size (sledgehammer999)
- - WINDOWS: Remove wrong dependency on msvc2008 runtime (sledgehammer999)
- - WINDOWS: Disable stacktrace when building with mingw (Gelmir)
- - WINDOWS: Updated NSIS script to include/delete .pdb file. (sledgehammer999)
-
-* Tue Jul 9 2013 - Christophe Dumez and sledgehammer999 - v3.0.10
- - BUGFIX: Fix LegitTorrents search plugin
- - BUGFIX: Improve peer host name resolution (closes #360)
- - BUGFIX: Context menu fix in the Web UI
- - BUGFIX: Respect 'don't show' torrent dialog in Search (sledgehammer999)
- - BUGFIX: Torrent creator can now use files/folders from disk root (Gelmir)
- - BUGFIX: Update free disk space when changing drives in the add new torrent dialog (sledgehammer999)
- - BUGFIX: Various fixes relating to RSS drag and drop (Gelmir)
- - BUGFIX: Properly rename torrent which changes position in filter model (Gelmir)
- - BUGFIX: Actually show tray notifications when a torrent finishes downloading (sledgehammer999)
- - BUGFIX: Don't download RSS items based on rules still being edited (Gelmir)
- - COSMETIC: Native look for the search boxes (Hyperz)
- - IMPROVEMENT: Use natural sorting where possible (Gelmir and sledgehammer999)
- - LINUX: Drop Boost.Thread dependency from configure script
- - OTHER: Update translations.
- - OTHER: Drop obsolete Boost.Thread dependency from configure script on linux (Dumez)
- - LIBTORRENT: SOCKS5 fixes (0.16.10)
- - LIBTORRENT: Fix hanging issue on Windows when closing files (0.16.10)
- - LIBTORRENT: Cache can now be returned to the OS (0.16.10)
- - PERFORMANCE: Improve drawing speed of tranferlist when there are many torrents(>100) (sledgehammer999)
- - PERFORMANCE: Improve drawing speed of peers list when there are many peers (sledgehammer999)
-
-* Sat Mar 16 2013 - Christophe Dumez - v3.0.9
- - BUGFIX: Raise qBittorrent windows when another instance is launched
- - BUGFIX: Show human readable names for network interfaces in preferences (Windows)
- - BUGFIX: Fix torrent creator bug when saving non-latin path (Windows)
- - BUGFIX: Enable 'copy magnet uri' for torrents without metadata too
- - BUGFIX: Fix a few JSON parser issues (Gelmir)
- - BUGFIX: Add support for gzipped encoded HTTP responses (daimor)
- - BUGFIX: Fix possibly missing "Add torrent" icon (Driim)
- - OTHER: Add search plugin for Legit Torrents
-
-* Sun Jan 20 2013 - Christophe Dumez - v3.0.8
- - BUGFIX: Fix support for --no-splash command line argument
- - BUGFIX: Fix compilation error with libtorrent v0.15
- - BUGFIX: Fix search issues with Python3
- - BUGFIX: Fix dead link about certificates in program preferences
-
-* Sat Jan 19 2013 - Christophe Dumez - v3.0.7
- - BUGFIX: Update max write cache size to 2048MB and set it to automatic by default (closes #148)
- - BUGFIX: Add m4v to the list of previewable file extensions (closes #216)
- - BUGFIX: Fix "Couldn't set environment variable..." message on start up (closes #245)
- - BUGFIX: Use right path separator in torrent addition dialog on Windows
- - BUGFIX: Fix "Set as default save path" setting (closes #254)
- - BUGFIX: Re-enable disk cache on Windows since the memory issue seems to be gone
- - BUGFIX: Fixed several search engine plugins and removed the dead ones
- - BUGFIX: Use https links in search plugins when possible
- - BUGFIX: Bump Mootools to v1.4.5 (Web UI)
- - BUGFIX: Require password to exit qBittorrent from tray icon when locked (closes #311)
- - BUGFIX: Fix possible crash in loadPeers() (closes #222)
-
-* Sun Oct 7 2012 - Christophe Dumez - v3.0.6
- - BUGFIX: Fix unicode support for command-line arguments on Windows (closes #139)
- - BUGFIX: Do not store created torrent in memory before writing it to a file (closes #133)
- - BUGFIX: No longer fallback to ANY interface if the user-selected interface cannot be found (closes #143)
- - BUGFIX: Fix timezone parsing in RSS (closes #136)
- - BUGFIX: Fix cookie support for RSS feeds (closes #119)
-
-* Sun Sep 30 2012 - Christophe Dumez - v3.0.5
- - BUGFIX: Disabling systray icon no longer disables file association settings (closes #114)
- - BUGFIX: Import new trackers from magnet link in case of duplicate torrent (closes #111)
- - BUGFIX: Fix "Skip hash check" feature in torrent import dialog (closes #128)
- - BUGFIX: Several Web UI connection fixes
- - BUGFIX: Add Basque locale to Web UI
-
-* Tue Sep 18 2012 - Christophe Dumez - v3.0.4
- - BUGFIX: Fix issue with downloads starting from scratch on startup if temporary
- directory setting is enabled.
-
-* Sun Sep 16 2012 - Christophe Dumez - v3.0.3
- - BUGFIX: Fix issue with temporary directory not being taken into consideration (closes #94)
- - BUGFIX: Address encoding issues when using search engine on Windows (closes #29)
- - BUGFIX: Bypass cache when uploading a torrent file in Web UI (closes #68)
- - BUGFIX: "Completed On" column is not updated until restart (closes #84)
- - BUGFIX: Fix possible build error on some systems
- - I18N: Add hebrew translation
-
-* Sat Sep 1 2012 - Christophe Dumez - v3.0.2
- - FEATURE: Add "clear" functionality to search field (closes #59)
- - BUGFIX: Attempt to use qBittorrent icon from theme if available (closes #49)
- - BUGFIX: Fix crash when a fastresume file is empty (closes #52)
- - BUGFIX: Fix encoding problem for detected XDG Download folder (closes #53)
- - BUGFIX: Improve performance when showing torrent content panel (Improves #24)
- - BUGFIX: Fix label-based filtering of torrents whose label contains special characters
- - BUGFIX: Fix possible crash due to labels (closes #64)
-
-* Tue Aug 21 2012 - Christophe Dumez - v3.0.1
- - BUGFIX: Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254)
- - BUGFIX: Remember queue position for torrents without metadata (closes #17)
- - BUGFIX: Fix crash when using unauthorized characters in label names (closes #19)
- - BUGFIX: Fix search plugins updating (closes #25)
- - BUGFIX: Make uTP connections rate limited by default
+ - PERFORMANCE: Impove drawing speed of tranferlist when there are many torrents(>100)
+ - PERFORMANCE: Impove drawing speed of peers list when there are many peers
* Thu Aug 09 2012 - Christophe Dumez - v3.0.0
- FEATURE: Brand new torrent addition dialog
@@ -1424,92 +624,6 @@
- OTHER: Drop support for libtorrent v0.14.x
- OTHER: Drop support for Qt 4.5
-* Unreleased - Christophe Dumez - v2.9.12
- - BUGFIX: Fix issue when "Minimize to tray" and "Start minimized" are both enabled
-
-* Sun Jul 1 2012 - Christophe Dumez - v2.9.11
- - BUGFIX: Fix unreversible "Minimize to tray" on some window managers
- - BUGFIX: Fix torrent availability computation (closes #988869)
- - BUGFIX: Bring window to front after restoring from systray
- - BUGFIX: Fix keyboard focus problems on main window (closes #1019563)
- - BUGFIX: Fix ThePirateBay search plugin
-
-* Sun Jun 24 2012 - Christophe Dumez - v2.9.10
- - BUGFIX: Fix possible crash when showing torrent content (closes #1002586)
- - BUGFIX: Add support for RSS feeds using magnet links (closes #1016379)
- - BUGFIX: Remove 100kb limit for torrent file size in Web UI
- - BUGFIX: Fix ratio limiting bug (closes #835217)
- - BUGFIX: Do not display .!qB file extensions in Web UI
- - BUGFIX: Stop using absolute URLs in Web UI ajax requests (closes #1011226)
- - BUGFIX: Fix torrent association and loading on Mac OS X (closes #1011229)
- - BUGFIX: Fix unreversible "Minimize to tray" on some window managers (closes #917825)
-
-* Sun May 20 2012 - Christophe Dumez - v2.9.9
- - BUGFIX: More reliable RSS feed parsing (closes #1001777)
- - BUGFIX: Better support for cookies in RSS
- - BUGFIX: Make sure show/hide text in tray icon menu is correct
- - COSMETIC: Improve style of left panel
- - COSMETIC: Never disable properties panel
- - COSMETIC: Make sure first tab is initially selected in options dialog
- - COSMETIC: Fix a few focus issues on Mac OS X
-
-* Sat May 5 2012 - Christophe Dumez - v2.9.8
- - BUGFIX: Various UI style fixes
- - BUGFIX: Fix compilation with gcc 4.7
- - BUGFIX: Fix possible compilation error with msvc (Windows)
- - BUGFIX: Fix compilation on OS/2
- - I18N: Update Italian translation
-
-* Sun Mar 18 2012 - Christophe Dumez - v2.9.7
- - BUGFIX: Fix important HTTP request parsing bug (Web UI)
-
-* Sat Mar 17 2012 - Christophe Dumez - v2.9.6
- - BUGFIX: Fix download first/last pieces state reporting
- - BUGFIX: Fix name of progress column in torrent content panel
- - BUGFIX: Disable system tray icon on Mac OS X
- - BUGFIX: RSS downloader should not ignore "Do not start automatically" rule (closes #946910)
- - BUGFIX: Fix DHT port setting in Web UI (Closes #952182)
- - BUGFIX: Fix possible Web UI authentication problem when using SSL (closes #941343)
- - BUGFIX: Fix possible issues with folder removal when removing a torrent
- - I18N: Add Basque translation
-
-* Sat Feb 18 2012 - Christophe Dumez - v2.9.5
- - BUGFIX: Fix crash when disabling then reenabling RSS
- - BUGFIX: Fix duplicate torrent detection when adding a magnet link
- - BUGFIX: Fix import of new trackers when adding a torrent with same hash (Closes #747000)
- - BUGFIX: Fix possible redownload of torrents marked as read (Closes #927495)
- - BUGFIX: Properly remove RSS feed settings/history upon feed removal
-
-* Sat Feb 18 2012 - Christophe Dumez - v2.9.4
- - BUGFIX: qBittorrent does not handle redirection to relative URLs correctly (Closes #919905)
- - BUGFIX: Cmd+M minimizes main window on Mac OS X (Closes #928216)
- - BUGFIX: Cmd+Del removes torrents on Mac OS X (Closes #928852)
- - BUGFIX: Fix potential bug when moving single file torrents to tmp folder (closes #932861)
- - BUGFIX: Fix torrent import dialog layout (Closes #930932)
- - BUGFIX: Prevent log window buffer from filling up (Closes #929673)
- - I18N: Add Belarusian translation
-
-* Thu Dec 29 2011 - Christophe Dumez - v2.9.3
- - BUGFIX: Fix btdigg plugin (Python3 support + torrent name in magnet links)
- - BUGFIX: Fix banning of IPv6 peers (Closes #885021)
- - BUGFIX: Fix torrent addition dialog layout problem (Closes #84650522)
- - BUGFIX: Do not report any progress for disabled files (Closes #56731485)
- - BUGFIX: Make torrent sorting case insensitive (Closes #857154)
- - BUGFIX: Improve Web UI usability of small devices
- - BUGFIX: Program updater: More reliable version detection / comparison
- - I18N: Add Georgian translation
-
-* Sat Oct 29 2011 - Christophe Dumez - v2.9.2
- - BUGFIX: Fix minimum dimensions for torrent addition dialog
- - BUGFIX: Remove dependency on boost-datetime
- - BUGFIX: Remove dependency on boost-filesystem (libtorrent v0.16.x)
-
-* Sun Oct 23 2011 - Christophe Dumez - v2.9.1
- - BUGFIX: Add support for speed limits scheduling (Web UI)
- - BUGFIX: Fix ratio calculation for purely seeded torrents
- - I18N: Update Russian translation
- - COSMETIC: Torrent addition dialog layout fixes
-
* Sat Oct 08 2011 - Christophe Dumez - v2.9.0
- FEATURE: Add file association settings to program preferences (Windows)
- FEATURE: Add setting to ignore slow torrents in queueing system
@@ -1711,7 +825,7 @@
- BUGFIX: Update RSS feed as soon as feed downloader is enabled
- BUGFIX: RSS Feed downloader ignores articles above maximum number of articles
- BUGFIX: Fix possible bug when deleting a RSS folder
- - BUGFIX: Remove persistent data when a RSS feed is deleted
+ - BUGFIX: Remove persistant data when a RSS feed is deleted
- BUGFIX: RSS filters are now alphabetically sorted
- BUGFIX: Fix crash when renaming currently displayed RSS filter
- BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it
@@ -1747,7 +861,7 @@
- BUGFIX: Use the save path set in program preferences as a default in torrent addition dialog
* Fri Dec 18 2009 - Christophe Dumez - v2.0.2
- - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusable for new users)
+ - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusuable for new users)
- BUGFIX: Fix RSS Feed downloader for some feeds
- BUGFIX: Do not use home folder as a fallback when the save path is not accessible
- BUGFIX: Fix Mininova, ThePirateBay search engine plugins
@@ -1837,7 +951,7 @@
- BUGFIX: Fix trackers addition to torrents (bug introduced in v1.5.4)
- BUGFIX: Suppress compilation warning regarding sortNewsList() not being used
- BUGFIX: Make sure scan folder is different than qBittorrent backup directory to avoid torrents deletion
- - BUGFIX: Added safety mechanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted.
+ - BUGFIX: Added safety mecanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted.
* Sun Oct 25 2009 - Christophe Dumez - v1.5.4
- BUGFIX: Updated man page
@@ -1904,7 +1018,7 @@
- FEATURE: Added right click menu in search engine to clear completion history
- FEATURE: Allow to set a different port for DHT (UDP) than the one used for Bittorrent
- FEATURE: Updated spoofing code to avoid trackers ban
- - BUGFIX: Provide more helpful explanation when an I/O error occurred
+ - BUGFIX: Provide more helpful explanation when an I/O error occured
- BUGFIX: Stop enforcing UTF-8 and use system locale instead
- COSMETIC: Redesigned program preferences
- COSMETIC: Updated icons set
@@ -1922,7 +1036,7 @@
- BUGFIX: Suppressed QLayout: Attempting to add QLayout "" to properties "properties" warning message when opening a properties dialog
- BUGFIX: Fixed a little bug in search engine plugins helper file
- BUGFIX: Fixed compilation problems with Qt 4.3
- - BUGFIX: Percentages no longer disappear with default cleanlooks style
+ - BUGFIX: Percentages no longer disapear with default cleanlooks style
- BUGFIX: Cleanly fixed popup menus position in lists (no more workarounds)
- BUGFIX: Fixed memory leak in search engine
- BUGFIX: Torrents with an infinite ratio are no longer affected by ratio_limit set in program preferences
@@ -2167,7 +1281,7 @@
- FEATURE: Number of complete/incomplete sources are now displayed in download list for each torrent
- FEATURE: Implemented close to systray
- FEATURE: Added Autocompletion to search engine
- - FEATURE: Split BT & GUI parts (huge code rewriting & optimization)
+ - FEATURE: Splitted BT & GUI parts (huge code rewriting & optimization)
- FEATURE: New parameters for configure file to point to custom locations for libtorrent/libcurl
- FEATURE: Update application style according to the system (WindowsXP, MacOS, X11)
- BUGFIX: Two torrents can now have the same name although they are different (use their hash)
diff -Nru qbittorrent-4.1.3/cmake/Modules/bundle.cmake qbittorrent-3.3.15/cmake/Modules/bundle.cmake
--- qbittorrent-4.1.3/cmake/Modules/bundle.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/bundle.cmake 1970-01-01 00:00:00.000000000 +0000
@@ -1,21 +0,0 @@
-set(BU_CHMOD_BUNDLE_ITEMS ON)
-include(DeployQt5)
-
-set(plugins "")
-
-get_property(svgIconPluginLocation TARGET Qt5::QSvgIconPlugin
- PROPERTY LOCATION_RELEASE)
-list(APPEND plugins "${svgIconPluginLocation}")
-get_property(svgPluginLocation TARGET Qt5::QSvgPlugin
- PROPERTY LOCATION_RELEASE)
-list(APPEND plugins "${svgPluginLocation}")
-
-set(sfx "")
-if(APPLE)
- set(sfx ".app")
-elseif(WIN32)
- set(sfx "${CMAKE_EXECUTABLE_SUFFIX}")
-endif()
-
-get_target_property(exe qBittorrent OUTPUT_NAME)
-install_qt5_executable("${exe}${sfx}" "${plugins}" "" "" "")
diff -Nru qbittorrent-4.1.3/cmake/Modules/CompileFeature.cmake qbittorrent-3.3.15/cmake/Modules/CompileFeature.cmake
--- qbittorrent-4.1.3/cmake/Modules/CompileFeature.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/CompileFeature.cmake 1970-01-01 00:00:00.000000000 +0000
@@ -1,22 +0,0 @@
-# Helper function for coupling add_feature_info(), option(), and add_definitions()
-
-function(optional_compile_definitions _name)
- set(options FEATURE)
- set(oneValueArgs DESCRIPTION DEFAULT)
- set(multiValueArgs ENABLED DISABLED)
- cmake_parse_arguments(OCD "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
- option(${_name} "${OCD_DESCRIPTION}" ${OCD_DEFAULT})
- if (${${_name}})
- set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY COMPILE_DEFINITIONS ${OCD_ENABLED})
- else()
- set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" APPEND PROPERTY COMPILE_DEFINITIONS ${OCD_DISABLED})
- endif()
- if(${OCD_FEATURE})
- add_feature_info(${_name} ${_name} "${OCD_DESCRIPTION}")
- endif()
-endfunction()
-
-macro(feature_option _name _description _default)
- option(${_name} "${_description}" ${_default})
- add_feature_info(${_name} ${_name} "${_description}")
-endmacro()
diff -Nru qbittorrent-4.1.3/cmake/Modules/DeployQt5.cmake qbittorrent-3.3.15/cmake/Modules/DeployQt5.cmake
--- qbittorrent-4.1.3/cmake/Modules/DeployQt5.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/DeployQt5.cmake 1970-01-01 00:00:00.000000000 +0000
@@ -1,355 +0,0 @@
-# Borrowed from Avogadro project (https://github.com/OpenChemistry/avogadroapp)
-
-#.rst:
-# DeployQt5
-# ---------
-#
-# Functions to help assemble a standalone Qt5 executable.
-#
-# A collection of CMake utility functions useful for deploying Qt5
-# executables.
-#
-# The following functions are provided by this module:
-#
-# ::
-#
-# write_qt5_conf
-# resolve_qt5_paths
-# fixup_qt5_executable
-# install_qt5_plugin_path
-# install_qt5_plugin
-# install_qt5_executable
-#
-# Requires CMake 2.8.9 or greater because Qt 5 does.
-# Also depends on BundleUtilities.cmake.
-#
-# ::
-#
-# WRITE_QT5_CONF( )
-#
-# Writes a qt.conf file with the into .
-#
-# ::
-#
-# RESOLVE_QT5_PATHS( [])
-#
-# Loop through list and if any don't exist resolve them
-# relative to the (if supplied) or the
-# CMAKE_INSTALL_PREFIX.
-#
-# ::
-#
-# FIXUP_QT5_EXECUTABLE( [ ])
-#
-# Copies Qt plugins, writes a Qt configuration file (if needed) and
-# fixes up a Qt5 executable using BundleUtilities so it is standalone
-# and can be drag-and-drop copied to another machine as long as all of
-# the system libraries are compatible.
-#
-# should point to the executable to be fixed-up.
-#
-# should contain a list of the names or paths of any Qt
-# plugins to be installed.
-#
-# will be passed to BundleUtilities and should be a list of any
-# already installed plugins, libraries or executables to also be
-# fixed-up.
-#
-# will be passed to BundleUtilities and should contain and
-# directories to be searched to find library dependencies.
-#
-# allows an custom plugins directory to be used.
-#
-# will force a qt.conf file to be written even if not
-# needed.
-#
-# ::
-#
-# INSTALL_QT5_PLUGIN_PATH(plugin executable copy installed_plugin_path_var )
-#
-# Install (or copy) a resolved to the default plugins directory
-# (or ) relative to and store the result in
-# .
-#
-# If is set to TRUE then the plugins will be copied rather than
-# installed. This is to allow this module to be used at CMake time
-# rather than install time.
-#
-# If is set then anything installed will use this COMPONENT.
-#
-# ::
-#
-# INSTALL_QT5_PLUGIN(plugin executable copy installed_plugin_path_var )
-#
-# Install (or copy) an unresolved to the default plugins
-# directory (or ) relative to and store the
-# result in . See documentation of
-# INSTALL_QT5_PLUGIN_PATH.
-#
-# ::
-#
-# INSTALL_QT5_EXECUTABLE( [ ])
-#
-# Installs Qt plugins, writes a Qt configuration file (if needed) and
-# fixes up a Qt5 executable using BundleUtilities so it is standalone
-# and can be drag-and-drop copied to another machine as long as all of
-# the system libraries are compatible. The executable will be fixed-up
-# at install time. is the COMPONENT used for bundle fixup
-# and plugin installation. See documentation of FIXUP_QT5_BUNDLE.
-
-#=============================================================================
-# Copyright 2011 Mike McQuaid
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file Copyright.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-# License text for the above reference.)
-
-# The functions defined in this file depend on the fixup_bundle function
-# (and others) found in BundleUtilities.cmake
-
-include(BundleUtilities)
-set(DeployQt5_cmake_dir "${CMAKE_CURRENT_LIST_DIR}")
-set(DeployQt5_apple_plugins_dir "PlugIns")
-
-function(write_qt5_conf qt_conf_dir qt_conf_contents)
- set(qt_conf_path "${qt_conf_dir}/qt.conf")
- message(STATUS "Writing ${qt_conf_path}")
- file(WRITE "${qt_conf_path}" "${qt_conf_contents}")
-endfunction()
-
-function(resolve_qt5_paths paths_var)
- set(executable_path ${ARGV1})
-
- set(paths_resolved)
- foreach(path ${${paths_var}})
- if(EXISTS "${path}")
- list(APPEND paths_resolved "${path}")
- else()
- if(${executable_path})
- list(APPEND paths_resolved "${executable_path}/${path}")
- else()
- list(APPEND paths_resolved "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${path}")
- endif()
- endif()
- endforeach()
- set(${paths_var} ${paths_resolved} PARENT_SCOPE)
-endfunction()
-
-function(fixup_qt5_executable executable)
- set(qtplugins ${ARGV1})
- set(libs ${ARGV2})
- set(dirs ${ARGV3})
- set(plugins_dir ${ARGV4})
- set(request_qt_conf ${ARGV5})
-
- message(STATUS "fixup_qt5_executable")
- message(STATUS " executable='${executable}'")
- message(STATUS " qtplugins='${qtplugins}'")
- message(STATUS " libs='${libs}'")
- message(STATUS " dirs='${dirs}'")
- message(STATUS " plugins_dir='${plugins_dir}'")
- message(STATUS " request_qt_conf='${request_qt_conf}'")
-
- if(QT_LIBRARY_DIR)
- list(APPEND dirs "${QT_LIBRARY_DIR}")
- endif()
- if(QT_BINARY_DIR)
- list(APPEND dirs "${QT_BINARY_DIR}")
- endif()
-
- if(APPLE)
- set(qt_conf_dir "${executable}/Contents/Resources")
- set(executable_path "${executable}")
- set(write_qt_conf TRUE)
- if(NOT plugins_dir)
- set(plugins_dir "${DeployQt5_apple_plugins_dir}")
- endif()
- else()
- get_filename_component(executable_path "${executable}" PATH)
- if(NOT executable_path)
- set(executable_path ".")
- endif()
- set(qt_conf_dir "${executable_path}")
- set(write_qt_conf ${request_qt_conf})
- endif()
-
- foreach(plugin ${qtplugins})
- set(installed_plugin_path "")
- install_qt5_plugin("${plugin}" "${executable}" 1 installed_plugin_path)
- list(APPEND libs ${installed_plugin_path})
- endforeach()
-
- foreach(lib ${libs})
- if(NOT EXISTS "${lib}")
- message(FATAL_ERROR "Library does not exist: ${lib}")
- endif()
- endforeach()
-
- resolve_qt5_paths(libs "${executable_path}")
-
- if(write_qt_conf)
- set(qt_conf_contents "[Paths]\nPlugins = ${plugins_dir}")
- write_qt5_conf("${qt_conf_dir}" "${qt_conf_contents}")
- endif()
-
- fixup_bundle("${executable}" "${libs}" "${dirs}")
-endfunction()
-
-function(install_qt5_plugin_path plugin executable copy installed_plugin_path_var)
- set(plugins_dir ${ARGV4})
- set(component ${ARGV5})
- set(configurations ${ARGV6})
- if(EXISTS "${plugin}")
- if(APPLE)
- if(NOT plugins_dir)
- set(plugins_dir "${DeployQt5_apple_plugins_dir}")
- endif()
- set(plugins_path "${executable}/Contents/${plugins_dir}")
- else()
- get_filename_component(plugins_path "${executable}" PATH)
- if(NOT plugins_path)
- set(plugins_path ".")
- endif()
- if(plugins_dir)
- set(plugins_path "${plugins_path}/${plugins_dir}")
- endif()
- endif()
-
- set(plugin_group "")
-
- get_filename_component(plugin_path "${plugin}" PATH)
- get_filename_component(plugin_parent_path "${plugin_path}" PATH)
- get_filename_component(plugin_parent_dir_name "${plugin_parent_path}" NAME)
- get_filename_component(plugin_name "${plugin}" NAME)
- string(TOLOWER "${plugin_parent_dir_name}" plugin_parent_dir_name)
-
- if("${plugin_parent_dir_name}" STREQUAL "plugins")
- get_filename_component(plugin_group "${plugin_path}" NAME)
- set(${plugin_group_var} "${plugin_group}")
- endif()
- set(plugins_path "${plugins_path}/${plugin_group}")
-
- if(${copy})
- file(MAKE_DIRECTORY "${plugins_path}")
- file(COPY "${plugin}" DESTINATION "${plugins_path}")
- else()
- if(configurations AND (CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE))
- set(configurations CONFIGURATIONS ${configurations})
- else()
- unset(configurations)
- endif()
- install(FILES "${plugin}" DESTINATION "${plugins_path}" ${configurations} ${component})
- endif()
- set(${installed_plugin_path_var} "${plugins_path}/${plugin_name}" PARENT_SCOPE)
- endif()
-endfunction()
-
-function(install_qt5_plugin plugin executable copy installed_plugin_path_var)
- set(plugins_dir ${ARGV4})
- set(component ${ARGV5})
- if(EXISTS "${plugin}")
- install_qt5_plugin_path("${plugin}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}")
- else()
- string(TOUPPER "QT_${plugin}_PLUGIN" plugin_var)
- set(plugin_release_var "${plugin_var}_RELEASE")
- set(plugin_debug_var "${plugin_var}_DEBUG")
- set(plugin_release "${${plugin_release_var}}")
- set(plugin_debug "${${plugin_debug_var}}")
- if(DEFINED "${plugin_release_var}" AND DEFINED "${plugin_debug_var}" AND NOT EXISTS "${plugin_release}" AND NOT EXISTS "${plugin_debug}")
- message(WARNING "Qt plugin \"${plugin}\" not recognized or found.")
- endif()
- if(NOT EXISTS "${${plugin_debug_var}}")
- set(plugin_debug "${plugin_release}")
- endif()
-
- if(CMAKE_CONFIGURATION_TYPES OR CMAKE_BUILD_TYPE)
- install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}_release" "${plugins_dir}" "${component}" "Release|RelWithDebInfo|MinSizeRel")
- install_qt5_plugin_path("${plugin_debug}" "${executable}" "${copy}" "${installed_plugin_path_var}_debug" "${plugins_dir}" "${component}" "Debug")
-
- if(CMAKE_BUILD_TYPE MATCHES "^Debug$")
- set(${installed_plugin_path_var} ${${installed_plugin_path_var}_debug})
- else()
- set(${installed_plugin_path_var} ${${installed_plugin_path_var}_release})
- endif()
- else()
- install_qt5_plugin_path("${plugin_release}" "${executable}" "${copy}" "${installed_plugin_path_var}" "${plugins_dir}" "${component}")
- endif()
- endif()
- set(${installed_plugin_path_var} ${${installed_plugin_path_var}} PARENT_SCOPE)
-endfunction()
-
-function(install_qt5_executable executable)
- set(qtplugins ${ARGV1})
- set(libs ${ARGV2})
- set(dirs ${ARGV3})
- set(plugins_dir ${ARGV4})
- set(request_qt_conf ${ARGV5})
- set(component ${ARGV6})
- if(QT_LIBRARY_DIR)
- list(APPEND dirs "${QT_LIBRARY_DIR}")
- endif()
- if(QT_BINARY_DIR)
- list(APPEND dirs "${QT_BINARY_DIR}")
- endif()
- if(TARGET Qt5::Core)
- get_property(_locCore TARGET Qt5::Core PROPERTY LOCATION_RELEASE)
- get_filename_component(_loc ${_locCore} DIRECTORY)
- message(STATUS "Adding Qt 5 directory: ${_loc}")
- list(APPEND dirs "${_loc}")
- else()
- message(FATAL_ERROR "No Qt5::Core target found, ensure it is available")
- endif()
- if(component)
- set(component COMPONENT ${component})
- else()
- unset(component)
- endif()
-
- get_filename_component(executable_absolute "${executable}" ABSOLUTE)
- if(EXISTS "${QT_QTCORE_LIBRARY_RELEASE}")
- gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_RELEASE}" qtcore_type)
- elseif(EXISTS "${QT_QTCORE_LIBRARY_DEBUG}")
- gp_file_type("${executable_absolute}" "${QT_QTCORE_LIBRARY_DEBUG}" qtcore_type)
- endif()
- if(qtcore_type STREQUAL "system")
- set(qt_plugins_dir "")
- endif()
-
- if(QT_IS_STATIC)
- message(WARNING "Qt built statically: not installing plugins.")
- else()
- if(APPLE)
- get_property(loc TARGET Qt5::QCocoaIntegrationPlugin
- PROPERTY LOCATION_RELEASE)
- install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths
- "PlugIns" "${component}")
- list(APPEND libs ${installed_plugin_paths})
- elseif(WIN32)
- get_property(loc TARGET Qt5::QWindowsIntegrationPlugin
- PROPERTY LOCATION_RELEASE)
- install_qt5_plugin("${loc}" "${executable}" 0 installed_plugin_paths
- "" "${component}")
- list(APPEND libs ${installed_plugin_paths})
- endif()
- foreach(plugin ${qtplugins})
- set(installed_plugin_paths "")
- install_qt5_plugin("${plugin}" "${executable}" 0 installed_plugin_paths "${plugins_dir}" "${component}")
- list(APPEND libs ${installed_plugin_paths})
- endforeach()
- endif()
-
- resolve_qt5_paths(libs "")
-
- install(CODE
- "include(\"${DeployQt5_cmake_dir}/DeployQt5.cmake\")
- set(BU_CHMOD_BUNDLE_ITEMS TRUE)
- fixup_qt5_executable(\"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${executable}\" \"\" \"${libs}\" \"${dirs}\" \"${plugins_dir}\" \"${request_qt_conf}\")"
- ${component}
- )
-endfunction()
diff -Nru qbittorrent-4.1.3/cmake/Modules/FindLibtorrentRasterbar.cmake qbittorrent-3.3.15/cmake/Modules/FindLibtorrentRasterbar.cmake
--- qbittorrent-4.1.3/cmake/Modules/FindLibtorrentRasterbar.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/FindLibtorrentRasterbar.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -99,7 +99,6 @@
if(LibtorrentRasterbar_ENCRYPTION_INDEX GREATER -1)
find_package(OpenSSL REQUIRED)
set(LibtorrentRasterbar_LIBRARIES ${LibtorrentRasterbar_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto)
- list(APPEND LibtorrentRasterbar_INCLUDE_DIRS "${OPENSSL_INCLUDE_DIR}")
set(LibtorrentRasterbar_OPENSSL_ENABLED ON)
endif()
@@ -114,10 +113,10 @@
LibtorrentRasterbar_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES
LibtorrentRasterbar_ENCRYPTION_INDEX)
-if (LibtorrentRasterbar_FOUND AND NOT TARGET LibtorrentRasterbar::torrent-rasterbar)
- add_library(LibtorrentRasterbar::torrent-rasterbar UNKNOWN IMPORTED)
+if (LibtorrentRasterbar_FOUND AND NOT TARGET LibtorrentRasterbar::LibTorrent)
+ add_library(LibtorrentRasterbar::LibTorrent UNKNOWN IMPORTED)
- set_target_properties(LibtorrentRasterbar::torrent-rasterbar PROPERTIES
+ set_target_properties(LibtorrentRasterbar::LibTorrent PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
IMPORTED_LOCATION "${LibtorrentRasterbar_LIBRARY}"
INTERFACE_INCLUDE_DIRECTORIES "${LibtorrentRasterbar_INCLUDE_DIRS}"
diff -Nru qbittorrent-4.1.3/cmake/Modules/FindQtSingleApplication.cmake qbittorrent-3.3.15/cmake/Modules/FindQtSingleApplication.cmake
--- qbittorrent-4.1.3/cmake/Modules/FindQtSingleApplication.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/FindQtSingleApplication.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -1,79 +1,94 @@
# - Try to find the QtSingleApplication includes and library
# which defines
#
-# QtSingleApplication_FOUND - system has QtSingleApplication
-# QtSingleApplication_INCLUDE_DIR - where to find header QtSingleApplication
-# QtSingleApplication_LIBRARIES - the libraries to link against to use QtSingleApplication
-# QtSingleApplication_LIBRARY - where to find the QtSingleApplication library (not for general use)
+# QTSINGLEAPPLICATION_FOUND - system has QtSingleApplication
+# QTSINGLEAPPLICATION_INCLUDE_DIR - where to find header QtSingleApplication
+# QTSINGLEAPPLICATION_LIBRARIES - the libraries to link against to use QtSingleApplication
+# QTSINGLEAPPLICATION_LIBRARY - where to find the QtSingleApplication library (not for general use)
# copyright (c) 2013 TI_Eugene ti.eugene@gmail.com
#
# Redistribution and use is allowed according to the terms of the FreeBSD license.
-SET(QtSingleApplication_FOUND FALSE)
+SET(QTSINGLEAPPLICATION_FOUND FALSE)
-if (Qt5Widgets_FOUND)
- set(_includeFileName qtsingleapplication.h)
-else()
- set(_includeFileName qtsinglecoreapplication.h)
-endif()
-
-FOREACH(TOP_INCLUDE_PATH in ${Qt5Core_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR})
- FIND_PATH(QtSingleApplication_INCLUDE_DIR ${_includeFileName} ${TOP_INCLUDE_PATH}/QtSolutions)
-
- IF(QtSingleApplication_INCLUDE_DIR)
- BREAK()
- ENDIF()
-ENDFOREACH()
-
-SET(QtSingleApplication_NAMES ${QtSingleApplication_NAMES}
- Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6
- QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6)
-GET_TARGET_PROPERTY(_QT5_CORELIBRARY Qt5::Core LOCATION)
-GET_FILENAME_COMPONENT(_QT5_CORELIBRARYPATH ${_QT5_CORELIBRARY} PATH)
-
-FIND_LIBRARY(QtSingleApplication_LIBRARY
- NAMES ${QtSingleApplication_NAMES}
- PATHS ${_QT5_CORELIBRARYPATH}
-)
+IF(QT4_FOUND)
+ message(STATUS "Looking for Qt4 single application library")
+ FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication
+ # standard locations
+ /usr/include
+ /usr/include/QtSolutions
+ # qt4 location except mac's frameworks
+ "${QT_INCLUDE_DIR}/QtSolutions"
+ # mac's frameworks
+ ${FRAMEWORK_INCLUDE_DIR}/QtSolutions
+ )
+
+ SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES}
+ QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6)
+ FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY
+ NAMES ${QTSINGLEAPPLICATION_NAMES}
+ PATHS ${QT_LIBRARY_DIR}
+ )
+ELSEIF(Qt5Widgets_FOUND)
+ message(STATUS "Looking for Qt5 single application library")
+ FOREACH(TOP_INCLUDE_PATH in ${Qt5Widgets_INCLUDE_DIRS} ${FRAMEWORK_INCLUDE_DIR})
+ FIND_PATH(QTSINGLEAPPLICATION_INCLUDE_DIR QtSingleApplication ${TOP_INCLUDE_PATH}/QtSolutions)
+
+ IF(QTSINGLEAPPLICATION_INCLUDE_DIR)
+ BREAK()
+ ENDIF()
+ ENDFOREACH()
+
+ SET(QTSINGLEAPPLICATION_NAMES ${QTSINGLEAPPLICATION_NAMES}
+ Qt5Solutions_SingleApplication-2.6 libQt5Solutions_SingleApplication-2.6
+ QtSolutions_SingleApplication-2.6 libQtSolutions_SingleApplication-2.6)
+ GET_TARGET_PROPERTY(QT5_WIDGETSLIBRARY Qt5::Widgets LOCATION)
+ GET_FILENAME_COMPONENT(QT5_WIDGETSLIBRARYPATH ${QT5_WIDGETSLIBRARY} PATH)
+
+ FIND_LIBRARY(QTSINGLEAPPLICATION_LIBRARY
+ NAMES ${QTSINGLEAPPLICATION_NAMES}
+ PATHS ${QT5_WIDGETSLIBRARYPATH}
+ )
+ENDIF()
-IF (QtSingleApplication_LIBRARY AND QtSingleApplication_INCLUDE_DIR)
+IF (QTSINGLEAPPLICATION_LIBRARY AND QTSINGLEAPPLICATION_INCLUDE_DIR)
- SET(QtSingleApplication_LIBRARIES ${QtSingleApplication_LIBRARY})
- SET(QtSingleApplication_FOUND TRUE)
+ SET(QTSINGLEAPPLICATION_LIBRARIES ${QTSINGLEAPPLICATION_LIBRARY})
+ SET(QTSINGLEAPPLICATION_FOUND TRUE)
IF (CYGWIN)
IF(BUILD_SHARED_LIBS)
- # No need to define QtSingleApplication_USE_DLL here, because it's default for Cygwin.
+ # No need to define QTSINGLEAPPLICATION_USE_DLL here, because it's default for Cygwin.
ELSE(BUILD_SHARED_LIBS)
- SET (QtSingleApplication_DEFINITIONS -DQTSINGLEAPPLICATION_STATIC)
+ SET (QTSINGLEAPPLICATION_DEFINITIONS -DQTSINGLEAPPLICATION_STATIC)
ENDIF(BUILD_SHARED_LIBS)
ENDIF (CYGWIN)
-ENDIF (QtSingleApplication_LIBRARY AND QtSingleApplication_INCLUDE_DIR)
+ENDIF (QTSINGLEAPPLICATION_LIBRARY AND QTSINGLEAPPLICATION_INCLUDE_DIR)
-IF (QtSingleApplication_FOUND)
- IF (NOT QtSingleApplication_FIND_QUIETLY)
- MESSAGE(STATUS "Found QtSingleApplication: ${QtSingleApplication_LIBRARY}")
- MESSAGE(STATUS " includes: ${QtSingleApplication_INCLUDE_DIR}")
- ENDIF (NOT QtSingleApplication_FIND_QUIETLY)
- if(NOT TARGET QtSingleApplication::QtSingleApplication)
- add_library(QtSingleApplication::QtSingleApplication UNKNOWN IMPORTED)
- set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
- INTERFACE_INCLUDE_DIRECTORIES "${QtSingleApplication_INCLUDE_DIR}"
- INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${QtSingleApplication_INCLUDE_DIR}"
- )
- if(EXISTS "${QtSingleApplication_LIBRARY}")
- set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
- IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
- IMPORTED_LOCATION "${QtSingleApplication_LIBRARY}")
- endif()
- endif(NOT TARGET QtSingleApplication::QtSingleApplication)
-
-ELSE (QtSingleApplication_FOUND)
+IF (QTSINGLEAPPLICATION_FOUND)
+ IF (NOT QtSingleApplication_FIND_QUIETLY)
+ MESSAGE(STATUS "Found QtSingleApplication: ${QTSINGLEAPPLICATION_LIBRARY}")
+ MESSAGE(STATUS " includes: ${QTSINGLEAPPLICATION_INCLUDE_DIR}")
+ ENDIF (NOT QtSingleApplication_FIND_QUIETLY)
+ELSE (QTSINGLEAPPLICATION_FOUND)
IF (QtSingleApplication_FIND_REQUIRED)
MESSAGE(FATAL_ERROR "Could not find QtSingleApplication library")
ENDIF (QtSingleApplication_FIND_REQUIRED)
-ENDIF (QtSingleApplication_FOUND)
+ENDIF (QTSINGLEAPPLICATION_FOUND)
+
+MARK_AS_ADVANCED(QTSINGLEAPPLICATION_INCLUDE_DIR QTSINGLEAPPLICATION_LIBRARY)
-MARK_AS_ADVANCED(QtSingleApplication_INCLUDE_DIR QtSingleApplication_LIBRARY)
+if(NOT TARGET QtSingleApplication::QtSingleApplication)
+ add_library(QtSingleApplication::QtSingleApplication UNKNOWN IMPORTED)
+ set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}"
+ INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${QTSINGLEAPPLICATION_INCLUDE_DIR}"
+ )
+ if(EXISTS "${QTSINGLEAPPLICATION_LIBRARY}")
+ set_target_properties(QtSingleApplication::QtSingleApplication PROPERTIES
+ IMPORTED_LINK_INTERFACE_LANGUAGES "CXX"
+ IMPORTED_LOCATION "${QTSINGLEAPPLICATION_LIBRARY}")
+ endif()
+endif(NOT TARGET QtSingleApplication::QtSingleApplication)
diff -Nru qbittorrent-4.1.3/cmake/Modules/MacroLinkQtComponents.cmake qbittorrent-3.3.15/cmake/Modules/MacroLinkQtComponents.cmake
--- qbittorrent-4.1.3/cmake/Modules/MacroLinkQtComponents.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/MacroLinkQtComponents.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -1,5 +1,5 @@
# - macro similar to target_link_libraries, which links Qt components
-# names of the components are passed in Qt4/Qt5 agnostic way (Core, DBus, Xml...)
+# names of the components are pased in Qt4/Qt5 agnostic way (Core, DBus, Xml...)
# and the macro links Qt4 ones if QT4_FOUND is set or Qt5 ones if not
macro (target_link_qt_components target)
diff -Nru qbittorrent-4.1.3/cmake/Modules/MacroQbtCompilerSettings.cmake qbittorrent-3.3.15/cmake/Modules/MacroQbtCompilerSettings.cmake
--- qbittorrent-4.1.3/cmake/Modules/MacroQbtCompilerSettings.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/MacroQbtCompilerSettings.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -11,17 +11,18 @@
#-Wshadow -Wconversion ?
set(_GCC_COMMON_C_AND_CXX_FLAGS "-Wall -Wextra"
"-Wfloat-equal -Wcast-qual -Wcast-align"
- "-Wsign-conversion -Winvalid-pch -Wno-long-long"
- #"-fstack-protector-all"
- #"-Werror -Wno-error=deprecated-declarations"
+ "-Wsign-conversion -Winvalid-pch -Werror=return-type -Wno-long-long"
+# -fstack-protector-all
+ "-Werror -Wno-error=deprecated-declarations"
)
- set(_GCC_COMMON_CXX_FLAGS "-fexceptions -frtti"
- "-Woverloaded-virtual -Wold-style-cast"
+ set (_GCC_COMMON_CXX_FLAGS "-fexceptions -frtti"
+ "-Woverloaded-virtual -Wold-style-cast -Wstrict-null-sentinel"
"-Wnon-virtual-dtor -Wfloat-equal -Wcast-qual -Wcast-align"
- #"-Weffc++"
- #"-Werror -Wno-error=cpp"
+ "-Werror=overloaded-virtual"
+ # "-Weffc++"
+ "-Werror -Wno-error=cpp"
# we should modify code to make these ones obsolete
- #"-Wno-error=sign-conversion -Wno-error=float-equal"
+ "-Wno-error=old-style-cast -Wno-error=sign-conversion -Wno-error=float-equal"
)
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
@@ -53,20 +54,6 @@
endif(${GLIBC_VERSION})
endif (CMAKE_SYSTEM_NAME MATCHES Linux)
- if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # Clang 5.0 still doesn't support -Wstrict-null-sentinel
- check_cxx_compiler_flag(-Wstrict-null-sentinel _STRICT_NULL_SENTINEL_IS_SUPPORTED)
- if (_STRICT_NULL_SENTINEL_IS_SUPPORTED)
- list(APPEND _GCC_COMMON_CXX_FLAGS "-Wstrict-null-sentinel")
- endif (_STRICT_NULL_SENTINEL_IS_SUPPORTED)
-
- # Code should be improved to render this not needed
- list(APPEND _GCC_COMMON_CXX_FLAGS "-Wno-error=unused-function -Wno-error=inconsistent-missing-override")
- else ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
- # GCC supports it
- list(APPEND _GCC_COMMON_CXX_FLAGS "-Wstrict-null-sentinel")
- endif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
-
string(REPLACE ";" " " _GCC_COMMON_C_AND_CXX_FLAGS_STRING "${_GCC_COMMON_C_AND_CXX_FLAGS}")
string(REPLACE ";" " " _GCC_COMMON_CXX_FLAGS_STRING "${_GCC_COMMON_CXX_FLAGS}")
diff -Nru qbittorrent-4.1.3/cmake/Modules/QbtTargetSources.cmake qbittorrent-3.3.15/cmake/Modules/QbtTargetSources.cmake
--- qbittorrent-4.1.3/cmake/Modules/QbtTargetSources.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/QbtTargetSources.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -1,17 +1,17 @@
-# a helper function which appends source to the target
-# sources file names are relative to the the target source dir
+# a helper function which appends source to the main qBt target
+# the target name is read from QBT_TARGET_NAME variable
+# sources file names are relative to the the ${qbt_executable_SOURCE_DIR}
-function (qbt_target_sources _target _scope)
- get_target_property(targetSourceDir ${_target} SOURCE_DIR)
- set(sourcesRelative "")
- foreach(source IN ITEMS ${ARGN})
- if(IS_ABSOLUTE "${source}")
- set(sourceAbsolutePath "${source}")
+function (qbt_target_sources)
+ set (_sources_rel "")
+ foreach (_source IN ITEMS ${ARGN})
+ if (IS_ABSOLUTE "${_source}")
+ set(source_abs "${_source}")
else()
- get_filename_component(sourceAbsolutePath "${source}" ABSOLUTE)
+ get_filename_component(_source_abs "${_source}" ABSOLUTE)
endif()
- file(RELATIVE_PATH sourceRelativePath "${targetSourceDir}" "${sourceAbsolutePath}")
- list(APPEND sourcesRelative "${sourceRelativePath}")
+ file (RELATIVE_PATH _source_rel "${qbt_executable_SOURCE_DIR}" "${_source_abs}")
+ list (APPEND _sources_rel "${_source_rel}")
endforeach()
- target_sources(${_target} ${_scope} "${sourcesRelative}")
-endfunction(qbt_target_sources)
+ target_sources (${QBT_TARGET_NAME} PRIVATE "${_sources_rel}")
+endfunction (qbt_target_sources)
diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf.cmake qbittorrent-3.3.15/cmake/Modules/winconf.cmake
--- qbittorrent-4.1.3/cmake/Modules/winconf.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/winconf.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -24,7 +24,6 @@
-D_WIN32_IE=0x0501
-D_CRT_SECURE_NO_DEPRECATE
-D_SCL_SECURE_NO_DEPRECATE
- -DNOMINMAX
)
# and boost
set(Boost_USE_STATIC_LIBS True)
diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf-mingw.cmake qbittorrent-3.3.15/cmake/Modules/winconf-mingw.cmake
--- qbittorrent-4.1.3/cmake/Modules/winconf-mingw.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/winconf-mingw.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -1,9 +1,9 @@
-if (STACKTRACE)
+if (STACKTRACE_WIN)
if ("${WINXXBITS}" NOT STREQUAL "Win64")
add_compile_options(-fno-omit-frame-pointer)
endif ("${WINXXBITS}" NOT STREQUAL "Win64")
link_libraries(libdbghelp -Wl,--export-all-symbols)
-endif (STACKTRACE)
+endif (STACKTRACE_WIN)
if (("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") OR ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo"))
link_libraries(-Wl,--dynamicbase)
diff -Nru qbittorrent-4.1.3/cmake/Modules/winconf-msvc.cmake qbittorrent-3.3.15/cmake/Modules/winconf-msvc.cmake
--- qbittorrent-4.1.3/cmake/Modules/winconf-msvc.cmake 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/cmake/Modules/winconf-msvc.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -1,4 +1,4 @@
-if (STACKTRACE)
+if (STACKTRACE_WIN)
if ("${WINXXBITS}" STREQUAL "Win64")
add_compile_options(-Zi)
else ("${WINXXBITS}" STREQUAL "Win64")
@@ -6,7 +6,7 @@
add_compile_options(-Oy-)
endif ("${WINXXBITS}" STREQUAL "Win64")
link_libraries(dbghelp.lib)
-endif (STACKTRACE)
+endif (STACKTRACE_WIN)
# Enable Wide characters
add_definitions(-DTORRENT_USE_WPATH)
diff -Nru qbittorrent-4.1.3/CMakeLists.txt qbittorrent-3.3.15/CMakeLists.txt
--- qbittorrent-4.1.3/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000
@@ -1,6 +1,5 @@
-cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
-
-message(WARNING "No official support for cmake build system. If it is broken, please submit patches!")
+cmake_minimum_required(VERSION 3.5)
+cmake_policy(VERSION 3.5)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules)
include(FunctionReadVersion)
@@ -23,32 +22,43 @@
add_definitions(-DQBT_VERSION_BUGFIX=${VER_BUGFIX})
add_definitions(-DQBT_VERSION_BUILD=${VER_BUILD})
+# os2 {
+# DEFINES += DQBT_VERSION=\'\"v$${PROJECT_VERSION}\"\'
+# DEFINES += DQBT_VERSION_2=\'\"$${PROJECT_VERSION}\"\'
+# } else {
add_definitions(-DQBT_VERSION="v${PROJECT_VERSION}")
add_definitions(-DQBT_VERSION_2="${PROJECT_VERSION}")
+# }
-include(GNUInstallDirs)
-include(FeatureSummary)
-
-# version requirements
-set(requiredBoostVersion 1.35)
-set(requiredQtVersion 5.5.1)
+if (UNIX AND NOT APPLE)
+ include(GNUInstallDirs)
+endif (UNIX AND NOT APPLE)
if(WIN32)
include(winconf)
endif(WIN32)
+# we need options here, because they are used not only in "src" subdir, but in the "dist" dir too
+include(CMakeDependentOption)
-# we need options here, at the top level, because they are used not only in "src" subdir, but in the "dist" dir too
-include(CompileFeature)
+option(QT5 "Compile using Qt5" ON)
+option(SYSTEM_QTSINGLEAPPLICATION
+ "Use the system qtsingleapplication library or shipped one otherwise")
+cmake_dependent_option(SYSTEM_QJSON
+ "Use the shipped qjson library or the system one (Qt4 only)" OFF "NOT QT5" OFF)
+
+option(GUI "Allows to disable GUI for headless running. Disables QtDBus and the GeoIP Database" ON)
+
+option(WEBUI "Allows to disable the WebUI." ON)
+
+if (WIN32)
+ option(STACKTRACE_WIN "")
+else (WIN32)
+ cmake_dependent_option(SYSTEMD "Install the systemd service file (headless only)" OFF
+ "NOT GUI" OFF)
+ cmake_dependent_option(DBUS "Enable use of QtDBus (GUI only)" ON "GUI" OFF)
+endif(WIN32)
-optional_compile_definitions(COUNTRIES_RESOLUTION FEATURE DESCRIPTION "Enable resolving peers IP addresses to countries"
- DEFAULT ON DISABLED DISABLE_COUNTRIES_RESOLUTION)
-optional_compile_definitions(STACKTRACE FEATURE DESCRIPTION "Enable stacktraces"
- DEFAULT ON ENABLED STACKTRACE)
-optional_compile_definitions(WEBUI FEATURE DESCRIPTION "Enables built-in HTTP server for headless use"
- DEFAULT ON DISABLED DISABLE_WEBUI)
add_subdirectory(src)
add_subdirectory(dist)
-
-feature_summary(DESCRIPTION "\nConfiguration results:" WHAT ALL)
diff -Nru qbittorrent-4.1.3/CODING_GUIDELINES.md qbittorrent-3.3.15/CODING_GUIDELINES.md
--- qbittorrent-4.1.3/CODING_GUIDELINES.md 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/CODING_GUIDELINES.md 2017-08-03 20:30:10.000000000 +0000
@@ -1,43 +1,15 @@
-All new code **must** follow the following coding guidelines.
-If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes.
-For programming languages other than C++ (e.g. JavaScript) used in this repository and submodules, unless otherwise specified, coding guidelines listed here applies as much as possible.
-
+All new code must follow the following coding guidelines.
+If you make changes in a file that still uses another coding style, make sure that you follow these guidelines for your changes instead.
**Note 1:** I will not take your head if you forget and use another style. However, most probably the request will be delayed until you fix your coding style.
**Note 2:** You can use the `uncrustify` program/tool to clean up any source file. Use it with the `uncrustify.cfg` configuration file found in the root folder.
**Note 3:** There is also a style for QtCreator but it doesn't cover all cases. In QtCreator `Tools->Options...->C++->Code Style->Import...` and choose the `codingStyleQtCreator.xml` file found in the root folder.
-### Table Of Contents
-
-* [1. New lines & curly braces](#1-new-lines--curly-braces)
- * [a. Function blocks, class/struct definitions, namespaces](#a-function-blocks-classstruct-definitions-namespaces)
- * [b. Other code blocks](#b-other-code-blocks)
- * [c. Blocks in switch's case labels](#c-blocks-in-switchs-case-labels)
- * [d. If-else statements](#d-if-else-statements)
- * [e. Single statement if blocks](#e-single-statement-if-blocks)
- * [f. Acceptable conditions to omit braces](#f-acceptable-conditions-to-omit-braces)
- * [g. Brace enclosed initializers](#g-brace-enclosed-initializers)
-* [2. Indentation](#2-indentation)
-* [3. File encoding and line endings](#3-file-encoding-and-line-endings)
-* [4. Initialization lists](#4-initialization-lists)
-* [5. Enums](#5-enums)
-* [6. Names](#6-names)
- * [a. Type names and namespaces](#a-type-names-and-namespaces)
- * [b. Variable names](#b-variable-names)
- * [c. Private member variable names](#c-private-member-variable-names)
-* [7. Header inclusion order](#7-header-inclusion-order)
-* [8. Include guard](#8-include-guard)
-* [9. Misc](#9-misc)
-* [10. Git commit message](#10-git-commit-message)
-* [11. Not covered above](#11-not-covered-above)
----
-
-### 1. New lines & curly braces ###
-
+### 1. Curly braces ###
#### a. Function blocks, class/struct definitions, namespaces ####
```c++
int myFunction(int a)
{
- // code
+ //code
}
void myFunction() {} // empty body
@@ -45,29 +17,29 @@
MyClass::MyClass(int *parent)
: m_parent(parent)
{
- // initialize
+ //initialize
}
int MyClass::myMethod(int a)
{
- // code
+ //code
}
class MyOtherClass
{
public:
- // code
-
+ //code
+
protected:
- // code
-
+ //code
+
private:
- // code
+ //code
};
namespace Name
{
- // code
+ //code
}
// Lambdas
@@ -82,20 +54,20 @@
#### b. Other code blocks ####
```c++
if (condition) {
- // code
+ //code
}
for (int a = 0; a < b; ++b) {
- // code
+ //code
}
switch (a) {
case 1:
- // blah
+ //blah
case 2:
- // blah
+ //blah
default:
- // blah
+ //blah
}
```
@@ -103,98 +75,77 @@
```c++
switch (var) {
case 1: {
- // declare local variables
- // code
+ //declare local variables
+ //code
}
break;
case 2: {
- // declare local variables
- // code
+ //declare local variables
+ //code
}
break;
default:
- // code
+ //code
}
```
-#### d. If-else statements ####
-The `else if`/`else` must be on their own lines:
+#### d. Brace enclosed initializers ####
+Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.
+But you must insert a space between the variable name and initializer.
+```c++
+Class obj {}; // empty
+Class obj {expr};
+Class obj {expr1, /*...,*/ exprN};
+QVariantMap map {{"key1", 5}, {"key2", 10}};
+```
+
+### 2. If blocks ###
+#### a. Multiple tests ####
```c++
if (condition) {
- // code
+ //code
}
else if (condition) {
- // code
+ //code
}
else {
- // code
+ //code
}
```
+The `else if`/`else` must be on their own lines.
-#### e. Single statement if blocks ####
-Most single statement if blocks should look like this:
+#### b. Single statement if blocks ####
+**Most** single statement if blocks should look like this:
```c++
if (condition)
a = a + b;
```
-One acceptable exception to this can be `return`, `break` or `continue` statements,
-provided that the test condition isn't very long and its body statement occupies only one line.
-However you can still choose to use the first rule.
+One acceptable exception to this **can be** `return`, `break` or `continue` statements, provided that the test condition isn't very long. However you can choose to use the first rule instead.
```c++
-if (a > 0) return;
+a = myFunction();
+b = a * 1500;
-while (p) {
- // ...
- if (!b) continue;
-}
+if (b > 0) return;
+c = 100 / b;
```
-#### f. Acceptable conditions to omit braces ####
-When the conditional statement in `if`/`else` has only one line and its body occupy only one line,
-this also applies to loops statements.
-Notice that for a series of `if - else` branches, if one branch needs braces then all branches must add braces.
-```c++
-if (a < b) // conditional statement
- do(a); // body
+#### c. Using curly braces for single statement if blocks ####
-if (a < b)
- do(a);
-else if (a > b)
- do(b);
-else
- do(c);
+However, there are cases where curly braces for single statement if blocks **should** be used.
+* If some branch needs braces then all others should use them. Unless you have multiple `else if` in a row and the one needing the braces is only for a very small sub-block of code.
+* Another exception would be when we have nested if blocks or generally multiple levels of code that affect code readability.
-if (a < b) {
- do(a);
-}
-else if (a > b) { // curly braces required here, then all branches should also add them
- do(b);
- do(d);
-}
-else {
- do(c);
-}
-```
-
-#### g. Brace enclosed initializers ####
-Unlike single-line functions, you must not insert spaces between the brackets and concluded expressions.
-But you must insert a space between the variable name and initializer.
-```c++
-Class obj {}; // empty
-Class obj {expr};
-Class obj {expr1, /*...,*/ exprN};
-QVariantMap map {{"key1", 5}, {"key2", 10}};
-```
+Generally it will depend on the particular piece of code and would be determined on how readable that piece of code is. **If in doubt** always use braces if one of the above exceptions applies.
-### 2. Indentation ###
+### 3. Indentation ###
4 spaces.
-### 3. File encoding and line endings ###
+### 4. File encoding and line endings. ###
UTF-8 and Unix-like line ending (LF). Unless some platform specific files need other encodings/line endings.
-### 4. Initialization lists ###
+### 5. Initialization lists. ###
Initialization lists should be vertical. This will allow for more easily readable diffs. The initialization colon should be indented and in its own line along with first argument. The rest of the arguments should be indented too and have the comma prepended.
```c++
myClass::myClass(int a, int b, int c, int d)
@@ -203,11 +154,11 @@
, m_c(c)
, m_d(d)
{
- // code
+ //code
}
```
-### 5. Enums ###
+### 6. Enums. ###
Enums should be vertical. This will allow for more easily readable diffs. The members should be indented.
```c++
enum Days
@@ -222,7 +173,7 @@
};
```
-### 6. Names ###
+### 7. Names. ###
All names should be camelCased.
#### a. Type names and namespaces ####
@@ -256,89 +207,40 @@
}
```
-### 7. Header inclusion order ###
-The headers should be placed in the following group order:
- 1. Module header (in .cpp)
- 2. C++ Standard Library headers
- 3. System headers
- 4. Boost library headers
- 5. Libtorrent headers
- 6. Qt headers
- 7. qBittorrent's own headers, starting from the *base* headers.
-
-The headers should be ordered alphabetically within each group.
-If there are conditionals for the same header group, then put them at the bottom of the respective group.
-If there are conditionals that contain headers from several different header groups, then put them above the "qBittorrent's own headers" group.
-
-One exception is the header containing the library version (for example, QtGlobal), this particular header isn't constrained by the aforementioned order.
+### 8. Header inclusion order. ###
+The headers should be placed in the following order:
+ 1. Module header (in .cpp)
+ 2. System/Qt/Boost etc. headers (splitted in subcategories if you have many).
+ 3. Application headers, starting from *Base* headers.
+The headers should be ordered alphabetically within each group (subgroup).
+
Example:
```c++
-// file: examplewidget.cpp
+// examplewidget.cpp
-// Module header
#include "examplewidget.h"
-// exceptions, headers containing version number
-#include
-#include
-#include
-
-// C++ Standard Library headers
-#include
-
-#ifdef Q_OS_WIN // conditional
#include
-#endif
-
-// System headers
-#ifdef Q_OS_WIN
-#include
-#endif
-
-// Boost library headers
-#include
-
-// Libtorrent headers
-#include
+#include
-// Qt headers
+#include
+#include
#include
#include
-#ifdef Q_OS_MAC // conditional
-#include
-#endif
-
-// conditional that contains headers from several different header groups
-#if LIBTORRENT_VERSION_NUM >= 10100
-#include
-#include
-#endif
+#include
-// qBittorrent's own headers
+#include "base/bittorrent/session.h"
#include "base/bittorrent/infohash.h"
-#include "anothermodule.h"
+#include "base/utils/fs.h"
+#include "base/utils/misc.h"
+#include "base/utils/string.h"
#include "ui_examplewidget.h"
-```
-
-### 8. Include guard ###
-`#pragma once` should be used instead of "include guard" in new code:
-```c++
-// examplewidget.h
-
-#pragma once
-
-#include
-
-class ExampleWidget : public QWidget
-{
- // (some code omitted)
-};
```
-### 9. Misc ###
+### 9. Misc. ###
* Line breaks for long lines with operation:
@@ -380,32 +282,20 @@
// we know the variable type based on the right-hand expression
```
-* Notice the spaces in the following specific situations:
+* Space around operations eg `a = b + c` or `a=b+c`:
+
+Before and after the assignment and other binary (and ternary) operators there should be a space.
+There should not be a space between increment/decrement and its operand.
+Some valid use cases:
```c++
-// Before and after the assignment and other binary (and ternary) operators there should be a space
-// There should not be a space between increment/decrement and its operand
a += 20;
a = (b <= MAX_B ? b : MAX_B);
++a;
---b;
+b--;
for (int a = 0; a < b; ++b) {
+ // code
}
-
-// Range-based for loop, spaces before and after the colon
-for (auto i : container) {
-}
-
-// Derived class, spaces before and after the colon
-class Derived : public Base
-{
-};
-```
-
-* Prefer pre-increment, pre-decrement operators
-```c++
-++i, --j; // Yes
-i++, j--; // No
```
* private/public/protected must not be indented
@@ -414,16 +304,5 @@
* Method definitions aren't allowed in header files
-### 10. Git commit message ###
-1. Limit the subject line to 50 characters. Subject should contain only the very essence of the changes (you should avoid extra details and internals)
-2. Separate subject from body with a blank line
-3. Capitalize the subject line
-4. Do not end the subject line with a period
-5. Use the imperative mood in the subject line (it's like you're ordering the program to do something (e.g. "Don't create temporary substrings")
-6. Wrap the body at 72 characters
-7. Use the body to explain what and why vs. how
-8. If commit fixes a reported issue, mention it in the message body (e.g. `Closes #4134.`)
-
-### 11. Not covered above ###
-If something isn't covered above, just follow the same style the file you are editing has.
-*This guide is not exhaustive and the style for a particular piece of code not specified here will be determined by project members on code review.*
+### 10. Not covered above ###
+If something isn't covered above, just follow the same style the file you are editing has. If that particular detail isn't present in the file you are editing, then use whatever the rest of the project uses.
diff -Nru qbittorrent-4.1.3/configure qbittorrent-3.3.15/configure
--- qbittorrent-4.1.3/configure 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/configure 2017-08-03 20:30:10.000000000 +0000
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for qbittorrent v4.1.3.
+# Generated by GNU Autoconf 2.69 for qbittorrent v3.2.0alpha.
#
# Report bugs to .
#
@@ -580,10 +580,10 @@
# Identity of this package.
PACKAGE_NAME='qbittorrent'
PACKAGE_TARNAME='qbittorrent'
-PACKAGE_VERSION='v4.1.3'
-PACKAGE_STRING='qbittorrent v4.1.3'
+PACKAGE_VERSION='v3.2.0alpha'
+PACKAGE_STRING='qbittorrent v3.2.0alpha'
PACKAGE_BUGREPORT='bugs.qbittorrent.org'
-PACKAGE_URL='https://www.qbittorrent.org/'
+PACKAGE_URL='http://www.qbittorrent.org/'
ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
@@ -603,11 +603,11 @@
zlib_CFLAGS
libtorrent_LIBS
libtorrent_CFLAGS
+qjson_LIBS
+qjson_CFLAGS
BOOST_SYSTEM_LIB
BOOST_LDFLAGS
BOOST_CPPFLAGS
-Qt5Svg_LIBS
-Qt5Svg_CFLAGS
QT_QMAKE
PKG_CONFIG_LIBDIR
PKG_CONFIG_PATH
@@ -715,9 +715,10 @@
enable_option_checking
enable_dependency_tracking
enable_silent_rules
+with_qt4
with_qtsingleapplication
+with_qjson
enable_debug
-enable_stacktrace
enable_gui
enable_systemd
enable_webui
@@ -741,8 +742,8 @@
PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR
QT_QMAKE
-Qt5Svg_CFLAGS
-Qt5Svg_LIBS
+qjson_CFLAGS
+qjson_LIBS
libtorrent_CFLAGS
libtorrent_LIBS
zlib_CFLAGS
@@ -1297,7 +1298,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures qbittorrent v4.1.3 to adapt to many kinds of systems.
+\`configure' configures qbittorrent v3.2.0alpha to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1368,7 +1369,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of qbittorrent v4.1.3:";;
+ short | recursive ) echo "Configuration of qbittorrent v3.2.0alpha:";;
esac
cat <<\_ACEOF
@@ -1383,7 +1384,6 @@
--enable-silent-rules less verbose build output (undo: "make V=1")
--disable-silent-rules verbose build output (undo: "make V=0")
--enable-debug Enable debug build
- --enable-stacktrace Enable stacktrace feature (default=auto)
--disable-gui Disable the GUI for headless running. Disables
QtDBus and the GeoIP Database.
--enable-systemd Install the systemd service file (headless only).
@@ -1393,9 +1393,13 @@
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-qt4 Compile using Qt4 (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)
--with-boost[=ARG] use Boost library from a standard location
(ARG=yes), from the specified location (ARG=),
or disable it (ARG=no) [ARG=yes]
@@ -1425,10 +1429,10 @@
directories to add to pkg-config's search path
PKG_CONFIG_LIBDIR
path overriding pkg-config's built-in search path
- QT_QMAKE value of host_bins for Qt5Core >= 5.5.1, overriding pkg-config
- Qt5Svg_CFLAGS
- C compiler flags for Qt5Svg, overriding pkg-config
- Qt5Svg_LIBS linker flags for Qt5Svg, overriding pkg-config
+ QT_QMAKE value of host_bins for Qt5Core >= 5.2.0, overriding pkg-config
+ qjson_CFLAGS
+ C compiler flags for qjson, overriding pkg-config
+ qjson_LIBS linker flags for qjson, overriding pkg-config
libtorrent_CFLAGS
C compiler flags for libtorrent, overriding pkg-config
libtorrent_LIBS
@@ -1440,7 +1444,7 @@
it to find libraries and programs with nonstandard names/locations.
Report bugs to .
-qbittorrent home page: .
+qbittorrent home page: .
_ACEOF
ac_status=$?
fi
@@ -1503,7 +1507,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-qbittorrent configure v4.1.3
+qbittorrent configure v3.2.0alpha
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1642,7 +1646,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by qbittorrent $as_me v4.1.3, which was
+It was created by qbittorrent $as_me v3.2.0alpha, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3820,7 +3824,7 @@
# Define the identity of the package.
PACKAGE='qbittorrent'
- VERSION='v4.1.3'
+ VERSION='v3.2.0alpha'
cat >>confdefs.h <<_ACEOF
@@ -4175,6 +4179,15 @@
# Define --wth-* and --enable-* arguments
+# Check whether --with-qt4 was given.
+if test "${with_qt4+set}" = set; then :
+ withval=$with_qt4;
+else
+ with_qt4=no
+fi
+
+
+
# Check whether --with-qtsingleapplication was given.
if test "${with_qtsingleapplication+set}" = set; then :
withval=$with_qtsingleapplication;
@@ -4183,19 +4196,20 @@
fi
-# Check whether --enable-debug was given.
-if test "${enable_debug+set}" = set; then :
- enableval=$enable_debug;
+
+# Check whether --with-qjson was given.
+if test "${with_qjson+set}" = set; then :
+ withval=$with_qjson;
else
- enable_debug=no
+ with_qjson=shipped
fi
-# Check whether --enable-stacktrace was given.
-if test "${enable_stacktrace+set}" = set; then :
- enableval=$enable_stacktrace;
+# Check whether --enable-debug was given.
+if test "${enable_debug+set}" = set; then :
+ enableval=$enable_debug;
else
- enable_stacktrace=auto
+ enable_debug=no
fi
@@ -4399,39 +4413,6 @@
as_fn_error $? "Unknown option \"$enable_debug\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
esac
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the stacktrace feature" >&5
-$as_echo_n "checking whether to enable the stacktrace feature... " >&6; }
-
-case "x$enable_stacktrace" in #(
- "xno") :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace" ;; #(
- "xyes") :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace" ;; #(
- "xauto") :
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;; #(
- *) :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_stacktrace" >&5
-$as_echo "$enable_stacktrace" >&6; }
- as_fn_error $? "Unknown option \"$enable_stacktrace\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
-esac
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable the GUI" >&5
$as_echo_n "checking whether to enable the GUI... " >&6; }
case "x$enable_gui" in #(
@@ -4485,9 +4466,15 @@
as_fn_error $? "Unknown option \"$enable_webui\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
esac
-if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5
- ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Qt4 should be enabled" >&5
+$as_echo_n "checking whether Qt4 should be enabled... " >&6; }
+case "x$with_qt4" in #(
+ "xno") :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
@@ -4496,12 +4483,12 @@
pkg_cv_QT_QMAKE="$QT_QMAKE"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.5.1\""; } >&5
- ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.5.1") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core >= 5.2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "Qt5Core >= 5.2.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.5.1" 2>/dev/null`
+ pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="host_bins" "Qt5Core >= 5.2.0" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -4528,8 +4515,8 @@
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.5.1" >&5
-$as_echo_n "checking for Qt5 qmake >= 5.5.1... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5 qmake >= 5.2.0" >&5
+$as_echo_n "checking for Qt5 qmake >= 5.2.0... " >&6; }
if test "x$QT_QMAKE" != "x"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5
$as_echo "$QT_QMAKE" >&6; }
@@ -4538,44 +4525,27 @@
$as_echo "not found" >&6; }
fi
-
-if test "x$QT_QMAKE" = "x"; then :
- as_fn_error $? "Could not find qmake" "$LINENO" 5
-
-fi
-if test "x$enable_gui" = "xyes"; then :
-
-pkg_failed=no
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5Svg" >&5
-$as_echo_n "checking for Qt5Svg... " >&6; }
-
-if test -n "$Qt5Svg_CFLAGS"; then
- pkg_cv_Qt5Svg_CFLAGS="$Qt5Svg_CFLAGS"
- elif test -n "$PKG_CONFIG"; then
- if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5
- ($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5
+ ;; #(
+ "xyes") :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_Qt5Svg_CFLAGS=`$PKG_CONFIG --cflags "Qt5Svg >= 5.5.1" 2>/dev/null`
- test "x$?" != "x0" && pkg_failed=yes
-else
- pkg_failed=yes
-fi
- else
- pkg_failed=untried
-fi
-if test -n "$Qt5Svg_LIBS"; then
- pkg_cv_Qt5Svg_LIBS="$Qt5Svg_LIBS"
+
+if test -n "$QT_QMAKE"; then
+ pkg_cv_QT_QMAKE="$QT_QMAKE"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Svg >= 5.5.1\""; } >&5
- ($PKG_CONFIG --exists --print-errors "Qt5Svg >= 5.5.1") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtCore >= 4.8.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtCore >= 4.8.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_Qt5Svg_LIBS=`$PKG_CONFIG --libs "Qt5Svg >= 5.5.1" 2>/dev/null`
+ pkg_cv_QT_QMAKE=`$PKG_CONFIG --variable="moc_location" "QtCore >= 4.8.0" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -4583,71 +4553,82 @@
else
pkg_failed=untried
fi
+QT_QMAKE=$pkg_cv_QT_QMAKE
+if test "x$QT_QMAKE" = x""; then :
-
-if test $pkg_failed = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
- _pkg_short_errors_supported=yes
else
- _pkg_short_errors_supported=no
+ QT_QMAKE=`$as_dirname -- "$QT_QMAKE" ||
+$as_expr X"$QT_QMAKE" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$QT_QMAKE" : 'X\(//\)[^/]' \| \
+ X"$QT_QMAKE" : 'X\(//\)$' \| \
+ X"$QT_QMAKE" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$QT_QMAKE" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)[^/].*/{
+ s//\1/
+ q
+ }
+ /^X\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
fi
- if test $_pkg_short_errors_supported = yes; then
- Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
- else
- Qt5Svg_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5Svg >= 5.5.1" 2>&1`
- fi
- # Put the nasty error message in config.log where it belongs
- echo "$Qt5Svg_PKG_ERRORS" >&5
-
- as_fn_error $? "Package requirements (Qt5Svg >= 5.5.1) were not met:
-
-$Qt5Svg_PKG_ERRORS
-Consider adjusting the PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
+fi
-Alternatively, you may set the environment variables Qt5Svg_CFLAGS
-and Qt5Svg_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." "$LINENO" 5
-elif test $pkg_failed = untried; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
- { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
-is in your PATH or set the PKG_CONFIG environment variable to the full
-path to pkg-config.
+if test -f "$QT_QMAKE/qmake"; then :
+ QT_QMAKE="$QT_QMAKE/qmake"
+else
+ if test -f "$QT_QMAKE/qmake-qt4"; then :
+ QT_QMAKE="$QT_QMAKE/qmake-qt4"
+else
+ QT_QMAKE=""
+fi
-Alternatively, you may set the environment variables Qt5Svg_CFLAGS
-and Qt5Svg_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
+fi
-To get pkg-config, see .
-See \`config.log' for more details" "$LINENO" 5; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt4 qmake >= 4.8.0" >&5
+$as_echo_n "checking for Qt4 qmake >= 4.8.0... " >&6; }
+if test "x$QT_QMAKE" != "x"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QT_QMAKE" >&5
+$as_echo "$QT_QMAKE" >&6; }
else
- Qt5Svg_CFLAGS=$pkg_cv_Qt5Svg_CFLAGS
- Qt5Svg_LIBS=$pkg_cv_Qt5Svg_LIBS
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
fi
+ ;; #(
+ *) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qt4" >&5
+$as_echo "$with_qt4" >&6; }
+ as_fn_error $? "Unknown option \"$with_qt4\". Use either \"yes\" or \"no\"." "$LINENO" 5 ;;
+esac
+if test "x$QT_QMAKE" = "x"; then :
+ as_fn_error $? "Could not find qmake" "$LINENO" 5
fi
+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether QtDBus should be enabled" >&5
$as_echo_n "checking whether QtDBus should be enabled... " >&6; }
case "x$enable_qt_dbus" in #(
"xyes") :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.5.1" >&5
-$as_echo_n "checking for Qt5DBus >= 5.5.1... " >&6; }
+ if test "x$with_qt4" = "xno"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus >= 5.2.0" >&5
+$as_echo_n "checking for Qt5DBus >= 5.2.0... " >&6; }
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.5.1\""; } >&5
- ($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.5.1") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus >= 5.2.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "Qt5DBus >= 5.2.0") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
@@ -4660,6 +4641,26 @@
HAVE_QTDBUS=false
fi
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for QtDBus >= 4.8.0" >&5
+$as_echo_n "checking for QtDBus >= 4.8.0... " >&6; }
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDBus >= 4.8.0\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QtDBus >= 4.8.0") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5
+$as_echo "found" >&6; }
+ HAVE_QTDBUS=true
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
+$as_echo "not found" >&6; }
+ HAVE_QTDBUS=false
+fi
+
+fi
+
if test "x$HAVE_QTDBUS" = "xfalse"; then :
as_fn_error $? "Could not find QtDBus" "$LINENO" 5
else
@@ -4679,17 +4680,19 @@
+
# Check whether --with-boost was given.
if test "${with_boost+set}" = set; then :
withval=$with_boost;
- case $withval in #(
- no) :
- want_boost="no";_AX_BOOST_BASE_boost_path="" ;; #(
- yes) :
- want_boost="yes";_AX_BOOST_BASE_boost_path="" ;; #(
- *) :
- want_boost="yes";_AX_BOOST_BASE_boost_path="$withval" ;;
-esac
+ if test "$withval" = "no"; then
+ want_boost="no"
+ elif test "$withval" = "yes"; then
+ want_boost="yes"
+ ac_boost_path=""
+ else
+ want_boost="yes"
+ ac_boost_path="$withval"
+ fi
else
want_boost="yes"
@@ -4701,121 +4704,78 @@
# Check whether --with-boost-libdir was given.
if test "${with_boost_libdir+set}" = set; then :
withval=$with_boost_libdir;
- if test -d "$withval"; then :
- _AX_BOOST_BASE_boost_lib_path="$withval"
-else
- as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5
-fi
+ if test -d "$withval"
+ then
+ ac_boost_lib_path="$withval"
+ else
+ as_fn_error $? "--with-boost-libdir expected directory name" "$LINENO" 5
+ fi
else
- _AX_BOOST_BASE_boost_lib_path=""
-fi
-
+ ac_boost_lib_path=""
-BOOST_LDFLAGS=""
-BOOST_CPPFLAGS=""
-if test "x$want_boost" = "xyes"; then :
-
-
- if test "x1.35" = "x"; then :
- _AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"
-else
- _AX_BOOST_BASE_TONUMERICVERSION_req="1.35"
-fi
- _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\.[0-9]*\)'`
- _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([0-9]*\)'`
- if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"; then :
- as_fn_error $? "You should at least specify libboost major version" "$LINENO" 5
fi
- _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.\([0-9]*\)'`
- if test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"; then :
- _AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"
-fi
- _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
- if test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"; then :
- _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"
-fi
- _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
- WANT_BOOST_VERSION=$_AX_BOOST_BASE_TONUMERICVERSION_RET
-
- succeeded=no
-
-
-
- case ${host_cpu} in #(
- x86_64) :
- libsubdirs="lib64 libx32 lib lib64" ;; #(
- ppc64|s390x|sparc64|aarch64|ppc64le) :
- libsubdirs="lib64 lib lib64" ;; #(
- *) :
- libsubdirs="lib"
- ;;
-esac
- case ${host_cpu} in #(
- i?86) :
- multiarch_libsubdir="lib/i386-${host_os}" ;; #(
- *) :
- multiarch_libsubdir="lib/${host_cpu}-${host_os}"
- ;;
-esac
- if test "x$_AX_BOOST_BASE_boost_path" != "x"; then :
+if test "x$want_boost" = "xyes"; then
+ boost_lib_version_req=1.35
+ boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([0-9]*\.[0-9]*\)'`
+ boost_lib_version_req_major=`expr $boost_lib_version_req : '\([0-9]*\)'`
+ boost_lib_version_req_minor=`expr $boost_lib_version_req : '[0-9]*\.\([0-9]*\)'`
+ boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[0-9]*\.[0-9]*\.\([0-9]*\)'`
+ if test "x$boost_lib_version_req_sub_minor" = "x" ; then
+ boost_lib_version_req_sub_minor="0"
+ fi
+ WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= $boost_lib_version_req" >&5
+$as_echo_n "checking for boostlib >= $boost_lib_version_req... " >&6; }
+ succeeded=no
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"" >&5
-$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) includes in \"$_AX_BOOST_BASE_boost_path/include\"... " >&6; }
- if test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"; then :
+ libsubdirs="lib"
+ ax_arch=`uname -m`
+ case $ax_arch in
+ x86_64)
+ libsubdirs="lib64 libx32 lib lib64"
+ ;;
+ ppc64|s390x|sparc64|aarch64|ppc64le)
+ libsubdirs="lib64 lib lib64 ppc64le"
+ ;;
+ esac
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
- for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"" >&5
-$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION) lib path in \"$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp\"... " >&6; }
- if test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ; then :
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
- break;
+ libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
- done
-else
-
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-fi
-
-else
+ case ${host_cpu} in
+ i?86)
+ libsubdirs="lib/i386-${host_os} $libsubdirs"
+ ;;
+ esac
- if test X"$cross_compiling" = Xyes; then
- search_libsubdirs=$multiarch_libsubdir
- else
- search_libsubdirs="$multiarch_libsubdir $libsubdirs"
- fi
- for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
- if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
- for libsubdir in $search_libsubdirs ; do
- if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+ if test "$ac_boost_path" != ""; then
+ BOOST_CPPFLAGS="-I$ac_boost_path/include"
+ for ac_boost_path_tmp in $libsubdirs; do
+ if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
+ BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
+ break
+ fi
+ done
+ elif test "$cross_compiling" != yes; then
+ for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
+ if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
+ for libsubdir in $libsubdirs ; do
+ if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
+ BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
+ BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
break;
fi
done
+ fi
-fi
-
- if test "x$_AX_BOOST_BASE_boost_lib_path" != "x"; then :
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"
-fi
+ if test "$ac_boost_lib_path" != ""; then
+ BOOST_LDFLAGS="-L$ac_boost_lib_path"
+ fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)" >&5
-$as_echo_n "checking for boostlib >= 1.35 ($WANT_BOOST_VERSION)... " >&6; }
CPPFLAGS_SAVED="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
@@ -4834,13 +4794,17 @@
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include
+ #include
int
main ()
{
-(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))]));
+ #if BOOST_VERSION >= $WANT_BOOST_VERSION
+ // Everything is okay
+ #else
+ # error Boost version is too old
+ #endif
;
return 0;
@@ -4864,47 +4828,39 @@
- if test "x$succeeded" != "xyes" ; then
+ if test "x$succeeded" != "xyes"; then
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
BOOST_CPPFLAGS=
- if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
- BOOST_LDFLAGS=
- fi
+ BOOST_LDFLAGS=
_version=0
- if test -n "$_AX_BOOST_BASE_boost_path" ; then
- if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
- for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+ if test "$ac_boost_path" != ""; then
+ if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
+ for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
+ _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
- if test "x$V_CHECK" = "x1" ; then
+ if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
fi
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
+ BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
done
if test -z "$BOOST_CPPFLAGS"; then
- if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
+ if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
+ BOOST_CPPFLAGS="-I$ac_boost_path"
fi
fi
- if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
- for libsubdir in $libsubdirs ; do
- if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
- done
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
- fi
fi
else
- if test "x$cross_compiling" != "xyes" ; then
- for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
- if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
- for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+ if test "$cross_compiling" != yes; then
+ for ac_boost_path in /usr /usr/local /opt /opt/local ; do
+ if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
+ for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
+ _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
- if test "x$V_CHECK" = "x1" ; then
+ if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
- best_path=$_AX_BOOST_BASE_boost_path
+ best_path=$ac_boost_path
fi
done
fi
@@ -4912,7 +4868,7 @@
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
- if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+ if test "$ac_boost_lib_path" = ""; then
for libsubdir in $libsubdirs ; do
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
@@ -4920,7 +4876,7 @@
fi
fi
- if test -n "$BOOST_ROOT" ; then
+ if test "x$BOOST_ROOT" != "x"; then
for libsubdir in $libsubdirs ; do
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
@@ -4929,7 +4885,7 @@
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
stage_version_shorten=`expr $stage_version : '\([0-9]*\.[0-9]*\)'`
V_CHECK=`expr $stage_version_shorten \>\= $_version`
- if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+ if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: We will use a staged boost library from $BOOST_ROOT" >&5
$as_echo "$as_me: We will use a staged boost library from $BOOST_ROOT" >&6;}
BOOST_CPPFLAGS="-I$BOOST_ROOT"
@@ -4953,13 +4909,17 @@
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-#include
+ #include
int
main ()
{
-(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($WANT_BOOST_VERSION))]));
+ #if BOOST_VERSION >= $WANT_BOOST_VERSION
+ // Everything is okay
+ #else
+ # error Boost version is too old
+ #endif
;
return 0;
@@ -4982,71 +4942,41 @@
fi
- if test "x$succeeded" != "xyes" ; then
- if test "x$_version" = "x0" ; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5
-$as_echo "$as_me: We could not detect the boost libraries (version 1.35 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;}
+ if test "$succeeded" != "yes" ; then
+ if test "$_version" = "0" ; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&5
+$as_echo "$as_me: We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation." >&6;}
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: Your boost libraries seems to old (version $_version)." >&5
$as_echo "$as_me: Your boost libraries seems to old (version $_version)." >&6;}
fi
# execute ACTION-IF-NOT-FOUND (if present):
- as_fn_error $? "Could not find Boost" "$LINENO" 5
+ :
else
+
+
$as_echo "#define HAVE_BOOST /**/" >>confdefs.h
# execute ACTION-IF-FOUND (if present):
- { $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\"
- Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&5
-$as_echo "$as_me: Boost CPPFLAGS: \"$BOOST_CPPFLAGS\"
- Boost LDFLAGS: \"$BOOST_LDFLAGS\"" >&6;}
+ :
fi
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
-
-
fi
-
-CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
-LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
-
-# add workaround for problematic boost version
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-# taken from ax_boost_base.m4
-
-
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include
-int
-main ()
-{
-(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < (106000))]));
- ;
- return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-
-else
- QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES"
+# HAVE_BOOST is set to an empty value when Boost is found. I don't know
+# how to test for a set vs unset variable.
+if test "x$BOOST_CPPFLAGS" = "x"; then :
+ as_fn_error $? "Could not find Boost" "$LINENO" 5
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&5
+$as_echo "$as_me: Boost CPPFLAGS: $BOOST_CPPFLAGS" >&6;}
+ CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
@@ -5290,9 +5220,15 @@
LDFLAGS="$LDFLAGS_SAVED"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&5
-$as_echo "$as_me: Boost.System LIB: \"$BOOST_SYSTEM_LIB\"" >&6;}
-LIBS="$BOOST_SYSTEM_LIB $LIBS"
+# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found.
+# I don't know how to test for a set vs unset variable.
+if test "x$BOOST_SYSTEM_LIB" = "x"; then :
+ as_fn_error $? "Could not find Boost.System" "$LINENO" 5
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: Boost.System LIB: $BOOST_SYSTEM_LIB" >&5
+$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 which qtsingleapplication to use" >&5
$as_echo_n "checking which qtsingleapplication to use... " >&6; }
@@ -5311,6 +5247,118 @@
as_fn_error $? "Unknown option \"$with_qtsingleapplication\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;;
esac
+if test "x$with_qt4" = "xyes"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking which qjson to use" >&5
+$as_echo_n "checking which qjson to use... " >&6; }
+ case "x$with_qjson" in #(
+ "xshipped") :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: shipped" >&5
+$as_echo "shipped" >&6; }
+ QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson" ;; #(
+ "xsystem") :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: system" >&5
+$as_echo "system" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for qjson" >&5
+$as_echo_n "checking for qjson... " >&6; }
+
+if test -n "$qjson_CFLAGS"; then
+ pkg_cv_qjson_CFLAGS="$qjson_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_qjson_CFLAGS=`$PKG_CONFIG --cflags "QJson >= 0.8.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$qjson_LIBS"; then
+ pkg_cv_qjson_LIBS="$qjson_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QJson >= 0.8.1\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "QJson >= 0.8.1") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_qjson_LIBS=`$PKG_CONFIG --libs "QJson >= 0.8.1" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ qjson_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1`
+ else
+ qjson_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QJson >= 0.8.1" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$qjson_PKG_ERRORS" >&5
+
+ as_fn_error $? "Package requirements (QJson >= 0.8.1) were not met:
+
+$qjson_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables qjson_CFLAGS
+and qjson_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables qjson_CFLAGS
+and qjson_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see .
+See \`config.log' for more details" "$LINENO" 5; }
+else
+ qjson_CFLAGS=$pkg_cv_qjson_CFLAGS
+ qjson_LIBS=$pkg_cv_qjson_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ CPPFLAGS="$qjson_CFLAGS $CPPFLAGS"
+ LIBS="$qjson_LIBS $LIBS"
+fi
+ QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson" ;; #(
+ *) :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_qjson" >&5
+$as_echo "$with_qjson" >&6; }
+ as_fn_error $? "Unknown option \"$with_qjson\". Use either \"system\" or \"shipped\"." "$LINENO" 5 ;;
+esac
+
+fi
+
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libtorrent" >&5
@@ -5577,7 +5625,7 @@
new_line='
'
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
- string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[:space:]]*//')
+ string=$(echo " $*" | $SED -e "s: -:\\${new_line}: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
@@ -5591,8 +5639,9 @@
IFS=$SAVEIFS
}
-extract "$CFLAGS $CPPFLAGS $CXXFLAGS"
+extract $CPPFLAGS
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
+QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS"
# Substitute the values of these vars in conf.pri.in
@@ -6174,7 +6223,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by qbittorrent $as_me v4.1.3, which was
+This file was extended by qbittorrent $as_me v3.2.0alpha, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -6226,13 +6275,13 @@
$config_commands
Report bugs to .
-qbittorrent home page: ."
+qbittorrent home page: ."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-qbittorrent config.status v4.1.3
+qbittorrent config.status v3.2.0alpha
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -7489,7 +7538,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by qbittorrent $as_me v4.1.3, which was
+This file was extended by qbittorrent $as_me v3.2.0alpha, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -7541,13 +7590,13 @@
$config_commands
Report bugs to .
-qbittorrent home page: ."
+qbittorrent home page: ."
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-qbittorrent config.status v4.1.3
+qbittorrent config.status v3.2.0alpha
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -8248,3 +8297,4 @@
as_fn_error $? "Failed running $QT_QMAKE to generate the makefile" "$LINENO" 5
fi
$as_echo
+
diff -Nru qbittorrent-4.1.3/configure.ac qbittorrent-3.3.15/configure.ac
--- qbittorrent-4.1.3/configure.ac 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/configure.ac 2017-08-03 20:30:10.000000000 +0000
@@ -1,4 +1,4 @@
-AC_INIT([qbittorrent], [v4.1.3], [bugs.qbittorrent.org], [], [https://www.qbittorrent.org/])
+AC_INIT([qbittorrent], [v3.2.0alpha], [bugs.qbittorrent.org], [], [http://www.qbittorrent.org/])
AC_CONFIG_AUX_DIR([build-aux])
AC_CONFIG_MACRO_DIR([m4])
AC_PROG_CC
@@ -12,24 +12,30 @@
# Define --wth-* and --enable-* arguments
+AC_ARG_WITH(qt4,
+ [AS_HELP_STRING([--with-qt4],
+ [Compile using Qt4 (default=no)])],
+ [],
+ [with_qt4=no])
+
AC_ARG_WITH(qtsingleapplication,
[AS_HELP_STRING([--with-qtsingleapplication=@<:@system|shipped@:>@],
[Use the shipped qtsingleapplication library or the system one (default=shipped)])],
[],
[with_qtsingleapplication=shipped])
+AC_ARG_WITH(qjson,
+ [AS_HELP_STRING([--with-qjson=@<:@system|shipped@:>@],
+ [Use the shipped qjson library or the system one (default=shipped) (Qt4 only)])],
+ [],
+ [with_qjson=shipped])
+
AC_ARG_ENABLE(debug,
[AS_HELP_STRING([--enable-debug],
[Enable debug build])],
[],
[enable_debug=no])
-AC_ARG_ENABLE(stacktrace,
- [AS_HELP_STRING([--enable-stacktrace],
- [Enable stacktrace feature (default=auto)])],
- [],
- [enable_stacktrace=auto])
-
AC_ARG_ENABLE(gui,
[AS_HELP_STRING([--disable-gui],
[Disable the GUI for headless running. Disables QtDBus and the GeoIP Database.])],
@@ -86,23 +92,6 @@
[AC_MSG_RESULT([$enable_debug])
AC_MSG_ERROR([Unknown option "$enable_debug". Use either "yes" or "no".])])
-AC_MSG_CHECKING([whether to enable the stacktrace feature])
-AS_CASE(["x$enable_stacktrace"],
- ["xno"],
- [AC_MSG_RESULT([no])
- QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace"],
- ["xyes"],
- [AC_MSG_RESULT([yes])
- QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace"],
- ["xauto"],
- [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include ]])],
- [AC_MSG_RESULT([yes])
- QBT_ADD_CONFIG="$QBT_ADD_CONFIG stacktrace"],
- [AC_MSG_RESULT([no])
- QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG stacktrace"])],
- [AC_MSG_RESULT([$enable_stacktrace])
- AC_MSG_ERROR([Unknown option "$enable_stacktrace". Use either "yes" or "no".])])
-
AC_MSG_CHECKING([whether to enable the GUI])
AS_CASE(["x$enable_gui"],
["xyes"],
@@ -138,13 +127,20 @@
[AC_MSG_RESULT([$enable_webui])
AC_MSG_ERROR([Unknown option "$enable_webui". Use either "yes" or "no".])])
-FIND_QT5()
+AC_MSG_CHECKING([whether Qt4 should be enabled])
+AS_CASE(["x$with_qt4"],
+ ["xno"],
+ [AC_MSG_RESULT([no])
+ FIND_QT5()],
+ ["xyes"],
+ [AC_MSG_RESULT([yes])
+ FIND_QT4()],
+ [AC_MSG_RESULT([$with_qt4])
+ AC_MSG_ERROR([Unknown option "$with_qt4". Use either "yes" or "no".])])
AS_IF([test "x$QT_QMAKE" = "x"],
[AC_MSG_ERROR([Could not find qmake])
])
-AS_IF([test "x$enable_gui" = "xyes"],
- [PKG_CHECK_MODULES(Qt5Svg, [Qt5Svg >= 5.5.1])
- ])
+
AC_MSG_CHECKING([whether QtDBus should be enabled])
AS_CASE(["x$enable_qt_dbus"],
["xyes"],
@@ -161,27 +157,22 @@
AC_MSG_ERROR([Unknown option "$enable_qt_dbus". Use either "yes" or "no".])])
-AX_BOOST_BASE([1.35],
- [AC_MSG_NOTICE([Boost CPPFLAGS: "$BOOST_CPPFLAGS"
- Boost LDFLAGS: "$BOOST_LDFLAGS"])],
- [AC_MSG_ERROR([Could not find Boost])])
-CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
-LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"
-
-# add workaround for problematic boost version
-AC_LANG_PUSH(C++)
-# taken from ax_boost_base.m4
-m4_define([DETECT_BOOST_VERSION_PROGRAM],
- [AC_LANG_PROGRAM([[#include ]],
- [[(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));]])])
-
-AC_COMPILE_IFELSE([DETECT_BOOST_VERSION_PROGRAM(106000)], [],
- [QBT_ADD_DEFINES="$QBT_ADD_DEFINES BOOST_NO_CXX11_RVALUE_REFERENCES"])
-AC_LANG_POP([C++])
+AX_BOOST_BASE([1.35])
+# HAVE_BOOST is set to an empty value when Boost is found. I don't know
+# how to test for a set vs unset variable.
+AS_IF([test "x$BOOST_CPPFLAGS" = "x"],
+ [AC_MSG_ERROR([Could not find Boost])],
+ [AC_MSG_NOTICE([Boost CPPFLAGS: $BOOST_CPPFLAGS])
+ CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS"
+ LDFLAGS="$BOOST_LDFLAGS $LDFLAGS"])
AX_BOOST_SYSTEM()
-AC_MSG_NOTICE([Boost.System LIB: "$BOOST_SYSTEM_LIB"])
-LIBS="$BOOST_SYSTEM_LIB $LIBS"
+# HAVE_BOOST_SYSTEM is set to an empty value when Boost.System is found.
+# I don't know how to test for a set vs unset variable.
+AS_IF([test "x$BOOST_SYSTEM_LIB" = "x"],
+ [AC_MSG_ERROR([Could not find Boost.System])],
+ [AC_MSG_NOTICE([Boost.System LIB: $BOOST_SYSTEM_LIB])
+ LIBS="$BOOST_SYSTEM_LIB $LIBS"])
AC_MSG_CHECKING([which qtsingleapplication to use])
AS_CASE(["x$with_qtsingleapplication"],
@@ -194,6 +185,23 @@
[AC_MSG_RESULT([$with_qtsingleapplication])
AC_MSG_ERROR([Unknown option "$with_qtsingleapplication". Use either "system" or "shipped".])])
+AS_IF([test "x$with_qt4" = "xyes"],
+ [AC_MSG_CHECKING([which qjson to use])
+ AS_CASE(["x$with_qjson"],
+ ["xshipped"],
+ [AC_MSG_RESULT([shipped])
+ QBT_REMOVE_CONFIG="$QBT_REMOVE_CONFIG usesystemqjson"],
+ ["xsystem"],
+ [AC_MSG_RESULT([system])
+ PKG_CHECK_MODULES(qjson,
+ [QJson >= 0.8.1],
+ [CPPFLAGS="$qjson_CFLAGS $CPPFLAGS"
+ LIBS="$qjson_LIBS $LIBS"])
+ QBT_ADD_CONFIG="$QBT_ADD_CONFIG usesystemqjson"],
+ [AC_MSG_RESULT([$with_qjson])
+ AC_MSG_ERROR([Unknown option "$with_qjson". Use either "system" or "shipped".])])
+ ])
+
PKG_CHECK_MODULES(libtorrent,
[libtorrent-rasterbar >= 1.0.6],
[CPPFLAGS="$libtorrent_CFLAGS $CPPFLAGS"
@@ -224,7 +232,7 @@
new_line='
'
# Convert " -" to "\n" if not between quotes and remove possible leading white spaces
- string=$(echo " $*" | $SED -e "s: -:\\${new_line}:g" -e 's:"\(.*\)\n\(.*\)":\"\1 -\2":g' -e "s:'\(.*\)\n\(.*\)':\'\1 -\2':g" -e 's/^[[[:space:]]]*//')
+ string=$(echo " $*" | $SED -e "s: -:\\${new_line}: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
@@ -238,8 +246,9 @@
IFS=$SAVEIFS
}
-extract "$CFLAGS $CPPFLAGS $CXXFLAGS"
+extract $CPPFLAGS
QBT_ADD_DEFINES="$QBT_ADD_DEFINES $QBT_CONF_DEFINES"
+QBT_CONF_EXTRA_CFLAGS="$QBT_CONF_EXTRA_CFLAGS $CXXFLAGS"
# Substitute the values of these vars in conf.pri.in
AC_SUBST(QBT_CONF_INCLUDES)
@@ -267,3 +276,4 @@
[AC_MSG_NOTICE([Good, your configure finished.])],
[AC_MSG_ERROR([Failed running $QT_QMAKE to generate the makefile])])
AS_ECHO()
+
diff -Nru qbittorrent-4.1.3/conf.pri.windows qbittorrent-3.3.15/conf.pri.windows
--- qbittorrent-4.1.3/conf.pri.windows 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/conf.pri.windows 1970-01-01 00:00:00.000000000 +0000
@@ -1,69 +0,0 @@
-# Adapt these paths
-# Point these to the include folders
-INCLUDEPATH += $$quote(C:/qBittorrent/boost)
-INCLUDEPATH += $$quote(C:/qBittorrent/libtorrent/include)
-INCLUDEPATH += $$quote(C:/qBittorrent/zlib/include)
-INCLUDEPATH += $$quote(C:/qBittorrent/openssl/include)
-# Point these to the lib folders
-LIBS += $$quote(-LC:/qBittorrent/boost/stage/lib)
-LIBS += $$quote(-LC:/qBittorrent/libtorrent/lib)
-LIBS += $$quote(-LC:/qBittorrent/zlib/lib)
-LIBS += $$quote(-LC:/qBittorrent/openssl/lib)
-
-# Adapt the lib names/versions accordingly
-# If you want to use Boost auto-linking then disable
-# BOOST_ALL_NO_LIB below and omit Boost libraries here
-CONFIG(debug, debug|release) {
- LIBS += libtorrentd.lib \
- libboost_system-vc140-mt-sgd-1_64.lib
-}
-else {
- LIBS += libtorrent.lib \
- libboost_system-vc140-mt-s-1_64.lib
-}
-LIBS += libeay32.lib ssleay32.lib
-LIBS += zlib.lib
-# ...or if you use MinGW
-#CONFIG(debug, debug|release) {
-# LIBS += libtorrent-rasterbar \
-# libboost_system-mt
-#}
-#else {
-# LIBS += libtorrent-rasterbar \
-# libboost_system-mt
-#}
-#LIBS += libcrypto libssl
-#LIBS += libz
-
-DEFINES += NTDDI_VERSION=0x05010000
-DEFINES += _WIN32_WINNT=0x0501
-DEFINES += _WIN32_IE=0x0501
-
-# Disable to use Boost auto-linking
-DEFINES += BOOST_ALL_NO_LIB
-# Use one of the following options
-DEFINES += BOOST_SYSTEM_STATIC_LINK
-#DEFINES += BOOST_SYSTEM_DYN_LINK
-# Boost 1.60+ defaults to Vista+ support. The define below enables XP support again.
-DEFINES += BOOST_USE_WINAPI_VERSION=0x0501
-# Enable if building against libtorrent 1.0.x (RC_1_0) (static linking)
-#DEFINES += BOOST_ASIO_SEPARATE_COMPILATION
-# Enable if building against libtorrent 1.0.x (RC_1_0) (dynamic linking)
-#DEFINES += BOOST_ASIO_DYN_LINK
-# Enable if encountered build error with boost version <= 1.59
-#DEFINES += BOOST_NO_CXX11_RVALUE_REFERENCES
-
-# Enable if building against libtorrent 1.1.x (RC_1_1)
-# built with this flag defined
-#DEFINES += TORRENT_NO_DEPRECATE
-# Enable if linking dynamically against libtorrent
-#DEFINES += TORRENT_LINKING_SHARED
-
-# Enable stack trace support
-CONFIG += stacktrace
-
-win32-msvc* {
- QMAKE_CXXFLAGS += "/guard:cf"
- QMAKE_LFLAGS += "/guard:cf"
- QMAKE_LFLAGS_RELEASE += "/OPT:REF /OPT:ICF"
-}
diff -Nru qbittorrent-4.1.3/CONTRIBUTING.md qbittorrent-3.3.15/CONTRIBUTING.md
--- qbittorrent-4.1.3/CONTRIBUTING.md 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/CONTRIBUTING.md 2017-08-03 20:30:10.000000000 +0000
@@ -1,221 +1,35 @@
-# How to contribute to qBittorrent
+# Filing an issue
-There are three main ways to contribute to the project.
-Read the respective section to find out more.
-
-### Table Of Contents
-
-* **[Bug reporting etiquette](#bug-reporting-etiquette)**
-
-
-* **[Submitting an issue/bug report](#submitting-an-issuebug-report)**
- * [What is an actual bug report?](#what-is-an-actual-bug-report)
- * [Before submitting a bug report](#before-submitting-a-bug-report)
- * [Steps to ensure a good bug report](#steps-to-ensure-a-good-bug-report)
-
-
-* **[Suggesting enhancements/feature requests](#suggesting-enhancementsfeature-requests)**
- * [Before submitting an enhancement/feature request](#before-submitting-an-enhancementfeature-request)
- * [Steps to ensure a good enhancement/feature suggestion](#steps-to-ensure-a-good-enhancementfeature-suggestion)
-
-
-* **[Opening a pull request](#opening-a-pull-request)**
- * [Must read](#must-read)
- * [Good to know](#good-to-know)
-
-# Bug reporting etiquette
-
-* Issues, pull requests, and comments must always be in **English.**
-
-* This project is supported by volunteers, do not expect "customer support"-style interaction.
-
-* **Be patient.** The development team is small and resource limited. Developers and contributors take from their free time to analyze the problem and fix the issue. :clock3:
-
-* Harsh words or threats won't help your situation. What's worse, your complain will (very likely) be **ignored.** :fearful:
-
-# Submitting an issue/bug report
-
-This section guides you through submitting an issue/bug report for qBittorrent.
-
-Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
-
-Make sure to follow these rules carefully when submitting a bug report. Failure to do so will result in the issue being closed.
-
-## What is an actual bug report?
-
-Developers and contributors are not supposed to deal with issues for which little to no investigation to find the actual cause of a purported issue was made by the reporter.
-
-Positive contributions are those which are reported with efforts to find the actual cause of an issue, or at the very least efforts were made to narrow it as much as possible.
-
-Requiring people to investigate as much as possible before opening an issue will more than likely avoid burdening the project with invalid issues or issues unrelated to qBittorrent.
-
-The following are _not_ bug reports. **Check the [wiki][wiki-url], [forum][forum-url] or other places for help and support for issues like these**:
-
-- Explanation of qBittorrent options (see [wiki][wiki-url]).
-- Help with WebUI setup.
-- Help with embedded tracker setup.
-- Help about BitTorrent in general.
-- Issues with specific search plugins.
-- Asking for specific builds of qBittorrent other than the current one. You can install older releases at your own risk or for regression testing purposes. Previous Windows and macOS builds are available [here][builds-url].
- - If you want older Linux builds, you will have to compile them yourself from the corresponding commits, or ask someone on the [forum][forum-url] to do it for you.
-- Possibly others. Read on and use common sense.
-
-The issue tracker is for provable issues only: You will have to make the case that the issue is really with qBittorrent and not something else on your side.
-
-To make a case means to provide detailed steps so that anybody can reproduce the issue.
-Be sure to rule out that the issue is not caused by something specific on your side.
-
-Issue reports for bugs that apparently aren't easily reproducible or that you can't figure out what triggers it even though you tried are OK.
-
-Any issue opened without effort to provide the required details for developers, contributors or anybody else to reproduce the problem will be closed as invalid.
-For example:
-- Crash reports with just a stack trace.
-- Speculated performance issues that do not come with actual profiling data + analysis supporting the claim.
-
-## Before submitting a bug report
-
-- **Do some basic troubleshooting (examples)**:
- - Restart qBittorrent.
- - Restart your PC.
- - Update your OS (e.g. Windows updates).
- - Update your network card drivers.
- - Fully reinstall qBittorrent.
- - etc...
-- Make sure the problem is not caused by anti-virus or other program messing with your files.
-- Check if you can reproduce the problem in the latest version of qBittorrent.
-- **Check [forum][forum-url] and [wiki][wiki-url].** You might be able to find the cause of the problem and fix things yourself.
-- **Check if the issue exists already in the issue tracker.**
- - If it does and the issue is still open, add a comment to the existing issue instead of opening a new one.
- - If you find a Closed issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
-- If the issue is with the search functionality:
- - **Make sure you have [`python`][python-url] installed correctly (remember the search functionality requires a working python installation).**
- - Make sure it is in fact a problem with the search functionality itself, and not a problem with the plugins. If something does not work properly with the search functionality, the first step is to rule out search plugin-related issues.
- - For search plugin issues, report on the respective search plugin support page, or at [qbittorrent/search-plugins][search-plugins-url].
-
-## Steps to ensure a good bug report
-
-**Follow these guidelines** in order to provide as much useful information as possible right away. Not all of them are applicable to all issues, but you are expected to follow most of these steps (use common sense).
-Otherwise, we've noticed that a lot of your time (and the developers') gets thrown away on exchanging back and forth to get this information.
-
-* Use a **clear and descriptive title** for the issue to identify the problem.
-
-* Post only **one specific issue per submission.**
-
-* **Fill out the issue template properly.**
-
-- **Make sure you are using qBittorrent on a supported platform.** Do not submit issues which can only be reproduced on beta/unsupported releases of supported operating systems (e.g. Windows 10 Insider, Ubuntu 12.04 LTS, etc).
-These are unstable/unsupported platforms, and in all likelihood, whatever the issue is, it is not related to qBittorrent.
-
-* **Specify the OS you're using, its version and architecture.**
- * Examples: Windows 8.1 32-bit, Linux Mint 17.1 64-bit, Windows 10 Fall creators Update 64-bit, etc.
-
-
-* **Report only if you run into the issue with an official stable release, a beta release, or with the most recent upstream changes (in this last case specify the specific commit you are on).** (beta testing is encouraged :smile:). We do not provide support for bugs on unofficial Windows builds.
-
-* **Specify the version of qBittorrent** you are using, as well as its **architecture** (x86 or x64) and its **libraries' versions** (Help -> About -> Libraries).
-
-* Specify **how you installed**:
- - Linux: either from the PPA, your distribution's repositories, or compiled from source, or even possibly third-party repositories.
- - Windows: either from the installer, or compiled from source, or even possibly third-party repositories.
- - macOS: either from the installer, or compiled from source, or even possibly third-party repositories.
-
-
-* **Describe the exact steps which reproduce the problem in as many details as possible.**
- - For example, start by explaining how you started qBittorrent, e.g. was it via the terminal? Desktop icon? Did you start it as root or normal user?
- - **When listing steps, don't just say what you did, but explain how you did it.**
- - For example, if you added a torrent for download, did you do so via a `.torrent` file or via a magnet link? If it was with a torrent file did you do so by dragging the torrent file from the file manager to the transfer list, or did you use the "Add Torrent File" in the Top Bar?
- - Describe the behavior you observed after following the steps and point out what exactly is the problem with that behavior; this is what we'll be looking for after executing the steps.
-
-
-* **Explain which behavior you expected to see instead** and why.
-
-* Use **screenshots/animated GIFs to help describe the issue** whenever appropriate [(How?)][attachments-howto-url].
-
-* If the problem wasn't triggered by a specific action, describe what you were doing before the problem happened.
-
-* **If you are reporting that qBittorrent crashes**, include the stack trace in the report; include it in a code block, a file attachment, or put it in a gist and provide link to that gist.
-
-* **For performance-related issues**, include as much profiling data as you can (resource usage graphs, etc).
-
-* Paste the **qBittorrent log** (or put the contents of the log in a gist and provide a link to the gist). The log can be viewed in the GUI (View -> Log -> tick all boxes). If you can't do that, the file is at:
- - Linux: `~/.local/share/data/qBittorrent/logs/qBittorrent.log`
- - Windows: `%LocalAppData%\qBittorrent\logs`
- - macOS: `~/Library/Application Support/qBittorrent/qBittorrent.log`
-
-
-* **Do NOT post comments like "+1" or "me too!"** without providing new relevant info on the issue. Using the built-in reactions is OK though. Remember that you can use the "subscribe" button to receive notifications of that report without having to comment first.
-
-* If there seems to be an **issue with specific torrent files/magnet links**:
- - Don't post private `.torrent` files/magnet links, or ones that point to copyrighted content. If you are willing, offer to email a link or the `.torrent` file itself to whoever developer is debugging it and requests it.
- - Make sure you can't reproduce the problem with another client, to rule out the possibility that the issue is with the `.torrent` file/magnet link itself.
-
-
-* A screenshot, transcription or file upload of any of **qBittorrent's preferences that differ from the defaults.** Please include everything different from the defaults whether or not it seems relevant to your issue.
-
-* **Attachment rules**:
- - Short logs and error messages can be pasted as quotes/code whenever small enough; otherwise make a gist with the contents and post the link to the gist.
- - Avoid linking/attaching impractical file formats such as PDFs/Word documents with images. If you want to post an image, just post the image.
-
-### Provide more context by answering these questions (if applicable):
-
-- Can you **reliably reproduce the issue?** If not, provide details about how often the problem happens and under which conditions it normally happens (e.g. only happens with extremely large torrents/only happens after qBittorrent is open for more than 2 days/etc...)
-
-- Did the problem start happening recently (e.g. after updating to a new version of qBittorrent) or was this always a problem?
-
-- If the problem started happening recently, can you reproduce the problem in an older version of qBittorrent?
-
-- Are you saving files locally (in a disk in your machine), or are you saving them remotely (e.g. network drives)?
-
-- Are you using qBittorrent with multiple monitors? If so, can you reproduce the problem when you use a single monitor?
-
-Good read: [How to Report Bugs Effectively][howto-report-bugs-url]
-
-# Suggesting enhancements/feature requests
-
-This section guides you through submitting an enhancement suggestion for qBittorrent, including completely new features and minor improvements to existing functionality.
-
-Following these guidelines helps maintainers and the community understand your suggestion and find related suggestions.
-
-## Before submitting an enhancement/feature request
-
-* Check the [wiki][wiki-url] and [forum][forum-url] for tips — you might discover that the enhancement is already available.
-* Most importantly, check if you're using the latest version of qBittorrent and if you can get the desired behavior by changing qBittorrent's settings.
-* Check in the [releases][releases-url] page or on the [forum][forum-url], see if there's already a alpha/beta version with that enhancement.
-* Perform a cursory search to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
+### Must read
+* If you aren't sure, you can ask on the [**forum**](http://forum.qbittorrent.org) or read our [**wiki**](http://wiki.qbittorrent.org) first.
+* Do a quick **search**. Others might already reported the issue.
+* Write in **English**!
+* Provide **version** information: (You can find version numbers at menu `Help -> About -> Libraries`)
+ ```
+ qBittorrent:
+ Qt:
+ libtorrent:
+ boost:
+ OS version:
+ ```
+* Provide **steps** to reproduce the problem, it will be easier to pinpoint the fault.
+* **Screenshots**! A screenshot is worth a thousand words. just upload it. [(How?)](https://help.github.com/articles/file-attachments-on-issues-and-pull-requests)
-## Steps to ensure a good enhancement/feature suggestion
+### Good to know
+* **Be patient**. The dev team is small and resource limited. Devs finding their free time, analyzing the problem and fixing the issue, it all takes time. :clock3:
+* If you can code, why not become a **contributor** by fixing the issue and open a pull request? :wink:
+* Harsh words or threats won't help your situation. What's worse, your complain will (very likely) to be **ignored**. :fearful:
-- Specify which version of qBittorrent you're using.
-- Specify the name and version of the OS you're using.
-- Provide a step-by-step description of the suggested enhancement in as many details as possible.
-- Describe the current behavior and explain which behavior you expected to see instead and why.
-- Include screenshots and animated GIFs which help you demonstrate the steps or point out the part of qBittorrent which the suggestion is related to.
-- If this enhancement exists in other BitTorrent clients, list those clients.
# Opening a pull request
### Must read
-* Read our [**coding guidelines**][coding-guidelines-url]. There are some scripts to help you: [uncrustify script][uncrustify-script-url], [astyle script][astyle-script-url], [(related thread)][coding-guidelines-thread-url].
-* Keep the title **short** and provide a **clear** description about what your pull request does.
-* Provide **screenshots** for UI related changes.
-* Keep your git commit history **clean** and **precise.** Refer to the section about "Git commit messages" in the [**coding guidelines**][coding-guidelines-url].
-* If your commit fixes a reported issue (for example #4134), add the following message to the commit `Closes #4134.`. Example [here][commit-message-fix-issue-example-url].
+* Read our [**coding guidelines**](https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md). There are some scripts to help you: [uncrustify script](https://raw.githubusercontent.com/qbittorrent/qBittorrent/master/uncrustify.cfg), [astyle script](https://gist.github.com/Chocobo1/539cee860d1eef0acfa6), [(related thread)](https://github.com/qbittorrent/qBittorrent/issues/2192).
+* Keep the title **short** and provide a **clear** description about what your pull request does.
+* Provide **screenshots** for UI related changes.
+* Keep your git commit history **clean** and **precise**. Commits like `xxx fixup` should not appear.
+* If your commit fix a reported issue (for example #4134), add the following message to the commit `Closes #4134.`. Example [here](https://github.com/qbittorrent/qBittorrent/commit/a74bac20c4e8de9776bf9bb77fdc7526135d1988).
### Good to know
-* **Search** pull request history! Others might have already implemented your idea and it is waiting to be merged (or got rejected already). Save your precious time by doing a search first.
-* When resolving merge conflicts, do `git rebase `, don't do `git pull`. Then you can start fixing the conflicts. Here is a good explanation: [link][merging-vs-rebasing-url].
-
-[astyle-script-url]: https://gist.github.com/Chocobo1/539cee860d1eef0acfa6
-[attachments-howto-url]: https://help.github.com/articles/file-attachments-on-issues-and-pull-requests
-[coding-guidelines-url]: https://github.com/qbittorrent/qBittorrent/blob/master/CODING_GUIDELINES.md
-[coding-guidelines-thread-url]: https://github.com/qbittorrent/qBittorrent/issues/2192
-[commit-message-fix-issue-example-url]: https://github.com/qbittorrent/qBittorrent/commit/c07cd440cd46345297debb47cb260f8688975f50
-[forum-url]: http://forum.qbittorrent.org/
-[howto-report-bugs-url]: https://www.chiark.greenend.org.uk/~sgtatham/bugs.html
-[merging-vs-rebasing-url]: https://www.atlassian.com/git/tutorials/merging-vs-rebasing
-[python-url]: https://www.python.org/
-[releases-url]: https://github.com/qbittorrent/qBittorrent/releases
-[search-plugins-url]: https://github.com/qbittorrent/search-plugins
-[uncrustify-script-url]: https://raw.githubusercontent.com/qbittorrent/qBittorrent/master/uncrustify.cfg
-[wiki-url]: https://github.com/qbittorrent/qBittorrent/wiki
-[builds-url]: https://sourceforge.net/projects/qbittorrent/files/
+* **Search** pull request history! Others might already implemented your idea and is waiting to be merged (or got rejected already). Save your precious time by doing a search first.
+* When resolving merge conflicts, do `git rebase `, don't do `git pull`. Then you can start fixing the conflicts. Here is a good explanation: [link](https://www.atlassian.com/git/tutorials/merging-vs-rebasing).
diff -Nru qbittorrent-4.1.3/debian/changelog qbittorrent-3.3.15/debian/changelog
--- qbittorrent-4.1.3/debian/changelog 2018-10-05 06:58:32.000000000 +0000
+++ qbittorrent-3.3.15/debian/changelog 2018-10-05 07:11:00.000000000 +0000
@@ -1,32 +1,8 @@
-qbittorrent (4.1.3-1~ubuntu16.04.1~ppa1) xenial; urgency=medium
+qbittorrent (3.3.15-1~ubuntu16.04.1~ppa1) xenial; urgency=medium
* No-change backport to xenial
- -- Micah Gersten Fri, 05 Oct 2018 01:58:32 -0500
-
-qbittorrent (4.1.3-1) unstable; urgency=medium
-
- [ Helmut Grohne ]
- * Partially fix FTCBFS: Let dh_auto_configure pass --host to ./configure.
- (Closes: #886162)
-
- [ Andrew Starr-Bochicchio ]
- * New upstream release (Closes: #900415, #908974, #893331).
- * debian/control:
- - Update VCS-* fields for salsa migration.
- - Bump Standards-Version to 4.2.1, no changes.
- * debian/rules: Remove unnecessary ' --parallel' dh argument
- as it is now the default.
- * Update lintian-overrides for new file locations.
-
- -- Andrew Starr-Bochicchio Sun, 23 Sep 2018 18:51:12 -0400
-
-qbittorrent (4.0.3-1) unstable; urgency=medium
-
- * New upstream release (Closes: #883871).
- * Build depend on libqt5svg5-dev.
-
- -- Andrew Starr-Bochicchio Mon, 25 Dec 2017 15:22:26 -0500
+ -- Micah Gersten Fri, 05 Oct 2018 02:11:00 -0500
qbittorrent (3.3.15-1) unstable; urgency=medium
diff -Nru qbittorrent-4.1.3/debian/control qbittorrent-3.3.15/debian/control
--- qbittorrent-4.1.3/debian/control 2018-09-23 22:12:39.000000000 +0000
+++ qbittorrent-3.3.15/debian/control 2017-09-03 18:26:33.000000000 +0000
@@ -7,13 +7,12 @@
dpkg-dev (>= 1.16.1),
libtorrent-rasterbar-dev (>= 1.1.2),
libboost-dev,
- libqt5svg5-dev,
qtbase5-dev (>= 5.2.0),
qttools5-dev-tools,
zlib1g-dev
-Standards-Version: 4.2.1
-Vcs-Git: https://salsa.debian.org/debian/qbittorrent.git
-Vcs-Browser: https://salsa.debian.org/debian/qbittorrent
+Standards-Version: 4.1.0
+Vcs-Git: git://anonscm.debian.org/collab-maint/qbittorrent.git
+Vcs-Browser: http://anonscm.debian.org/gitweb/?p=collab-maint/qbittorrent.git
Homepage: http://www.qbittorrent.org/
Package: qbittorrent
diff -Nru qbittorrent-4.1.3/debian/.gitlab-ci.yml qbittorrent-3.3.15/debian/.gitlab-ci.yml
--- qbittorrent-4.1.3/debian/.gitlab-ci.yml 2018-09-23 21:58:39.000000000 +0000
+++ qbittorrent-3.3.15/debian/.gitlab-ci.yml 1970-01-01 00:00:00.000000000 +0000
@@ -1,9 +0,0 @@
-image: registry.gitlab.com/eighthave/ci-image-git-buildpackage:latest
-
-build:
- artifacts:
- paths:
- - "*.deb"
- expire_in: 1 day
- script:
- - gitlab-ci-git-buildpackage-all
diff -Nru qbittorrent-4.1.3/debian/missing-sources/clipboard.js qbittorrent-3.3.15/debian/missing-sources/clipboard.js
--- qbittorrent-4.1.3/debian/missing-sources/clipboard.js 2018-09-23 22:21:14.000000000 +0000
+++ qbittorrent-3.3.15/debian/missing-sources/clipboard.js 1970-01-01 00:00:00.000000000 +0000
@@ -1,135 +0,0 @@
-import ClipboardAction from './clipboard-action';
-import Emitter from 'tiny-emitter';
-import listen from 'good-listener';
-
-/**
- * Base class which takes one or more elements, adds event listeners to them,
- * and instantiates a new `ClipboardAction` on each click.
- */
-class Clipboard extends Emitter {
- /**
- * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
- * @param {Object} options
- */
- constructor(trigger, options) {
- super();
-
- this.resolveOptions(options);
- this.listenClick(trigger);
- }
-
- /**
- * Defines if attributes would be resolved using internal setter functions
- * or custom functions that were passed in the constructor.
- * @param {Object} options
- */
- resolveOptions(options = {}) {
- this.action = (typeof options.action === 'function') ? options.action : this.defaultAction;
- this.target = (typeof options.target === 'function') ? options.target : this.defaultTarget;
- this.text = (typeof options.text === 'function') ? options.text : this.defaultText;
- this.container = (typeof options.container === 'object') ? options.container : document.body;
- }
-
- /**
- * Adds a click event listener to the passed trigger.
- * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
- */
- listenClick(trigger) {
- this.listener = listen(trigger, 'click', (e) => this.onClick(e));
- }
-
- /**
- * Defines a new `ClipboardAction` on each click event.
- * @param {Event} e
- */
- onClick(e) {
- const trigger = e.delegateTarget || e.currentTarget;
-
- if (this.clipboardAction) {
- this.clipboardAction = null;
- }
-
- this.clipboardAction = new ClipboardAction({
- action : this.action(trigger),
- target : this.target(trigger),
- text : this.text(trigger),
- container : this.container,
- trigger : trigger,
- emitter : this
- });
- }
-
- /**
- * Default `action` lookup function.
- * @param {Element} trigger
- */
- defaultAction(trigger) {
- return getAttributeValue('action', trigger);
- }
-
- /**
- * Default `target` lookup function.
- * @param {Element} trigger
- */
- defaultTarget(trigger) {
- const selector = getAttributeValue('target', trigger);
-
- if (selector) {
- return document.querySelector(selector);
- }
- }
-
- /**
- * Returns the support of the given action, or all actions if no action is
- * given.
- * @param {String} [action]
- */
- static isSupported(action = ['copy', 'cut']) {
- const actions = (typeof action === 'string') ? [action] : action;
- let support = !!document.queryCommandSupported;
-
- actions.forEach((action) => {
- support = support && !!document.queryCommandSupported(action);
- });
-
- return support;
- }
-
- /**
- * Default `text` lookup function.
- * @param {Element} trigger
- */
- defaultText(trigger) {
- return getAttributeValue('text', trigger);
- }
-
- /**
- * Destroy lifecycle.
- */
- destroy() {
- this.listener.destroy();
-
- if (this.clipboardAction) {
- this.clipboardAction.destroy();
- this.clipboardAction = null;
- }
- }
-}
-
-
-/**
- * Helper function to retrieve attribute value.
- * @param {String} suffix
- * @param {Element} element
- */
-function getAttributeValue(suffix, element) {
- const attribute = `data-clipboard-${suffix}`;
-
- if (!element.hasAttribute(attribute)) {
- return;
- }
-
- return element.getAttribute(attribute);
-}
-
-module.exports = Clipboard;
diff -Nru qbittorrent-4.1.3/debian/patches/honor-buildflags.patch qbittorrent-3.3.15/debian/patches/honor-buildflags.patch
--- qbittorrent-4.1.3/debian/patches/honor-buildflags.patch 2018-09-23 22:09:11.000000000 +0000
+++ qbittorrent-3.3.15/debian/patches/honor-buildflags.patch 2017-09-03 17:34:18.000000000 +0000
@@ -5,15 +5,15 @@
Index: qbittorrent/unixconf.pri
===================================================================
---- qbittorrent.orig/unixconf.pri 2018-09-23 18:07:17.491619461 -0400
-+++ qbittorrent/unixconf.pri 2018-09-23 18:08:57.342001409 -0400
-@@ -12,8 +12,9 @@
+--- qbittorrent.orig/unixconf.pri 2015-12-26 14:39:32.176931136 -0500
++++ qbittorrent/unixconf.pri 2015-12-26 14:39:32.172931077 -0500
+@@ -15,8 +15,9 @@
# COMPILATION SPECIFIC
!nogui:dbus: QT += dbus
--QMAKE_CXXFLAGS += -Wall -Wextra -Wpedantic -Wformat-security
+-QMAKE_CXXFLAGS += -Wformat -Wformat-security
-!haiku: QMAKE_LFLAGS_APP += -rdynamic
-+QMAKE_CXXFLAGS += -Wall -Wextra -Wpedantic -Wformat-security $$(CXXFLAGS) $$(CPPFLAGS)
++QMAKE_CXXFLAGS += -Wformat -Wformat-security $$(CXXFLAGS) $$(CPPFLAGS)
+QMAKE_LFLAGS_RELEASE += $$(LDFLAGS)
+!haiku: QMAKE_LFLAGS_APP += -rdynamic $$(LDFLAGS)
diff -Nru qbittorrent-4.1.3/debian/patches/kfreebsd-detection.patch qbittorrent-3.3.15/debian/patches/kfreebsd-detection.patch
--- qbittorrent-4.1.3/debian/patches/kfreebsd-detection.patch 2018-09-23 22:09:35.000000000 +0000
+++ qbittorrent-3.3.15/debian/patches/kfreebsd-detection.patch 2017-09-03 17:46:46.000000000 +0000
@@ -5,9 +5,9 @@
Index: qbittorrent/configure.ac
===================================================================
---- qbittorrent.orig/configure.ac 2018-09-23 18:09:29.646778507 -0400
-+++ qbittorrent/configure.ac 2018-09-23 18:09:29.642778409 -0400
-@@ -56,7 +56,7 @@
+--- qbittorrent.orig/configure.ac 2017-09-03 13:46:41.639063027 -0400
++++ qbittorrent/configure.ac 2017-09-03 13:46:41.635062935 -0400
+@@ -62,7 +62,7 @@
# Detect OS
AC_MSG_CHECKING([whether OS is FreeBSD])
@@ -18,9 +18,9 @@
[AC_MSG_RESULT([no])])
Index: qbittorrent/configure
===================================================================
---- qbittorrent.orig/configure 2018-09-23 18:09:29.646778507 -0400
-+++ qbittorrent/configure 2018-09-23 18:09:29.642778409 -0400
-@@ -4234,7 +4234,7 @@
+--- qbittorrent.orig/configure 2017-09-03 13:46:41.639063027 -0400
++++ qbittorrent/configure 2017-09-03 13:46:41.635062935 -0400
+@@ -4248,7 +4248,7 @@
# Detect OS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether OS is FreeBSD" >&5
$as_echo_n "checking whether OS is FreeBSD... " >&6; }
diff -Nru qbittorrent-4.1.3/debian/rules qbittorrent-3.3.15/debian/rules
--- qbittorrent-4.1.3/debian/rules 2018-09-23 22:13:59.000000000 +0000
+++ qbittorrent-3.3.15/debian/rules 2016-10-29 19:56:06.000000000 +0000
@@ -5,12 +5,12 @@
include /usr/share/dpkg/buildflags.mk
%:
- dh $@ --without autoreconf
+ dh $@ --without autoreconf --parallel
override_dh_auto_configure:
- dh_auto_configure --builddirectory build-nox -- --disable-gui \
+ mkdir -p build-nox && cd build-nox && ../configure --prefix=/usr --disable-gui \
--with-boost-libdir=/usr/lib/$(DEB_HOST_MULTIARCH)
- dh_auto_configure --builddirectory build-gui -- \
+ mkdir -p build-gui && cd build-gui && ../configure --prefix=/usr \
--with-boost-libdir=/usr/lib/$(DEB_HOST_MULTIARCH)
override_dh_auto_build:
diff -Nru qbittorrent-4.1.3/debian/source/lintian-overrides qbittorrent-3.3.15/debian/source/lintian-overrides
--- qbittorrent-4.1.3/debian/source/lintian-overrides 2018-09-23 22:25:37.000000000 +0000
+++ qbittorrent-3.3.15/debian/source/lintian-overrides 2017-09-03 17:34:18.000000000 +0000
@@ -1,9 +1,7 @@
# False positive. File is not minified.
-source-is-missing src/webui/www/private/scripts/lib/excanvas-compressed.js
-source-is-missing src/webui/www/private/scripts/mocha-init.js line length is 485 characters (>256)
+source-is-missing src/webui/www/public/scripts/excanvas-compressed.js
+source-is-missing src/webui/www/public/scripts/mocha-init.js line length is 445 characters (>256)
# Full source provided in debian/missing-sources
-source-is-missing src/webui/www/private/scripts/lib/mootools-1.2-core-yc.js
-source-is-missing src/webui/www/public/scripts/lib/mootools-1.2-core-yc.js
+source-is-missing src/webui/www/public/scripts/mootools-1.2-core-yc.js
source-is-missing debian/missing-sources/mootools-1.2-core-yc.js
-source-is-missing src/webui/www/private/scripts/lib/clipboard.min.js
\ No newline at end of file
diff -Nru qbittorrent-4.1.3/dist/CMakeLists.txt qbittorrent-3.3.15/dist/CMakeLists.txt
--- qbittorrent-4.1.3/dist/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000
@@ -1,5 +1,3 @@
-find_package(Qt5Widgets ${requiredQtVersion}) # to conditionally install desktop-related files
-
if (APPLE)
add_subdirectory(mac)
else (APPLE)
diff -Nru qbittorrent-4.1.3/dist/mac/bundle.cmake qbittorrent-3.3.15/dist/mac/bundle.cmake
--- qbittorrent-4.1.3/dist/mac/bundle.cmake 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/dist/mac/bundle.cmake 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,3 @@
+set(BU_CHMOD_BUNDLE_ITEMS ON)
+include(BundleUtilities)
+fixup_bundle("$ENV{DESTDIR}/${CMAKE_INSTALL_PREFIX}/qbittorrent.app" "" "")
diff -Nru qbittorrent-4.1.3/dist/mac/Info.plist qbittorrent-3.3.15/dist/mac/Info.plist
--- qbittorrent-4.1.3/dist/mac/Info.plist 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/mac/Info.plist 2017-08-03 20:30:10.000000000 +0000
@@ -45,7 +45,7 @@
CFBundlePackageType
APPL
CFBundleShortVersionString
- 4.1.3
+ 3.3.15
CFBundleSignature
qBit
CFBundleExecutable
@@ -59,7 +59,7 @@
NSAppleScriptEnabled
YES
NSHumanReadableCopyright
- Copyright © 2006-2018 The qBittorrent project
+ Copyright © 2006-2017 The qBittorrent project
UTExportedTypeDeclarations
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/mac/qBitTorrentDocument.icns and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/mac/qBitTorrentDocument.icns differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/mac/qbittorrent_mac.icns and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/mac/qbittorrent_mac.icns differ
diff -Nru qbittorrent-4.1.3/dist/unix/CMakeLists.txt qbittorrent-3.3.15/dist/unix/CMakeLists.txt
--- qbittorrent-4.1.3/dist/unix/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/unix/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000
@@ -1,48 +1,39 @@
-if (NOT Qt5Widgets_FOUND)
- feature_option(SYSTEMD "Install systemd service file (headless only)" OFF)
- if (SYSTEMD)
- if (NOT Systemd_SERVICES_INSTALL_DIR)
- find_package(Systemd)
- if (NOT Systemd_FOUND)
- message(FATAL_ERROR "Could not locate systemd services install dir."
- " Either pass -DSystemd_SERVICES_INSTALL_DIR=/path/to/systemd/services option or install systemd pkg-config")
- endif(NOT Systemd_FOUND)
- endif(NOT Systemd_SERVICES_INSTALL_DIR)
+if (SYSTEMD)
+ find_package(Systemd)
+ if (SYSTEMD_FOUND)
set(EXPAND_BINDIR ${CMAKE_INSTALL_FULL_BINDIR})
configure_file(systemd/qbittorrent-nox@.service.in ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service @ONLY)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qbittorrent-nox@.service
- DESTINATION ${Systemd_SERVICES_INSTALL_DIR}
+ DESTINATION ${SYSTEMD_SERVICES_INSTALL_DIR}
COMPONENT data)
- endif(SYSTEMD)
-endif()
+ endif(SYSTEMD_FOUND)
+endif(SYSTEMD)
+
-if (Qt5Widgets_FOUND)
+if (GUI)
list(APPEND MAN_FILES ${qBittorrent_SOURCE_DIR}/doc/qbittorrent.1)
-else (Qt5Widgets_FOUND)
+else (GUI)
list(APPEND MAN_FILES ${qBittorrent_SOURCE_DIR}/doc/qbittorrent-nox.1)
-endif (Qt5Widgets_FOUND)
+endif (GUI)
install(FILES ${MAN_FILES}
DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
COMPONENT doc)
-if (Qt5Widgets_FOUND)
+if (GUI)
install(DIRECTORY menuicons/
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor
FILES_MATCHING PATTERN "*.png")
- install(FILES qbittorrent.desktop
+ install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.png
+ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps/
+ COMPONENT data)
+
+ install(FILES ${qBittorrent_SOURCE_DIR}/src/icons/qbittorrent.desktop
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications/
COMPONENT data)
install(FILES qbittorrent.appdata.xml
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/appdata/
COMPONENT data)
-
- install(FILES
- ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray.svg
- ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-dark.svg
- ${qBittorrent_SOURCE_DIR}/src/icons/skin/qbittorrent-tray-light.svg
- DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status
- COMPONENT data)
endif()
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/128x128/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/128x128/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/128x128/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/128x128/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/16x16/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/16x16/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/16x16/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/16x16/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/192x192/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/192x192/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/192x192/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/192x192/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/22x22/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/22x22/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/22x22/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/22x22/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/24x24/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/24x24/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/24x24/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/24x24/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/32x32/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/32x32/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/32x32/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/32x32/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/36x36/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/36x36/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/36x36/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/36x36/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/48x48/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/48x48/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/48x48/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/48x48/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/64x64/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/64x64/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/64x64/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/64x64/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/72x72/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/72x72/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/72x72/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/72x72/status/qbittorrent-tray.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/96x96/apps/qbittorrent.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/96x96/apps/qbittorrent.png differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/unix/menuicons/96x96/status/qbittorrent-tray.png and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/unix/menuicons/96x96/status/qbittorrent-tray.png differ
diff -Nru qbittorrent-4.1.3/dist/unix/qbittorrent.appdata.xml qbittorrent-3.3.15/dist/unix/qbittorrent.appdata.xml
--- qbittorrent-4.1.3/dist/unix/qbittorrent.appdata.xml 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/unix/qbittorrent.appdata.xml 2017-08-03 20:30:10.000000000 +0000
@@ -11,7 +11,7 @@
Aiming to be a good alternative to all other bittorrent clients out
there, qBittorrent is fast, stable and provides unicode support as well
as many other features. Additionally, qBittorrent runs and provides those
- same features on all major platforms (Linux, Mac OS X, Windows, FreeBSD).
+ same features on all major platforms (Linux, Mac OS X, Windows, OS/2, FreeBSD).
It is programmed in C++ / Qt and uses libtorrent (sometimes called
@@ -56,7 +56,7 @@
- https://www.qbittorrent.org/
+ http://www.qbittorrent.org/
sledgehammer999@qbittorrent.org
The qBittorrent Project
http://bugs.qbittorrent.org/
diff -Nru qbittorrent-4.1.3/dist/unix/qbittorrent.desktop qbittorrent-3.3.15/dist/unix/qbittorrent.desktop
--- qbittorrent-4.1.3/dist/unix/qbittorrent.desktop 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/unix/qbittorrent.desktop 1970-01-01 00:00:00.000000000 +0000
@@ -1,190 +0,0 @@
-[Desktop Entry]
-Categories=Network;FileTransfer;P2P;Qt;
-Exec=qbittorrent %U
-GenericName=BitTorrent client
-Comment=Download and share files over BitTorrent
-Icon=qbittorrent
-MimeType=application/x-bittorrent;x-scheme-handler/magnet;
-Name=qBittorrent
-Terminal=false
-Type=Application
-StartupNotify=false
-StartupWMClass=qbittorrent
-Keywords=bittorrent;torrent;magnet;download;p2p;
-
-# Translations
-Comment[oc]=Telecargar e partejar de fichièrs amb BitTorrent
-GenericName[oc]=Client BitTorrent
-Name[oc]=qBittorrent
-Comment[af]=Aflaai en deel lêers oor BitTorrent
-GenericName[af]=BitTorrent kliënt
-Name[af]=qBittorrent
-Comment[ar]=نزّل وشارك الملفات عبر كيوبتتورنت
-GenericName[ar]=عميل بتتورنت
-Name[ar]=كيوبتتورنت
-Comment[be]=Сцягванне і раздача файлаў праз пратакол BitTorrent
-GenericName[be]=BitTorrent-кліент
-Name[be]=qBittorrent
-Comment[bg]=Сваляне и споделяне на файлове чрез BitTorrent
-GenericName[bg]=BitTorrent клиент
-Name[bg]=qBittorrent
-Comment[bn]=বিটটরেন্টে ফাইল ডাউনলোড এবং শেয়ার করুন
-GenericName[bn]=বিটটরেন্ট ক্লায়েন্ট
-Name[bn]=কিউবি্টটরেন্ট
-Comment[bs]=Preuzmi i dijeli datoteke preko BitTorrent-a
-GenericName[bs]=BitTorrent klijent
-Name[bs]=qBittorrent
-Comment[ca]=Baixeu i compartiu fitxers mitjançant BitTorrent
-GenericName[ca]=Client de BitTorrent
-Name[ca]=qBittorrent
-Comment[cs]=Stahování a sdílení souborů přes síť BitTorrent
-GenericName[cs]=BitTorrent klient
-Name[cs]=qBittorrent
-Comment[da]=Download og del filer over BitTorrent
-GenericName[da]=BitTorrent klient
-Name[da]=qBittorrent
-Comment[de]=Über BitTorrent Dateien herunterladen und teilen
-GenericName[de]=BitTorrent Client
-Name[de]=qBittorrent
-Comment[el]=Κάντε λήψη και ανταλάξτε αρχεία μέσω BitTorrent
-GenericName[el]=Πελάτης BitTorrent
-Name[el]=qBittorrent
-Comment[en_GB]=Download and share files over BitTorrent
-GenericName[en_GB]=BitTorrent client
-Name[en_GB]=qBittorrent
-Comment[es]=Descargue y comparta archivos por BitTorrent
-GenericName[es]=Cliente BitTorrent
-Name[es]=qBittorrent
-Comment[eu]=Jeitsi eta elkarbanatu agiriak BitTorrent-en
-GenericName[eu]=BitTorrent bezeroa
-Name[eu]=qBittorrent
-Comment[fa]=دانلود و به اشتراک گذاری فایل های بوسیله بیت تورنت
-GenericName[fa]=بیت تورنت نسخه کلاینت
-Name[fa]=کیو بیت تورنت
-Comment[fi]=Lataa ja jaa tiedostoja BitTorrentia käyttäen
-GenericName[fi]=BitTorrent-asiakasohjelma
-Name[fi]=qBittorrent
-Comment[fr]=Télécharger et partager des fichiers avec BitTorrent
-GenericName[fr]=Client BitTorrent
-Name[fr]=qBittorrent
-Comment[gl]=Descargar e compartir ficheiros co protocolo BitTorrent
-GenericName[gl]=Cliente BitTorrent
-Name[gl]=qBittorrent
-Comment[gu]=બિટ્ટોરેંટ પર ફાઈલો ડાઉનલોડ અને શેર કરો
-GenericName[gu]=બિટ્ટોરેંટ ક્લાયન્ટ
-Name[gu]=ક્યૂ-બિટ્ટોરેંટ
-Comment[he]=הורד ושתף קבצים על גבי ביטורנט
-GenericName[he]=לקוח ביטורנט
-Name[he]=qBittorrent
-Comment[hr]=Preuzmite i dijelite datoteke putem BitTorrenta
-GenericName[hr]=BitTorrent klijent
-Name[hr]=qBittorrent
-Comment[hu]=Fájlok letöltése és megosztása a BitTorrent hálózaton keresztül
-GenericName[hu]=BitTorrent kliens
-Name[hu]=qBittorrent
-Comment[id]=Unduh dan berbagi berkas melalui BitTorrent
-GenericName[id]=Klien BitTorrent
-Name[id]=qBittorrent
-Comment[is]=Sækja og deila skrám yfir BitTorrent
-GenericName[is]=BitTorrent biðlarar
-Name[is]=qBittorrent
-Comment[it]=Client BitTorrent per il download di file via internet
-GenericName[it]=Client BitTorrent
-Name[it]=qBittorrent
-Comment[ja]=BitTorrent でファイルをダウンロードおよび共有します
-GenericName[ja]=BitTorrent クライアント
-Name[ja]=qBittorrent
-Comment[ka]=ჩამოტვირთე და გააზიარე ფაილები Bittorrent-ის საშუალებით
-GenericName[ka]=BitTorrent კლიენტი
-Name[ka]=qBittorrent
-Comment[ko]=비트토런트를 통해 파일을 다운로드하고 공유합니다
-GenericName[ko]=비트토런트 클라이언트
-Name[ko]=큐빗토런트
-Comment[zh]=通过 BitTorrent 下载和分享文件
-GenericName[zh]=BitTorrent 客户端
-Name[zh]=qBittorrent
-Comment[lt]=Atsisiųskite bei dalinkitės failais BitTorrent tinkle
-GenericName[lt]=BitTorrent klientas
-Name[lt]=qBittorrent
-Comment[nb]=Last ned og del filer over BitTorrent
-GenericName[nb]=BitTorrent-klient
-Name[nb]=qBittorrent
-Comment[nqo]=ߞߐߕߐ߯ߘߐ ߟߎ߬ ߟߊߖߌ߰ ߞߊ߬ ߓߊ߲߫ ߞߵߊ߬ߟߎ߬ ߘߐߕߟߊ߫ ߓߌߙߏߙߍ߲ߕ ߞߊ߲߬
-GenericName[nqo]=ߓߌߙߏߙߍ߲ߕ ߕߣߐ߬ߓߐ߬ߟߊ
-Name[nqo]=ߞߎ߳ߓߌߕߏߙߍ߲ߕ
-Comment[nl]=Bestanden downloaden en delen via BitTorrent
-GenericName[nl]=BitTorrent-cliënt
-Name[nl]=qBittorrent
-Comment[pl]=Pobieraj i dziel się plikami przez BitTorrent
-GenericName[pl]=Klient BitTorrent
-Name[pl]=qBittorrent
-Comment[pt]=Transferir e partilhar ficheiros por BitTorrent
-GenericName[pt]=Cliente BitTorrent
-Name[pt]=qBittorrent
-Comment[pt_BR]=Baixe e compartilhe arquivos por BitTorrent
-GenericName[pt_BR]=Cliente BitTorrent
-Name[pt_BR]=qBittorrent
-Comment[ro]=Descărcați și partajați fișiere prin BitTorrent
-GenericName[ro]=Client BitTorrent
-Name[ro]=qBittorrent
-Comment[ru]=Скачивайте и делитесь файлами с помощью BitTorrent
-GenericName[ru]=BitTorrent-клиент
-Name[ru]=qBittorrent
-Comment[sk]=Sťahovanie a zdieľanie súborov prostredníctvom siete BitTorrent
-GenericName[sk]=Klient siete BitTorrent
-Name[sk]=qBittorrent
-Comment[sl]=Prenesite in delite datoteke preko BitTorrenta
-GenericName[sl]=BitTorrent odjemalec
-Name[sl]=qBittorrent
-GenericName[sr]=BitTorrent-клијент
-Comment[sr@latin]=Preuzimanje i deljenje fajlova preko BitTorrent-a
-GenericName[sr@latin]=BitTorrent klijent
-Name[sr@latin]=qBittorrent
-Comment[sv]=Hämta och dela filer över BitTorrent
-GenericName[sv]=BitTorrent-klient
-Name[sv]=qBittorrent
-Comment[uz@Latn]=BitTorrent orqali fayllarni yuklab olish va baham ko‘rish
-GenericName[uz@Latn]=BitTorrent mijozi
-Name[uz@Latn]=qBittorrent
-Comment[te]=క్యు బిట్ టొరెంట్ తో ఫైల్స్ దిగుమతి చేసుకోండి , పంచుకోండి
-GenericName[te]=క్యు బిట్ టొరెంట్ క్లయింట్
-Name[te]=క్యు బిట్ టొరెంట్
-Comment[hi_IN]= अपनी फाइलें BitTorrent के माध्यम से डाउनलोड आैर साॅझा करें
-GenericName[hi_IN]=BitTorrent उपभोक्ता
-Name[hi_IN]=qBittorrent
-Comment[tr]=Dosyaları BitTorrent üzerinden indirin ve paylaşın
-GenericName[tr]=BitTorrent istemcisi
-Name[tr]=qBittorrent
-Comment[uk]=Завантажувати і обмінюватися файлами через BitTorrent
-GenericName[uk]=BitTorrent-клієнт
-Name[uk]=qBittorrent
-Comment[vi]=Tải về và chia sẻ các tập tin thông qua BitTorrent
-GenericName[vi]=Máy trạm dạng BitTorrent
-Name[vi]=qBittorrent
-Comment[zh_HK]=經由BitTorrent下載並分享檔案
-GenericName[zh_HK]=BitTorrent用戶端
-Name[zh_HK]=qBittorrent
-Comment[zh_TW]=經由 BitTorrent 下載並分享檔案
-GenericName[zh_TW]=BitTorrent 客戶端
-Name[zh_TW]=qBittorrent
-Comment[lv_LV]=Lejupielādēt un koplietot failus ar BitTorrent
-GenericName[lv_LV]=BitTorrent klients
-Name[lv_LV]=qBittorrent
-Comment[ms_MY]=Muat turun dan kongsi fail melalui BitTorrent
-GenericName[ms_MY]=Klien BitTorrent
-Name[ms_MY]=qBittorrent
-Comment[eo]=Elŝutu kaj kunhavigu dosierojn per BitTorrent
-GenericName[eo]=BitTorrent-kliento
-Name[eo]=qBittorrent
-Comment[mn_MN]=BitTorrent ашиглан файлуудыг татаж түгээх
-GenericName[mn_MN]=BitTorrent үйлчлүүлэгч
-Name[mn_MN]=qBittorrent
-Comment[ne_NP]=फाइलहरू डाउनलोड गर्नुहोस् र BitTorrent मा साझा गर्नुहोस्
-GenericName[ne_NP]=BitTorrent क्लाइन्ट
-Name[ne_NP]=qBittorrent
-Comment[en_AU]=Download and share files over BitTorrent
-GenericName[en_AU]=BitTorrent client
-Name[en_AU]=qBittorrent
-Comment[th]=ดาว์นโหลดและแชร์ไฟล์ด้วยบิททอเร้น
-GenericName[th]=โปรแกรมบิททอเร้น
-Name[th]=qBittorrent
diff -Nru qbittorrent-4.1.3/dist/windows/installer.nsi qbittorrent-3.3.15/dist/windows/installer.nsi
--- qbittorrent-4.1.3/dist/windows/installer.nsi 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/windows/installer.nsi 2017-08-03 20:30:10.000000000 +0000
@@ -86,7 +86,7 @@
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayIcon" '"$INSTDIR\qbittorrent.exe",0'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "Publisher" "The qBittorrent project"
- WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "https://www.qbittorrent.org"
+ WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "URLInfoAbout" "http://www.qbittorrent.org"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "DisplayVersion" "${PROG_VERSION}"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\qBittorrent" "NoRepair" 1
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProcDLL_mod_by_hnedka.7z differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProcDLL Unicode bin.zip and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProcDLL Unicode bin.zip differ
Binary files /tmp/tmpX8HWgb/L2n3fQp7s2/qbittorrent-4.1.3/dist/windows/nsis plugins/FindProc Unicode-source.zip and /tmp/tmpX8HWgb/TvJXX23hIT/qbittorrent-3.3.15/dist/windows/nsis plugins/FindProc Unicode-source.zip differ
diff -Nru qbittorrent-4.1.3/dist/windows/options.nsi qbittorrent-3.3.15/dist/windows/options.nsi
--- qbittorrent-4.1.3/dist/windows/options.nsi 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/windows/options.nsi 2017-08-03 20:30:10.000000000 +0000
@@ -27,7 +27,7 @@
!define CSIDL_LOCALAPPDATA '0x1C' ;Local Application Data path
; Program specific
-!define PROG_VERSION "4.1.3"
+!define PROG_VERSION "3.3.15"
!define MUI_FINISHPAGE_RUN
!define MUI_FINISHPAGE_RUN_FUNCTION PageFinishRun
@@ -50,7 +50,7 @@
;Installer Version Information
VIAddVersionKey "ProductName" "qBittorrent"
VIAddVersionKey "CompanyName" "The qBittorrent project"
-VIAddVersionKey "LegalCopyright" "Copyright ©2006-2018 The qBittorrent project"
+VIAddVersionKey "LegalCopyright" "Copyright ©2006-2017 The qBittorrent project"
VIAddVersionKey "FileDescription" "qBittorrent - A Bittorrent Client"
VIAddVersionKey "FileVersion" "${PROG_VERSION}"
diff -Nru qbittorrent-4.1.3/dist/windows/qt.conf qbittorrent-3.3.15/dist/windows/qt.conf
--- qbittorrent-4.1.3/dist/windows/qt.conf 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/dist/windows/qt.conf 2017-08-03 20:30:10.000000000 +0000
@@ -2,4 +2,4 @@
Translations = translations
[Platforms]
-;WindowsArguments = dpiawareness=1
+WindowsArguments = dpiawareness=0
diff -Nru qbittorrent-4.1.3/.editorconfig qbittorrent-3.3.15/.editorconfig
--- qbittorrent-4.1.3/.editorconfig 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/.editorconfig 1970-01-01 00:00:00.000000000 +0000
@@ -1,12 +0,0 @@
-# EditorConfig is awesome: http://EditorConfig.org
-
-root = true
-
-[*]
-indent_style = space
-indent_size = 4
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[**.yml]
-indent_size = 2
diff -Nru qbittorrent-4.1.3/.github/ISSUE_TEMPLATE.md qbittorrent-3.3.15/.github/ISSUE_TEMPLATE.md
--- qbittorrent-4.1.3/.github/ISSUE_TEMPLATE.md 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/.github/ISSUE_TEMPLATE.md 2017-08-03 20:30:10.000000000 +0000
@@ -1,20 +1,14 @@
**Please provide the following information**
-### qBittorrent version and Operating System
-(type here)
+### qBittorrent version and Operating System:
-### If on linux, libtorrent and Qt version
-(type here)
+### If on linux, libtorrent and Qt version:
-### What is the problem
-(type here)
+### What is the problem:
-### What is the expected behavior
-(type here)
+### What is the expected behavior:
-### Steps to reproduce
-(type here)
+### Steps to reproduce:
-### Extra info(if any)
-(type here)
+### Extra info(if any):
diff -Nru qbittorrent-4.1.3/INSTALL qbittorrent-3.3.15/INSTALL
--- qbittorrent-4.1.3/INSTALL 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/INSTALL 2017-08-03 20:30:10.000000000 +0000
@@ -1,49 +1,54 @@
-qBittorrent - A BitTorrent client in C++ / Qt
+qBittorrent - A BitTorrent client in C++ / Qt4
------------------------------------------
-1) Compile and install qBittorrent with Qt graphical interface
+1) Compile and install qBittorrent with Qt4 Graphical Interface
$ ./configure
$ make && make install
$ qbittorrent
- will install and execute qBittorrent.
+ will install and execute qBittorrent hopefully without any problems.
Dependencies:
- - Qt >= 5.5.1
+ - Qt >= 4.6.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional)
- - pkg-config
+ - pkg-config executable
- - libtorrent-rasterbar >= 1.0.6 (by Arvid Norberg)
- * https://www.libtorrent.org/
- * Be careful: another library (the one used by rTorrent) uses a similar name
+ - libtorrent-rasterbar by Arvid Norberg (>= 1.0.6)
+ -> http://www.libtorrent.net
+ Be careful: another library (the one used by rTorrent) uses a similar name.
- - Boost >= 1.35
+ - libboost >= 1.35.x (libboost-system)
- - Python >= 2.7.9 / 3.3.0 (optional, runtime only)
- * Required by the internal search engine
+ - python >= 2.3 (needed by search engine)
+ * Run time only dependency
-2) Compile and install qBittorrent without Qt graphical interface
+ - geoip-database (optional)
+ * If qBittorrent cannot find this database, it will try to resolve countries using the Internet but it will be a lot slower.
+ * Run time only dependency
+
+2) Compile and install qBittorrent without Qt4 Graphical interface
$ ./configure --disable-gui
$ make && make install
- $ qbittorrent-nox
+ $ qbittorrent
- will install and execute qBittorrent.
+ will install and execute qBittorrent hopefully without any problems.
Dependencies:
- - Qt >= 5.5.1
+ - Qt >= 4.4.0 (libqt-devel, libqtcore, libqtnetwork)
+
+ - pkg-config executable
- - pkg-config
+ - libtorrent-rasterbar by Arvid Norberg (>= v1.0.6)
+ -> http://www.libtorrent.net
+ Be careful: another library (the one used by rTorrent) uses a similar name.
- - libtorrent-rasterbar >= 1.0.6 (by Arvid Norberg)
- * https://www.libtorrent.org/
- * Be careful: another library (the one used by rTorrent) uses a similar name
+ - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
- - Boost >= 1.35
DOCUMENTATION:
-Please note that there is a "Compilation" section at http://wiki.qbittorrent.org.
+Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
------------------------------------------
-sledgehammer999
+Christophe Dumez
diff -Nru qbittorrent-4.1.3/install.os2 qbittorrent-3.3.15/install.os2
--- qbittorrent-4.1.3/install.os2 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/install.os2 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,187 @@
+QBittorrent installation
+
+
+
+0. CONTENTS OF THIS FILE
+========================
+
+1. INTRODUCTION
+
+2. REQUIREMENTS
+
+3. INSTALLATION
+
+4. BUGREPORTS
+
+5. CREDITS
+
+6. SUPPORT AND DONATIONS
+
+7. HISTORY
+
+
+1. INTRODUCTION
+===============
+
+Welcome to QBittorrent port for OS/2 and eComStation.
+
+
+2. REQUIREMENTS
+===============
+
+The following requirements can be installed either by rpm or by zip files.
+
+RPM Installation:
+
+klibc
+-----
+
+ 1. yum install libc
+
+openssl 1.0
+-----------
+
+ 1. yum install openssl
+
+pthread
+-------
+
+ 1. yum install pthread
+
+GCC4Core
+--------
+
+ 1. yum install libgcc
+ 2. yum install gcc-stack-protector
+ 3. yum install gcc-stdc++-shared-library
+ 4. yum install gcc-supc++-shared-library
+
+Qt4 dll
+-------
+
+ 1. yum install libqt4
+
+
+ZIP Installation:
+
+klibc
+-----
+
+ 1. Download klibc 0.6.5 or better (see http://svn.netlabs.org/libc for more information)
+ 2. Install the files to your libpath eg x:\ecs\dll
+
+openssl 1.0
+-----------
+
+ 1. Download the zip file from http://rpm.netlabs.org/release/00/zip
+ 2. Install the files to your libpath eg. x:\ecs\dll
+
+pthread
+-------
+
+ 1. Download pthread 2012-03-13 or better from http://rpm.netlabs.org/release/00/zip
+ 2. Install the files to your libpath eg. x:\ecs\dll
+
+GCC4Core
+--------
+
+ 1. Download GCC4Core 1.2.1 or better from http://ftp.netlabs.org/pub/gcc
+ 2. Install the files to your libpath eg. x:\ecs\dll
+
+Qt4 dll
+-------
+
+ 1. Download Qt4 4.7.3 or better (see http://svn.netlabs.org/qt4 for more information)
+ 2. Install the files according to the readme
+
+
+3. INSTALLATION
+===============
+
+To install QBittorrent, do the following:
+
+ 1. Create a directory for QBittorrent.
+ 2. Extract the QBittorrent package to the new directory.
+ 3. Create a WPS object for QBittorrent.exe.
+ 4. Start QBittorrent
+ 5. Happy torrenting
+
+
+4. BUGREPORTS
+=============
+
+Please create bugreports at http://svn.netlabs.org/qtapps
+Only bug reports with a reproducible bug are accepted. :-)
+
+
+5. CREDITS
+==========
+
+The port was done by:
+
+Silvan Scherrer aka _diver
+
+Thanks go to:
+
+ * Dmitry A. Kuminov
+
+They either helped me when I had some nasty questions or did some testing for
+me.
+
+
+6. SUPPORT AND DONATIONS
+========================
+
+QBittorrent port is based on volunteer work. If you would like to support further
+development, you can do so in one of the following ways:
+
+
+ * Donate to the Qt4 project: see qt.netlabs.org for more information
+
+ * Contribute to the project: Besides actual development, this also includes
+ maintaining the documentation and the project web site as well as help
+ for users.
+
+
+7. HISTORY
+==========
+
+2012-09-19
+
+ * updated to 3.0.4 code level of QBittorrent
+ * updated libtorrent to 0.16.3 level
+
+2012-09-06
+
+ * updated to 3.0.2 code level of QBittorrent
+
+2012-05-14
+
+ * updated to 2.9.8 code level of QBittorrent
+
+2012-03-15
+
+ * updated to 2.9.5 code level of QBittorrent
+
+2011-09-26
+
+ * updated to 2.8.5 code level of QBittorrent
+ * updated to Qt 4.7.3
+
+2011-06-20
+
+ * updated to 2.7.3 code level of QBittorrent
+ * updated libtorrent to 0.15.6 level
+
+2010-12-23
+
+ * updated to 2.5.2 code level of QBittorrent
+
+2010-11-22
+
+ * updated to 2.4.11 code level of QBittorrent
+
+2010-xx-xx
+
+ * initial port
+
diff -Nru qbittorrent-4.1.3/m4/ax_boost_base.m4 qbittorrent-3.3.15/m4/ax_boost_base.m4
--- qbittorrent-4.1.3/m4/ax_boost_base.m4 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/m4/ax_boost_base.m4 2017-08-03 20:30:10.000000000 +0000
@@ -1,5 +1,5 @@
# ===========================================================================
-# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html
+# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html
# ===========================================================================
#
# SYNOPSIS
@@ -33,15 +33,7 @@
# and this notice are preserved. This file is offered as-is, without any
# warranty.
-#serial 42
-
-# example boost program (need to pass version)
-m4_define([_AX_BOOST_BASE_PROGRAM],
- [AC_LANG_PROGRAM([[
-#include
-]],[[
-(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))]));
-]])])
+#serial 26
AC_DEFUN([AX_BOOST_BASE],
[
@@ -52,121 +44,104 @@
or disable it (ARG=no)
@<:@ARG=yes@:>@ ])],
[
- AS_CASE([$withval],
- [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""],
- [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""],
- [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"])
+ if test "$withval" = "no"; then
+ want_boost="no"
+ elif test "$withval" = "yes"; then
+ want_boost="yes"
+ ac_boost_path=""
+ else
+ want_boost="yes"
+ ac_boost_path="$withval"
+ fi
],
[want_boost="yes"])
AC_ARG_WITH([boost-libdir],
- [AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
- [Force given directory for boost libraries.
- Note that this will override library path detection,
- so use this parameter only if default library detection fails
- and you know exactly where your boost libraries are located.])],
- [
- AS_IF([test -d "$withval"],
- [_AX_BOOST_BASE_boost_lib_path="$withval"],
- [AC_MSG_ERROR([--with-boost-libdir expected directory name])])
- ],
- [_AX_BOOST_BASE_boost_lib_path=""])
-
-BOOST_LDFLAGS=""
-BOOST_CPPFLAGS=""
-AS_IF([test "x$want_boost" = "xyes"],
- [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])])
-AC_SUBST(BOOST_CPPFLAGS)
-AC_SUBST(BOOST_LDFLAGS)
-])
-
-
-# convert a version string in $2 to numeric and affect to polymorphic var $1
-AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[
- AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"])
- _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'`
- _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'`
- AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"],
- [AC_MSG_ERROR([You should at least specify libboost major version])])
- _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'`
- AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"],
- [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"])
- _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
- AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"],
- [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"])
- _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor`
- AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET)
-])
-
-dnl Run the detection of boost should be run only if $want_boost
-AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[
- _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1])
+ AS_HELP_STRING([--with-boost-libdir=LIB_DIR],
+ [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]),
+ [
+ if test -d "$withval"
+ then
+ ac_boost_lib_path="$withval"
+ else
+ AC_MSG_ERROR(--with-boost-libdir expected directory name)
+ fi
+ ],
+ [ac_boost_lib_path=""]
+)
+
+if test "x$want_boost" = "xyes"; then
+ boost_lib_version_req=ifelse([$1], ,1.20.0,$1)
+ boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'`
+ boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'`
+ boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'`
+ boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'`
+ if test "x$boost_lib_version_req_sub_minor" = "x" ; then
+ boost_lib_version_req_sub_minor="0"
+ fi
+ WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor`
+ AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req)
succeeded=no
-
- AC_REQUIRE([AC_CANONICAL_HOST])
dnl On 64-bit systems check for system libraries in both lib64 and lib.
dnl The former is specified by FHS, but e.g. Debian does not adhere to
dnl this (as it rises problems for generic multi-arch support).
dnl The last entry in the list is chosen by default when no libraries
dnl are found, e.g. when only header-only libraries are installed!
- AS_CASE([${host_cpu}],
- [x86_64],[libsubdirs="lib64 libx32 lib lib64"],
- [ppc64|s390x|sparc64|aarch64|ppc64le],[libsubdirs="lib64 lib lib64"],
- [libsubdirs="lib"]
- )
+ libsubdirs="lib"
+ ax_arch=`uname -m`
+ case $ax_arch in
+ x86_64)
+ libsubdirs="lib64 libx32 lib lib64"
+ ;;
+ ppc64|s390x|sparc64|aarch64|ppc64le)
+ libsubdirs="lib64 lib lib64 ppc64le"
+ ;;
+ esac
dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give
dnl them priority over the other paths since, if libs are found there, they
dnl are almost assuredly the ones desired.
- AS_CASE([${host_cpu}],
- [i?86],[multiarch_libsubdir="lib/i386-${host_os}"],
- [multiarch_libsubdir="lib/${host_cpu}-${host_os}"]
- )
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs"
+
+ case ${host_cpu} in
+ i?86)
+ libsubdirs="lib/i386-${host_os} $libsubdirs"
+ ;;
+ esac
dnl first we check the system location for boost libraries
dnl this location ist chosen if boost libraries are installed with the --layout=system option
dnl or if you install boost with RPM
- AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[
- AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"])
- AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[
- AC_MSG_RESULT([yes])
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include"
- for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do
- AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"])
- AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[
- AC_MSG_RESULT([yes])
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp";
- break;
- ],
- [AC_MSG_RESULT([no])])
- done],[
- AC_MSG_RESULT([no])])
- ],[
- if test X"$cross_compiling" = Xyes; then
- search_libsubdirs=$multiarch_libsubdir
- else
- search_libsubdirs="$multiarch_libsubdir $libsubdirs"
- fi
- for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
- if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then
- for libsubdir in $search_libsubdirs ; do
- if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
+ if test "$ac_boost_path" != ""; then
+ BOOST_CPPFLAGS="-I$ac_boost_path/include"
+ for ac_boost_path_tmp in $libsubdirs; do
+ if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then
+ BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp"
+ break
+ fi
+ done
+ elif test "$cross_compiling" != yes; then
+ for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do
+ if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then
+ for libsubdir in $libsubdirs ; do
+ if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir"
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include"
+ BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir"
+ BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include"
break;
fi
done
- ])
+ fi
dnl overwrite ld flags if we have required special directory with
dnl --with-boost-libdir parameter
- AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"],
- [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"])
+ if test "$ac_boost_lib_path" != ""; then
+ BOOST_LDFLAGS="-L$ac_boost_lib_path"
+ fi
- AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)])
CPPFLAGS_SAVED="$CPPFLAGS"
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
export CPPFLAGS
@@ -177,7 +152,15 @@
AC_REQUIRE([AC_PROG_CXX])
AC_LANG_PUSH(C++)
- AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ @%:@include
+ ]], [[
+ #if BOOST_VERSION >= $WANT_BOOST_VERSION
+ // Everything is okay
+ #else
+ # error Boost version is too old
+ #endif
+ ]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
@@ -189,50 +172,40 @@
dnl if we found no boost with system layout we search for boost libraries
dnl built and installed without the --layout=system option or for a staged(not installed) version
- if test "x$succeeded" != "xyes" ; then
+ if test "x$succeeded" != "xyes"; then
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
BOOST_CPPFLAGS=
- if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
- BOOST_LDFLAGS=
- fi
+ BOOST_LDFLAGS=
_version=0
- if test -n "$_AX_BOOST_BASE_boost_path" ; then
- if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then
- for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+ if test "$ac_boost_path" != ""; then
+ if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
+ for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
+ _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
- if test "x$V_CHECK" = "x1" ; then
+ if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
fi
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE"
+ BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
done
dnl if nothing found search for layout used in Windows distributions
if test -z "$BOOST_CPPFLAGS"; then
- if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then
- BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path"
+ if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
+ BOOST_CPPFLAGS="-I$ac_boost_path"
fi
fi
- dnl if we found something and BOOST_LDFLAGS was unset before
- dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here.
- if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then
- for libsubdir in $libsubdirs ; do
- if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
- done
- BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir"
- fi
fi
else
- if test "x$cross_compiling" != "xyes" ; then
- for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do
- if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then
- for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do
- _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
+ if test "$cross_compiling" != yes; then
+ for ac_boost_path in /usr /usr/local /opt /opt/local ; do
+ if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
+ for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do
+ _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'`
V_CHECK=`expr $_version_tmp \> $_version`
- if test "x$V_CHECK" = "x1" ; then
+ if test "$V_CHECK" = "1" ; then
_version=$_version_tmp
- best_path=$_AX_BOOST_BASE_boost_path
+ best_path=$ac_boost_path
fi
done
fi
@@ -240,7 +213,7 @@
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE"
- if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+ if test "$ac_boost_lib_path" = ""; then
for libsubdir in $libsubdirs ; do
if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
@@ -248,7 +221,7 @@
fi
fi
- if test -n "$BOOST_ROOT" ; then
+ if test "x$BOOST_ROOT" != "x"; then
for libsubdir in $libsubdirs ; do
if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi
done
@@ -257,7 +230,7 @@
stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'`
stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'`
V_CHECK=`expr $stage_version_shorten \>\= $_version`
- if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then
+ if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then
AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT)
BOOST_CPPFLAGS="-I$BOOST_ROOT"
BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir"
@@ -272,7 +245,15 @@
export LDFLAGS
AC_LANG_PUSH(C++)
- AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[
+ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+ @%:@include
+ ]], [[
+ #if BOOST_VERSION >= $WANT_BOOST_VERSION
+ // Everything is okay
+ #else
+ # error Boost version is too old
+ #endif
+ ]])],[
AC_MSG_RESULT(yes)
succeeded=yes
found_system=yes
@@ -281,15 +262,17 @@
AC_LANG_POP([C++])
fi
- if test "x$succeeded" != "xyes" ; then
- if test "x$_version" = "x0" ; then
- AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]])
+ if test "$succeeded" != "yes" ; then
+ if test "$_version" = "0" ; then
+ AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]])
else
AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).])
fi
# execute ACTION-IF-NOT-FOUND (if present):
ifelse([$3], , :, [$3])
else
+ AC_SUBST(BOOST_CPPFLAGS)
+ AC_SUBST(BOOST_LDFLAGS)
AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available])
# execute ACTION-IF-FOUND (if present):
ifelse([$2], , :, [$2])
@@ -297,5 +280,6 @@
CPPFLAGS="$CPPFLAGS_SAVED"
LDFLAGS="$LDFLAGS_SAVED"
+fi
])
diff -Nru qbittorrent-4.1.3/m4/ax_boost_system.m4 qbittorrent-3.3.15/m4/ax_boost_system.m4
--- qbittorrent-4.1.3/m4/ax_boost_system.m4 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/m4/ax_boost_system.m4 2017-08-03 20:30:10.000000000 +0000
@@ -1,5 +1,5 @@
# ===========================================================================
-# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html
+# http://www.gnu.org/software/autoconf-archive/ax_boost_system.html
# ===========================================================================
#
# SYNOPSIS
@@ -31,7 +31,7 @@
# and this notice are preserved. This file is offered as-is, without any
# warranty.
-#serial 19
+#serial 18
AC_DEFUN([AX_BOOST_SYSTEM],
[
diff -Nru qbittorrent-4.1.3/m4/qbittorrent.m4 qbittorrent-3.3.15/m4/qbittorrent.m4
--- qbittorrent-4.1.3/m4/qbittorrent.m4 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/m4/qbittorrent.m4 2017-08-03 20:30:10.000000000 +0000
@@ -1,13 +1,38 @@
# Checking for pkg-config. If found, check for QtCore and query pkg-config
# for its exec-prefix variable.
+# FIND_QT4()
+# Sets the QT_QMAKE variable to the path of Qt4 qmake if found.
+# --------------------------------------
+AC_DEFUN([FIND_QT4],
+[PKG_CHECK_EXISTS([QtCore >= 4.8.0],
+ [PKG_CHECK_VAR(QT_QMAKE,
+ [QtCore >= 4.8.0],
+ [moc_location],
+ [QT_QMAKE=`AS_DIRNAME(["$QT_QMAKE"])`])
+ ])
+
+AS_IF([test -f "$QT_QMAKE/qmake"],
+ [QT_QMAKE="$QT_QMAKE/qmake"],
+ [AS_IF([test -f "$QT_QMAKE/qmake-qt4"],
+ [QT_QMAKE="$QT_QMAKE/qmake-qt4"],
+ [QT_QMAKE=""])
+ ])
+
+AC_MSG_CHECKING([for Qt4 qmake >= 4.8.0])
+AS_IF([test "x$QT_QMAKE" != "x"],
+ [AC_MSG_RESULT([$QT_QMAKE])],
+ [AC_MSG_RESULT([not found])]
+ )
+])
+
# FIND_QT5()
# Sets the QT_QMAKE variable to the path of Qt5 qmake if found.
# --------------------------------------
AC_DEFUN([FIND_QT5],
-[PKG_CHECK_EXISTS([Qt5Core >= 5.5.1],
+[PKG_CHECK_EXISTS([Qt5Core >= 5.2.0],
[PKG_CHECK_VAR(QT_QMAKE,
- [Qt5Core >= 5.5.1],
+ [Qt5Core >= 5.2.0],
[host_bins])
])
@@ -18,7 +43,7 @@
[QT_QMAKE=""])
])
-AC_MSG_CHECKING([for Qt5 qmake >= 5.5.1])
+AC_MSG_CHECKING([for Qt5 qmake >= 5.2.0])
AS_IF([test "x$QT_QMAKE" != "x"],
[AC_MSG_RESULT([$QT_QMAKE])],
[AC_MSG_RESULT([not found])]
@@ -29,10 +54,19 @@
# Sets the HAVE_QTDBUS variable to true or false.
# --------------------------------------
AC_DEFUN([FIND_QTDBUS],
- [AC_MSG_CHECKING([for Qt5DBus >= 5.5.1])
- PKG_CHECK_EXISTS([Qt5DBus >= 5.5.1],
+[AS_IF([test "x$with_qt4" = "xno"],
+ [AC_MSG_CHECKING([for Qt5DBus >= 5.2.0])
+ PKG_CHECK_EXISTS([Qt5DBus >= 5.2.0],
+ [AC_MSG_RESULT([found])
+ HAVE_QTDBUS=[true]],
+ [AC_MSG_RESULT([not found])
+ HAVE_QTDBUS=[false]])
+ ],
+ [AC_MSG_CHECKING([for QtDBus >= 4.8.0])
+ PKG_CHECK_EXISTS([QtDBus >= 4.8.0],
[AC_MSG_RESULT([found])
HAVE_QTDBUS=[true]],
[AC_MSG_RESULT([not found])
HAVE_QTDBUS=[false]])
+ ])
])
diff -Nru qbittorrent-4.1.3/macxconf.pri qbittorrent-3.3.15/macxconf.pri
--- qbittorrent-4.1.3/macxconf.pri 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/macxconf.pri 2017-08-03 20:30:10.000000000 +0000
@@ -9,7 +9,10 @@
include(conf.pri)
}
-LIBS += -framework Carbon -framework IOKit -framework AppKit
+LIBS += -framework Carbon -framework IOKit
+
+# C++11 support
+lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
QT_LANG_PATH = ../dist/qt-translations
DIST_PATH = ../dist/mac
diff -Nru qbittorrent-4.1.3/os2conf.pri qbittorrent-3.3.15/os2conf.pri
--- qbittorrent-4.1.3/os2conf.pri 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/os2conf.pri 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,19 @@
+# C++11 support
+lessThan(QT_MAJOR_VERSION, 5): QMAKE_CXXFLAGS += -std=c++11
+
+exists(conf.pri) {
+ # to the conf.pri goes all system dependent stuff
+ include(conf.pri)
+}
+
+LIBS += \
+ -ltorrent-rasterbar \
+ -lboost_thread \
+ -lboost_system \
+ -lboost_filesystem \
+ -lssl -lcrypto -lidn -lpthread -lz
+
+RC_FILE = qbittorrent_os2.rc
+
+# LIBTORRENT DEFINES
+DEFINES += BOOST_ASIO_DYN_LINK
diff -Nru qbittorrent-4.1.3/qbittorrent.pro qbittorrent-3.3.15/qbittorrent.pro
--- qbittorrent-4.1.3/qbittorrent.pro 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/qbittorrent.pro 2017-08-03 20:30:10.000000000 +0000
@@ -3,6 +3,7 @@
SUBDIRS += src
include(version.pri)
+include(qm_gen.pri)
# Make target to create release tarball. Use 'make tarball'
tarball.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/ &&
@@ -16,11 +17,3 @@
tarball.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION}
QMAKE_EXTRA_TARGETS += tarball
-
-# Translations included here (at top level) is to avoid regenerating the .qm files
-# every time when src.pro is processed
-include(src/lang/lang.pri)
-
-# For Qt Creator beautifier
-DISTFILES += \
- uncrustify.cfg
diff -Nru qbittorrent-4.1.3/qm_gen.pri qbittorrent-3.3.15/qm_gen.pri
--- qbittorrent-4.1.3/qm_gen.pri 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/qm_gen.pri 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,24 @@
+TS_IN = $$fromfile(src/src.pro,TRANSLATIONS)
+TS_IN_NOEXT = $$replace(TS_IN,".ts","")
+
+isEmpty(QMAKE_LRELEASE) {
+ win32|os2:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe
+ else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
+ unix {
+ equals(QT_MAJOR_VERSION, 4) {
+ !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt4 }
+ }
+ equals(QT_MAJOR_VERSION, 5) {
+ !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease-qt5 }
+ }
+ } else {
+ !exists($$QMAKE_LRELEASE) { QMAKE_LRELEASE = lrelease }
+ }
+}
+
+message("Building translations")
+for(L,TS_IN_NOEXT) {
+ message("Processing $${L}")
+ system("$$QMAKE_LRELEASE -silent src/$${L}.ts -qm src/$${L}.qm")
+ !exists("src/$${L}.qm"):error("Building translations failed, cannot continue")
+}
diff -Nru qbittorrent-4.1.3/README.md qbittorrent-3.3.15/README.md
--- qbittorrent-4.1.3/README.md 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/README.md 2017-08-03 20:30:10.000000000 +0000
@@ -35,7 +35,7 @@
### Misc:
For more information please visit:
-https://www.qbittorrent.org
+http://www.qbittorrent.org
or our wiki here:
http://wiki.qbittorrent.org
diff -Nru qbittorrent-4.1.3/README.os2 qbittorrent-3.3.15/README.os2
--- qbittorrent-4.1.3/README.os2 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/README.os2 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,74 @@
+qBittorrent - A BitTorrent client in Qt4
+------------------------------------------
+
+This is the eComStation (OS/2) qBittorrent part of the readme. See also README for more general information.
+
+
+Building qBittorrent
+********************
+
+
+Requirements
+============
+
+- gcc based build env (recommended gcc v4.4.2 or greater)
+
+- Qt4 for eCS (OS/2) dev package (see http://svn.netlabs.org/qt4 for more information)
+
+- libtorrent-rasterbar for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
+
+- boost for eCS (OS/2) port (see http://svn.netlabs.org/ports for more information)
+
+
+How to build
+============
+
+First you need to create the conf.pri file in the same dir as this readme.os2 is.
+the conf.pri file has the following content:
+
+##### conf.pri content begin #####
+BINDIR = ./bin
+INCDIR = ./include
+LIBDIR = ./lib
+DATADIR = ./share
+
+CONFIG += staticlib
+INCLUDEPATH += x:/trees/libtorrent/trunk/include
+LIBS += -Lx:/trees/libtorrent/trunk/src/.libs \
+ -Lx:/trees/boost/trunk/stage/lib \
+ -Lx:/trees/openssl \
+ -Lx:/extras/lib
+##### conf.pri content end #####
+
+Of course all the above path references have to be adjusted to your build env.
+
+Now you can either do a normal build or a shadow build. A shadow build has the
+advantage that no created files are in the same dir as the sources are.
+
+For a normal build do the following:
+
+Simply type:
+$ qmake
+
+Followed by:
+$ make
+
+For a shadow build do the following:
+given your sources are in x:\trees\qbittorrent\trunk create a
+x:\trees\qbittorrent\build directory
+
+Now switch to the created directory and type:
+$ qmake ..\trunk
+
+Followed by:
+$ make
+
+If all works fine you should get a working qbittorrent executable.
+
+If you have any question regarding the eCS (OS/2) port of qBittorrent you can meet me (_diver) on IRC:
+#netlabs on irc.freenode.net
+
+------------------------------------------
+Silvan Scherrer
+
+
diff -Nru qbittorrent-4.1.3/src/app/application.cpp qbittorrent-3.3.15/src/app/application.cpp
--- qbittorrent-4.1.3/src/app/application.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/application.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -27,129 +27,107 @@
* exception statement from your version.
*/
-#include "application.h"
-
-#include
-
-#include
#include
-#include
+#include
#include
-#include
+#include
#include
-
-#ifdef Q_OS_WIN
-#include
-#include
-#endif
+#include
+#include
#ifndef DISABLE_GUI
+#include "gui/guiiconprovider.h"
#ifdef Q_OS_WIN
-#include
+#include
#include
+#include
#endif // Q_OS_WIN
#ifdef Q_OS_MAC
#include
+#include
+#include
#endif // Q_OS_MAC
-#include "addnewtorrentdialog.h"
-#include "gui/guiiconprovider.h"
#include "mainwindow.h"
-#include "shutdownconfirmdialog.h"
+#include "addnewtorrentdialog.h"
+#include "shutdownconfirmdlg.h"
#else // DISABLE_GUI
-#include
+#include
#endif // DISABLE_GUI
-#include "base/bittorrent/session.h"
-#include "base/bittorrent/torrenthandle.h"
-#include "base/iconprovider.h"
+#ifndef DISABLE_WEBUI
+#include "webui/webui.h"
+#endif
+
+#include "application.h"
+#include "filelogger.h"
#include "base/logger.h"
-#include "base/net/downloadmanager.h"
-#include "base/net/geoipmanager.h"
-#include "base/net/proxyconfigurationmanager.h"
-#include "base/net/smtp.h"
#include "base/preferences.h"
-#include "base/profile.h"
-#include "base/rss/rss_autodownloader.h"
-#include "base/rss/rss_session.h"
-#include "base/scanfoldersmodel.h"
#include "base/settingsstorage.h"
#include "base/utils/fs.h"
#include "base/utils/misc.h"
-#include "base/utils/string.h"
-#include "filelogger.h"
-
-#ifndef DISABLE_WEBUI
-#include "webui/webui.h"
-#endif
+#include "base/iconprovider.h"
+#include "base/scanfoldersmodel.h"
+#include "base/net/smtp.h"
+#include "base/net/downloadmanager.h"
+#include "base/net/geoipmanager.h"
+#include "base/net/proxyconfigurationmanager.h"
+#include "base/bittorrent/session.h"
+#include "base/bittorrent/torrenthandle.h"
namespace
{
#define SETTINGS_KEY(name) "Application/" name
// FileLogger properties keys
-#define FILELOGGER_SETTINGS_KEY(name) QStringLiteral(SETTINGS_KEY("FileLogger/") name)
+#define FILELOGGER_SETTINGS_KEY(name) SETTINGS_KEY("FileLogger/") name
const QString KEY_FILELOGGER_ENABLED = FILELOGGER_SETTINGS_KEY("Enabled");
const QString KEY_FILELOGGER_PATH = FILELOGGER_SETTINGS_KEY("Path");
const QString KEY_FILELOGGER_BACKUP = FILELOGGER_SETTINGS_KEY("Backup");
const QString KEY_FILELOGGER_DELETEOLD = FILELOGGER_SETTINGS_KEY("DeleteOld");
- const QString KEY_FILELOGGER_MAXSIZEBYTES = FILELOGGER_SETTINGS_KEY("MaxSizeBytes");
+ const QString KEY_FILELOGGER_MAXSIZE = FILELOGGER_SETTINGS_KEY("MaxSize");
const QString KEY_FILELOGGER_AGE = FILELOGGER_SETTINGS_KEY("Age");
const QString KEY_FILELOGGER_AGETYPE = FILELOGGER_SETTINGS_KEY("AgeType");
- // just a shortcut
+ //just a shortcut
inline SettingsStorage *settings() { return SettingsStorage::instance(); }
- const QString LOG_FOLDER = QStringLiteral("logs");
- const QChar PARAMS_SEPARATOR = '|';
-
- const QString DEFAULT_PORTABLE_MODE_PROFILE_DIR = QStringLiteral("profile");
-
- const int MIN_FILELOG_SIZE = 1024; // 1KiB
- const int MAX_FILELOG_SIZE = 1000 * 1024 * 1024; // 1000MiB
- const int DEFAULT_FILELOG_SIZE = 65 * 1024; // 65KiB
+ const QString LOG_FOLDER("logs");
+ const char PARAMS_SEPARATOR[] = "|";
}
Application::Application(const QString &id, int &argc, char **argv)
: BaseApplication(id, argc, argv)
, m_running(false)
, m_shutdownAct(ShutdownDialogAction::Exit)
- , m_commandLineArgs(parseCommandLine(this->arguments()))
-#ifndef DISABLE_WEBUI
- , m_webui(nullptr)
-#endif
{
- qRegisterMetaType("Log::Msg");
-
- setApplicationName("qBittorrent");
- validateCommandLineParameters();
-
- QString profileDir = m_commandLineArgs.portableMode
- ? QDir(QCoreApplication::applicationDirPath()).absoluteFilePath(DEFAULT_PORTABLE_MODE_PROFILE_DIR)
- : m_commandLineArgs.profileDir;
-
- Profile::initialize(profileDir, m_commandLineArgs.configurationName,
- m_commandLineArgs.relativeFastresumePaths || m_commandLineArgs.portableMode);
-
Logger::initInstance();
SettingsStorage::initInstance();
Preferences::initInstance();
- if (m_commandLineArgs.webUiPort > 0) // it will be -1 when user did not set any value
- Preferences::instance()->setWebUiPort(m_commandLineArgs.webUiPort);
+#if defined(Q_OS_MACX) && !defined(DISABLE_GUI)
+ if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) {
+ // fix Mac OS X 10.9 (mavericks) font issue
+ // https://bugreports.qt-project.org/browse/QTBUG-32789
+ QFont::insertSubstitution(".Lucida Grande UI", "Lucida Grande");
+ }
+#endif
+ setApplicationName("qBittorrent");
initializeTranslation();
#if !defined(DISABLE_GUI)
+#ifdef QBT_USES_QT5
setAttribute(Qt::AA_UseHighDpiPixmaps, true); // opt-in to the high DPI pixmap support
+#endif // QBT_USES_QT5
setQuitOnLastWindowClosed(false);
#endif
#if defined(Q_OS_WIN) && !defined(DISABLE_GUI)
- connect(this, &QGuiApplication::commitDataRequest, this, &Application::shutdownCleanup, Qt::DirectConnection);
+ connect(this, SIGNAL(commitDataRequest(QSessionManager &)), this, SLOT(shutdownCleanup(QSessionManager &)), Qt::DirectConnection);
#endif
- connect(this, &Application::messageReceived, this, &Application::processMessage);
- connect(this, &QCoreApplication::aboutToQuit, this, &Application::cleanup);
+ connect(this, SIGNAL(messageReceived(const QString &)), SLOT(processMessage(const QString &)));
+ connect(this, SIGNAL(aboutToQuit()), SLOT(cleanup()));
if (isFileLoggerEnabled())
m_fileLogger = new FileLogger(fileLoggerPath(), isFileLoggerBackup(), fileLoggerMaxSize(), isFileLoggerDeleteOld(), fileLoggerAge(), static_cast(fileLoggerAgeType()));
@@ -157,13 +135,6 @@
Logger::instance()->addMessage(tr("qBittorrent %1 started", "qBittorrent v3.2.0alpha started").arg(QBT_VERSION));
}
-Application::~Application()
-{
- // we still need to call cleanup()
- // in case the App failed to start
- cleanup();
-}
-
#ifndef DISABLE_GUI
QPointer Application::mainWindow()
{
@@ -171,11 +142,6 @@
}
#endif
-const QBtCommandLineParameters &Application::commandLineArgs() const
-{
- return m_commandLineArgs;
-}
-
bool Application::isFileLoggerEnabled() const
{
return settings()->loadValue(KEY_FILELOGGER_ENABLED, true).toBool();
@@ -192,15 +158,14 @@
QString Application::fileLoggerPath() const
{
- return settings()->loadValue(KEY_FILELOGGER_PATH,
- QVariant(specialFolderLocation(SpecialFolder::Data) + LOG_FOLDER)).toString();
+ return settings()->loadValue(KEY_FILELOGGER_PATH, QVariant(Utils::Fs::QDesktopServicesDataLocation() + LOG_FOLDER)).toString();
}
-void Application::setFileLoggerPath(const QString &path)
+void Application::setFileLoggerPath(const QString &value)
{
if (m_fileLogger)
- m_fileLogger->changePath(path);
- settings()->storeValue(KEY_FILELOGGER_PATH, path);
+ m_fileLogger->changePath(value);
+ settings()->storeValue(KEY_FILELOGGER_PATH, value);
}
bool Application::isFileLoggerBackup() const
@@ -229,22 +194,29 @@
int Application::fileLoggerMaxSize() const
{
- int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZEBYTES, DEFAULT_FILELOG_SIZE).toInt();
- return std::min(std::max(val, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
+ int val = settings()->loadValue(KEY_FILELOGGER_MAXSIZE, 10).toInt();
+ if (val < 1)
+ return 1;
+ if (val > 1000)
+ return 1000;
+ return val;
}
-void Application::setFileLoggerMaxSize(const int bytes)
+void Application::setFileLoggerMaxSize(const int value)
{
- int clampedValue = std::min(std::max(bytes, MIN_FILELOG_SIZE), MAX_FILELOG_SIZE);
if (m_fileLogger)
- m_fileLogger->setMaxSize(clampedValue);
- settings()->storeValue(KEY_FILELOGGER_MAXSIZEBYTES, clampedValue);
+ m_fileLogger->setMaxSize(value);
+ settings()->storeValue(KEY_FILELOGGER_MAXSIZE, std::min(std::max(value, 1), 1000));
}
int Application::fileLoggerAge() const
{
- int val = settings()->loadValue(KEY_FILELOGGER_AGE, 1).toInt();
- return std::min(std::max(val, 1), 365);
+ int val = settings()->loadValue(KEY_FILELOGGER_AGE, 6).toInt();
+ if (val < 1)
+ return 1;
+ if (val > 365)
+ return 365;
+ return val;
}
void Application::setFileLoggerAge(const int value)
@@ -255,17 +227,17 @@
int Application::fileLoggerAgeType() const
{
int val = settings()->loadValue(KEY_FILELOGGER_AGETYPE, 1).toInt();
- return ((val < 0) || (val > 2)) ? 1 : val;
+ return (val < 0 || val > 2) ? 1 : val;
}
void Application::setFileLoggerAgeType(const int value)
{
- settings()->storeValue(KEY_FILELOGGER_AGETYPE, ((value < 0) || (value > 2)) ? 1 : value);
+ settings()->storeValue(KEY_FILELOGGER_AGETYPE, (value < 0 || value > 2) ? 1 : value);
}
void Application::processMessage(const QString &message)
{
- QStringList params = message.split(PARAMS_SEPARATOR, QString::SkipEmptyParts);
+ QStringList params = message.split(QLatin1String(PARAMS_SEPARATOR), QString::SkipEmptyParts);
// If Application is not running (i.e., other
// components are not ready) store params
if (m_running)
@@ -274,77 +246,66 @@
m_paramsQueue.append(params);
}
-void Application::runExternalProgram(const BitTorrent::TorrentHandle *torrent) const
+void Application::runExternalProgram(BitTorrent::TorrentHandle *const torrent) const
{
- QString program = Preferences::instance()->getAutoRunProgram().trimmed();
+ QString program = Preferences::instance()->getAutoRunProgram();
program.replace("%N", torrent->name());
program.replace("%L", torrent->category());
-
- QStringList tags = torrent->tags().toList();
- std::sort(tags.begin(), tags.end(), Utils::String::naturalLessThan);
- program.replace("%G", tags.join(','));
-
-#if defined(Q_OS_WIN)
- const auto chopPathSep = [](const QString &str) -> QString
- {
- if (str.endsWith('\\'))
- return str.mid(0, (str.length() -1));
- return str;
- };
- program.replace("%F", chopPathSep(Utils::Fs::toNativePath(torrent->contentPath())));
- program.replace("%R", chopPathSep(Utils::Fs::toNativePath(torrent->rootPath())));
- program.replace("%D", chopPathSep(Utils::Fs::toNativePath(torrent->savePath())));
-#else
program.replace("%F", Utils::Fs::toNativePath(torrent->contentPath()));
program.replace("%R", Utils::Fs::toNativePath(torrent->rootPath()));
program.replace("%D", Utils::Fs::toNativePath(torrent->savePath()));
-#endif
program.replace("%C", QString::number(torrent->filesCount()));
program.replace("%Z", QString::number(torrent->totalSize()));
program.replace("%T", torrent->currentTracker());
program.replace("%I", torrent->hash());
Logger *logger = Logger::instance();
- logger->addMessage(tr("Torrent: %1, running external program, command: %2").arg(torrent->name(), program));
-
-#if defined(Q_OS_WIN)
- std::unique_ptr programWchar(new wchar_t[program.length() + 1] {});
- program.toWCharArray(programWchar.get());
+ logger->addMessage(tr("Torrent: %1, running external program, command: %2").arg(torrent->name()).arg(program));
- // Need to split arguments manually because QProcess::startDetached(QString)
- // will strip off empty parameters.
- // E.g. `python.exe "1" "" "3"` will become `python.exe "1" "3"`
- int argCount = 0;
- LPWSTR *args = ::CommandLineToArgvW(programWchar.get(), &argCount);
-
- QStringList argList;
- for (int i = 1; i < argCount; ++i)
- argList += QString::fromWCharArray(args[i]);
-
- QProcess::startDetached(QString::fromWCharArray(args[0]), argList);
+#if defined(Q_OS_UNIX)
+ QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program});
+#elif defined(Q_OS_WIN) // test cmd: `echo "%F" > "c:\ab ba.txt"`
+ program.prepend(QLatin1String("\"")).append(QLatin1String("\""));
+ program.prepend(Utils::Misc::windowsSystemPath() + QLatin1String("\\cmd.exe /C "));
+ const int cmdMaxLength = 32768; // max length (incl. terminate char) for `lpCommandLine` in `CreateProcessW()`
+ if ((program.size() + 1) > cmdMaxLength) {
+ logger->addMessage(tr("Torrent: %1, run external program command too long (length > %2), execution failed.").arg(torrent->name()).arg(cmdMaxLength), Log::CRITICAL);
+ return;
+ }
- ::LocalFree(args);
+ STARTUPINFOW si = {0};
+ si.cb = sizeof(si);
+ PROCESS_INFORMATION pi = {0};
+
+ WCHAR *arg = new WCHAR[program.size() + 1];
+ program.toWCharArray(arg);
+ arg[program.size()] = L'\0';
+ if (CreateProcessW(NULL, arg, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ delete[] arg;
#else
- QProcess::startDetached(QLatin1String("/bin/sh"), {QLatin1String("-c"), program});
+ QProcess::startDetached(program);
#endif
}
-void Application::sendNotificationEmail(const BitTorrent::TorrentHandle *torrent)
+void Application::sendNotificationEmail(BitTorrent::TorrentHandle *const torrent)
{
// Prepare mail content
- const QString content = tr("Torrent name: %1").arg(torrent->name()) + '\n'
- + tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + '\n'
- + tr("Save path: %1").arg(torrent->savePath()) + "\n\n"
- + tr("The torrent was downloaded in %1.", "The torrent was downloaded in 1 hour and 20 seconds")
- .arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n"
- + tr("Thank you for using qBittorrent.") + '\n';
+ QString content = QObject::tr("Torrent name: %1").arg(torrent->name()) + "\n";
+ content += QObject::tr("Torrent size: %1").arg(Utils::Misc::friendlyUnit(torrent->wantedSize())) + "\n";
+ content += QObject::tr("Save path: %1").arg(torrent->savePath()) + "\n\n";
+ content += QObject::tr("The torrent was downloaded in %1.",
+ "The torrent was downloaded in 1 hour and 20 seconds")
+ .arg(Utils::Misc::userFriendlyDuration(torrent->activeTime())) + "\n\n\n";
+ content += QObject::tr("Thank you for using qBittorrent.") + "\n";
// Send the notification email
- const Preferences *pref = Preferences::instance();
- Net::Smtp *smtp = new Net::Smtp(this);
- smtp->sendMail(pref->getMailNotificationSender(),
- pref->getMailNotificationEmail(),
- tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()),
+ Net::Smtp *sender = new Net::Smtp;
+ sender->sendMail("notification@qbittorrent.org",
+ Preferences::instance()->getMailNotificationEmail(),
+ QObject::tr("[qBittorrent] '%1' has finished downloading").arg(torrent->name()),
content);
}
@@ -388,7 +349,7 @@
// do nothing & skip confirm
}
else {
- if (!ShutdownConfirmDialog::askForConfirmation(m_window, action)) return;
+ if (!ShutdownConfirmDlg::askForConfirmation(action)) return;
}
#endif // DISABLE_GUI
@@ -409,7 +370,7 @@
bool Application::sendParams(const QStringList ¶ms)
{
- return sendMessage(params.join(PARAMS_SEPARATOR));
+ return sendMessage(params.join(QLatin1String(PARAMS_SEPARATOR)));
}
// As program parameters, we can get paths or urls.
@@ -424,63 +385,15 @@
return;
}
#endif
- BitTorrent::AddTorrentParams torrentParams;
- TriStateBool skipTorrentDialog;
foreach (QString param, params) {
param = param.trimmed();
-
- // Process strings indicating options specified by the user.
-
- if (param.startsWith(QLatin1String("@savePath="))) {
- torrentParams.savePath = param.mid(10);
- continue;
- }
-
- if (param.startsWith(QLatin1String("@addPaused="))) {
- torrentParams.addPaused = param.midRef(11).toInt() ? TriStateBool::True : TriStateBool::False;
- continue;
- }
-
- if (param == QLatin1String("@skipChecking")) {
- torrentParams.skipChecking = true;
- continue;
- }
-
- if (param.startsWith(QLatin1String("@category="))) {
- torrentParams.category = param.mid(10);
- continue;
- }
-
- if (param == QLatin1String("@sequential")) {
- torrentParams.sequential = true;
- continue;
- }
-
- if (param == QLatin1String("@firstLastPiecePriority")) {
- torrentParams.firstLastPiecePriority = true;
- continue;
- }
-
- if (param.startsWith(QLatin1String("@skipDialog="))) {
- skipTorrentDialog = param.midRef(12).toInt() ? TriStateBool::True : TriStateBool::False;
- continue;
- }
-
#ifndef DISABLE_GUI
- // There are two circumstances in which we want to show the torrent
- // dialog. One is when the application settings specify that it should
- // be shown and skipTorrentDialog is undefined. The other is when
- // skipTorrentDialog is false, meaning that the application setting
- // should be overridden.
- const bool showDialogForThisTorrent =
- ((AddNewTorrentDialog::isEnabled() && skipTorrentDialog == TriStateBool::Undefined)
- || skipTorrentDialog == TriStateBool::False);
- if (showDialogForThisTorrent)
- AddNewTorrentDialog::show(param, torrentParams, m_window);
+ if (AddNewTorrentDialog::isEnabled())
+ AddNewTorrentDialog::show(param, m_window);
else
#endif
- BitTorrent::Session::instance()->addTorrent(param, torrentParams);
+ BitTorrent::Session::instance()->addTorrent(param);
}
}
@@ -495,8 +408,8 @@
#endif
BitTorrent::Session::initInstance();
- connect(BitTorrent::Session::instance(), &BitTorrent::Session::torrentFinished, this, &Application::torrentFinished);
- connect(BitTorrent::Session::instance(), &BitTorrent::Session::allTorrentsFinished, this, &Application::allTorrentsFinished, Qt::QueuedConnection);
+ connect(BitTorrent::Session::instance(), SIGNAL(torrentFinished(BitTorrent::TorrentHandle *const)), SLOT(torrentFinished(BitTorrent::TorrentHandle *const)));
+ connect(BitTorrent::Session::instance(), SIGNAL(allTorrentsFinished()), SLOT(allTorrentsFinished()), Qt::QueuedConnection);
#ifndef DISABLE_COUNTRIES_RESOLUTION
Net::GeoIPManager::initInstance();
@@ -505,30 +418,19 @@
#ifndef DISABLE_WEBUI
m_webui = new WebUI;
-#ifdef DISABLE_GUI
- if (m_webui->isErrored())
- return 1;
- connect(m_webui, &WebUI::fatalError, this, []() { QCoreApplication::exit(1); });
-#endif // DISABLE_GUI
-#endif // DISABLE_WEBUI
-
- new RSS::Session; // create RSS::Session singleton
- new RSS::AutoDownloader; // create RSS::AutoDownloader singleton
+#endif
#ifdef DISABLE_GUI
#ifndef DISABLE_WEBUI
- Preferences *const pref = Preferences::instance();
+ Preferences* const pref = Preferences::instance();
// Display some information to the user
- const QString mesg = QString("\n******** %1 ********\n").arg(tr("Information"))
- + tr("To control qBittorrent, access the Web UI at %1")
- .arg(QString("http://localhost:") + QString::number(pref->getWebUiPort())) + '\n'
- + tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername()) + '\n';
- printf("%s", qUtf8Printable(mesg));
+ std::cout << std::endl << "******** " << qPrintable(tr("Information")) << " ********" << std::endl;
+ std::cout << qPrintable(tr("To control qBittorrent, access the Web UI at http://localhost:%1").arg(QString::number(pref->getWebUiPort()))) << std::endl;
+ std::cout << qPrintable(tr("The Web UI administrator user name is: %1").arg(pref->getWebUiUsername())) << std::endl;
qDebug() << "Password:" << pref->getWebUiPassword();
if (pref->getWebUiPassword() == "f6fdffe48c908deb0f4c3bd36c032e72") {
- const QString warning = tr("The Web UI administrator password is still the default one: %1").arg("adminadmin") + '\n'
- + tr("This is a security risk, please consider changing your password from program preferences.") + '\n';
- printf("%s", qUtf8Printable(warning));
+ std::cout << qPrintable(tr("The Web UI administrator password is still the default one: %1").arg("adminadmin")) << std::endl;
+ std::cout << qPrintable(tr("This is a security risk, please consider changing your password from program preferences.")) << std::endl;
}
#endif // DISABLE_WEBUI
#else
@@ -536,15 +438,15 @@
#endif // DISABLE_GUI
m_running = true;
-
- // Now UI is ready to process signals from Session
- BitTorrent::Session::instance()->startUpTorrents();
-
m_paramsQueue = params + m_paramsQueue;
if (!m_paramsQueue.isEmpty()) {
processParams(m_paramsQueue);
m_paramsQueue.clear();
}
+
+ // Now UI is ready to process signals from Session
+ BitTorrent::Session::instance()->startUpTorrents();
+
return BaseApplication::exec();
}
@@ -584,7 +486,7 @@
if (path.isEmpty())
// Get the url instead
path = static_cast(ev)->url().toString();
- qDebug("Received a mac file open event: %s", qUtf8Printable(path));
+ qDebug("Received a mac file open event: %s", qPrintable(path));
if (m_running)
processParams(QStringList(path));
else
@@ -613,22 +515,24 @@
void Application::initializeTranslation()
{
- Preferences *const pref = Preferences::instance();
+ Preferences* const pref = Preferences::instance();
// Load translation
QString localeStr = pref->getLocale();
- if (m_qtTranslator.load(QLatin1String("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
- m_qtTranslator.load(QLatin1String("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
- qDebug("Qt %s locale recognized, using translation.", qUtf8Printable(localeStr));
+ if (
+#ifdef QBT_USES_QT5
+ m_qtTranslator.load(QString::fromUtf8("qtbase_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)) ||
+#endif
+ m_qtTranslator.load(QString::fromUtf8("qt_") + localeStr, QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
+ qDebug("Qt %s locale recognized, using translation.", qPrintable(localeStr));
else
- qDebug("Qt %s locale unrecognized, using default (en).", qUtf8Printable(localeStr));
-
+ qDebug("Qt %s locale unrecognized, using default (en).", qPrintable(localeStr));
installTranslator(&m_qtTranslator);
- if (m_translator.load(QLatin1String(":/lang/qbittorrent_") + localeStr))
- qDebug("%s locale recognized, using translation.", qUtf8Printable(localeStr));
+ if (m_translator.load(QString::fromUtf8(":/lang/qbittorrent_") + localeStr))
+ qDebug("%s locale recognized, using translation.", qPrintable(localeStr));
else
- qDebug("%s locale unrecognized, using default (en).", qUtf8Printable(localeStr));
+ qDebug("%s locale unrecognized, using default (en).", qPrintable(localeStr));
installTranslator(&m_translator);
#ifndef DISABLE_GUI
@@ -666,51 +570,49 @@
// According to the qt docs we shouldn't call quit() inside a slot.
// aboutToQuit() is never emitted if the user hits "Cancel" in
// the above dialog.
- QTimer::singleShot(0, qApp, &QCoreApplication::quit);
+ QTimer::singleShot(0, qApp, SLOT(quit()));
}
#endif
void Application::cleanup()
{
+#ifndef DISABLE_GUI
+#ifdef Q_OS_WIN
// cleanup() can be called multiple times during shutdown. We only need it once.
static QAtomicInt alreadyDone;
if (!alreadyDone.testAndSetAcquire(0, 1))
return;
+#endif // Q_OS_WIN
-#ifndef DISABLE_GUI
- if (m_window) {
- // Hide the window and don't leave it on screen as
- // unresponsive. Also for Windows take the WinId
- // after it's hidden, because hide() may cause a
- // WinId change.
- m_window->hide();
+ // Hide the window and not leave it on screen as
+ // unresponsive. Also for Windows take the WinId
+ // after it's hidden, because hide() may cause a
+ // WinId change.
+ m_window->hide();
#ifdef Q_OS_WIN
- typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR);
- const auto shutdownBRCreate = Utils::Misc::loadWinAPI("User32.dll", "ShutdownBlockReasonCreate");
- // Only available on Vista+
- if (shutdownBRCreate)
- shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str());
+ typedef BOOL (WINAPI *PSHUTDOWNBRCREATE)(HWND, LPCWSTR);
+ PSHUTDOWNBRCREATE shutdownBRCreate = (PSHUTDOWNBRCREATE)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonCreate");
+ // Only available on Vista+
+ if (shutdownBRCreate)
+ shutdownBRCreate((HWND)m_window->effectiveWinId(), tr("Saving torrent progress...").toStdWString().c_str());
#endif // Q_OS_WIN
- // Do manual cleanup in MainWindow to force widgets
- // to save their Preferences, stop all timers and
- // delete as many widgets as possible to leave only
- // a 'shell' MainWindow.
- // We need a valid window handle for Windows Vista+
- // otherwise the system shutdown will continue even
- // though we created a ShutdownBlockReason
- m_window->cleanup();
- }
+ // Do manual cleanup in MainWindow to force widgets
+ // to save their Preferences, stop all timers and
+ // delete as many widgets as possible to leave only
+ // a 'shell' MainWindow.
+ // We need a valid window handle for Windows Vista+
+ // otherwise the system shutdown will continue even
+ // though we created a ShutdownBlockReason
+ m_window->cleanup();
+
#endif // DISABLE_GUI
#ifndef DISABLE_WEBUI
delete m_webui;
#endif
- delete RSS::AutoDownloader::instance();
- delete RSS::Session::instance();
-
ScanFoldersModel::freeInstance();
BitTorrent::Session::freeInstance();
#ifndef DISABLE_COUNTRIES_RESOLUTION
@@ -726,16 +628,14 @@
Utils::Fs::removeDirRecursive(Utils::Fs::tempPath());
#ifndef DISABLE_GUI
- if (m_window) {
#ifdef Q_OS_WIN
- typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND);
- const auto shutdownBRDestroy = Utils::Misc::loadWinAPI("User32.dll", "ShutdownBlockReasonDestroy");
- // Only available on Vista+
- if (shutdownBRDestroy)
- shutdownBRDestroy((HWND)m_window->effectiveWinId());
+ typedef BOOL (WINAPI *PSHUTDOWNBRDESTROY)(HWND);
+ PSHUTDOWNBRDESTROY shutdownBRDestroy = (PSHUTDOWNBRDESTROY)::GetProcAddress(::GetModuleHandleW(L"User32.dll"), "ShutdownBlockReasonDestroy");
+ // Only available on Vista+
+ if (shutdownBRDestroy)
+ shutdownBRDestroy((HWND)m_window->effectiveWinId());
#endif // Q_OS_WIN
- delete m_window;
- }
+ delete m_window;
#endif // DISABLE_GUI
if (m_shutdownAct != ShutdownDialogAction::Exit) {
@@ -743,12 +643,3 @@
Utils::Misc::shutdownComputer(m_shutdownAct);
}
}
-
-void Application::validateCommandLineParameters()
-{
- if (m_commandLineArgs.portableMode && !m_commandLineArgs.profileDir.isEmpty())
- throw CommandLineParameterError(tr("Portable mode and explicit profile directory options are mutually exclusive"));
-
- if (m_commandLineArgs.portableMode && m_commandLineArgs.relativeFastresumePaths)
- Logger::instance()->addMessage(tr("Portable mode implies relative fastresume"), Log::WARNING);
-}
diff -Nru qbittorrent-4.1.3/src/app/application.h qbittorrent-3.3.15/src/app/application.h
--- qbittorrent-4.1.3/src/app/application.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/application.h 2017-08-03 20:30:10.000000000 +0000
@@ -40,16 +40,17 @@
class MainWindow;
#ifdef Q_OS_WIN
+QT_BEGIN_NAMESPACE
class QSessionManager;
+QT_END_NAMESPACE
#endif // Q_OS_WIN
#else
#include "qtsinglecoreapplication.h"
typedef QtSingleCoreApplication BaseApplication;
-#endif // DISABLE_GUI
+#endif
#include "base/utils/misc.h"
-#include "cmdoptions.h"
#ifndef DISABLE_WEBUI
class WebUI;
@@ -62,20 +63,12 @@
class TorrentHandle;
}
-namespace RSS
-{
- class Session;
- class AutoDownloader;
-}
-
class Application : public BaseApplication
{
Q_OBJECT
- Q_DISABLE_COPY(Application)
public:
Application(const QString &id, int &argc, char **argv);
- ~Application() override;
#if (defined(Q_OS_WIN) && !defined(DISABLE_GUI))
bool isRunning();
@@ -87,8 +80,6 @@
QPointer mainWindow();
#endif
- const QBtCommandLineParameters &commandLineArgs() const;
-
// FileLogger properties
bool isFileLoggerEnabled() const;
void setFileLoggerEnabled(bool value);
@@ -99,7 +90,7 @@
bool isFileLoggerDeleteOld() const;
void setFileLoggerDeleteOld(bool value);
int fileLoggerMaxSize() const;
- void setFileLoggerMaxSize(const int bytes);
+ void setFileLoggerMaxSize(const int value);
int fileLoggerAge() const;
void setFileLoggerAge(const int value);
int fileLoggerAgeType() const;
@@ -108,9 +99,9 @@
protected:
#ifndef DISABLE_GUI
#ifdef Q_OS_MAC
- bool event(QEvent *) override;
+ bool event(QEvent *);
#endif
- bool notify(QObject *receiver, QEvent *event) override;
+ bool notify(QObject* receiver, QEvent* event);
#endif
private slots:
@@ -125,14 +116,13 @@
private:
bool m_running;
ShutdownDialogAction m_shutdownAct;
- QBtCommandLineParameters m_commandLineArgs;
#ifndef DISABLE_GUI
QPointer m_window;
#endif
#ifndef DISABLE_WEBUI
- WebUI *m_webui;
+ QPointer m_webui;
#endif
// FileLog
@@ -144,9 +134,8 @@
void initializeTranslation();
void processParams(const QStringList ¶ms);
- void runExternalProgram(const BitTorrent::TorrentHandle *torrent) const;
- void sendNotificationEmail(const BitTorrent::TorrentHandle *torrent);
- void validateCommandLineParameters();
+ void runExternalProgram(BitTorrent::TorrentHandle *const torrent) const;
+ void sendNotificationEmail(BitTorrent::TorrentHandle *const torrent);
};
#endif // APPLICATION_H
diff -Nru qbittorrent-4.1.3/src/app/app.pri qbittorrent-3.3.15/src/app/app.pri
--- qbittorrent-4.1.3/src/app/app.pri 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/app.pri 2017-08-03 20:30:10.000000000 +0000
@@ -16,25 +16,19 @@
HEADERS += \
$$PWD/application.h \
- $$PWD/cmdoptions.h \
$$PWD/filelogger.h
SOURCES += \
$$PWD/application.cpp \
- $$PWD/cmdoptions.cpp \
$$PWD/filelogger.cpp \
$$PWD/main.cpp
-stacktrace {
- unix {
- HEADERS += $$PWD/stacktrace.h
- }
- else {
- HEADERS += $$PWD/stacktrace_win.h
- !nogui {
- HEADERS += $$PWD/stacktracedialog.h
- FORMS += $$PWD/stacktracedialog.ui
- }
+unix: HEADERS += $$PWD/stacktrace.h
+strace_win {
+ HEADERS += $$PWD/stacktrace_win.h
+ !nogui {
+ HEADERS += $$PWD/stacktrace_win_dlg.h
+ FORMS += $$PWD/stacktrace_win_dlg.ui
}
}
diff -Nru qbittorrent-4.1.3/src/app/CMakeLists.txt qbittorrent-3.3.15/src/app/CMakeLists.txt
--- qbittorrent-4.1.3/src/app/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000
@@ -1,38 +1,32 @@
-add_executable(qBittorrent
+project(qbt_executable)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+set(QBT_APP_HEADERS
application.h
-cmdoptions.h
filelogger.h
-upgrade.h
+)
+
+set(QBT_APP_SOURCES
application.cpp
-cmdoptions.cpp
filelogger.cpp
main.cpp
)
-target_include_directories(qBittorrent PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
-target_link_libraries(qBittorrent
- PRIVATE
- qbt_base
-)
-
-set_target_properties(qBittorrent
- PROPERTIES
- AUTOUIC True
- AUTORCC True
- MACOSX_BUNDLE True
-)
-
# translations
file(GLOB QBT_TS_FILES ../lang/*.ts)
get_filename_component(QBT_QM_FILES_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE)
set_source_files_properties(${QBT_TS_FILES} PROPERTIES OUTPUT_LOCATION "${QBT_QM_FILES_BINARY_DIR}")
-find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
-qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
-
-get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang/lang.qrc" ABSOLUTE)
-get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang/lang.qrc" ABSOLUTE)
-get_filename_component(_lang_qrc_dst_dir "${CMAKE_CURRENT_BINARY_DIR}/../lang" ABSOLUTE)
+if (QT5)
+ find_package(Qt5 COMPONENTS LinguistTools REQUIRED)
+ qt5_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
+else (QT5)
+ qt4_add_translation(QBT_QM_FILES ${QBT_TS_FILES})
+endif (QT5)
+
+get_filename_component(_lang_qrc_src "${CMAKE_CURRENT_SOURCE_DIR}/../lang.qrc" ABSOLUTE)
+get_filename_component(_lang_qrc_dst "${CMAKE_CURRENT_BINARY_DIR}/../lang.qrc" ABSOLUTE)
+get_filename_component(_lang_qrc_dst_dir "${CMAKE_CURRENT_BINARY_DIR}/../" ABSOLUTE)
message(STATUS "copying ${_lang_qrc_src} -> ${_lang_qrc_dst}")
file(COPY ${_lang_qrc_src} DESTINATION ${_lang_qrc_dst_dir})
@@ -43,52 +37,66 @@
endforeach()
set(QBT_APP_RESOURCES
-../icons/icons.qrc
-../searchengine/searchengine.qrc
+../icons.qrc
+../searchengine.qrc
"${_lang_qrc_dst}"
)
# With AUTORCC rcc is ran by cmake before language files are generated,
# and thus we call rcc explicitly
-qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
+if (QT5)
+ qt5_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
+else (QT5)
+ qt4_add_resources(QBT_APP_RESOURCE_SOURCE ${QBT_APP_RESOURCES})
+endif (QT5)
if (WIN32)
if (MINGW)
- target_sources(qBittorrent PRIVATE ../qbittorrent_mingw.rc)
+ list (APPEND QBT_APP_SOURCES ../qbittorrent_mingw.rc)
else (MINGW)
- target_sources(qBittorrent PRIVATE ../qbittorrent.rc)
+ list (APPEND QBT_APP_SOURCES ../qbittorrent.rc)
endif (MINGW)
- target_sources(qBittorrent PRIVATE ../qbittorrent.exe.manifest)
+ list(APPEND QBT_APP_SOURCES ../qbittorrent.exe.manifest)
endif (WIN32)
-if (STACKTRACE)
- if (UNIX)
- target_sources(qBittorrent PRIVATE stacktrace.h)
- else (UNIX)
- target_sources(qBittorrent PRIVATE stacktrace_win.h)
- if (Qt5Widgets_FOUND)
- target_sources(qBittorrent PRIVATE stacktracedialog.h)
- endif (Qt5Widgets_FOUND)
- endif (UNIX)
-endif (STACKTRACE)
-
-
-if (Qt5Widgets_FOUND)
- target_link_libraries(qBittorrent PRIVATE qbt_searchengine qbt_gui)
- set_target_properties(qBittorrent
- PROPERTIES
- OUTPUT_NAME qbittorrent
- WIN32_EXECUTABLE True
- )
-else(Qt5Widgets_FOUND)
- set_target_properties(qBittorrent
- PROPERTIES
- OUTPUT_NAME qbittorrent-nox
+if (UNIX)
+ list(APPEND QBT_APP_HEADERS stacktrace.h)
+endif (UNIX)
+
+if (STACKTRACE_WIN)
+ list(APPEND QBT_APP_HEADERS stacktrace_win.h)
+ if (GUI)
+ list(APPEND QBT_APP_HEADERS stacktrace_win_dlg.h)
+ endif (GUI)
+endif (STACKTRACE_WIN)
+
+# usesystemqtsingleapplication {
+# nogui {
+# CONFIG += qtsinglecoreapplication
+# } else {
+# CONFIG += qtsingleapplication
+# }
+# } else {
+# nogui {
+# include(qtsingleapplication/qtsinglecoreapplication.pri)
+# } else {
+# include(qtsingleapplication/qtsingleapplication.pri)
+# }
+# }
+
+# upgrade code
+list(APPEND QBT_APP_HEADERS upgrade.h)
+list(APPEND QBT_TARGET_LIBRARIES qbt_base)
+
+if (GUI)
+ list(APPEND QBT_TARGET_LIBRARIES qbt_searchengine qbt_gui)
+ include_directories(../gui
+ ${CMAKE_CURRENT_BINARY_DIR}/../gui
)
-endif (Qt5Widgets_FOUND)
+endif (GUI)
if (WEBUI)
- target_link_libraries(qBittorrent PRIVATE qbt_webui)
+ list(APPEND QBT_TARGET_LIBRARIES qbt_webui)
endif (WEBUI)
# we have to include resources into the bundle
@@ -140,32 +148,39 @@
PROPERTIES MACOSX_PACKAGE_LOCATION translations)
endif (APPLE)
-target_sources(qBittorrent PRIVATE ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE})
+add_executable(${QBT_TARGET_NAME} ${QBT_APP_HEADERS} ${QBT_APP_SOURCES} ${QBT_QM_FILES} ${QBT_APP_RESOURCE_SOURCE})
+set_target_properties(${QBT_TARGET_NAME}
+ PROPERTIES
+ AUTOUIC True
+ AUTORCC True
+ MACOSX_BUNDLE True
+)
-get_target_property(QBT_EXECUTABLE_NAME qBittorrent OUTPUT_NAME)
+if (GUI AND WIN32)
+ set_target_properties(${QBT_TARGET_NAME} PROPERTIES WIN32_EXECUTABLE True)
+endif (GUI AND WIN32)
-target_link_libraries(qBittorrent PRIVATE ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication)
+target_link_libraries(${QBT_TARGET_NAME} ${QBT_TARGET_LIBRARIES} QtSingleApplication::QtSingleApplication)
if (APPLE)
- set(qbt_BUNDLE_NAME ${QBT_EXECUTABLE_NAME})
+ set(qbt_BUNDLE_NAME "${QBT_TARGET_NAME}")
# substitute @EXECUTABLE@ in dist/mac/Info.plist
set(EXECUTABLE ${qbt_BUNDLE_NAME})
configure_file(${qBittorrent_SOURCE_DIR}/dist/mac/Info.plist ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist @ONLY)
- set_target_properties(qBittorrent PROPERTIES
+ set_target_properties(${QBT_TARGET_NAME} PROPERTIES
MACOSX_BUNDLE_BUNDLE_NAME "${qbt_BUNDLE_NAME}"
MACOSX_BUNDLE_INFO_PLIST ${qBittorrent_BINARY_DIR}/dist/mac/Info.plist
)
endif (APPLE)
# installation
-install(TARGETS qBittorrent
+install(TARGETS ${QBT_TARGET_NAME}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
BUNDLE DESTINATION .
COMPONENT runtime)
-if (Qt5Widgets_FOUND AND APPLE)
- find_package(Qt5Svg REQUIRED)
- include(bundle)
-endif (Qt5Widgets_FOUND AND APPLE)
+if (APPLE AND GUI)
+ install(SCRIPT ${OSX_RES_SRC_DIR}/bundle.cmake)
+endif (APPLE AND GUI)
diff -Nru qbittorrent-4.1.3/src/app/cmdoptions.cpp qbittorrent-3.3.15/src/app/cmdoptions.cpp
--- qbittorrent-4.1.3/src/app/cmdoptions.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/cmdoptions.cpp 1970-01-01 00:00:00.000000000 +0000
@@ -1,586 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2016 Eugene Shalygin
- * Copyright (C) 2014 Vladimir Golovnev
- * Copyright (C) 2006 Christophe Dumez
- *
- * 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.
- */
-
-#include "cmdoptions.h"
-
-#include
-
-#include
-#include
-#include
-#include
-
-#ifdef Q_OS_WIN
-#include
-#endif
-
-#include "base/utils/misc.h"
-#include "base/utils/string.h"
-
-namespace
-{
- const int USAGE_INDENTATION = 4;
- const int USAGE_TEXT_COLUMN = 31;
- const int WRAP_AT_COLUMN = 80;
-
- // Base option class. Encapsulates name operations.
- class Option
- {
- protected:
- constexpr Option(const char *name, char shortcut = 0)
- : m_name {name}
- , m_shortcut {shortcut}
- {
- }
-
- QString fullParameter() const
- {
- return QLatin1String("--") + QLatin1String(m_name);
- }
-
- QString shortcutParameter() const
- {
- return QLatin1String("-") + QLatin1Char(m_shortcut);
- }
-
- bool hasShortcut() const
- {
- return m_shortcut != 0;
- }
-
- QString envVarName() const
- {
- return QLatin1String("QBT_")
- + QString(QLatin1String(m_name)).toUpper().replace(QLatin1Char('-'), QLatin1Char('_'));
- }
-
- public:
- static QString padUsageText(const QString &usage)
- {
- QString res = QString(USAGE_INDENTATION, ' ') + usage;
-
- if ((USAGE_TEXT_COLUMN - usage.length() - 4) > 0)
- return res + QString(USAGE_TEXT_COLUMN - usage.length() - 4, ' ');
- else
- return res;
- }
-
- private:
- const char *m_name;
- const char m_shortcut;
- };
-
- // Boolean option.
- class BoolOption : protected Option
- {
- public:
- constexpr BoolOption(const char *name, char shortcut = 0)
- : Option {name, shortcut}
- {
- }
-
- bool operator==(const QString &arg) const
- {
- return (hasShortcut() && ((arg.size() == 2) && (arg == shortcutParameter())))
- || (arg == fullParameter());
- }
-
- bool value(const QProcessEnvironment &env) const
- {
- QString val = env.value(envVarName());
- // we accept "1" and "true" (upper or lower cased) as boolean 'true' values
- return ((val == QLatin1String("1")) || (val.toUpper() == QLatin1String("TRUE")));
- }
-
- QString usage() const
- {
- QString res;
- if (hasShortcut())
- res += shortcutParameter() + QLatin1String(" | ");
- res += fullParameter();
- return padUsageText(res);
- }
- };
-
- bool operator==(const QString &s, const BoolOption &o)
- {
- return o == s;
- }
-
- // Option with string value. May not have a shortcut
- struct StringOption : protected Option
- {
- public:
- constexpr StringOption(const char *name)
- : Option {name, 0}
- {
- }
-
- bool operator==(const QString &arg) const
- {
- return arg.startsWith(parameterAssignment());
- }
-
- QString value(const QString &arg) const
- {
- QStringList parts = arg.split(QLatin1Char('='));
- if (parts.size() == 2)
- return Utils::String::unquote(parts[1], QLatin1String("'\""));
- throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
- "e.g. Parameter '--webui-port' must follow syntax '--webui-port=value'")
- .arg(fullParameter()).arg(QLatin1String("")));
- }
-
- QString value(const QProcessEnvironment &env, const QString &defaultValue = QString()) const
- {
- QString val = env.value(envVarName());
- return val.isEmpty() ? defaultValue : Utils::String::unquote(val, QLatin1String("'\""));
- }
-
- QString usage(const QString &valueName) const
- {
- return padUsageText(parameterAssignment() + QLatin1Char('<') + valueName + QLatin1Char('>'));
- }
-
- private:
- QString parameterAssignment() const
- {
- return fullParameter() + QLatin1Char('=');
- }
- };
-
- bool operator==(const QString &s, const StringOption &o)
- {
- return o == s;
- }
-
- // Option with integer value. May not have a shortcut
- class IntOption : protected StringOption
- {
- public:
- constexpr IntOption(const char *name)
- : StringOption {name}
- {
- }
-
- using StringOption::operator==;
- using StringOption::usage;
-
- int value(const QString &arg) const
- {
- QString val = StringOption::value(arg);
- bool ok = false;
- int res = val.toInt(&ok);
- if (!ok)
- throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
- "e.g. Parameter '--webui-port' must follow syntax '--webui-port='")
- .arg(fullParameter()).arg(QLatin1String("")));
- return res;
- }
-
- int value(const QProcessEnvironment &env, int defaultValue) const
- {
- QString val = env.value(envVarName());
- if (val.isEmpty()) return defaultValue;
-
- bool ok;
- int res = val.toInt(&ok);
- if (!ok) {
- qDebug() << QObject::tr("Expected integer number in environment variable '%1', but got '%2'")
- .arg(envVarName(), val);
- return defaultValue;
- }
- return res;
- }
- };
-
- bool operator==(const QString &s, const IntOption &o)
- {
- return o == s;
- }
-
- // Option that is explicitly set to true or false, and whose value is undefined when unspecified.
- // May not have a shortcut.
- class TriStateBoolOption : protected Option
- {
- public:
- constexpr TriStateBoolOption(const char *name, bool defaultValue)
- : Option {name, 0}
- , m_defaultValue(defaultValue)
- {
- }
-
- bool operator==(const QString &arg) const
- {
- QStringList parts = arg.split(QLatin1Char('='));
- return parts[0] == fullParameter();
- }
-
- QString usage() const
- {
- return padUsageText(fullParameter() + QLatin1String("="));
- }
-
- TriStateBool value(const QString &arg) const
- {
- QStringList parts = arg.split(QLatin1Char('='));
-
- if (parts.size() == 1) {
- return TriStateBool(m_defaultValue);
- }
- else if (parts.size() == 2) {
- QString val = parts[1];
-
- if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) {
- return TriStateBool::True;
- }
- else if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) {
- return TriStateBool::False;
- }
- }
-
- throw CommandLineParameterError(QObject::tr("Parameter '%1' must follow syntax '%1=%2'",
- "e.g. Parameter '--add-paused' must follow syntax "
- "'--add-paused='")
- .arg(fullParameter())
- .arg(QLatin1String("")));
- }
-
- TriStateBool value(const QProcessEnvironment &env) const
- {
- QString val = env.value(envVarName(), "-1");
-
- if (val.isEmpty()) {
- return TriStateBool(m_defaultValue);
- }
- else if (val == QLatin1String("-1")) {
- return TriStateBool::Undefined;
- }
- else if ((val.toUpper() == QLatin1String("TRUE")) || (val == QLatin1String("1"))) {
- return TriStateBool::True;
- }
- else if ((val.toUpper() == QLatin1String("FALSE")) || (val == QLatin1String("0"))) {
- return TriStateBool::False;
- }
- else {
- qDebug() << QObject::tr("Expected %1 in environment variable '%2', but got '%3'")
- .arg(QLatin1String("true|false"), envVarName(), val);
- return TriStateBool::Undefined;
- }
- }
-
- bool m_defaultValue;
- };
-
- bool operator==(const QString &s, const TriStateBoolOption &o)
- {
- return o == s;
- }
-
- constexpr const BoolOption SHOW_HELP_OPTION = {"help", 'h'};
- constexpr const BoolOption SHOW_VERSION_OPTION = {"version", 'v'};
-#ifdef DISABLE_GUI
- constexpr const BoolOption DAEMON_OPTION = {"daemon", 'd'};
-#else
- constexpr const BoolOption NO_SPLASH_OPTION = {"no-splash"};
-#endif
- constexpr const IntOption WEBUI_PORT_OPTION = {"webui-port"};
- constexpr const StringOption PROFILE_OPTION = {"profile"};
- constexpr const StringOption CONFIGURATION_OPTION = {"configuration"};
- constexpr const BoolOption PORTABLE_OPTION = {"portable"};
- constexpr const BoolOption RELATIVE_FASTRESUME = {"relative-fastresume"};
- constexpr const StringOption SAVE_PATH_OPTION = {"save-path"};
- constexpr const TriStateBoolOption PAUSED_OPTION = {"add-paused", true};
- constexpr const BoolOption SKIP_HASH_CHECK_OPTION = {"skip-hash-check"};
- constexpr const StringOption CATEGORY_OPTION = {"category"};
- constexpr const BoolOption SEQUENTIAL_OPTION = {"sequential"};
- constexpr const BoolOption FIRST_AND_LAST_OPTION = {"first-and-last"};
- constexpr const TriStateBoolOption SKIP_DIALOG_OPTION = {"skip-dialog", true};
-}
-
-QBtCommandLineParameters::QBtCommandLineParameters(const QProcessEnvironment &env)
- : showHelp(false)
- , relativeFastresumePaths(RELATIVE_FASTRESUME.value(env))
- , portableMode(PORTABLE_OPTION.value(env))
- , skipChecking(SKIP_HASH_CHECK_OPTION.value(env))
- , sequential(SEQUENTIAL_OPTION.value(env))
- , firstLastPiecePriority(FIRST_AND_LAST_OPTION.value(env))
-#ifndef Q_OS_WIN
- , showVersion(false)
-#endif
-#ifndef DISABLE_GUI
- , noSplash(NO_SPLASH_OPTION.value(env))
-#else
- , shouldDaemonize(DAEMON_OPTION.value(env))
-#endif
- , webUiPort(WEBUI_PORT_OPTION.value(env, -1))
- , addPaused(PAUSED_OPTION.value(env))
- , skipDialog(SKIP_DIALOG_OPTION.value(env))
- , profileDir(PROFILE_OPTION.value(env))
- , configurationName(CONFIGURATION_OPTION.value(env))
- , savePath(SAVE_PATH_OPTION.value(env))
- , category(CATEGORY_OPTION.value(env))
-{
-}
-
-QStringList QBtCommandLineParameters::paramList() const
-{
- QStringList result;
- // Because we're passing a string list to the currently running
- // qBittorrent process, we need some way of passing along the options
- // the user has specified. Here we place special strings that are
- // almost certainly not going to collide with a file path or URL
- // specified by the user, and placing them at the beginning of the
- // string list so that they will be processed before the list of
- // torrent paths or URLs.
-
- if (!savePath.isEmpty())
- result.append(QString("@savePath=%1").arg(savePath));
-
- if (addPaused == TriStateBool::True) {
- result.append(QLatin1String("@addPaused=1"));
- }
- else if (addPaused == TriStateBool::False) {
- result.append(QLatin1String("@addPaused=0"));
- }
-
- if (skipChecking)
- result.append(QLatin1String("@skipChecking"));
-
- if (!category.isEmpty())
- result.append(QString("@category=%1").arg(category));
-
- if (sequential)
- result.append(QLatin1String("@sequential"));
-
- if (firstLastPiecePriority)
- result.append(QLatin1String("@firstLastPiecePriority"));
-
- if (skipDialog == TriStateBool::True) {
- result.append(QLatin1String("@skipDialog=1"));
- }
- else if (skipDialog == TriStateBool::False) {
- result.append(QLatin1String("@skipDialog=0"));
- }
-
- result += torrents;
- return result;
-}
-
-QBtCommandLineParameters parseCommandLine(const QStringList &args)
-{
- QBtCommandLineParameters result {QProcessEnvironment::systemEnvironment()};
-
- for (int i = 1; i < args.count(); ++i) {
- const QString &arg = args[i];
-
- if ((arg.startsWith("--") && !arg.endsWith(".torrent"))
- || (arg.startsWith('-') && (arg.size() == 2))) {
- // Parse known parameters
- if (arg == SHOW_HELP_OPTION) {
- result.showHelp = true;
- }
-#ifndef Q_OS_WIN
- else if (arg == SHOW_VERSION_OPTION) {
- result.showVersion = true;
- }
-#endif
- else if (arg == WEBUI_PORT_OPTION) {
- result.webUiPort = WEBUI_PORT_OPTION.value(arg);
- if ((result.webUiPort < 1) || (result.webUiPort > 65535))
- throw CommandLineParameterError(QObject::tr("%1 must specify a valid port (1 to 65535).")
- .arg(QLatin1String("--webui-port")));
- }
-#ifndef DISABLE_GUI
- else if (arg == NO_SPLASH_OPTION) {
- result.noSplash = true;
- }
-#else
- else if (arg == DAEMON_OPTION) {
- result.shouldDaemonize = true;
- }
-#endif
- else if (arg == PROFILE_OPTION) {
- result.profileDir = PROFILE_OPTION.value(arg);
- }
- else if (arg == RELATIVE_FASTRESUME) {
- result.relativeFastresumePaths = true;
- }
- else if (arg == PORTABLE_OPTION) {
- result.portableMode = true;
- }
- else if (arg == CONFIGURATION_OPTION) {
- result.configurationName = CONFIGURATION_OPTION.value(arg);
- }
- else if (arg == SAVE_PATH_OPTION) {
- result.savePath = SAVE_PATH_OPTION.value(arg);
- }
- else if (arg == PAUSED_OPTION) {
- result.addPaused = PAUSED_OPTION.value(arg);
- }
- else if (arg == SKIP_HASH_CHECK_OPTION) {
- result.skipChecking = true;
- }
- else if (arg == CATEGORY_OPTION) {
- result.category = CATEGORY_OPTION.value(arg);
- }
- else if (arg == SEQUENTIAL_OPTION) {
- result.sequential = true;
- }
- else if (arg == FIRST_AND_LAST_OPTION) {
- result.firstLastPiecePriority = true;
- }
- else if (arg == SKIP_DIALOG_OPTION) {
- result.skipDialog = SKIP_DIALOG_OPTION.value(arg);
- }
- else {
- // Unknown argument
- result.unknownParameter = arg;
- break;
- }
- }
- else {
- QFileInfo torrentPath;
- torrentPath.setFile(arg);
-
- if (torrentPath.exists())
- result.torrents += torrentPath.absoluteFilePath();
- else
- result.torrents += arg;
- }
- }
-
- return result;
-}
-
-CommandLineParameterError::CommandLineParameterError(const QString &messageForUser)
- : std::runtime_error(messageForUser.toLocal8Bit().data())
- , m_messageForUser(messageForUser)
-{
-}
-
-const QString& CommandLineParameterError::messageForUser() const
-{
- return m_messageForUser;
-}
-
-QString wrapText(const QString &text, int initialIndentation = USAGE_TEXT_COLUMN, int wrapAtColumn = WRAP_AT_COLUMN)
-{
- QStringList words = text.split(' ');
- QStringList lines = {words.first()};
- int currentLineMaxLength = wrapAtColumn - initialIndentation;
-
- foreach (const QString &word, words.mid(1)) {
- if (lines.last().length() + word.length() + 1 < currentLineMaxLength) {
- lines.last().append(' ' + word);
- }
- else {
- lines.append(QString(initialIndentation, ' ') + word);
- currentLineMaxLength = wrapAtColumn;
- }
- }
-
- return lines.join('\n');
-}
-
-QString makeUsage(const QString &prgName)
-{
- QString text;
- QTextStream stream(&text, QIODevice::WriteOnly);
- QString indentation = QString(USAGE_INDENTATION, ' ');
-
- stream << QObject::tr("Usage:") << '\n';
- stream << indentation << prgName << QLatin1String(" [options] [( | )...]") << '\n';
-
- stream << QObject::tr("Options:") << '\n';
-#ifndef Q_OS_WIN
- stream << SHOW_VERSION_OPTION.usage() << wrapText(QObject::tr("Display program version and exit")) << '\n';
-#endif
- stream << SHOW_HELP_OPTION.usage() << wrapText(QObject::tr("Display this help message and exit")) << '\n';
- stream << WEBUI_PORT_OPTION.usage(QObject::tr("port"))
- << wrapText(QObject::tr("Change the Web UI port"))
- << '\n';
-#ifndef DISABLE_GUI
- stream << NO_SPLASH_OPTION.usage() << wrapText(QObject::tr("Disable splash screen")) << '\n';
-#else
- stream << DAEMON_OPTION.usage() << wrapText(QObject::tr("Run in daemon-mode (background)")) << '\n';
-#endif
- //: Use appropriate short form or abbreviation of "directory"
- stream << PROFILE_OPTION.usage(QObject::tr("dir"))
- << wrapText(QObject::tr("Store configuration files in ")) << '\n';
- stream << CONFIGURATION_OPTION.usage(QObject::tr("name"))
- << wrapText(QObject::tr("Store configuration files in directories qBittorrent_")) << '\n';
- stream << RELATIVE_FASTRESUME.usage()
- << wrapText(QObject::tr("Hack into libtorrent fastresume files and make file paths relative "
- "to the profile directory")) << '\n';
- stream << PORTABLE_OPTION.usage()
- << wrapText(QObject::tr("Shortcut for %1", "Shortcut for --profile=/profile --relative-fastresume")
- .arg(QLatin1String("--profile=/profile --relative-fastresume"))) << '\n';
- stream << Option::padUsageText(QObject::tr("files or URLs"))
- << wrapText(QObject::tr("Download the torrents passed by the user")) << '\n'
- << '\n';
-
- stream << wrapText(QObject::tr("Options when adding new torrents:"), 0) << '\n';
- stream << SAVE_PATH_OPTION.usage(QObject::tr("path")) << wrapText(QObject::tr("Torrent save path")) << '\n';
- stream << PAUSED_OPTION.usage() << wrapText(QObject::tr("Add torrents as started or paused")) << '\n';
- stream << SKIP_HASH_CHECK_OPTION.usage() << wrapText(QObject::tr("Skip hash check")) << '\n';
- stream << CATEGORY_OPTION.usage(QObject::tr("name"))
- << wrapText(QObject::tr("Assign torrents to category. If the category doesn't exist, it will be "
- "created.")) << '\n';
- stream << SEQUENTIAL_OPTION.usage() << wrapText(QObject::tr("Download files in sequential order")) << '\n';
- stream << FIRST_AND_LAST_OPTION.usage()
- << wrapText(QObject::tr("Download first and last pieces first")) << '\n';
- stream << SKIP_DIALOG_OPTION.usage()
- << wrapText(QObject::tr("Specify whether the \"Add New Torrent\" dialog opens when adding a "
- "torrent.")) << '\n';
- stream << '\n';
-
- stream << wrapText(QObject::tr("Option values may be supplied via environment variables. For option named "
- "'parameter-name', environment variable name is 'QBT_PARAMETER_NAME' (in upper "
- "case, '-' replaced with '_'). To pass flag values, set the variable to '1' or "
- "'TRUE'. For example, to disable the splash screen: "), 0) << "\n"
- << QLatin1String("QBT_NO_SPLASH=1 ") << prgName << '\n'
- << wrapText(QObject::tr("Command line parameters take precedence over environment variables"), 0) << '\n';
-
- stream << flush;
- return text;
-}
-
-void displayUsage(const QString &prgName)
-{
-#ifndef Q_OS_WIN
- printf("%s\n", qUtf8Printable(makeUsage(prgName)));
-#else
- QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prgName), QMessageBox::Ok);
- msgBox.show(); // Need to be shown or to moveToCenter does not work
- msgBox.move(Utils::Misc::screenCenter(&msgBox));
- msgBox.exec();
-#endif
-}
diff -Nru qbittorrent-4.1.3/src/app/cmdoptions.h qbittorrent-3.3.15/src/app/cmdoptions.h
--- qbittorrent-4.1.3/src/app/cmdoptions.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/cmdoptions.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,76 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2016 Eugene Shalygin
- * Copyright (C) 2014 Vladimir Golovnev
- * Copyright (C) 2006 Christophe Dumez
- *
- * 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.
- */
-
-#ifndef APP_OPTIONS_H
-#define APP_OPTIONS_H
-
-#include
-
-#include
-#include
-
-#include "base/tristatebool.h"
-
-class QProcessEnvironment;
-
-struct QBtCommandLineParameters
-{
- bool showHelp, relativeFastresumePaths, portableMode, skipChecking, sequential, firstLastPiecePriority;
-#ifndef Q_OS_WIN
- bool showVersion;
-#endif
-#ifndef DISABLE_GUI
- bool noSplash;
-#else
- bool shouldDaemonize;
-#endif
- int webUiPort;
- TriStateBool addPaused, skipDialog;
- QStringList torrents;
- QString profileDir, configurationName, savePath, category, unknownParameter;
-
- QBtCommandLineParameters(const QProcessEnvironment&);
- QStringList paramList() const;
-};
-
-class CommandLineParameterError : public std::runtime_error
-{
-public:
- CommandLineParameterError(const QString &messageForUser);
- const QString &messageForUser() const;
-
-private:
- const QString m_messageForUser;
-};
-
-QBtCommandLineParameters parseCommandLine(const QStringList &args);
-void displayUsage(const QString &prgName);
-
-#endif // APP_OPTIONS_H
diff -Nru qbittorrent-4.1.3/src/app/filelogger.cpp qbittorrent-3.3.15/src/app/filelogger.cpp
--- qbittorrent-4.1.3/src/app/filelogger.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/filelogger.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -26,13 +26,11 @@
* exception statement from your version.
*/
-#include "filelogger.h"
-
#include
#include
#include
#include
-
+#include "filelogger.h"
#include "base/logger.h"
#include "base/utils/fs.h"
@@ -43,17 +41,17 @@
{
m_flusher.setInterval(0);
m_flusher.setSingleShot(true);
- connect(&m_flusher, &QTimer::timeout, this, &FileLogger::flushLog);
+ connect(&m_flusher, SIGNAL(timeout()), SLOT(flushLog()));
changePath(path);
if (deleteOld)
this->deleteOld(age, ageType);
- const Logger *const logger = Logger::instance();
- foreach (const Log::Msg &msg, logger->getMessages())
+ const Logger* const logger = Logger::instance();
+ foreach (const Log::Msg& msg, logger->getMessages())
addLogMessage(msg);
- connect(logger, &Logger::newLogMessage, this, &FileLogger::addLogMessage);
+ connect(logger, SIGNAL(newLogMessage(const Log::Msg &)), SLOT(addLogMessage(const Log::Msg &)));
}
FileLogger::~FileLogger()
@@ -63,7 +61,7 @@
delete m_logFile;
}
-void FileLogger::changePath(const QString &newPath)
+void FileLogger::changePath(const QString& newPath)
{
QString tmpPath = Utils::Fs::fromNativePath(newPath);
QDir dir(tmpPath);
@@ -85,21 +83,21 @@
void FileLogger::deleteOld(const int age, const FileLogAgeType ageType)
{
QDateTime date = QDateTime::currentDateTime();
- QDir dir(Utils::Fs::branchPath(m_path));
+ QDir dir(m_path);
+
+ switch (ageType) {
+ case DAYS:
+ date = date.addDays(age);
+ break;
+ case MONTHS:
+ date = date.addMonths(age);
+ break;
+ default:
+ date = date.addYears(age);
+ }
foreach (const QFileInfo file, dir.entryInfoList(QStringList("qbittorrent.log.bak*"), QDir::Files | QDir::Writable, QDir::Time | QDir::Reversed)) {
- QDateTime modificationDate = file.lastModified();
- switch (ageType) {
- case DAYS:
- modificationDate = modificationDate.addDays(age);
- break;
- case MONTHS:
- modificationDate = modificationDate.addMonths(age);
- break;
- default:
- modificationDate = modificationDate.addYears(age);
- }
- if (modificationDate > date)
+ if (file.lastModified() < date)
break;
Utils::Fs::forceRemove(file.absoluteFilePath());
}
@@ -137,7 +135,7 @@
str << QDateTime::fromMSecsSinceEpoch(msg.timestamp).toString(Qt::ISODate) << " - " << msg.message << endl;
- if (m_backup && (m_logFile->size() >= m_maxSize)) {
+ if (m_backup && (m_logFile->size() >= (m_maxSize * 1024 * 1024))) {
closeLogFile();
int counter = 0;
QString backupLogFilename = m_path + ".bak";
@@ -167,7 +165,7 @@
|| !m_logFile->setPermissions(QFile::ReadOwner | QFile::WriteOwner)) {
delete m_logFile;
m_logFile = nullptr;
- Logger::instance()->addMessage(tr("An error occurred while trying to open the log file. Logging to file is disabled."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("An error occured while trying to open the log file. Logging to file is disabled."), Log::CRITICAL);
}
}
diff -Nru qbittorrent-4.1.3/src/app/filelogger.h qbittorrent-3.3.15/src/app/filelogger.h
--- qbittorrent-4.1.3/src/app/filelogger.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/filelogger.h 2017-08-03 20:30:10.000000000 +0000
@@ -76,3 +76,4 @@
};
#endif // FILELOGGER_H
+
diff -Nru qbittorrent-4.1.3/src/app/main.cpp qbittorrent-3.3.15/src/app/main.cpp
--- qbittorrent-4.1.3/src/app/main.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/main.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -1,7 +1,7 @@
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2014 Vladimir Golovnev
- * Copyright (C) 2006 Christophe Dumez
+ * Copyright (C) 2006 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -25,13 +25,12 @@
* 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.
+ *
+ * Contact : chris@qbittorrent.org
*/
-#include
-
#include
#include
-#include
#ifndef DISABLE_GUI
// GUI-only includes
@@ -44,7 +43,11 @@
#ifdef QBT_STATIC_QT
#include
+#ifdef QBT_USES_QT5
Q_IMPORT_PLUGIN(QICOPlugin)
+#else
+Q_IMPORT_PLUGIN(qico)
+#endif
#endif // QBT_STATIC_QT
#else
@@ -55,53 +58,85 @@
#endif
#endif // DISABLE_GUI
-#include
-#ifdef STACKTRACE
#ifdef Q_OS_UNIX
+#include
+#include
#include "stacktrace.h"
-#else
-#include "stacktrace_win.h"
-#include "stacktracedialog.h"
#endif // Q_OS_UNIX
-#endif //STACKTRACE
-#include "base/preferences.h"
-#include "base/profile.h"
-#include "base/utils/misc.h"
+#ifdef STACKTRACE_WIN
+#include
+#include "stacktrace_win.h"
+#include "stacktrace_win_dlg.h"
+#endif //STACKTRACE_WIN
+
+#include
+#include
#include "application.h"
-#include "cmdoptions.h"
+#include "base/utils/misc.h"
+#include "base/preferences.h"
+
#include "upgrade.h"
// Signal handlers
+#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
void sigNormalHandler(int signum);
-#ifdef STACKTRACE
void sigAbnormalHandler(int signum);
-#endif
// sys_signame[] is only defined in BSD
const char *sysSigName[] = {
-#if defined(Q_OS_WIN)
- "", "", "SIGINT", "", "SIGILL", "", "SIGABRT_COMPAT", "", "SIGFPE", "",
- "", "SIGSEGV", "", "", "", "SIGTERM", "", "", "", "",
- "", "SIGBREAK", "SIGABRT", "", "", "", "", "", "", "",
- "", ""
-#else
"", "SIGHUP", "SIGINT", "SIGQUIT", "SIGILL", "SIGTRAP", "SIGABRT", "SIGBUS", "SIGFPE", "SIGKILL",
"SIGUSR1", "SIGSEGV", "SIGUSR2", "SIGPIPE", "SIGALRM", "SIGTERM", "SIGSTKFLT", "SIGCHLD", "SIGCONT", "SIGSTOP",
"SIGTSTP", "SIGTTIN", "SIGTTOU", "SIGURG", "SIGXCPU", "SIGXFSZ", "SIGVTALRM", "SIGPROF", "SIGWINCH", "SIGIO",
"SIGPWR", "SIGUNUSED"
+};
#endif
+
+struct QBtCommandLineParameters
+{
+ bool showHelp;
+#ifndef Q_OS_WIN
+ bool showVersion;
+#endif
+#ifndef DISABLE_GUI
+ bool noSplash;
+#else
+ bool shouldDaemonize;
+#endif
+ int webUiPort;
+ QStringList torrents;
+ QString unknownParameter;
+
+ QBtCommandLineParameters()
+ : showHelp(false)
+#ifndef Q_OS_WIN
+ , showVersion(false)
+#endif
+#ifndef DISABLE_GUI
+ , noSplash(Preferences::instance()->isSplashScreenDisabled())
+#else
+ , shouldDaemonize(false)
+#endif
+ , webUiPort(Preferences::instance()->getWebUiPort())
+ {
+ }
};
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
-void reportToUser(const char *str);
+void reportToUser(const char* str);
#endif
void displayVersion();
+void displayUsage(const QString &prg_name);
bool userAgreesWithLegalNotice();
void displayBadArgMessage(const QString &message);
+QBtCommandLineParameters parseCommandLine();
#if !defined(DISABLE_GUI)
void showSplashScreen();
+
+#if defined(Q_OS_UNIX)
+void setupDpi();
+#endif // Q_OS_UNIX
#endif // DISABLE_GUI
// Main
@@ -116,150 +151,214 @@
macMigratePlists();
#endif
- try {
- // Create Application
- QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString();
- QScopedPointer app(new Application(appId, argc, argv));
+#if !defined(DISABLE_GUI) && defined(Q_OS_UNIX)
+ setupDpi();
+#endif
+
#ifndef DISABLE_GUI
- // after the application object creation because we need a profile to be set already
- // for the migration
- migrateRSS();
+ migrateRSS();
#endif
- const QBtCommandLineParameters params = app->commandLineArgs();
+ // Create Application
+ QString appId = QLatin1String("qBittorrent-") + Utils::Misc::getUserIDString();
+ QScopedPointer app(new Application(appId, argc, argv));
+
+ const QBtCommandLineParameters params = parseCommandLine();
+
+ if (!params.unknownParameter.isEmpty()) {
+ displayBadArgMessage(QObject::tr("%1 is an unknown command line parameter.", "--random-parameter is an unknown command line parameter.")
+ .arg(params.unknownParameter));
+ return EXIT_FAILURE;
+ }
- if (!params.unknownParameter.isEmpty()) {
- throw CommandLineParameterError(QObject::tr("%1 is an unknown command line parameter.",
- "--random-parameter is an unknown command line parameter.")
- .arg(params.unknownParameter));
- }
#ifndef Q_OS_WIN
- if (params.showVersion) {
- if (isOneArg) {
- displayVersion();
- return EXIT_SUCCESS;
- }
- throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.")
- .arg(QLatin1String("-v (or --version)")));
+ if (params.showVersion) {
+ if (isOneArg) {
+ displayVersion();
+ return EXIT_SUCCESS;
+ }
+ else {
+ displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.")
+ .arg(QLatin1String("-v (or --version)")));
+ return EXIT_FAILURE;
}
+ }
#endif
- if (params.showHelp) {
- if (isOneArg) {
- displayUsage(argv[0]);
- return EXIT_SUCCESS;
- }
- throw CommandLineParameterError(QObject::tr("%1 must be the single command line parameter.")
+
+ if (params.showHelp) {
+ if (isOneArg) {
+ displayUsage(argv[0]);
+ return EXIT_SUCCESS;
+ }
+ else {
+ displayBadArgMessage(QObject::tr("%1 must be the single command line parameter.")
.arg(QLatin1String("-h (or --help)")));
+ return EXIT_FAILURE;
}
+ }
- // Set environment variable
- if (!qputenv("QBITTORRENT", QBT_VERSION))
- fprintf(stderr, "Couldn't set environment variable...\n");
+ if ((params.webUiPort > 0) && (params.webUiPort <= 65535)) {
+ Preferences::instance()->setWebUiPort(params.webUiPort);
+ }
+ else {
+ displayBadArgMessage(QObject::tr("%1 must specify the correct port (1 to 65535).")
+ .arg(QLatin1String("--webui-port")));
+ return EXIT_FAILURE;
+ }
+
+ // Set environment variable
+ if (!qputenv("QBITTORRENT", QBT_VERSION))
+ std::cerr << "Couldn't set environment variable...\n";
#ifndef DISABLE_GUI
- if (!userAgreesWithLegalNotice())
- return EXIT_SUCCESS;
+ if (!userAgreesWithLegalNotice())
+ return EXIT_SUCCESS;
#else
- if (!params.shouldDaemonize
- && isatty(fileno(stdin))
- && isatty(fileno(stdout))
- && !userAgreesWithLegalNotice())
- return EXIT_SUCCESS;
+ if (!params.shouldDaemonize
+ && isatty(fileno(stdin))
+ && isatty(fileno(stdout))
+ && !userAgreesWithLegalNotice())
+ return EXIT_SUCCESS;
#endif
- // Check if qBittorrent is already running for this user
- if (app->isRunning()) {
+ // Check if qBittorrent is already running for this user
+ if (app->isRunning()) {
#ifdef DISABLE_GUI
- if (params.shouldDaemonize) {
- throw CommandLineParameterError(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
- .arg(QLatin1String("-d (or --daemon)")));
- }
- else
+ if (params.shouldDaemonize) {
+ displayBadArgMessage(QObject::tr("You cannot use %1: qBittorrent is already running for this user.")
+ .arg(QLatin1String("-d (or --daemon)")));
+ return EXIT_FAILURE;
+ }
+ else
#endif
- qDebug("qBittorrent is already running for this user.");
+ qDebug("qBittorrent is already running for this user.");
- QThread::msleep(300);
- app->sendParams(params.paramList());
+ Utils::Misc::msleep(300);
+ app->sendParams(params.torrents);
- return EXIT_SUCCESS;
- }
+ return EXIT_SUCCESS;
+ }
-#if defined(Q_OS_WIN)
- // This affects only Windows apparently and Qt5.
- // When QNetworkAccessManager is instantiated it regularly starts polling
- // the network interfaces to see what's available and their status.
- // This polling creates jitter and high ping with wifi interfaces.
- // So here we disable it for lack of better measure.
- // It will also spew this message in the console: QObject::startTimer: Timers cannot have negative intervals
- // For more info see:
- // 1. https://github.com/qbittorrent/qBittorrent/issues/4209
- // 2. https://bugreports.qt.io/browse/QTBUG-40332
- // 3. https://bugreports.qt.io/browse/QTBUG-46015
-
- qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
-#if (QT_VERSION >= QT_VERSION_CHECK(5, 10, 0))
- // this is the default in Qt6
- app->setAttribute(Qt::AA_DisableWindowContextHelpButton);
-#endif
+#if defined(Q_OS_WIN) && defined(QBT_USES_QT5)
+ // This affects only Windows apparently and Qt5.
+ // When QNetworkAccessManager is instantiated it regularly starts polling
+ // the network interfaces to see what's available and their status.
+ // This polling creates jitter and high ping with wifi interfaces.
+ // So here we disable it for lack of better measure.
+ // It will also spew this message in the console: QObject::startTimer: Timers cannot have negative intervals
+ // For more info see:
+ // 1. https://github.com/qbittorrent/qBittorrent/issues/4209
+ // 2. https://bugreports.qt.io/browse/QTBUG-40332
+ // 3. https://bugreports.qt.io/browse/QTBUG-46015
+
+ qputenv("QT_BEARER_POLL_TIMEOUT", QByteArray::number(-1));
#endif
#if defined(Q_OS_MAC)
- // Since Apple made difficult for users to set PATH, we set here for convenience.
- // Users are supposed to install Homebrew Python for search function.
- // For more info see issue #5571.
- QByteArray path = "/usr/local/bin:";
- path += qgetenv("PATH");
- qputenv("PATH", path.constData());
-
- // On OS X the standard is to not show icons in the menus
- app->setAttribute(Qt::AA_DontShowIconsInMenus);
+{
+ // Since Apple made difficult for users to set PATH, we set here for convenience.
+ // Users are supposed to install Homebrew Python for search function.
+ // For more info see issue #5571.
+ QByteArray path = "/usr/local/bin:";
+ path += qgetenv("PATH");
+ qputenv("PATH", path.constData());
+}
#endif
#ifndef DISABLE_GUI
- if (!upgrade()) return EXIT_FAILURE;
+ if (!upgrade()) return EXIT_FAILURE;
#else
- if (!upgrade(!params.shouldDaemonize
- && isatty(fileno(stdin))
- && isatty(fileno(stdout)))) return EXIT_FAILURE;
+ if (!upgrade(!params.shouldDaemonize
+ && isatty(fileno(stdin))
+ && isatty(fileno(stdout)))) return EXIT_FAILURE;
#endif
+
#ifdef DISABLE_GUI
- if (params.shouldDaemonize) {
- app.reset(); // Destroy current application
- if (daemon(1, 0) == 0) {
- app.reset(new Application(appId, argc, argv));
- if (app->isRunning()) {
- // Another instance had time to start.
- return EXIT_FAILURE;
- }
- }
- else {
- qCritical("Something went wrong while daemonizing, exiting...");
+ if (params.shouldDaemonize) {
+ app.reset(); // Destroy current application
+ if ((daemon(1, 0) == 0)) {
+ app.reset(new Application(appId, argc, argv));
+ if (app->isRunning()) {
+ // Another instance had time to start.
return EXIT_FAILURE;
}
}
+ else {
+ qCritical("Something went wrong while daemonizing, exiting...");
+ return EXIT_FAILURE;
+ }
+ }
#else
- if (!(params.noSplash || Preferences::instance()->isSplashScreenDisabled()))
- showSplashScreen();
+ if (!params.noSplash)
+ showSplashScreen();
#endif
- signal(SIGINT, sigNormalHandler);
- signal(SIGTERM, sigNormalHandler);
-#ifdef STACKTRACE
- signal(SIGABRT, sigAbnormalHandler);
- signal(SIGSEGV, sigAbnormalHandler);
+#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
+ signal(SIGINT, sigNormalHandler);
+ signal(SIGTERM, sigNormalHandler);
+ signal(SIGABRT, sigAbnormalHandler);
+ signal(SIGSEGV, sigAbnormalHandler);
#endif
- return app->exec(params.paramList());
- }
- catch (CommandLineParameterError &er) {
- displayBadArgMessage(er.messageForUser());
- return EXIT_FAILURE;
+ return app->exec(params.torrents);
+}
+
+QBtCommandLineParameters parseCommandLine()
+{
+ QBtCommandLineParameters result;
+ QStringList appArguments = qApp->arguments();
+
+ for (int i = 1; i < appArguments.size(); ++i) {
+ const QString& arg = appArguments[i];
+
+ if ((arg.startsWith("--") && !arg.endsWith(".torrent")) ||
+ (arg.startsWith("-") && arg.size() == 2)) {
+ //Parse known parameters
+ if ((arg == QLatin1String("-h")) || (arg == QLatin1String("--help"))) {
+ result.showHelp = true;
+ }
+#ifndef Q_OS_WIN
+ else if ((arg == QLatin1String("-v")) || (arg == QLatin1String("--version"))) {
+ result.showVersion = true;
+ }
+#endif
+ else if (arg.startsWith(QLatin1String("--webui-port="))) {
+ QStringList parts = arg.split(QLatin1Char('='));
+ if (parts.size() == 2)
+ result.webUiPort = parts.last().toInt();
+ }
+#ifndef DISABLE_GUI
+ else if (arg == QLatin1String("--no-splash")) {
+ result.noSplash = true;
+ }
+#else
+ else if ((arg == QLatin1String("-d")) || (arg == QLatin1String("--daemon"))) {
+ result.shouldDaemonize = true;
+ }
+#endif
+ else {
+ //Unknown argument
+ result.unknownParameter = arg;
+ break;
+ }
+ }
+ else {
+ QFileInfo torrentPath;
+ torrentPath.setFile(arg);
+
+ if (torrentPath.exists())
+ result.torrents += torrentPath.absoluteFilePath();
+ else
+ result.torrents += arg;
+ }
}
+
+ return result;
}
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
-void reportToUser(const char *str)
+void reportToUser(const char* str)
{
const size_t strLen = strlen(str);
if (write(STDERR_FILENO, str, strLen) < static_cast(strLen)) {
@@ -269,67 +368,120 @@
}
#endif
+#if defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
void sigNormalHandler(int signum)
{
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
- const char msg1[] = "Catching signal: ";
- const char msg2[] = "\nExiting cleanly\n";
- reportToUser(msg1);
- reportToUser(sysSigName[signum]);
- reportToUser(msg2);
+ const char str1[] = "Catching signal: ";
+ const char *sigName = sysSigName[signum];
+ const char str2[] = "\nExiting cleanly\n";
+ reportToUser(str1);
+ reportToUser(sigName);
+ reportToUser(str2);
#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
signal(signum, SIG_DFL);
qApp->exit(); // unsafe, but exit anyway
}
-#ifdef STACKTRACE
void sigAbnormalHandler(int signum)
{
- const char *sigName = sysSigName[signum];
#if !defined Q_OS_WIN && !defined Q_OS_HAIKU
- const char msg[] = "\n\n*************************************************************\n"
- "Please file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n"
- "qBittorrent version: " QBT_VERSION "\n\n"
- "Caught signal: ";
- reportToUser(msg);
+ const char str1[] = "\n\n*************************************************************\nCatching signal: ";
+ const char *sigName = sysSigName[signum];
+ const char str2[] = "\nPlease file a bug report at http://bug.qbittorrent.org and provide the following information:\n\n"
+ "qBittorrent version: " QBT_VERSION "\n";
+ reportToUser(str1);
reportToUser(sigName);
- reportToUser("\n");
+ reportToUser(str2);
print_stacktrace(); // unsafe
-#endif
-
-#if defined Q_OS_WIN
- StacktraceDialog dlg; // unsafe
- dlg.setStacktraceString(QLatin1String(sigName), straceWin::getBacktrace());
+#endif // !defined Q_OS_WIN && !defined Q_OS_HAIKU
+#ifdef STACKTRACE_WIN
+ StraceDlg dlg; // unsafe
+ dlg.setStacktraceString(straceWin::getBacktrace());
dlg.exec();
-#endif
-
+#endif // STACKTRACE_WIN
signal(signum, SIG_DFL);
raise(signum);
}
-#endif // STACKTRACE
+#endif // defined(Q_OS_UNIX) || defined(STACKTRACE_WIN)
#if !defined(DISABLE_GUI)
void showSplashScreen()
{
- QPixmap splashImg(":/icons/skin/splash.png");
- QPainter painter(&splashImg);
+ QPixmap splash_img(":/icons/skin/splash.png");
+ QPainter painter(&splash_img);
QString version = QBT_VERSION;
painter.setPen(QPen(Qt::white));
painter.setFont(QFont("Arial", 22, QFont::Black));
painter.drawText(224 - painter.fontMetrics().width(version), 270, version);
- QSplashScreen *splash = new QSplashScreen(splashImg);
+ QSplashScreen *splash = new QSplashScreen(splash_img);
splash->show();
- QTimer::singleShot(1500, splash, &QObject::deleteLater);
+ QTimer::singleShot(1500, splash, SLOT(deleteLater()));
qApp->processEvents();
}
+
+#if defined(Q_OS_UNIX)
+void setupDpi()
+{
+ if (qgetenv("QT_AUTO_SCREEN_SCALE_FACTOR").isEmpty())
+ qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
+}
+#endif // Q_OS_UNIX
#endif // DISABLE_GUI
void displayVersion()
{
- printf("%s %s\n", qUtf8Printable(qApp->applicationName()), QBT_VERSION);
+ std::cout << qPrintable(qApp->applicationName()) << " " << QBT_VERSION << std::endl;
+}
+
+QString makeUsage(const QString &prg_name)
+{
+ QString text;
+
+ text += QObject::tr("Usage:") + QLatin1Char('\n');
+#ifndef Q_OS_WIN
+ text += QLatin1Char('\t') + prg_name + QLatin1String(" (-v | --version)") + QLatin1Char('\n');
+#endif
+ text += QLatin1Char('\t') + prg_name + QLatin1String(" (-h | --help)") + QLatin1Char('\n');
+ text += QLatin1Char('\t') + prg_name
+ + QLatin1String(" [--webui-port=]")
+#ifndef DISABLE_GUI
+ + QLatin1String(" [--no-splash]")
+#else
+ + QLatin1String(" [-d | --daemon]")
+#endif
+ + QLatin1String("[( | )...]") + QLatin1Char('\n');
+ text += QObject::tr("Options:") + QLatin1Char('\n');
+#ifndef Q_OS_WIN
+ text += QLatin1String("\t-v | --version\t\t") + QObject::tr("Displays program version") + QLatin1Char('\n');
+#endif
+ text += QLatin1String("\t-h | --help\t\t") + QObject::tr("Displays this help message") + QLatin1Char('\n');
+ text += QLatin1String("\t--webui-port=\t")
+ + 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');
+#else
+ text += QLatin1String("\t-d | --daemon\t\t") + QObject::tr("Run in daemon-mode (background)") + QLatin1Char('\n');
+#endif
+ text += QLatin1String("\tfiles or urls\t\t") + QObject::tr("Downloads the torrents passed by the user");
+
+ return text;
+}
+
+void displayUsage(const QString& prg_name)
+{
+#ifndef Q_OS_WIN
+ std::cout << qPrintable(makeUsage(prg_name)) << std::endl;
+#else
+ QMessageBox msgBox(QMessageBox::Information, QObject::tr("Help"), makeUsage(prg_name), QMessageBox::Ok);
+ msgBox.show(); // Need to be shown or to moveToCenter does not work
+ msgBox.move(Utils::Misc::screenCenter(&msgBox));
+ msgBox.exec();
+#endif
}
-void displayBadArgMessage(const QString &message)
+void displayBadArgMessage(const QString& message)
{
QString help = QObject::tr("Run application with -h option to read about command line parameters.");
#ifdef Q_OS_WIN
@@ -339,28 +491,24 @@
msgBox.move(Utils::Misc::screenCenter(&msgBox));
msgBox.exec();
#else
- const QString errMsg = QObject::tr("Bad command line: ") + '\n'
- + message + '\n'
- + help + '\n';
- fprintf(stderr, "%s", qUtf8Printable(errMsg));
+ std::cerr << qPrintable(QObject::tr("Bad command line: "));
+ std::cerr << qPrintable(message) << std::endl;
+ std::cerr << qPrintable(help) << std::endl;
#endif
}
bool userAgreesWithLegalNotice()
{
- Preferences *const pref = Preferences::instance();
+ Preferences* const pref = Preferences::instance();
if (pref->getAcceptedLegal()) // Already accepted once
return true;
#ifdef DISABLE_GUI
- const QString eula = QString("\n*** %1 ***\n").arg(QObject::tr("Legal Notice"))
- + QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.") + "\n\n"
- + QObject::tr("No further notices will be issued.") + "\n\n"
- + QObject::tr("Press %1 key to accept and continue...").arg("'y'") + '\n';
- printf("%s", qUtf8Printable(eula));
-
+ std::cout << std::endl << "*** " << qPrintable(QObject::tr("Legal Notice")) << " ***" << std::endl;
+ std::cout << qPrintable(QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.\n\nNo further notices will be issued.")) << std::endl << std::endl;
+ std::cout << qPrintable(QObject::tr("Press %1 key to accept and continue...").arg("'y'")) << std::endl;
char ret = getchar(); // Read pressed key
- if ((ret == 'y') || (ret == 'Y')) {
+ if (ret == 'y' || ret == 'Y') {
// Save the answer
pref->setAcceptedLegal(true);
return true;
@@ -370,16 +518,16 @@
msgBox.setText(QObject::tr("qBittorrent is a file sharing program. When you run a torrent, its data will be made available to others by means of upload. Any content you share is your sole responsibility.\n\nNo further notices will be issued."));
msgBox.setWindowTitle(QObject::tr("Legal notice"));
msgBox.addButton(QObject::tr("Cancel"), QMessageBox::RejectRole);
- QAbstractButton *agreeButton = msgBox.addButton(QObject::tr("I Agree"), QMessageBox::AcceptRole);
+ QAbstractButton *agree_button = msgBox.addButton(QObject::tr("I Agree"), QMessageBox::AcceptRole);
msgBox.show(); // Need to be shown or to moveToCenter does not work
msgBox.move(Utils::Misc::screenCenter(&msgBox));
msgBox.exec();
- if (msgBox.clickedButton() == agreeButton) {
+ if (msgBox.clickedButton() == agree_button) {
// Save the answer
pref->setAcceptedLegal(true);
return true;
}
-#endif // DISABLE_GUI
+#endif
return false;
}
diff -Nru qbittorrent-4.1.3/src/app/qtsingleapplication/CMakeLists.txt qbittorrent-3.3.15/src/app/qtsingleapplication/CMakeLists.txt
--- qbittorrent-4.1.3/src/app/qtsingleapplication/CMakeLists.txt 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/qtsingleapplication/CMakeLists.txt 2017-08-03 20:30:10.000000000 +0000
@@ -8,24 +8,29 @@
qtlocalpeer.cpp
)
-if (Qt5Widgets_FOUND)
+if (GUI)
list(APPEND QBT_QTSINGLEAPPLICATION_HEADERS qtsingleapplication.h)
list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsingleapplication.cpp)
-else (Qt5Widgets_FOUND)
+else (GUI)
list(APPEND QBT_QTSINGLEAPPLICATION_HEADERS qtsinglecoreapplication.h)
list(APPEND QBT_QTSINGLEAPPLICATION_SOURCES qtsinglecoreapplication.cpp)
-endif (Qt5Widgets_FOUND)
+endif (GUI)
-add_library(qtsingleapplication STATIC ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES})
+add_library(qtsingleapplication ${QBT_QTSINGLEAPPLICATION_HEADERS} ${QBT_QTSINGLEAPPLICATION_SOURCES})
target_include_directories(qtsingleapplication INTERFACE "${qtsingleapplication_SOURCE_DIR}")
-target_link_libraries(qtsingleapplication PRIVATE Qt5::Network)
-if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
- target_compile_options(qtsingleapplication PRIVATE "-w") # disable warning for 3rdparty code
-endif()
+if (QT4_FOUND)
+ target_link_libraries(qtsingleapplication Qt4::QtNetwork)
+else (QT4_FOUND)
+ target_link_libraries(qtsingleapplication Qt5::Network)
+endif (QT4_FOUND)
-if (Qt5Widgets_FOUND)
- target_link_libraries(qtsingleapplication PRIVATE Qt5::Widgets)
-endif (Qt5Widgets_FOUND)
+if (GUI)
+ if (QT4_FOUND)
+ target_link_libraries(qtsingleapplication Qt4::QtGui)
+ else (QT4_FOUND)
+ target_link_libraries(qtsingleapplication Qt5::Widgets)
+ endif(QT4_FOUND)
+endif (GUI)
add_library(QtSingleApplication::QtSingleApplication ALIAS qtsingleapplication)
diff -Nru qbittorrent-4.1.3/src/app/qtsingleapplication/qtlocalpeer.cpp qbittorrent-3.3.15/src/app/qtsingleapplication/qtlocalpeer.cpp
--- qbittorrent-4.1.3/src/app/qtsingleapplication/qtlocalpeer.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/qtsingleapplication/qtlocalpeer.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -176,17 +176,8 @@
if (!socket)
return;
- while (true) {
- if (socket->state() == QLocalSocket::UnconnectedState) {
- qWarning("QtLocalPeer: Peer disconnected");
- delete socket;
- return;
- }
- if (socket->bytesAvailable() >= qint64(sizeof(quint32)))
- break;
+ while (socket->bytesAvailable() < (int)sizeof(quint32))
socket->waitForReadyRead();
- }
-
QDataStream ds(socket);
QByteArray uMsg;
quint32 remaining;
diff -Nru qbittorrent-4.1.3/src/app/stacktracedialog.h qbittorrent-3.3.15/src/app/stacktracedialog.h
--- qbittorrent-4.1.3/src/app/stacktracedialog.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktracedialog.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,87 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2015 The qBittorrent project
- *
- * 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.
- *
- */
-
-#ifndef STACKTRACEDIALOG_H
-#define STACKTRACEDIALOG_H
-
-#include
-#include
-
-#include "base/utils/misc.h"
-#include "ui_stacktracedialog.h"
-
-class StacktraceDialog : public QDialog, private Ui::StacktraceDialog
-{
- Q_OBJECT
-
-public:
- StacktraceDialog(QWidget *parent = nullptr)
- : QDialog(parent)
- {
- setupUi(this);
- }
-
- void setStacktraceString(const QString &sigName, const QString &trace)
- {
- // try to call Qt function as less as possible
- QString htmlStr = QString(
- ""
- "qBittorrent has crashed"
- "
"
- ""
- "Please file a bug report at "
- "http://bugs.qbittorrent.org "
- "and provide the following information:"
- "
"
- "
"
- ""
-#if defined(__x86_64__) || defined(_M_X64)
- "qBittorrent version: " QBT_VERSION " (64-bit)
"
-#else
- "qBittorrent version: " QBT_VERSION " (32-bit)
"
-#endif
- "Libtorrent version: %1
"
- "Qt version: " QT_VERSION_STR "
"
- "Boost version: %2
"
- "OS version: %3
"
- "Caught signal: %4"
- "
"
- "%5
"
- "
")
- .arg(Utils::Misc::libtorrentVersionString())
- .arg(Utils::Misc::boostVersionString())
- .arg(Utils::Misc::osName())
- .arg(sigName)
- .arg(trace);
-
- errorText->setHtml(htmlStr);
- }
-};
-
-#endif // STACKTRACEDIALOG_H
diff -Nru qbittorrent-4.1.3/src/app/stacktracedialog.ui qbittorrent-3.3.15/src/app/stacktracedialog.ui
--- qbittorrent-4.1.3/src/app/stacktracedialog.ui 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktracedialog.ui 1970-01-01 00:00:00.000000000 +0000
@@ -1,35 +0,0 @@
-
-
- StacktraceDialog
-
-
-
- 0
- 0
- 640
- 480
-
-
-
- Crash info
-
-
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html>
-
-
- true
-
-
-
-
-
-
-
-
diff -Nru qbittorrent-4.1.3/src/app/stacktrace.h qbittorrent-3.3.15/src/app/stacktrace.h
--- qbittorrent-4.1.3/src/app/stacktrace.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktrace.h 2017-08-03 20:30:10.000000000 +0000
@@ -14,7 +14,7 @@
/** Print a demangled stack backtrace of the caller function to FILE* out. */
static inline void print_stacktrace(FILE *out = stderr, unsigned int max_frames = 63)
{
- fprintf(out, "Stack trace:\n");
+ fprintf(out, "stack trace:\n");
// storage array for stack trace address data
std::vector addrlist(max_frames + 1);
@@ -33,7 +33,7 @@
// allocate string which will be filled with the demangled function name
size_t funcnamesize = 256;
- char *funcname = static_cast(malloc(funcnamesize));
+ char *funcname = (char *)malloc(funcnamesize);
int functionNamesFound = 0;
// iterate over the returned symbol lines. skip the first, it is the
diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win_dlg.h qbittorrent-3.3.15/src/app/stacktrace_win_dlg.h
--- qbittorrent-4.1.3/src/app/stacktrace_win_dlg.h 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktrace_win_dlg.h 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,84 @@
+/*
+ * Bittorrent Client using Qt and libtorrent.
+ * Copyright (C) 2015 The qBittorrent project
+ *
+ * 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.
+ *
+ */
+
+#ifndef STACKTRACE_WIN_DLG_H
+#define STACKTRACE_WIN_DLG_H
+
+#include
+#include
+#include "base/utils/misc.h"
+#include "ui_stacktrace_win_dlg.h"
+
+class StraceDlg : public QDialog, private Ui::errorDialog
+{
+ Q_OBJECT
+
+public:
+ StraceDlg(QWidget* parent = 0)
+ : QDialog(parent)
+ {
+ setupUi(this);
+ }
+
+ void setStacktraceString(const QString& trace)
+ {
+ // try to call Qt function as less as possible
+ QString htmlStr = QString(
+ ""
+ "qBittorrent has crashed"
+ "
"
+ ""
+ "Please file a bug report at "
+ "http://bugs.qbittorrent.org "
+ "and provide the following information:"
+ "
"
+ "
"
+ ""
+#if defined(__x86_64__) || defined(_M_X64)
+ "qBittorrent version: " QBT_VERSION " (64-bit)
"
+#else
+ "qBittorrent version: " QBT_VERSION " (32-bit)
"
+#endif
+ "Libtorrent version: %1
"
+ "Qt version: " QT_VERSION_STR "
"
+ "Boost version: %2
"
+ "OS version: %3"
+ "
"
+ "%4
"
+ "
")
+ .arg(Utils::Misc::libtorrentVersionString())
+ .arg(Utils::Misc::boostVersionString())
+ .arg(Utils::Misc::osName())
+ .arg(trace);
+
+ errorText->setHtml(htmlStr);
+ }
+};
+
+#endif
diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win_dlg.ui qbittorrent-3.3.15/src/app/stacktrace_win_dlg.ui
--- qbittorrent-4.1.3/src/app/stacktrace_win_dlg.ui 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktrace_win_dlg.ui 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,35 @@
+
+
+ errorDialog
+
+
+
+ 0
+ 0
+ 640
+ 480
+
+
+
+ Crash info
+
+
+ -
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+<html><head><meta name="qrichtext" content="1" /><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;">
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html>
+
+
+ true
+
+
+
+
+
+
+
+
diff -Nru qbittorrent-4.1.3/src/app/stacktrace_win.h qbittorrent-3.3.15/src/app/stacktrace_win.h
--- qbittorrent-4.1.3/src/app/stacktrace_win.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/stacktrace_win.h 2017-08-03 20:30:10.000000000 +0000
@@ -138,7 +138,7 @@
QString straceWin::getSourcePathAndLineNumber(HANDLE hProcess, DWORD64 addr)
{
- IMAGEHLP_LINE64 line {};
+ IMAGEHLP_LINE64 line = {0};
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
DWORD dwDisplacement = 0;
@@ -291,7 +291,7 @@
demangle(funcName);
#endif
- // now ihsf.InstructionOffset points to the instruction that follows CALL instruction
+ // now ihsf.InstructionOffset points to the instruction that follows CALL instuction
// decrease the query address by one byte to point somewhere in the CALL instruction byte sequence
sourceFile = getSourcePathAndLineNumber(hProcess, ihsf.InstructionOffset - 1);
}
diff -Nru qbittorrent-4.1.3/src/app/upgrade.h qbittorrent-3.3.15/src/app/upgrade.h
--- qbittorrent-4.1.3/src/app/upgrade.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/app/upgrade.h 2017-08-03 20:30:10.000000000 +0000
@@ -29,43 +29,39 @@
#ifndef UPGRADE_H
#define UPGRADE_H
-#include
-#include
#include
-
#if LIBTORRENT_VERSION_NUM >= 10100
#include
-#else
+#endif
+#include
+#include
+#if LIBTORRENT_VERSION_NUM < 10100
#include
#endif
+
#include
#include
-#include
-#include
-
#ifndef DISABLE_GUI
#include
#endif
-#ifdef Q_OS_MAC
-#include
-#endif
+#include
+#include
#include "base/logger.h"
-#include "base/preferences.h"
-#include "base/profile.h"
#include "base/utils/fs.h"
#include "base/utils/misc.h"
#include "base/utils/string.h"
+#include "base/preferences.h"
+#include "base/qinisettings.h"
bool userAcceptsUpgrade()
{
#ifdef DISABLE_GUI
- printf("\n*** %s ***\n", qUtf8Printable(QObject::tr("Upgrade")));
+ std::cout << std::endl << "*** " << qPrintable(QObject::tr("Upgrade")) << " ***" << std::endl;
char ret = '\0';
do {
- printf("%s\n"
- , qUtf8Printable(QObject::tr("You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n]")));
+ std::cout << qPrintable(QObject::tr("You updated from an older version that saved things differently. You must migrate to the new saving system. You will not be able to use an older version than v3.3.0 again. Continue? [y/n]")) << std::endl;
ret = getchar(); // Read pressed key
}
while ((ret != 'y') && (ret != 'Y') && (ret != 'n') && (ret != 'N'));
@@ -114,47 +110,22 @@
bool v3_3 = false;
int queuePosition = 0;
QString outFilePath = filepath;
- static const QRegularExpression rx(QLatin1String("([A-Fa-f0-9]{40})\\.fastresume\\.(.+)$"));
- const QRegularExpressionMatch rxMatch = rx.match(filepath);
- if (rxMatch.hasMatch()) {
- // Old v3.3.x format had a number at the end indicating the queue position.
- // The naming scheme was '.fastresume.'.
- // However, QSaveFile, which uses QTemporaryFile internally, might leave
- // non-commited files behind eg after a crash. These files have the
- // naming scheme '.fastresume.XXXXXX' where each X is a random
- // character. So we detect if the last part is present. Then check if it
- // is 6 chars long. If all the 6 chars are digits we assume it is an old
- // v3.3.x format. Otherwise it is considered a non-commited fastresume
- // and is deleted, because it may be a corrupted/incomplete fastresume.
- // NOTE: When the upgrade code is removed, we must continue to perform
- // cleanup of non-commited QSaveFile/QTemporaryFile fastresumes
- queuePosition = rxMatch.captured(2).toInt();
- if ((rxMatch.captured(2).size() == 6) && (queuePosition <= 99999)) {
- Utils::Fs::forceRemove(filepath);
- return true;
- }
-
+ QRegExp rx(QLatin1String("([A-Fa-f0-9]{40})\\.fastresume\\.(\\d+)$"));
+ if (rx.indexIn(filepath) != -1) {
+ // old v3.3.x format
+ queuePosition = rx.cap(2).toInt();
v3_3 = true;
- outFilePath.replace(QRegularExpression("\\.fastresume\\..+$"), ".fastresume");
+ outFilePath.replace(QRegExp("\\.\\d+$"), "");
}
else {
queuePosition = fastOld.dict_find_int_value("qBt-queuePosition", 0);
- fastNew["qBt-name"] = oldTorrent.value("name").toString().toStdString();
+ fastNew["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
fastNew["qBt-tempPathDisabled"] = false;
}
// in versions < 3.3 we have -1 for seeding torrents, so we convert it to 0
fastNew["qBt-queuePosition"] = (queuePosition >= 0 ? queuePosition : 0);
- if (v3_3) {
- QFileInfo oldFile(filepath);
- QFileInfo newFile(outFilePath);
- if (newFile.exists()
- && (oldFile.lastModified() < newFile.lastModified())) {
- Utils::Fs::forceRemove(filepath);
- return true;
- }
- }
QFile file2(outFilePath);
QVector out;
libtorrent::bencode(std::back_inserter(out), fastNew);
@@ -174,7 +145,7 @@
// Upgrade preferences
Preferences::instance()->upgrade();
- QString backupFolderPath = Utils::Fs::expandPathAbs(specialFolderLocation(SpecialFolder::Data) + "BT_backup");
+ QString backupFolderPath = Utils::Fs::expandPathAbs(Utils::Fs::QDesktopServicesDataLocation() + "BT_backup");
QDir backupFolderDir(backupFolderPath);
// ****************************************************************************************
@@ -185,10 +156,15 @@
upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile));
// ****************************************************************************************
- SettingsPtr oldResumeSettings = Profile::instance().applicationSettings(QLatin1String("qBittorrent-resume"));
+#ifdef Q_OS_MAC
+ // native .plist
+ QSettings *oldResumeSettings = new QSettings("qBittorrent", "qBittorrent-resume");
+#else
+ QIniSettings *oldResumeSettings = new QIniSettings("qBittorrent", "qBittorrent-resume");
+#endif
QString oldResumeFilename = oldResumeSettings->fileName();
QVariantHash oldResumeData = oldResumeSettings->value("torrents").toHash();
- oldResumeSettings.reset();
+ delete oldResumeSettings;
if (oldResumeData.isEmpty()) {
Utils::Fs::forceRemove(oldResumeFilename);
@@ -199,34 +175,31 @@
QStringList backupFiles = backupFolderDir.entryList(
QStringList(QLatin1String("*.fastresume")), QDir::Files, QDir::Unsorted);
- const QRegularExpression rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$"));
+ QRegExp rx(QLatin1String("^([A-Fa-f0-9]{40})\\.fastresume$"));
foreach (QString backupFile, backupFiles) {
- const QRegularExpressionMatch rxMatch = rx.match(backupFile);
- if (rxMatch.hasMatch()) {
- const QString hashStr = rxMatch.captured(1);
- if (upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile), oldResumeData[hashStr].toHash()))
- oldResumeData.remove(hashStr);
+ if (rx.indexIn(backupFile) != -1) {
+ if (upgradeResumeFile(backupFolderDir.absoluteFilePath(backupFile), oldResumeData[rx.cap(1)].toHash()))
+ oldResumeData.remove(rx.cap(1));
else
- Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(hashStr), Log::WARNING);
+ Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent with hash: %1").arg(rx.cap(1)), Log::WARNING);
}
else {
Logger::instance()->addMessage(QObject::tr("Couldn't migrate torrent. Invalid fastresume file name: %1").arg(backupFile), Log::WARNING);
}
}
- for (auto i = oldResumeData.cbegin(); i != oldResumeData.cend(); ++i) {
- const QVariantHash oldTorrent = i.value().toHash();
+ foreach (const QString &hash, oldResumeData.keys()) {
+ QVariantHash oldTorrent = oldResumeData[hash].toHash();
if (oldTorrent.value("is_magnet", false).toBool()) {
- const QString &hash = i.key();
libtorrent::entry resumeData;
- resumeData["qBt-magnetUri"] = oldTorrent.value("magnet_uri").toString().toStdString();
+ resumeData["qBt-magnetUri"] = Utils::String::toStdString(oldTorrent.value("magnet_uri").toString());
resumeData["qBt-paused"] = false;
resumeData["qBt-forced"] = false;
- resumeData["qBt-savePath"] = oldTorrent.value("save_path").toString().toStdString();
- resumeData["qBt-ratioLimit"] = static_cast(oldTorrent.value("max_ratio", -2).toReal() * 1000);
- resumeData["qBt-label"] = oldTorrent.value("label").toString().toStdString();
- resumeData["qBt-name"] = oldTorrent.value("name").toString().toStdString();
+ resumeData["qBt-savePath"] = Utils::String::toStdString(oldTorrent.value("save_path").toString());
+ resumeData["qBt-ratioLimit"] = Utils::String::toStdString(QString::number(oldTorrent.value("max_ratio", -2).toReal()));
+ resumeData["qBt-label"] = Utils::String::toStdString(oldTorrent.value("label").toString());
+ resumeData["qBt-name"] = Utils::String::toStdString(oldTorrent.value("name").toString());
resumeData["qBt-seedStatus"] = oldTorrent.value("seed").toBool();
resumeData["qBt-tempPathDisabled"] = false;
@@ -258,7 +231,7 @@
#ifdef Q_OS_MAC
void migratePlistToIni(const QString &application)
{
- QSettings iniFile(QSettings::IniFormat, QSettings::UserScope, "qBittorrent", application);
+ QIniSettings iniFile("qBittorrent", application);
if (!iniFile.allKeys().isEmpty()) return; // We copy the contents of plist, only if inifile does not exist(is empty).
QSettings *plistFile = new QSettings("qBittorrent", application);
@@ -287,18 +260,18 @@
void migrateRSS()
{
// Copy old feed items to new file if needed
- SettingsPtr qBTRSS = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss-feeds"));
- if (!qBTRSS->allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty).
+ QIniSettings qBTRSS("qBittorrent", "qBittorrent-rss-feeds");
+ if (!qBTRSS.allKeys().isEmpty()) return; // We move the contents of RSS old_items only if inifile does not exist (is empty).
- SettingsPtr qBTRSSLegacy = Profile::instance().applicationSettings(QLatin1String("qBittorrent-rss"));
- QHash allOldItems = qBTRSSLegacy->value("old_items", QHash()).toHash();
+ QIniSettings qBTRSSLegacy("qBittorrent", "qBittorrent-rss");
+ QHash allOldItems = qBTRSSLegacy.value("old_items", QHash()).toHash();
if (!allOldItems.empty()) {
qDebug("Moving %d old items for feeds to qBittorrent-rss-feeds", allOldItems.size());
- qBTRSS->setValue("old_items", allOldItems);
- qBTRSSLegacy->remove("old_items");
+ qBTRSS.setValue("old_items", allOldItems);
+ qBTRSSLegacy.remove("old_items");
}
}
-#endif // DISABLE_GUI
+#endif
#endif // UPGRADE_H
diff -Nru qbittorrent-4.1.3/src/base/algorithm.h qbittorrent-3.3.15/src/base/algorithm.h
--- qbittorrent-4.1.3/src/base/algorithm.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/algorithm.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,41 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2018 Vladimir Golovnev
- *
- * 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.
- */
-
-#pragma once
-
-namespace Dict
-{
- // To be used with QMap, QHash and it's variants
- template
- void removeIf(Dictionary &&dict, BinaryPredicate p)
- {
- auto it = dict.begin();
- while (it != dict.end())
- it = (p(it.key(), it.value()) ? dict.erase(it) : it + 1);
- }
-}
diff -Nru qbittorrent-4.1.3/src/base/asyncfilestorage.cpp qbittorrent-3.3.15/src/base/asyncfilestorage.cpp
--- qbittorrent-4.1.3/src/base/asyncfilestorage.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/asyncfilestorage.cpp 1970-01-01 00:00:00.000000000 +0000
@@ -1,88 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2017 Vladimir Golovnev
- *
- * 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.
- */
-
-#include "asyncfilestorage.h"
-
-#include
-#include
-#include
-
-AsyncFileStorage::AsyncFileStorage(const QString &storageFolderPath, QObject *parent)
- : QObject(parent)
- , m_storageDir(storageFolderPath)
- , m_lockFile(m_storageDir.absoluteFilePath(QStringLiteral("storage.lock")))
-{
- if (!m_storageDir.mkpath(m_storageDir.absolutePath()))
- throw AsyncFileStorageError(
- QString("Could not create directory '%1'.").arg(m_storageDir.absolutePath()));
-
- // TODO: This folder locking approach does not work for UNIX systems. Implement it.
- if (!m_lockFile.open(QFile::WriteOnly))
- throw AsyncFileStorageError(m_lockFile.errorString());
-}
-
-AsyncFileStorage::~AsyncFileStorage()
-{
- m_lockFile.close();
- m_lockFile.remove();
-}
-
-void AsyncFileStorage::store(const QString &fileName, const QByteArray &data)
-{
- QMetaObject::invokeMethod(this, "store_impl", Qt::QueuedConnection
- , Q_ARG(QString, fileName), Q_ARG(QByteArray, data));
-}
-
-QDir AsyncFileStorage::storageDir() const
-{
- return m_storageDir;
-}
-
-void AsyncFileStorage::store_impl(const QString &fileName, const QByteArray &data)
-{
- const QString filePath = m_storageDir.absoluteFilePath(fileName);
- QSaveFile file(filePath);
- qDebug() << "AsyncFileStorage: Saving data to" << filePath;
- if (file.open(QIODevice::WriteOnly)) {
- file.write(data);
- if (!file.commit()) {
- qDebug() << "AsyncFileStorage: Failed to save data";
- emit failed(filePath, file.errorString());
- }
- }
-}
-
-AsyncFileStorageError::AsyncFileStorageError(const QString &message)
- : std::runtime_error(message.toUtf8().data())
-{
-}
-
-QString AsyncFileStorageError::message() const
-{
- return what();
-}
diff -Nru qbittorrent-4.1.3/src/base/asyncfilestorage.h qbittorrent-3.3.15/src/base/asyncfilestorage.h
--- qbittorrent-4.1.3/src/base/asyncfilestorage.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/asyncfilestorage.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,64 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2017 Vladimir Golovnev
- *
- * 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.
- */
-
-#pragma once
-
-#include
-
-#include
-#include
-#include
-
-class AsyncFileStorageError : public std::runtime_error
-{
-public:
- explicit AsyncFileStorageError(const QString &message);
- QString message() const;
-};
-
-class AsyncFileStorage : public QObject
-{
- Q_OBJECT
-
-public:
- explicit AsyncFileStorage(const QString &storageFolderPath, QObject *parent = nullptr);
- ~AsyncFileStorage() override;
-
- void store(const QString &fileName, const QByteArray &data);
-
- QDir storageDir() const;
-
-signals:
- void failed(const QString &fileName, const QString &errorString);
-
-private:
- Q_INVOKABLE void store_impl(const QString &fileName, const QByteArray &data);
-
- QDir m_storageDir;
- QFile m_lockFile;
-};
diff -Nru qbittorrent-4.1.3/src/base/base.pri qbittorrent-3.3.15/src/base/base.pri
--- qbittorrent-4.1.3/src/base/base.pri 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/base.pri 2017-08-03 20:30:10.000000000 +0000
@@ -1,137 +1,116 @@
HEADERS += \
- $$PWD/algorithm.h \
- $$PWD/asyncfilestorage.h \
- $$PWD/bittorrent/addtorrentparams.h \
- $$PWD/bittorrent/cachestatus.h \
- $$PWD/bittorrent/infohash.h \
- $$PWD/bittorrent/magneturi.h \
- $$PWD/bittorrent/peerinfo.h \
- $$PWD/bittorrent/private/bandwidthscheduler.h \
- $$PWD/bittorrent/private/filterparserthread.h \
- $$PWD/bittorrent/private/resumedatasavingmanager.h \
- $$PWD/bittorrent/private/speedmonitor.h \
- $$PWD/bittorrent/private/statistics.h \
- $$PWD/bittorrent/session.h \
- $$PWD/bittorrent/sessionstatus.h \
- $$PWD/bittorrent/torrentcreatorthread.h \
- $$PWD/bittorrent/torrenthandle.h \
- $$PWD/bittorrent/torrentinfo.h \
- $$PWD/bittorrent/tracker.h \
- $$PWD/bittorrent/trackerentry.h \
- $$PWD/exceptions.h \
+ $$PWD/types.h \
+ $$PWD/tristatebool.h \
$$PWD/filesystemwatcher.h \
- $$PWD/global.h \
- $$PWD/http/connection.h \
- $$PWD/http/httperror.h \
+ $$PWD/qinisettings.h \
+ $$PWD/logger.h \
+ $$PWD/settingsstorage.h \
+ $$PWD/settingvalue.h \
+ $$PWD/preferences.h \
+ $$PWD/indexrange.h \
+ $$PWD/iconprovider.h \
$$PWD/http/irequesthandler.h \
+ $$PWD/http/connection.h \
$$PWD/http/requestparser.h \
- $$PWD/http/responsebuilder.h \
$$PWD/http/responsegenerator.h \
$$PWD/http/server.h \
$$PWD/http/types.h \
- $$PWD/iconprovider.h \
- $$PWD/indexrange.h \
- $$PWD/logger.h \
+ $$PWD/http/responsebuilder.h \
$$PWD/net/dnsupdater.h \
- $$PWD/net/downloadhandler.h \
$$PWD/net/downloadmanager.h \
+ $$PWD/net/downloadhandler.h \
$$PWD/net/geoipmanager.h \
$$PWD/net/portforwarder.h \
- $$PWD/net/private/geoipdatabase.h \
$$PWD/net/proxyconfigurationmanager.h \
$$PWD/net/reverseresolution.h \
$$PWD/net/smtp.h \
- $$PWD/preferences.h \
- $$PWD/private/profile_p.h \
- $$PWD/profile.h \
- $$PWD/rss/private/rss_parser.h \
- $$PWD/rss/rss_article.h \
- $$PWD/rss/rss_autodownloader.h \
- $$PWD/rss/rss_autodownloadrule.h \
- $$PWD/rss/rss_feed.h \
- $$PWD/rss/rss_folder.h \
- $$PWD/rss/rss_item.h \
- $$PWD/rss/rss_session.h \
- $$PWD/scanfoldersmodel.h \
- $$PWD/search/searchhandler.h \
- $$PWD/search/searchdownloadhandler.h \
- $$PWD/search/searchpluginmanager.h \
- $$PWD/settingsstorage.h \
- $$PWD/settingvalue.h \
- $$PWD/torrentfileguard.h \
- $$PWD/torrentfilter.h \
- $$PWD/tristatebool.h \
- $$PWD/types.h \
- $$PWD/unicodestrings.h \
- $$PWD/utils/bytearray.h \
- $$PWD/utils/foreignapps.h \
+ $$PWD/net/private/geoipdatabase.h \
+ $$PWD/bittorrent/infohash.h \
+ $$PWD/bittorrent/session.h \
+ $$PWD/bittorrent/sessionstatus.h \
+ $$PWD/bittorrent/cachestatus.h \
+ $$PWD/bittorrent/magneturi.h \
+ $$PWD/bittorrent/torrentinfo.h \
+ $$PWD/bittorrent/torrenthandle.h \
+ $$PWD/bittorrent/peerinfo.h \
+ $$PWD/bittorrent/trackerentry.h \
+ $$PWD/bittorrent/tracker.h \
+ $$PWD/bittorrent/torrentcreatorthread.h \
+ $$PWD/bittorrent/private/speedmonitor.h \
+ $$PWD/bittorrent/private/bandwidthscheduler.h \
+ $$PWD/bittorrent/private/filterparserthread.h \
+ $$PWD/bittorrent/private/statistics.h \
+ $$PWD/bittorrent/private/resumedatasavingmanager.h \
+ $$PWD/rss/rssmanager.h \
+ $$PWD/rss/rssfeed.h \
+ $$PWD/rss/rssfolder.h \
+ $$PWD/rss/rssfile.h \
+ $$PWD/rss/rssarticle.h \
+ $$PWD/rss/rssdownloadrule.h \
+ $$PWD/rss/rssdownloadrulelist.h \
+ $$PWD/rss/private/rssparser.h \
$$PWD/utils/fs.h \
$$PWD/utils/gzip.h \
$$PWD/utils/misc.h \
- $$PWD/utils/net.h \
$$PWD/utils/random.h \
$$PWD/utils/string.h \
- $$PWD/utils/version.h
+ $$PWD/unicodestrings.h \
+ $$PWD/torrentfileguard.h \
+ $$PWD/torrentfilter.h \
+ $$PWD/scanfoldersmodel.h \
+ $$PWD/searchengine.h
SOURCES += \
- $$PWD/asyncfilestorage.cpp \
- $$PWD/bittorrent/infohash.cpp \
- $$PWD/bittorrent/magneturi.cpp \
- $$PWD/bittorrent/peerinfo.cpp \
- $$PWD/bittorrent/private/bandwidthscheduler.cpp \
- $$PWD/bittorrent/private/filterparserthread.cpp \
- $$PWD/bittorrent/private/resumedatasavingmanager.cpp \
- $$PWD/bittorrent/private/speedmonitor.cpp \
- $$PWD/bittorrent/private/statistics.cpp \
- $$PWD/bittorrent/session.cpp \
- $$PWD/bittorrent/torrentcreatorthread.cpp \
- $$PWD/bittorrent/torrenthandle.cpp \
- $$PWD/bittorrent/torrentinfo.cpp \
- $$PWD/bittorrent/tracker.cpp \
- $$PWD/bittorrent/trackerentry.cpp \
- $$PWD/exceptions.cpp \
+ $$PWD/tristatebool.cpp \
$$PWD/filesystemwatcher.cpp \
+ $$PWD/logger.cpp \
+ $$PWD/settingsstorage.cpp \
+ $$PWD/preferences.cpp \
+ $$PWD/iconprovider.cpp \
$$PWD/http/connection.cpp \
- $$PWD/http/httperror.cpp \
$$PWD/http/requestparser.cpp \
- $$PWD/http/responsebuilder.cpp \
$$PWD/http/responsegenerator.cpp \
$$PWD/http/server.cpp \
- $$PWD/iconprovider.cpp \
- $$PWD/logger.cpp \
+ $$PWD/http/responsebuilder.cpp \
$$PWD/net/dnsupdater.cpp \
- $$PWD/net/downloadhandler.cpp \
$$PWD/net/downloadmanager.cpp \
+ $$PWD/net/downloadhandler.cpp \
$$PWD/net/geoipmanager.cpp \
$$PWD/net/portforwarder.cpp \
- $$PWD/net/private/geoipdatabase.cpp \
$$PWD/net/proxyconfigurationmanager.cpp \
$$PWD/net/reverseresolution.cpp \
$$PWD/net/smtp.cpp \
- $$PWD/preferences.cpp \
- $$PWD/private/profile_p.cpp \
- $$PWD/profile.cpp \
- $$PWD/rss/private/rss_parser.cpp \
- $$PWD/rss/rss_article.cpp \
- $$PWD/rss/rss_autodownloader.cpp \
- $$PWD/rss/rss_autodownloadrule.cpp \
- $$PWD/rss/rss_feed.cpp \
- $$PWD/rss/rss_folder.cpp \
- $$PWD/rss/rss_item.cpp \
- $$PWD/rss/rss_session.cpp \
- $$PWD/scanfoldersmodel.cpp \
- $$PWD/search/searchdownloadhandler.cpp \
- $$PWD/search/searchhandler.cpp \
- $$PWD/search/searchpluginmanager.cpp \
- $$PWD/settingsstorage.cpp \
- $$PWD/torrentfileguard.cpp \
- $$PWD/torrentfilter.cpp \
- $$PWD/tristatebool.cpp \
- $$PWD/utils/bytearray.cpp \
- $$PWD/utils/foreignapps.cpp \
+ $$PWD/net/private/geoipdatabase.cpp \
+ $$PWD/bittorrent/infohash.cpp \
+ $$PWD/bittorrent/session.cpp \
+ $$PWD/bittorrent/sessionstatus.cpp \
+ $$PWD/bittorrent/cachestatus.cpp \
+ $$PWD/bittorrent/magneturi.cpp \
+ $$PWD/bittorrent/torrentinfo.cpp \
+ $$PWD/bittorrent/torrenthandle.cpp \
+ $$PWD/bittorrent/peerinfo.cpp \
+ $$PWD/bittorrent/trackerentry.cpp \
+ $$PWD/bittorrent/tracker.cpp \
+ $$PWD/bittorrent/torrentcreatorthread.cpp \
+ $$PWD/bittorrent/private/speedmonitor.cpp \
+ $$PWD/bittorrent/private/bandwidthscheduler.cpp \
+ $$PWD/bittorrent/private/filterparserthread.cpp \
+ $$PWD/bittorrent/private/statistics.cpp \
+ $$PWD/bittorrent/private/resumedatasavingmanager.cpp \
+ $$PWD/rss/rssmanager.cpp \
+ $$PWD/rss/rssfeed.cpp \
+ $$PWD/rss/rssfolder.cpp \
+ $$PWD/rss/rssarticle.cpp \
+ $$PWD/rss/rssdownloadrule.cpp \
+ $$PWD/rss/rssdownloadrulelist.cpp \
+ $$PWD/rss/rssfile.cpp \
+ $$PWD/rss/private/rssparser.cpp \
$$PWD/utils/fs.cpp \
$$PWD/utils/gzip.cpp \
$$PWD/utils/misc.cpp \
- $$PWD/utils/net.cpp \
$$PWD/utils/random.cpp \
- $$PWD/utils/string.cpp
+ $$PWD/utils/string.cpp \
+ $$PWD/torrentfileguard.cpp \
+ $$PWD/torrentfilter.cpp \
+ $$PWD/scanfoldersmodel.cpp \
+ $$PWD/searchengine.cpp
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/addtorrentparams.h qbittorrent-3.3.15/src/base/bittorrent/addtorrentparams.h
--- qbittorrent-4.1.3/src/base/bittorrent/addtorrentparams.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/addtorrentparams.h 1970-01-01 00:00:00.000000000 +0000
@@ -1,58 +0,0 @@
-/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2015 Vladimir Golovnev
- *
- * 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.
- */
-
-#pragma once
-
-#include
-#include
-#include
-
-#include "../tristatebool.h"
-
-namespace BitTorrent
-{
- struct AddTorrentParams
- {
- QString name;
- QString category;
- QSet tags;
- QString savePath;
- bool disableTempPath = false; // e.g. for imported torrents
- bool sequential = false;
- bool firstLastPiecePriority = false;
- TriStateBool addForced;
- TriStateBool addPaused;
- QVector filePriorities; // used if TorrentInfo is set
- bool ignoreShareLimits = false;
- bool skipChecking = false;
- TriStateBool createSubfolder;
- TriStateBool useAutoTMM;
- int uploadLimit = -1;
- int downloadLimit = -1;
- };
-}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/cachestatus.cpp qbittorrent-3.3.15/src/base/bittorrent/cachestatus.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/cachestatus.cpp 1970-01-01 00:00:00.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/cachestatus.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -0,0 +1,69 @@
+/*
+ * Bittorrent Client using Qt and libtorrent.
+ * Copyright (C) 2015 Vladimir Golovnev
+ *
+ * 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.
+ */
+
+#include
+#include "cachestatus.h"
+
+using namespace BitTorrent;
+
+CacheStatus::CacheStatus(const libtorrent::cache_status &nativeStatus)
+ : m_nativeStatus(nativeStatus)
+{
+}
+
+int CacheStatus::totalUsedBuffers() const
+{
+ return m_nativeStatus.total_used_buffers;
+}
+
+qreal CacheStatus::readRatio() const
+{
+ if (m_nativeStatus.blocks_read > 0)
+ return (static_cast(m_nativeStatus.blocks_read_hit) / m_nativeStatus.blocks_read);
+ else
+ return -1;
+}
+
+int CacheStatus::jobQueueLength() const
+{
+#if LIBTORRENT_VERSION_NUM < 10100
+ return m_nativeStatus.job_queue_length;
+#else
+ return m_nativeStatus.queued_jobs;
+#endif
+}
+
+int CacheStatus::averageJobTime() const
+{
+ return m_nativeStatus.average_job_time;
+}
+
+qlonglong CacheStatus::queuedBytes() const
+{
+ return m_nativeStatus.queued_bytes;
+}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/cachestatus.h qbittorrent-3.3.15/src/base/bittorrent/cachestatus.h
--- qbittorrent-4.1.3/src/base/bittorrent/cachestatus.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/cachestatus.h 2017-08-03 20:30:10.000000000 +0000
@@ -1,6 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2015, 2017 Vladimir Golovnev
+ * Copyright (C) 2015 Vladimir Golovnev
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -30,16 +30,23 @@
#define BITTORRENT_CACHESTATUS_H
#include
+#include
namespace BitTorrent
{
- struct CacheStatus
+ class CacheStatus
{
- quint64 totalUsedBuffers = 0;
- quint64 jobQueueLength = 0;
- quint64 averageJobTime = 0;
- quint64 queuedBytes = 0;
- qreal readRatio = 0.0;
+ public:
+ CacheStatus(const libtorrent::cache_status &nativeStatus);
+
+ int totalUsedBuffers() const;
+ qreal readRatio() const;
+ int jobQueueLength() const;
+ int averageJobTime() const;
+ qlonglong queuedBytes() const;
+
+ private:
+ libtorrent::cache_status m_nativeStatus;
};
}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/infohash.cpp qbittorrent-3.3.15/src/base/bittorrent/infohash.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/infohash.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/infohash.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -26,9 +26,8 @@
* exception statement from your version.
*/
-#include "infohash.h"
-
#include
+#include "infohash.h"
using namespace BitTorrent;
@@ -42,7 +41,7 @@
, m_nativeHash(nativeHash)
{
char out[(libtorrent::sha1_hash::size * 2) + 1];
- libtorrent::to_hex(reinterpret_cast(&m_nativeHash[0]), libtorrent::sha1_hash::size, out);
+ libtorrent::to_hex((char const*)&m_nativeHash[0], libtorrent::sha1_hash::size, out);
m_hashString = QString(out);
}
@@ -52,7 +51,7 @@
{
QByteArray raw = m_hashString.toLatin1();
if (raw.size() == 40)
- m_valid = libtorrent::from_hex(raw.constData(), 40, reinterpret_cast(&m_nativeHash[0]));
+ m_valid = libtorrent::from_hex(raw.constData(), 40, (char*)&m_nativeHash[0]);
}
@@ -92,7 +91,7 @@
return (m_nativeHash != other.m_nativeHash);
}
-uint BitTorrent::qHash(const InfoHash &key, uint seed)
+uint qHash(const InfoHash &key, uint seed)
{
return qHash(static_cast(key), seed);
}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/infohash.h qbittorrent-3.3.15/src/base/bittorrent/infohash.h
--- qbittorrent-4.1.3/src/base/bittorrent/infohash.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/infohash.h 2017-08-03 20:30:10.000000000 +0000
@@ -54,8 +54,8 @@
libtorrent::sha1_hash m_nativeHash;
QString m_hashString;
};
-
- uint qHash(const InfoHash &key, uint seed);
}
+uint qHash(const BitTorrent::InfoHash &key, uint seed);
+
#endif // BITTORRENT_INFOHASH_H
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/magneturi.cpp qbittorrent-3.3.15/src/base/bittorrent/magneturi.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/magneturi.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/magneturi.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -26,17 +26,16 @@
* exception statement from your version.
*/
-#include "magneturi.h"
+#include
+#include
+#include
#include
#include
#include
-#include
-#include
-#include
-
#include "base/utils/string.h"
+#include "magneturi.h"
namespace
{
@@ -46,7 +45,7 @@
rawBc = rawBc.mid(8); // skip bc://bt/
rawBc = QByteArray::fromBase64(rawBc); // Decode base64
// Format is now AA/url_encoded_filename/size_bytes/info_hash/ZZ
- QStringList parts = QString(rawBc).split('/');
+ QStringList parts = QString(rawBc).split("/");
if (parts.size() != 5) return QString();
QString filename = parts.at(1);
@@ -70,8 +69,8 @@
qDebug("Creating magnet link from bc link");
m_url = bcLinkToMagnet(source);
}
- else if (((source.size() == 40) && !source.contains(QRegularExpression("[^0-9A-Fa-f]")))
- || ((source.size() == 32) && !source.contains(QRegularExpression("[^2-7A-Za-z]")))) {
+ else if (((source.size() == 40) && !source.contains(QRegExp("[^0-9A-Fa-f]")))
+ || ((source.size() == 32) && !source.contains(QRegExp("[^2-7A-Za-z]")))) {
m_url = "magnet:?xt=urn:btih:" + source;
}
@@ -81,10 +80,10 @@
m_valid = true;
m_hash = m_addTorrentParams.info_hash;
- m_name = QString::fromStdString(m_addTorrentParams.name);
+ m_name = Utils::String::fromStdString(m_addTorrentParams.name);
foreach (const std::string &tracker, m_addTorrentParams.trackers)
- m_trackers.append(QString::fromStdString(tracker));
+ m_trackers.append(Utils::String::fromStdString(tracker));
foreach (const std::string &urlSeed, m_addTorrentParams.url_seeds)
m_urlSeeds.append(QUrl(urlSeed.c_str()));
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/magneturi.h qbittorrent-3.3.15/src/base/bittorrent/magneturi.h
--- qbittorrent-4.1.3/src/base/bittorrent/magneturi.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/magneturi.h 2017-08-03 20:30:10.000000000 +0000
@@ -29,8 +29,8 @@
#ifndef BITTORRENT_MAGNETURI_H
#define BITTORRENT_MAGNETURI_H
-#include
#include
+#include
#include
#include
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/peerinfo.cpp qbittorrent-3.3.15/src/base/bittorrent/peerinfo.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/peerinfo.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/peerinfo.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -26,12 +26,11 @@
* exception statement from your version.
*/
-#include "peerinfo.h"
-
-#include "base/bittorrent/torrenthandle.h"
#include "base/net/geoipmanager.h"
-#include "base/unicodestrings.h"
#include "base/utils/string.h"
+#include "base/unicodestrings.h"
+#include "base/bittorrent/torrenthandle.h"
+#include "peerinfo.h"
namespace libt = libtorrent;
using namespace BitTorrent;
@@ -100,6 +99,7 @@
return (m_nativeInfo.flags & libt::peer_info::remote_choked);
}
+
bool PeerInfo::isSupportsExtensions() const
{
return (m_nativeInfo.flags & libt::peer_info::supports_extensions);
@@ -115,11 +115,18 @@
return (m_nativeInfo.flags & libt::peer_info::handshake);
}
+
bool PeerInfo::isConnecting() const
{
return (m_nativeInfo.flags & libt::peer_info::connecting);
}
+bool PeerInfo::isQueued() const
+{
+ return (m_nativeInfo.flags & libt::peer_info::queued);
+}
+
+
bool PeerInfo::isOnParole() const
{
return (m_nativeInfo.flags & libt::peer_info::on_parole);
@@ -135,6 +142,7 @@
return (m_nativeInfo.flags & libt::peer_info::optimistic_unchoke);
}
+
bool PeerInfo::isSnubbed() const
{
return (m_nativeInfo.flags & libt::peer_info::snubbed);
@@ -150,6 +158,7 @@
return (m_nativeInfo.flags & libt::peer_info::endgame_mode);
}
+
bool PeerInfo::isHolepunched() const
{
return (m_nativeInfo.flags & libt::peer_info::holepunched);
@@ -180,6 +189,7 @@
return (m_nativeInfo.flags & libt::peer_info::plaintext_encrypted);
}
+
PeerAddress PeerInfo::address() const
{
return PeerAddress(QHostAddress(QString::fromStdString(m_nativeInfo.ip.address().to_string())),
@@ -188,9 +198,10 @@
QString PeerInfo::client() const
{
- return QString::fromStdString(m_nativeInfo.client);
+ return Utils::String::fromStdString(m_nativeInfo.client);
}
+
qreal PeerInfo::progress() const
{
return m_nativeInfo.progress;
@@ -201,6 +212,7 @@
return m_nativeInfo.payload_up_speed;
}
+
int PeerInfo::payloadDownSpeed() const
{
return m_nativeInfo.payload_down_speed;
@@ -211,6 +223,7 @@
return m_nativeInfo.total_upload;
}
+
qlonglong PeerInfo::totalDownload() const
{
return m_nativeInfo.total_download;
@@ -232,7 +245,7 @@
return QString::fromUtf8(C_UTP);
QString connection;
- switch (m_nativeInfo.connection_type) {
+ switch(m_nativeInfo.connection_type) {
case libt::peer_info::http_seed:
case libt::peer_info::web_seed:
connection = "Web";
@@ -246,8 +259,8 @@
void PeerInfo::calcRelevance(const TorrentHandle *torrent)
{
- const QBitArray allPieces = torrent->pieces();
- const QBitArray peerPieces = pieces();
+ const QBitArray &allPieces = torrent->pieces();
+ const QBitArray &peerPieces = pieces();
int localMissing = 0;
int remoteHaves = 0;
@@ -273,116 +286,117 @@
void PeerInfo::determineFlags()
{
- QStringList flagsDescriptionList;
-
if (isInteresting()) {
- // d = Your client wants to download, but peer doesn't want to send (interested and choked)
+ //d = Your client wants to download, but peer doesn't want to send (interested and choked)
if (isRemoteChocked()) {
m_flags += "d ";
- flagsDescriptionList += "d = "
- + tr("Interested(local) and Choked(peer)");
+ m_flagsDescription += tr("interested(local) and choked(peer)");
+ m_flagsDescription += ", ";
}
else {
- // D = Currently downloading (interested and not choked)
+ //D = Currently downloading (interested and not choked)
m_flags += "D ";
- flagsDescriptionList += "D = "
- + tr("interested(local) and unchoked(peer)");
+ m_flagsDescription += tr("interested(local) and unchoked(peer)");
+ m_flagsDescription += ", ";
}
}
if (isRemoteInterested()) {
- // u = Peer wants your client to upload, but your client doesn't want to (interested and choked)
+ //u = Peer wants your client to upload, but your client doesn't want to (interested and choked)
if (isChocked()) {
m_flags += "u ";
- flagsDescriptionList += "u = "
- + tr("interested(peer) and choked(local)");
+ m_flagsDescription += tr("interested(peer) and choked(local)");
+ m_flagsDescription += ", ";
}
else {
- // U = Currently uploading (interested and not choked)
+ //U = Currently uploading (interested and not choked)
m_flags += "U ";
- flagsDescriptionList += "U = "
- + tr("interested(peer) and unchoked(local)");
+ m_flagsDescription += tr("interested(peer) and unchoked(local)");
+ m_flagsDescription += ", ";
}
}
- // O = Optimistic unchoke
+ //O = Optimistic unchoke
if (optimisticUnchoke()) {
m_flags += "O ";
- flagsDescriptionList += "O = "
- + tr("optimistic unchoke");
+ m_flagsDescription += tr("optimistic unchoke");
+ m_flagsDescription += ", ";
}
- // S = Peer is snubbed
+ //S = Peer is snubbed
if (isSnubbed()) {
m_flags += "S ";
- flagsDescriptionList += "S = "
- + tr("peer snubbed");
+ m_flagsDescription += tr("peer snubbed");
+ m_flagsDescription += ", ";
}
- // I = Peer is an incoming connection
+ //I = Peer is an incoming connection
if (!isLocalConnection()) {
m_flags += "I ";
- flagsDescriptionList += "I = "
- + tr("incoming connection");
+ m_flagsDescription += tr("incoming connection");
+ m_flagsDescription += ", ";
}
- // K = Peer is unchoking your client, but your client is not interested
+ //K = Peer is unchoking your client, but your client is not interested
if (!isRemoteChocked() && !isInteresting()) {
m_flags += "K ";
- flagsDescriptionList += "K = "
- + tr("not interested(local) and unchoked(peer)");
+ m_flagsDescription += tr("not interested(local) and unchoked(peer)");
+ m_flagsDescription += ", ";
}
- // ? = Your client unchoked the peer but the peer is not interested
+ //? = Your client unchoked the peer but the peer is not interested
if (!isChocked() && !isRemoteInterested()) {
m_flags += "? ";
- flagsDescriptionList += "? = "
- + tr("not interested(peer) and unchoked(local)");
+ m_flagsDescription += tr("not interested(peer) and unchoked(local)");
+ m_flagsDescription += ", ";
}
- // X = Peer was included in peerlists obtained through Peer Exchange (PEX)
+ //X = Peer was included in peerlists obtained through Peer Exchange (PEX)
if (fromPeX()) {
m_flags += "X ";
- flagsDescriptionList += "X = "
- + tr("peer from PEX");
+ m_flagsDescription += tr("peer from PEX");
+ m_flagsDescription += ", ";
}
- // H = Peer was obtained through DHT
+ //H = Peer was obtained through DHT
if (fromDHT()) {
m_flags += "H ";
- flagsDescriptionList += "H = "
- + tr("peer from DHT");
+ m_flagsDescription += tr("peer from DHT");
+ m_flagsDescription += ", ";
}
- // E = Peer is using Protocol Encryption (all traffic)
+ //E = Peer is using Protocol Encryption (all traffic)
if (isRC4Encrypted()) {
m_flags += "E ";
- flagsDescriptionList += "E = "
- + tr("encrypted traffic");
+ m_flagsDescription += tr("encrypted traffic");
+ m_flagsDescription += ", ";
}
- // e = Peer is using Protocol Encryption (handshake)
+ //e = Peer is using Protocol Encryption (handshake)
if (isPlaintextEncrypted()) {
m_flags += "e ";
- flagsDescriptionList += "e = "
- + tr("encrypted handshake");
+ m_flagsDescription += tr("encrypted handshake");
+ m_flagsDescription += ", ";
}
- // P = Peer is using uTorrent uTP
+ //P = Peer is using uTorrent uTP
+
if (useUTPSocket()) {
m_flags += "P ";
- flagsDescriptionList += "P = "
- + QString::fromUtf8(C_UTP);
+ m_flagsDescription += QString::fromUtf8(C_UTP);
+ m_flagsDescription += ", ";
}
- // L = Peer is local
+ //L = Peer is local
if (fromLSD()) {
- m_flags += 'L';
- flagsDescriptionList += "L = "
- + tr("peer from LSD");
+ m_flags += "L";
+ m_flagsDescription += tr("peer from LSD");
}
+
m_flags = m_flags.trimmed();
- m_flagsDescription = flagsDescriptionList.join('\n');
+ m_flagsDescription = m_flagsDescription.trimmed();
+ if (m_flagsDescription.endsWith(',', Qt::CaseInsensitive))
+ m_flagsDescription.chop(1);
}
QString PeerInfo::flags() const
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/peerinfo.h qbittorrent-3.3.15/src/base/bittorrent/peerinfo.h
--- qbittorrent-4.1.3/src/base/bittorrent/peerinfo.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/peerinfo.h 2017-08-03 20:30:10.000000000 +0000
@@ -29,11 +29,11 @@
#ifndef BITTORRENT_PEERINFO_H
#define BITTORRENT_PEERINFO_H
+#include
+
+#include
#include
#include
-#include
-
-#include
namespace BitTorrent
{
@@ -68,6 +68,7 @@
bool isHandshake() const;
bool isConnecting() const;
+ bool isQueued() const;
bool isOnParole() const;
bool isSeed() const;
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.cpp qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -1,7 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2017 Vladimir Golovnev
- * Copyright (C) 2010 Christophe Dumez
+ * Copyright (C) 2010 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -25,78 +24,72 @@
* 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.
+ *
+ * Contact : chris@qbittorrent.org
*/
-#include "bandwidthscheduler.h"
-
-#include
-
-#include
#include
+#include
+#include "base/bittorrent/session.h"
#include "base/preferences.h"
+#include "bandwidthscheduler.h"
BandwidthScheduler::BandwidthScheduler(QObject *parent)
- : QObject(parent)
- , m_lastAlternative(false)
+ : QTimer(parent)
{
- connect(&m_timer, &QTimer::timeout, this, &BandwidthScheduler::onTimeout);
+ // Single shot, we call start() again manually
+ setSingleShot(true);
+ // Connect Signals/Slots
+ connect(this, SIGNAL(timeout()), this, SLOT(start()));
}
void BandwidthScheduler::start()
{
- m_lastAlternative = isTimeForAlternative();
- emit bandwidthLimitRequested(m_lastAlternative);
-
- // Timeout regularly to accommodate for external system clock changes
- // eg from the user or from a timesync utility
- m_timer.start(30000);
-}
-
-bool BandwidthScheduler::isTimeForAlternative() const
-{
- const Preferences *const pref = Preferences::instance();
+ const Preferences* const pref = Preferences::instance();
+ bool alt_bw_enabled = BitTorrent::Session::instance()->isAltGlobalSpeedLimitEnabled();
QTime start = pref->getSchedulerStartTime();
QTime end = pref->getSchedulerEndTime();
- const QTime now = QTime::currentTime();
- const int schedulerDays = pref->getSchedulerDays();
- const int day = QDate::currentDate().dayOfWeek();
- bool alternative = false;
+ QTime now = QTime::currentTime();
+ int sched_days = pref->getSchedulerDays();
+ int day = QDateTime::currentDateTime().toLocalTime().date().dayOfWeek();
+ bool new_mode = false;
+ bool reverse = false;
if (start > end) {
- std::swap(start, end);
- alternative = true;
+ QTime temp = start;
+ start = end;
+ end = temp;
+ reverse = true;
}
if ((start <= now) && (end >= now)) {
- switch (schedulerDays) {
+ switch(sched_days) {
case EVERY_DAY:
- alternative = !alternative;
+ new_mode = true;
break;
case WEEK_ENDS:
if ((day == 6) || (day == 7))
- alternative = !alternative;
+ new_mode = true;
break;
case WEEK_DAYS:
if ((day != 6) && (day != 7))
- alternative = !alternative;
+ new_mode = true;
break;
default:
- if (day == (schedulerDays - 2))
- alternative = !alternative;
+ if (day == (sched_days - 2))
+ new_mode = true;
}
}
- return alternative;
-}
+ if (reverse)
+ new_mode = !new_mode;
-void BandwidthScheduler::onTimeout()
-{
- bool alternative = isTimeForAlternative();
+ if (new_mode != alt_bw_enabled)
+ emit switchToAlternativeMode(new_mode);
- if (alternative != m_lastAlternative) {
- m_lastAlternative = alternative;
- emit bandwidthLimitRequested(alternative);
- }
+ // Timeout regularly to accommodate for external system clock changes
+ // eg from the user or from a timesync utility
+ QTimer::start(1500);
}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.h qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.h
--- qbittorrent-4.1.3/src/base/bittorrent/private/bandwidthscheduler.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/bandwidthscheduler.h 2017-08-03 20:30:10.000000000 +0000
@@ -1,7 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2017 Vladimir Golovnev
- * Copyright (C) 2010 Christophe Dumez
+ * Copyright (C) 2010 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -25,32 +24,27 @@
* 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.
+ *
+ * Contact : chris@qbittorrent.org
*/
#ifndef BANDWIDTHSCHEDULER_H
#define BANDWIDTHSCHEDULER_H
-#include
#include
-class BandwidthScheduler : public QObject
+class BandwidthScheduler : public QTimer
{
Q_OBJECT
- Q_DISABLE_COPY(BandwidthScheduler)
public:
- explicit BandwidthScheduler(QObject *parent = nullptr);
+ BandwidthScheduler(QObject *parent = 0);
+
+public slots:
void start();
signals:
- void bandwidthLimitRequested(bool alternative);
-
-private:
- bool isTimeForAlternative() const;
- void onTimeout();
-
- QTimer m_timer;
- bool m_lastAlternative;
+ void switchToAlternativeMode(bool alternative);
};
#endif // BANDWIDTHSCHEDULER_H
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.cpp qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -1,6 +1,6 @@
/*
- * Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2006 Christophe Dumez
+ * Bittorrent Client using Qt and libt.
+ * Copyright (C) 2006 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -24,89 +24,26 @@
* 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.
+ *
+ * Contact : chris@qbittorrent.org
*/
-#include "filterparserthread.h"
-
-#include
-
-#include
#include
+#include
+#include
+#include
+
+#include
+#include
#include "base/logger.h"
+#include "filterparserthread.h"
namespace libt = libtorrent;
-namespace
-{
- class IPv4Parser
- {
- public:
- bool tryParse(const char *str)
- {
- unsigned char octetIndex = 0;
-
- const char *octetStart = str;
- char *endptr;
- for (; *str; ++str) {
- if (*str == '.') {
- long int extractedNum = strtol(octetStart, &endptr, 10);
- if ((extractedNum >= 0L) && (extractedNum <= 255L))
- m_buf[octetIndex++] = static_cast(extractedNum);
- else
- return false;
-
- if (endptr != str)
- return false;
- if (octetIndex == 4)
- return true;
-
- octetStart = str + 1;
- }
- }
-
- if (str != octetStart) {
- long int extractedNum = strtol(octetStart, &endptr, 10);
- if ((extractedNum >= 0L) && (extractedNum <= 255L))
- m_buf[octetIndex] = static_cast(strtol(octetStart, &endptr, 10));
- else
- return false;
-
- if ((endptr == str) && (octetIndex == 3))
- return true;
- }
-
- return false;
- }
-
- libt::address_v4::bytes_type parsed() const
- {
- return m_buf;
- }
-
- private:
- libt::address_v4::bytes_type m_buf;
- };
-
- bool parseIPAddress(const char *data, libt::address &address)
- {
- IPv4Parser parser;
- boost::system::error_code ec;
-
- if (parser.tryParse(data))
- address = libt::address_v4(parser.parsed());
- else
- address = libt::address_v6::from_string(data, ec);
-
- return !ec;
- }
-
- const int BUFFER_SIZE = 2 * 1024 * 1024; // 2 MiB
- const int MAX_LOGGED_ERRORS = 5;
-}
-
-FilterParserThread::FilterParserThread(QObject *parent)
+FilterParserThread::FilterParserThread(libt::session *s, QObject *parent)
: QThread(parent)
+ , m_session(s)
, m_abort(false)
{
}
@@ -118,324 +55,216 @@
}
// Parser for eMule ip filter in DAT format
-int FilterParserThread::parseDATFilterFile()
+int FilterParserThread::parseDATFilterFile(QString filePath, libt::ip_filter &filter)
{
int ruleCount = 0;
- QFile file(m_filePath);
+ QFile file(filePath);
if (!file.exists()) return ruleCount;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
return ruleCount;
}
- std::vector buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector
- qint64 bytesRead = 0;
- int offset = 0;
- int start = 0;
- int endOfLine = -1;
- int nbLine = 0;
- int parseErrorCount = 0;
- const auto addLog = [&parseErrorCount](const QString &msg)
- {
- if (parseErrorCount <= MAX_LOGGED_ERRORS)
- LogMsg(msg, Log::CRITICAL);
- };
-
- while (true) {
- bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1);
- if (bytesRead < 0)
- break;
- int dataSize = bytesRead + offset;
- if ((bytesRead == 0) && (dataSize == 0))
- break;
-
- for (start = 0; start < dataSize; ++start) {
- endOfLine = -1;
- // The file might have ended without the last line having a newline
- if (!((bytesRead == 0) && (dataSize > 0))) {
- for (int i = start; i < dataSize; ++i) {
- if (buffer[i] == '\n') {
- endOfLine = i;
- // We need to NULL the newline in case the line has only an IP range.
- // In that case the parser won't work for the end IP, because it ends
- // with the newline and not with a number.
- buffer[i] = '\0';
- break;
- }
- }
- }
- else {
- endOfLine = dataSize;
- buffer[dataSize] = '\0';
- }
-
- if (endOfLine == -1) {
- // read the next chunk from file
- // but first move(copy) the leftover data to the front of the buffer
- offset = dataSize - start;
- memmove(buffer.data(), buffer.data() + start, offset);
- break;
- }
- else {
- ++nbLine;
- }
-
- if ((buffer[start] == '#')
- || ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) {
- start = endOfLine;
- continue;
- }
-
- // Each line should follow this format:
- // 001.009.096.105 - 001.009.096.105 , 000 , Some organization
- // The 3rd entry is access level and if above 127 the IP range isn't blocked.
- int firstComma = findAndNullDelimiter(buffer.data(), ',', start, endOfLine);
- if (firstComma != -1)
- findAndNullDelimiter(buffer.data(), ',', firstComma + 1, endOfLine);
-
- // Check if there is an access value (apparently not mandatory)
- if (firstComma != -1) {
- // There is possibly one
- const long int nbAccess = strtol(buffer.data() + firstComma + 1, nullptr, 10);
- // Ignoring this rule because access value is too high
- if (nbAccess > 127L) {
- start = endOfLine;
- continue;
- }
- }
+ unsigned int nbLine = 0;
+ while (!file.atEnd() && !m_abort) {
+ ++nbLine;
+ QByteArray line = file.readLine();
+ // Ignoring empty lines
+ line = line.trimmed();
+ if (line.isEmpty()) continue;
+ // Ignoring commented lines
+ if (line.startsWith('#') || line.startsWith("//")) continue;
+
+ // Line should be split by commas
+ QList partsList = line.split(',');
+ const uint nbElem = partsList.size();
+
+ // IP Range should be split by a dash
+ QList IPs = partsList.first().split('-');
+ if (IPs.size() != 2) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("Line was %s", line.constData());
+ continue;
+ }
- // IP Range should be split by a dash
- int endOfIPRange = ((firstComma == -1) ? (endOfLine - 1) : (firstComma - 1));
- int delimIP = findAndNullDelimiter(buffer.data(), '-', start, endOfIPRange);
- if (delimIP == -1) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ boost::system::error_code ec;
+ const QString strStartIP = cleanupIPAddress(IPs.at(0));
+ if (strStartIP.isEmpty()) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP));
+ continue;
+ }
+ libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec);
+ if (ec) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("Start IP of the range is malformated: %s", qPrintable(strStartIP));
+ continue;
+ }
- libt::address startAddr;
- int newStart = trim(buffer.data(), start, delimIP - 1);
- if (!parseIPAddress(buffer.data() + newStart, startAddr)) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ const QString strEndIP = cleanupIPAddress(IPs.at(1));
+ if (strEndIP.isEmpty()) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP));
+ continue;
+ }
- libt::address endAddr;
- newStart = trim(buffer.data(), delimIP + 1, endOfIPRange);
- if (!parseIPAddress(buffer.data() + newStart, endAddr)) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec);
+ if (ec) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("End IP of the range is malformated: %s", qPrintable(strEndIP));
+ continue;
+ }
- if ((startAddr.is_v4() != endAddr.is_v4())
- || (startAddr.is_v6() != endAddr.is_v6())) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ if (startAddr.is_v4() != endAddr.is_v4()) {
+ qDebug("Ipfilter.dat: line %d is malformed.", nbLine);
+ qDebug("One IP is IPv4 and the other is IPv6!");
+ continue;
+ }
- start = endOfLine;
+ // Check if there is an access value (apparently not mandatory)
+ int nbAccess = 0;
+ if (nbElem > 1) {
+ // There is possibly one
+ nbAccess = partsList.at(1).trimmed().toInt();
+ }
- // Now Add to the filter
- try {
- m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
- ++ruleCount;
- }
- catch (std::exception &e) {
- ++parseErrorCount;
- addLog(tr("IP filter exception thrown for line %1. Exception is: %2")
- .arg(nbLine).arg(QString::fromLocal8Bit(e.what())));
- }
+ if (nbAccess > 127) {
+ // Ignoring this rule because access value is too high
+ continue;
}
- if (start >= dataSize)
- offset = 0;
+ // Now Add to the filter
+ try {
+ filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
+ ++ruleCount;
+ }
+ catch(std::exception &) {
+ qDebug("Bad line in filter file, avoided crash...");
+ }
}
- if (parseErrorCount > MAX_LOGGED_ERRORS)
- LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.")
- .arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL);
+ file.close();
return ruleCount;
}
// Parser for PeerGuardian ip filter in p2p format
-int FilterParserThread::parseP2PFilterFile()
+int FilterParserThread::parseP2PFilterFile(QString filePath, libt::ip_filter &filter)
{
int ruleCount = 0;
- QFile file(m_filePath);
+ QFile file(filePath);
if (!file.exists()) return ruleCount;
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
- LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
return ruleCount;
}
- std::vector buffer(BUFFER_SIZE, 0); // seems a bit faster than QVector
- qint64 bytesRead = 0;
- int offset = 0;
- int start = 0;
- int endOfLine = -1;
- int nbLine = 0;
- int parseErrorCount = 0;
- const auto addLog = [&parseErrorCount](const QString &msg)
- {
- if (parseErrorCount <= MAX_LOGGED_ERRORS)
- LogMsg(msg, Log::CRITICAL);
- };
-
- while (true) {
- bytesRead = file.read(buffer.data() + offset, BUFFER_SIZE - offset - 1);
- if (bytesRead < 0)
- break;
- int dataSize = bytesRead + offset;
- if ((bytesRead == 0) && (dataSize == 0))
- break;
-
- for (start = 0; start < dataSize; ++start) {
- endOfLine = -1;
- // The file might have ended without the last line having a newline
- if (!((bytesRead == 0) && (dataSize > 0))) {
- for (int i = start; i < dataSize; ++i) {
- if (buffer[i] == '\n') {
- endOfLine = i;
- // We need to NULL the newline in case the line has only an IP range.
- // In that case the parser won't work for the end IP, because it ends
- // with the newline and not with a number.
- buffer[i] = '\0';
- break;
- }
- }
- }
- else {
- endOfLine = dataSize;
- buffer[dataSize] = '\0';
- }
-
- if (endOfLine == -1) {
- // read the next chunk from file
- // but first move(copy) the leftover data to the front of the buffer
- offset = dataSize - start;
- memmove(buffer.data(), buffer.data() + start, offset);
- break;
- }
- else {
- ++nbLine;
- }
-
- if ((buffer[start] == '#')
- || ((buffer[start] == '/') && ((start + 1 < dataSize) && (buffer[start + 1] == '/')))) {
- start = endOfLine;
- continue;
- }
-
- // Each line should follow this format:
- // Some organization:1.0.0.0-1.255.255.255
- // The "Some organization" part might contain a ':' char itself so we find the last occurrence
- int partsDelimiter = findAndNullDelimiter(buffer.data(), ':', start, endOfLine, true);
- if (partsDelimiter == -1) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
-
- // IP Range should be split by a dash
- int delimIP = findAndNullDelimiter(buffer.data(), '-', partsDelimiter + 1, endOfLine);
- if (delimIP == -1) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ unsigned int nbLine = 0;
+ while (!file.atEnd() && !m_abort) {
+ ++nbLine;
+ QByteArray line = file.readLine().trimmed();
+ if (line.isEmpty()) continue;
+ // Ignoring commented lines
+ if (line.startsWith('#') || line.startsWith("//")) continue;
+
+ // Line is split by :
+ QList partsList = line.split(':');
+ if (partsList.size() < 2) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ continue;
+ }
+
+ // Get IP range
+ QList IPs = partsList.last().split('-');
+ if (IPs.size() != 2) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("line was: %s", line.constData());
+ continue;
+ }
- libt::address startAddr;
- int newStart = trim(buffer.data(), partsDelimiter + 1, delimIP - 1);
- if (!parseIPAddress(buffer.data() + newStart, startAddr)) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. Start IP of the range is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ boost::system::error_code ec;
+ QString strStartIP = cleanupIPAddress(IPs.at(0));
+ if (strStartIP.isEmpty()) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("Start IP is invalid: %s", qPrintable(strStartIP));
+ continue;
+ }
- libt::address endAddr;
- newStart = trim(buffer.data(), delimIP + 1, endOfLine);
- if (!parseIPAddress(buffer.data() + newStart, endAddr)) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. End IP of the range is malformed.").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ libt::address startAddr = libt::address::from_string(qPrintable(strStartIP), ec);
+ if (ec) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("Start IP is invalid: %s", qPrintable(strStartIP));
+ continue;
+ }
- if ((startAddr.is_v4() != endAddr.is_v4())
- || (startAddr.is_v6() != endAddr.is_v6())) {
- ++parseErrorCount;
- addLog(tr("IP filter line %1 is malformed. One IP is IPv4 and the other is IPv6!").arg(nbLine));
- start = endOfLine;
- continue;
- }
+ QString strEndIP = cleanupIPAddress(IPs.at(1));
+ if (strEndIP.isEmpty()) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("End IP is invalid: %s", qPrintable(strStartIP));
+ continue;
+ }
- start = endOfLine;
+ libt::address endAddr = libt::address::from_string(qPrintable(strEndIP), ec);
+ if (ec) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("End IP is invalid: %s", qPrintable(strStartIP));
+ continue;
+ }
- try {
- m_filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
- ++ruleCount;
- }
- catch (std::exception &e) {
- ++parseErrorCount;
- addLog(tr("IP filter exception thrown for line %1. Exception is: %2")
- .arg(nbLine).arg(QString::fromLocal8Bit(e.what())));
- }
+ if (startAddr.is_v4() != endAddr.is_v4()) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("Line was: %s", line.constData());
+ continue;
}
- if (start >= dataSize)
- offset = 0;
+ try {
+ filter.add_rule(startAddr, endAddr, libt::ip_filter::blocked);
+ ++ruleCount;
+ }
+ catch(std::exception &) {
+ qDebug("p2p file: line %d is malformed.", nbLine);
+ qDebug("Line was: %s", line.constData());
+ continue;
+ }
}
- if (parseErrorCount > MAX_LOGGED_ERRORS)
- LogMsg(tr("%1 extra IP filter parsing errors occurred.", "513 extra IP filter parsing errors occurred.")
- .arg(parseErrorCount - MAX_LOGGED_ERRORS), Log::CRITICAL);
+ file.close();
return ruleCount;
}
int FilterParserThread::getlineInStream(QDataStream &stream, std::string &name, char delim)
{
char c;
- int totalRead = 0;
+ int total_read = 0;
int read;
do {
read = stream.readRawData(&c, 1);
- totalRead += read;
+ total_read += read;
if (read > 0) {
if (c != delim) {
name += c;
}
else {
// Delim found
- return totalRead;
+ return total_read;
}
}
}
- while (read > 0);
+ while(read > 0);
- return totalRead;
+ return total_read;
}
// Parser for PeerGuardian ip filter in p2p format
-int FilterParserThread::parseP2BFilterFile()
+int FilterParserThread::parseP2BFilterFile(QString filePath, libt::ip_filter &filter)
{
int ruleCount = 0;
- QFile file(m_filePath);
+ QFile file(filePath);
if (!file.exists()) return ruleCount;
if (!file.open(QIODevice::ReadOnly)) {
- LogMsg(tr("I/O Error: Could not open IP filter file in read mode."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("I/O Error: Could not open ip filter file in read mode."), Log::CRITICAL);
return ruleCount;
}
@@ -445,8 +274,8 @@
unsigned char version;
if (!stream.readRawData(buf, sizeof(buf))
|| memcmp(buf, "\xFF\xFF\xFF\xFFP2B", 7)
- || !stream.readRawData(reinterpret_cast(&version), sizeof(version))) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ || !stream.readRawData((char*)&version, sizeof(version))) {
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
@@ -455,10 +284,10 @@
unsigned int start, end;
std::string name;
- while (getlineInStream(stream, name, '\0') && !m_abort) {
- if (!stream.readRawData(reinterpret_cast(&start), sizeof(start))
- || !stream.readRawData(reinterpret_cast(&end), sizeof(end))) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ while(getlineInStream(stream, name, '\0') && !m_abort) {
+ if (!stream.readRawData((char*)&start, sizeof(start))
+ || !stream.readRawData((char*)&end, sizeof(end))) {
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
@@ -469,17 +298,17 @@
libt::address_v4 last(ntohl(end));
// Apply to bittorrent session
try {
- m_filter.add_rule(first, last, libt::ip_filter::blocked);
+ filter.add_rule(first, last, libt::ip_filter::blocked);
++ruleCount;
}
- catch (std::exception &) {}
+ catch(std::exception &) {}
}
}
else if (version == 3) {
qDebug ("p2b version 3");
unsigned int namecount;
- if (!stream.readRawData(reinterpret_cast(&namecount), sizeof(namecount))) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ if (!stream.readRawData((char*)&namecount, sizeof(namecount))) {
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
@@ -488,7 +317,7 @@
for (unsigned int i = 0; i < namecount; ++i) {
std::string name;
if (!getlineInStream(stream, name, '\0')) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
@@ -497,18 +326,18 @@
// Reading the ranges
unsigned int rangecount;
- if (!stream.readRawData(reinterpret_cast(&rangecount), sizeof(rangecount))) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ if (!stream.readRawData((char*)&rangecount, sizeof(rangecount))) {
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
rangecount = ntohl(rangecount);
unsigned int name, start, end;
for (unsigned int i = 0; i < rangecount; ++i) {
- if (!stream.readRawData(reinterpret_cast(&name), sizeof(name))
- || !stream.readRawData(reinterpret_cast(&start), sizeof(start))
- || !stream.readRawData(reinterpret_cast(&end), sizeof(end))) {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ if (!stream.readRawData((char*)&name, sizeof(name))
+ || !stream.readRawData((char*)&start, sizeof(start))
+ || !stream.readRawData((char*)&end, sizeof(end))) {
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
return ruleCount;
}
@@ -519,18 +348,19 @@
libt::address_v4 last(ntohl(end));
// Apply to bittorrent session
try {
- m_filter.add_rule(first, last, libt::ip_filter::blocked);
+ filter.add_rule(first, last, libt::ip_filter::blocked);
++ruleCount;
}
- catch (std::exception &) {}
+ catch(std::exception &) {}
if (m_abort) return ruleCount;
}
}
else {
- LogMsg(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
+ Logger::instance()->addMessage(tr("Parsing Error: The filter file is not a valid PeerGuardian P2B file."), Log::CRITICAL);
}
+ file.close();
return ruleCount;
}
@@ -539,7 +369,7 @@
// * eMule IP list (DAT): http://wiki.phoenixlabs.org/wiki/DAT_Format
// * PeerGuardian Text (P2P): http://wiki.phoenixlabs.org/wiki/P2P_Format
// * PeerGuardian Binary (P2B): http://wiki.phoenixlabs.org/wiki/P2B_Format
-void FilterParserThread::processFilterFile(const QString &filePath)
+void FilterParserThread::processFilterFile(QString filePath)
{
if (isRunning()) {
// Already parsing a filter, m_abort first
@@ -549,88 +379,68 @@
m_abort = false;
m_filePath = filePath;
- m_filter = libt::ip_filter();
// Run it
start();
}
-libt::ip_filter FilterParserThread::IPfilter()
+QString FilterParserThread::cleanupIPAddress(QString _ip)
{
- return m_filter;
+ _ip = _ip.trimmed();
+
+ // Emule .DAT files contain leading zeroes in IPv4 addresses
+ // eg 001.009.106.186
+ // We need to remove them because both QHostAddress and Boost.Asio fail to parse them.
+ QStringList octets = _ip.split('.', QString::SkipEmptyParts);
+ if (octets.size() == 4) {
+ QString octet; // it is faster to not recreate this object in the loop
+ for (int i = 0; i < 4; i++) {
+ octet = octets[i];
+ if ((octet[0] == QChar('0')) && (octet.count() > 1)) {
+ if ((octet[1] == QChar('0')) && (octet.count() > 2))
+ octet.remove(0, 2);
+ else
+ octet.remove(0, 1);
+
+ octets[i] = octet;
+ }
+ }
+
+ _ip = octets.join(".");
+ }
+
+ QHostAddress ip(_ip);
+ if (ip.isNull()) return QString();
+
+ return ip.toString();
}
void FilterParserThread::run()
{
qDebug("Processing filter file");
+ libt::ip_filter filter = m_session->get_ip_filter();
int ruleCount = 0;
if (m_filePath.endsWith(".p2p", Qt::CaseInsensitive)) {
// PeerGuardian p2p file
- ruleCount = parseP2PFilterFile();
+ ruleCount = parseP2PFilterFile(m_filePath, filter);
}
else if (m_filePath.endsWith(".p2b", Qt::CaseInsensitive)) {
// PeerGuardian p2b file
- ruleCount = parseP2BFilterFile();
+ ruleCount = parseP2BFilterFile(m_filePath, filter);
}
else if (m_filePath.endsWith(".dat", Qt::CaseInsensitive)) {
// eMule DAT format
- ruleCount = parseDATFilterFile();
+ ruleCount = parseDATFilterFile(m_filePath, filter);
}
if (m_abort) return;
try {
+ m_session->set_ip_filter(filter);
emit IPFilterParsed(ruleCount);
}
- catch (std::exception &) {
+ catch(std::exception &) {
emit IPFilterError();
}
qDebug("IP Filter thread: finished parsing, filter applied");
}
-
-int FilterParserThread::findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse)
-{
- if (!reverse) {
- for (int i = start; i <= end; ++i) {
- if (data[i] == delimiter) {
- data[i] = '\0';
- return i;
- }
- }
- }
- else {
- for (int i = end; i >= start; --i) {
- if (data[i] == delimiter) {
- data[i] = '\0';
- return i;
- }
- }
- }
-
- return -1;
-}
-
-int FilterParserThread::trim(char *const data, int start, int end)
-{
- if (start >= end) return start;
- int newStart = start;
-
- for (int i = start; i <= end; ++i) {
- if (isspace(data[i]) != 0) {
- data[i] = '\0';
- }
- else {
- newStart = i;
- break;
- }
- }
-
- for (int i = end; i >= start; --i) {
- if (isspace(data[i]) != 0)
- data[i] = '\0';
- else
- break;
- }
-
- return newStart;
-}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.h qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.h
--- qbittorrent-4.1.3/src/base/bittorrent/private/filterparserthread.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/filterparserthread.h 2017-08-03 20:30:10.000000000 +0000
@@ -1,6 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
- * Copyright (C) 2006 Christophe Dumez
+ * Copyright (C) 2006 Christophe Dumez
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@@ -24,6 +24,8 @@
* 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.
+ *
+ * Contact : chris@qbittorrent.org
*/
#ifndef FILTERPARSERTHREAD_H
@@ -31,38 +33,41 @@
#include
-#include
-
class QDataStream;
+class QStringList;
+
+namespace libtorrent
+{
+ class session;
+ struct ip_filter;
+}
class FilterParserThread : public QThread
{
Q_OBJECT
public:
- FilterParserThread(QObject *parent = nullptr);
+ FilterParserThread(libtorrent::session *s, QObject *parent = 0);
~FilterParserThread();
- void processFilterFile(const QString &filePath);
- libtorrent::ip_filter IPfilter();
+ void processFilterFile(QString filePath);
signals:
void IPFilterParsed(int ruleCount);
void IPFilterError();
protected:
+ QString cleanupIPAddress(QString _ip);
void run();
private:
- int findAndNullDelimiter(char *const data, char delimiter, int start, int end, bool reverse = false);
- int trim(char *const data, int start, int end);
- int parseDATFilterFile();
- int parseP2PFilterFile();
+ int parseDATFilterFile(QString filePath, libtorrent::ip_filter &filter);
+ int parseP2PFilterFile(QString filePath, libtorrent::ip_filter &filter);
int getlineInStream(QDataStream &stream, std::string &name, char delim);
- int parseP2BFilterFile();
+ int parseP2BFilterFile(QString filePath, libtorrent::ip_filter &filter);
+ libtorrent::session *m_session;
bool m_abort;
QString m_filePath;
- libtorrent::ip_filter m_filter;
};
#endif // BITTORRENT_FILTERPARSERTHREAD_H
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.cpp qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -26,13 +26,16 @@
* exception statement from your version.
*/
-#include "resumedatasavingmanager.h"
-
#include
+#ifdef QBT_USES_QT5
#include
+#else
+#include
+#endif
#include "base/logger.h"
#include "base/utils/fs.h"
+#include "resumedatasavingmanager.h"
ResumeDataSavingManager::ResumeDataSavingManager(const QString &resumeFolderPath)
: m_resumeDataDir(resumeFolderPath)
@@ -45,12 +48,18 @@
QString filepath = m_resumeDataDir.absoluteFilePath(filename);
qDebug() << "Saving resume data in" << filepath;
+#ifdef QBT_USES_QT5
QSaveFile resumeFile(filepath);
+#else
+ QFile resumeFile(filepath);
+#endif
if (resumeFile.open(QIODevice::WriteOnly)) {
resumeFile.write(data);
+#ifdef QBT_USES_QT5
if (!resumeFile.commit()) {
Logger::instance()->addMessage(QString("Couldn't save resume data in %1. Error: %2")
- .arg(filepath, resumeFile.errorString()), Log::WARNING);
+ .arg(filepath).arg(resumeFile.errorString()), Log::WARNING);
}
+#endif
}
}
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.h qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.h
--- qbittorrent-4.1.3/src/base/bittorrent/private/resumedatasavingmanager.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/resumedatasavingmanager.h 2017-08-03 20:30:10.000000000 +0000
@@ -29,11 +29,11 @@
#ifndef RESUMEDATASAVINGMANAGER_H
#define RESUMEDATASAVINGMANAGER_H
+#include
#include
#include
-#include
-class ResumeDataSavingManager : public QObject
+class ResumeDataSavingManager: public QObject
{
Q_OBJECT
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/statistics.cpp qbittorrent-3.3.15/src/base/bittorrent/private/statistics.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/private/statistics.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/statistics.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -1,12 +1,11 @@
-#include "statistics.h"
-
#include
#include
-#include "base/bittorrent/session.h"
+#include "base/qinisettings.h"
#include "base/bittorrent/sessionstatus.h"
-#include "base/profile.h"
+#include "base/bittorrent/session.h"
+#include "statistics.h"
static const qint64 SAVE_INTERVAL = 15 * 60 * 1000;
@@ -22,7 +21,7 @@
, m_dirty(false)
{
load();
- connect(&m_timer, &QTimer::timeout, this, &Statistics::gather);
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(gather()));
m_timer.start(60 * 1000);
}
@@ -45,13 +44,13 @@
void Statistics::gather()
{
- const SessionStatus &ss = m_session->status();
- if (ss.totalDownload > m_sessionDL) {
- m_sessionDL = ss.totalDownload;
+ SessionStatus ss = m_session->status();
+ if (ss.totalDownload() > m_sessionDL) {
+ m_sessionDL = ss.totalDownload();
m_dirty = true;
}
- if (ss.totalUpload > m_sessionUL) {
- m_sessionUL = ss.totalUpload;
+ if (ss.totalUpload() > m_sessionUL) {
+ m_sessionUL = ss.totalUpload();
m_dirty = true;
}
@@ -65,19 +64,19 @@
if (!m_dirty || ((now - m_lastWrite) < SAVE_INTERVAL))
return;
- SettingsPtr s = Profile::instance().applicationSettings(QLatin1String("qBittorrent-data"));
+ QIniSettings s("qBittorrent", "qBittorrent-data");
QVariantHash v;
v.insert("AlltimeDL", m_alltimeDL + m_sessionDL);
v.insert("AlltimeUL", m_alltimeUL + m_sessionUL);
- s->setValue("Stats/AllStats", v);
+ s.setValue("Stats/AllStats", v);
m_dirty = false;
m_lastWrite = now;
}
void Statistics::load()
{
- SettingsPtr s = Profile::instance().applicationSettings(QLatin1String("qBittorrent-data"));
- QVariantHash v = s->value("Stats/AllStats").toHash();
+ QIniSettings s("qBittorrent", "qBittorrent-data");
+ QVariantHash v = s.value("Stats/AllStats").toHash();
m_alltimeDL = v["AlltimeDL"].toULongLong();
m_alltimeUL = v["AlltimeUL"].toULongLong();
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/private/statistics.h qbittorrent-3.3.15/src/base/bittorrent/private/statistics.h
--- qbittorrent-4.1.3/src/base/bittorrent/private/statistics.h 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/private/statistics.h 2017-08-03 20:30:10.000000000 +0000
@@ -4,12 +4,9 @@
#include
#include
-namespace BitTorrent
-{
- class Session;
-}
+namespace BitTorrent { class Session; }
-class Statistics : public QObject
+class Statistics : QObject
{
Q_OBJECT
Q_DISABLE_COPY(Statistics)
@@ -28,12 +25,13 @@
void save() const;
void load();
+private:
BitTorrent::Session *m_session;
// Will overflow at 15.9 EiB
quint64 m_alltimeUL;
quint64 m_alltimeDL;
- quint64 m_sessionUL;
- quint64 m_sessionDL;
+ qint64 m_sessionUL;
+ qint64 m_sessionDL;
mutable qint64 m_lastWrite;
mutable bool m_dirty;
diff -Nru qbittorrent-4.1.3/src/base/bittorrent/session.cpp qbittorrent-3.3.15/src/base/bittorrent/session.cpp
--- qbittorrent-4.1.3/src/base/bittorrent/session.cpp 2018-09-18 19:52:17.000000000 +0000
+++ qbittorrent-3.3.15/src/base/bittorrent/session.cpp 2017-08-03 20:30:10.000000000 +0000
@@ -1,3 +1,4 @@
+
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2015 Vladimir Golovnev
@@ -29,78 +30,64 @@
#include "session.h"
-#include
-#include
-#include
-#include
-
#include
+#include
#include
#include
#include
#include
#include
#include
-#include
+#include
#include
#include
#include
-#include
+
+#include
+#include
+#include
#include
+#if LIBTORRENT_VERSION_NUM >= 10100
+#include
+#endif
#include
-#include
#include
#include
#include
#include
#include
#include
-#include
-#include