Compare commits
70 Commits
search_enc
...
release-2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
924a82cce1 | ||
|
|
8271eb309d | ||
|
|
304c20d3d8 | ||
|
|
fa09f5f48a | ||
|
|
8125651a57 | ||
|
|
739390134f | ||
|
|
781f579037 | ||
|
|
413dd60c56 | ||
|
|
1c0d462785 | ||
|
|
89f317dad2 | ||
|
|
facbb650d0 | ||
|
|
893b7bf7f3 | ||
|
|
f39d3296ab | ||
|
|
edbe67c4e6 | ||
|
|
9836d4ec07 | ||
|
|
b5b14d4d43 | ||
|
|
dff1666b6c | ||
|
|
e6966bec31 | ||
|
|
e92f6a3d96 | ||
|
|
f70aab3877 | ||
|
|
ec44efb261 | ||
|
|
d227ed8b59 | ||
|
|
395c2c862a | ||
|
|
e7eb61c0c3 | ||
|
|
7cd2ec57d3 | ||
|
|
4941f24fff | ||
|
|
94cb5fe0b6 | ||
|
|
4828ffa280 | ||
|
|
622d9701cb | ||
|
|
93c4b521bb | ||
|
|
9c7374e4a1 | ||
|
|
1d58e7fd7f | ||
|
|
ed9c68eea0 | ||
|
|
1b8a87c54d | ||
|
|
a33b978564 | ||
|
|
f9cf937e20 | ||
|
|
7109685913 | ||
|
|
bd222ac8bd | ||
|
|
b675f4ac58 | ||
|
|
9989ec79c9 | ||
|
|
20167c2276 | ||
|
|
e26a1d5342 | ||
|
|
3734e11879 | ||
|
|
4632c6fda9 | ||
|
|
62ff08b6b5 | ||
|
|
f50b62624a | ||
|
|
d380eb9958 | ||
|
|
a71bdde022 | ||
|
|
e8e6894b5c | ||
|
|
d92f69fa0f | ||
|
|
77d7a1ec49 | ||
|
|
d5c174a6f8 | ||
|
|
173999e504 | ||
|
|
1ed928bc39 | ||
|
|
b85d51ba79 | ||
|
|
779b53722b | ||
|
|
76780c4c46 | ||
|
|
da74f24a71 | ||
|
|
01c56865db | ||
|
|
b541c9fa4c | ||
|
|
aac0fbcbe4 | ||
|
|
b315551edd | ||
|
|
58a885cb87 | ||
|
|
d19282285c | ||
|
|
e0d8ca39a5 | ||
|
|
ec3169c9b0 | ||
|
|
7bfd7e9cda | ||
|
|
459bb8c51d | ||
|
|
9159a9f25d | ||
|
|
8ea8f8a9f7 |
14
.gitignore
vendored
@@ -1,14 +0,0 @@
|
|||||||
src/geoip/GeoIP.dat
|
|
||||||
src/qbittorrent
|
|
||||||
qbittorrent.pro.user
|
|
||||||
conf.pri
|
|
||||||
Makefile
|
|
||||||
*.pyc
|
|
||||||
*.log
|
|
||||||
# Compiled object files
|
|
||||||
*.o
|
|
||||||
# Generated MOC, resource and UI files
|
|
||||||
moc_*.cpp
|
|
||||||
qrc_*.cpp
|
|
||||||
ui_*.h
|
|
||||||
*.moc
|
|
||||||
44
AUTHORS
@@ -2,29 +2,16 @@ Author:
|
|||||||
* Christophe Dumez <chris@qbittorrent.org>
|
* Christophe Dumez <chris@qbittorrent.org>
|
||||||
|
|
||||||
Contributors:
|
Contributors:
|
||||||
* Vladimir Golovnev <glassez@yandex.ru>
|
|
||||||
* Stefanos Antaris <santaris@csd.auth.gr>
|
* Stefanos Antaris <santaris@csd.auth.gr>
|
||||||
* Mohammad Dib <mdib@qbittorrent.org>
|
|
||||||
* Mirco Chinelli <infinity89@fastwebmail.it>
|
|
||||||
* Ishan Arora <ishan@qbittorrent.org>
|
* Ishan Arora <ishan@qbittorrent.org>
|
||||||
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
* Arnaud Demaizière <arnaud@qbittorrent.org>
|
||||||
* Grigis Gaëtan <cipher16@gmail.com>
|
* Grigis Gaëtan <cipher16@gmail.com>
|
||||||
* Christian Kandeler <zambesi@users.sourceforge.net>
|
|
||||||
* Silvan Scherrer <silvan.scherrer@aroa.ch>
|
|
||||||
|
|
||||||
Code from other projects:
|
Code from other projects:
|
||||||
* files src/qtsingleapp/* src/lineedit/*
|
|
||||||
copyright: Nokia Corporation
|
|
||||||
license: LGPL
|
|
||||||
|
|
||||||
* files src/ico.cpp src/ico.h
|
* files src/ico.cpp src/ico.h
|
||||||
copyright: Malte Starostik <malte@kde.org>
|
copyright: Malte Starostik <malte@kde.org>
|
||||||
license: LGPL
|
license: LGPL
|
||||||
|
|
||||||
* files src/search_engine/socks.py
|
|
||||||
copyright: Dan Haim <negativeiq@users.sourceforge.net>
|
|
||||||
license: BSD
|
|
||||||
|
|
||||||
Images Authors:
|
Images Authors:
|
||||||
* files: src/Icons/*.png
|
* files: src/Icons/*.png
|
||||||
copyright: Gnome Icon Theme
|
copyright: Gnome Icon Theme
|
||||||
@@ -37,9 +24,9 @@ Images Authors:
|
|||||||
url: http://www.oxygen-icons.org
|
url: http://www.oxygen-icons.org
|
||||||
|
|
||||||
* files: src/Icons/flags/*.png
|
* files: src/Icons/flags/*.png
|
||||||
copyright: Mark James <mjames@gmail.com>
|
copyright: Open Clip Art Library
|
||||||
license: Public Domain
|
license: Creative Commons Public Domain Dedication
|
||||||
url: http://www.famfamfam.com
|
url: http://www.openclipart.org
|
||||||
|
|
||||||
* files: src/Icons/skin/*.png
|
* files: src/Icons/skin/*.png
|
||||||
files: src/menuicons/YYxYY/*.png
|
files: src/menuicons/YYxYY/*.png
|
||||||
@@ -50,10 +37,6 @@ Images Authors:
|
|||||||
copyright: Greg Houston <gregory.houston@gmail.com>
|
copyright: Greg Houston <gregory.houston@gmail.com>
|
||||||
license: MIT
|
license: MIT
|
||||||
|
|
||||||
* file: src/Icons/skin/qbittorrent_mono*
|
|
||||||
copyright: Daniel Eguren <deguren@gmail.com>
|
|
||||||
license: LGPL
|
|
||||||
|
|
||||||
* file: src/search_engine/engines/btjunkie.png
|
* file: src/search_engine/engines/btjunkie.png
|
||||||
copyright: Downloaded from btjunkie.org
|
copyright: Downloaded from btjunkie.org
|
||||||
|
|
||||||
@@ -72,33 +55,24 @@ Images Authors:
|
|||||||
Translations authors:
|
Translations authors:
|
||||||
* files: src/lang/*.ts
|
* files: src/lang/*.ts
|
||||||
copyright:
|
copyright:
|
||||||
- Arabic: SDERAWI (abz8868@msn.com) and sn51234 (nesseyan@gmail.com)
|
|
||||||
- Armenian: Hrant Ohanyan (hrantohanyan@mail.am)
|
|
||||||
- Basque: Xabier Aramendi (azpidatziak@gmail.com)
|
|
||||||
- Belarusian: Mihas Varantsou (meequz@gmail.com)
|
|
||||||
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
- Brazilian: Nick Marinho (nickmarinho@gmail.com)
|
||||||
- Bulgarian: Tsvetan & Boyko Bankoff (emerge_life@users.sourceforge.net)
|
- Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net)
|
||||||
- Catalan: Francisco Luque Contreras (frannoe@ya.com)
|
- Catalan: Francisco Luque Contreras (frannoe@ya.com)
|
||||||
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
- Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com)
|
||||||
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
- Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com)
|
||||||
- Croatian: Oliver Mucafir (oliver.untwist@gmail.com)
|
|
||||||
- Czech: Jirka Vilim (web@tets.cz)
|
- Czech: Jirka Vilim (web@tets.cz)
|
||||||
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
- Danish: Mathias Nielsen (comoneo@gmail.com)
|
||||||
- Dutch: Pieter Heyvaert (pieter_heyvaert@hotmail.com)
|
- Dutch: Joost Schipper (heavyjoost@users.sourceforge.net)
|
||||||
- English: Christophe Dumez (chris@qbittorrent.org)
|
- English: Christophe Dumez (chris@qbittorrent.org)
|
||||||
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
- Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net)
|
||||||
- French: Christophe Dumez (chris@qbittorrent.org)
|
- French: Christophe Dumez (chris@qbittorrent.org)
|
||||||
- Galician: Marcos Lans (marcoslansgarza@gmail.com)
|
|
||||||
- Georgian: Beqa Arabuli (arabulibeqa@yahoo.com)
|
|
||||||
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
- German: Niels Hoffmann (zentralmaschine@users.sourceforge.net)
|
||||||
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
|
- Greek: Tsvetan Bankov (emerge_life@users.sourceforge.net) and Stephanos Antaris (santaris@csd.auth.gr)
|
||||||
- Hebrew: David Deutsch (d.deffo@gmail.com)
|
|
||||||
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
- Hungarian: Majoros Péter (majoros.j.p@t-online.hu)
|
||||||
- Italian: Matteo Sechi (bu17714@gmail.com)
|
- Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com)
|
||||||
- Japanese: Masato Hashimoto (cabezon.hashimoto@gmail.com)
|
- Japanese: Nardog (alphisation@gmail.com)
|
||||||
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
- Korean: Jin Woo Sin (jin828sin@users.sourceforge.net)
|
||||||
- Lithuanian: Naglis Jonaitis (njonaitis@gmail.com)
|
- Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net)
|
||||||
- Norwegian: Tomaso
|
|
||||||
- Polish: Mariusz Fik (fisiu@opensuse.org)
|
- Polish: Mariusz Fik (fisiu@opensuse.org)
|
||||||
- Portuguese: Nick Marinho (nickmarinho@gmail.com)
|
- Portuguese: Nick Marinho (nickmarinho@gmail.com)
|
||||||
- Romanian: Obada Denis (obadadenis@users.sourceforge.net)
|
- Romanian: Obada Denis (obadadenis@users.sourceforge.net)
|
||||||
@@ -108,5 +82,5 @@ Translations authors:
|
|||||||
- Spanish: Francisco Luque Contreras (frannoe@ya.com)
|
- Spanish: Francisco Luque Contreras (frannoe@ya.com)
|
||||||
- Swedish: Daniel Nylander (po@danielnylander.se)
|
- Swedish: Daniel Nylander (po@danielnylander.se)
|
||||||
- Turkish: Hasan Yilmaz (iletisim@hedefturkce.com)
|
- Turkish: Hasan Yilmaz (iletisim@hedefturkce.com)
|
||||||
- Ukrainian: Oleh Prypin (blaxpirit@gmail.com)
|
- Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net)
|
||||||
license: GPLv2
|
license: GPLv2
|
||||||
|
|||||||
233
Changelog
@@ -1,233 +1,4 @@
|
|||||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v3.0.3
|
* Mon Jan 11 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.7
|
||||||
- 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 <chris@qbittorrent.org> - 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 <chris@qbittorrent.org> - 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
|
|
||||||
|
|
||||||
* Thu Aug 09 2012 - Christophe Dumez <chris@qbittorrent.org> - v3.0.0
|
|
||||||
- FEATURE: Brand new torrent addition dialog
|
|
||||||
- FEATURE: Add the ability to choose the save path when using magnet links (mutoso)
|
|
||||||
- FEATURE: Add support for adding multiple local torrents at once (Web UI)
|
|
||||||
- COSMETIC: Improve style of left panel
|
|
||||||
- BUGFIX: Lower panels no longer gets disabled
|
|
||||||
- BUGFIX: Major code refactoring and various optimizations.
|
|
||||||
- BUGFIX: No longer strip root folder from torrent files
|
|
||||||
- OTHER: Drop support for libtorrent v0.14.x
|
|
||||||
- OTHER: Drop support for Qt 4.5
|
|
||||||
|
|
||||||
* Sat Oct 08 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.9.0
|
|
||||||
- FEATURE: Add file association settings to program preferences (Windows)
|
|
||||||
- FEATURE: Add setting to ignore slow torrents in queueing system
|
|
||||||
- FEATURE: Add advanced setting to announce to all trackers
|
|
||||||
- FEATURE: Add support for anonymous mode (libtorrent >= v0.16)
|
|
||||||
- FEATURE: Add quick "set as default save path" checkbox to torrent addition dialog (sledgehammer999)
|
|
||||||
- BUGFIX: Add tray menu entry for toggling window visibility
|
|
||||||
- BUGFIX: Fix execution log lines selection and copying
|
|
||||||
- BUGFIX: Reduce CPU usage when running Web UI
|
|
||||||
- BUGFIX: Save RSS items to disk regularly for safety
|
|
||||||
- BUGFIX: Fix ratio calculation (use all_time_download)
|
|
||||||
- BUGFIX: Fix torrent upload issues (Web UI)
|
|
||||||
- BUGFIX: Fix some IE incompatibilities (Web UI)
|
|
||||||
- COSMETIC: Display speed at the beginning of the Window title
|
|
||||||
- COSMETIC: Several cosmetic fixes to the Web UI
|
|
||||||
- COSMETIC: Make top toolbar follow system style
|
|
||||||
- OTHER: Display libraries versions in about dialog (sledgehammer999)
|
|
||||||
- OTHER: Display qBittorrent version in Web UI about dialog
|
|
||||||
|
|
||||||
* Thu Jun 02 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.8.0
|
|
||||||
- FEATURE: Added full libtorrent v0.16 support (uTP, ...)
|
|
||||||
- FEATURE: Proxy can be disabled for peer connections
|
|
||||||
- FEATURE: Added support for secure SMTP connection (SSL)
|
|
||||||
- FEATURE: Added support for SMTP authentication
|
|
||||||
- FEATURE: Added UPnP/NAT-PMP port forward for the Web UI port
|
|
||||||
- FEATURE: qBittorrent can update dynamic DNS services (DynDNS, no-ip)
|
|
||||||
- FEATURE: Display peer connection type in peer list (BT, uTP, Web)
|
|
||||||
- FEATURE: Added full regex support to RSS downloader
|
|
||||||
- FEATURE: Added regex help and validation in RSS downloader
|
|
||||||
- FEATURE: Added HTTPS support to Web UI (Ishan Arora)
|
|
||||||
- BUGFIX: Change systray icon on the fly (no restart needed)
|
|
||||||
- BUGFIX: Remember peer-level rate limits (requires libtorrent v0.16)
|
|
||||||
- BUGFIX: Stop annoncing to trackers an all tiers (more respectful)
|
|
||||||
- BUGFIX: Stop sharing private trackers with other peers
|
|
||||||
- BUGFIX: Tracker exchange extension can be disabled
|
|
||||||
- BUGFIX: Cleaner program exit on system log out
|
|
||||||
- BUGFIX: Fix possible magnet link parsing problems
|
|
||||||
- BUGFIX: Fix possible RSS URL parsing problems
|
|
||||||
- COSMETIC: Added monochrome icon for light themes
|
|
||||||
|
|
||||||
* Sun Mar 20 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.7.0
|
|
||||||
- FEATURE: Added search field for torrent content
|
|
||||||
- FEATURE: Added auto-shutdown confirmation dialog
|
|
||||||
- FEATURE: Added option to skip torrent deletion confirmation (Ville Kiiskinen)
|
|
||||||
- FEATURE: IP address reported to trackers is now customizable
|
|
||||||
- FEATURE: Inhibit system sleep when torrents are active (Vladimir Golovnev)
|
|
||||||
- FEATURE: Added option to bypass Web UI authentication for localhost
|
|
||||||
- FEATURE: Added option to disable program exit confirmation
|
|
||||||
- FEATURE: Added per-torrent ratio limiting (Christian Kandeler)
|
|
||||||
- FEATURE: Torrent content list is now sortable
|
|
||||||
- BUGFIX: Fix compilation with namespaced Qt (Christian Kandeler)
|
|
||||||
- BUGFIX: Added length restriction on UI lock password
|
|
||||||
- COSMETIC: Added monochrome tray icon
|
|
||||||
- COSMETIC: Improved status bar's style
|
|
||||||
- OTHER: Make QtDBus dependency optional (X11)
|
|
||||||
|
|
||||||
* Sun Jan 9 2011 - Christophe Dumez <chris@qbittorrent.org> - v2.6.0
|
|
||||||
- FEATURE: Use system icons (Linux, Qt >= 4.6)
|
|
||||||
- FEATURE: Improved ETA calculation
|
|
||||||
- FEATURE: Simplify program preferences
|
|
||||||
- FEATURE: Software update check can now be disabled (Mac OS X / Windows)
|
|
||||||
- FEATURE: Display pieces size in torrent properties
|
|
||||||
- FEATURE: Added "Time Active/Seeded" column to transfer list
|
|
||||||
- FEATURE: Give feedback regarding the IP filter parsing
|
|
||||||
- FEATURE: Added a button to reload the IP filter
|
|
||||||
- FEATURE: Search engine results can now be opened in a Web browser
|
|
||||||
- FEATURE: Added a search engine plugin to extratorrent.com
|
|
||||||
- FEATURE: Added a search engine plugin for kickasstorrents.com
|
|
||||||
- FEATURE: Added auto-suspend upon downloads completion feature
|
|
||||||
- BUGFIX: Hide unwanted files that have to be partly downloaded
|
|
||||||
- BUGFIX: Do not allocate space for unwanted files (preallocation mode)
|
|
||||||
- I18N: Added Galician translation
|
|
||||||
- COSMETIC: Same deletion confirmation dialog in the GUI and Web UI
|
|
||||||
- COSMETIC: Simplified the top toolbar
|
|
||||||
- COSMETIC: Display execution log as a tab instead of a modal window
|
|
||||||
|
|
||||||
* Sun Dec 5 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.5.0
|
|
||||||
- FEATURE: qBittorrent can now act as a tracker
|
|
||||||
- FEATURE: New and improved RSS feed automated downloader
|
|
||||||
- FEATURE: Added feature to shutdown qbittorrent on torrents completion
|
|
||||||
- FEATURE: Added a torrent import assistant to seed or keep downloading outside torrents
|
|
||||||
- FEATURE: qBittorrent can update itself from Sourceforge (Windows/Mac OS X only)
|
|
||||||
- FEATURE: Added a transfer list column to display the current tracker
|
|
||||||
- FEATURE: Remember the last trackers used in the torrent creation tool
|
|
||||||
- FEATURE: The optimal piece size is now automatically computed in the torrent creation tool
|
|
||||||
- FEATURE: Bring up the connection settings when clicking on the connection status icon
|
|
||||||
- FEATURE: Major code refactoring and optimization
|
|
||||||
- FEATURE: Added "Amount downloaded/left" columns to transfer list
|
|
||||||
- FEATURE: Simplified proxy settings
|
|
||||||
- FEATURE: Optimized and improved the peer country resolution code
|
|
||||||
- FEATURE: Download first/last pieces first when sequential download is
|
|
||||||
enabled (Thanks Ahmad)
|
|
||||||
- FEATURE: Download first/last pieces first now applies to all media files
|
|
||||||
in the torrent (Thanks Ahmad)
|
|
||||||
- BUGFIX: Fix SOCKS5 proxy authentication in search engine(closes #680072)
|
|
||||||
- BUGFIX: Fix two advanced settings (ignore limits on LAN and protocol
|
|
||||||
overhead inclusion in rate limiter)
|
|
||||||
- BUGFIX: Fix strict super seeding (was not working)
|
|
||||||
- BUGFIX: Improve magnet save path handling (closes #683395)
|
|
||||||
- BUGFIX: Disable overwrite confirmation in torrent addition dialog (closes # 685269)
|
|
||||||
- COSMETIC: Replaced message box by on-screen notification for download errors
|
|
||||||
- COSMETIC: Improved the torrent creation tool appearance
|
|
||||||
- COSMETIC: Use country flags by Mark James (Thanks to Dmytro Pukha)
|
|
||||||
- COSMETIC: Use bigger alternative speed icon
|
|
||||||
- OTHERS: Dropped support for Qt <= 4.4
|
|
||||||
|
|
||||||
* Tue Aug 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.4.0
|
|
||||||
- FEATURE: Added actions to "Move to top/bottom" of priority queue
|
|
||||||
- FEATURE: Auto-Shutdown on downloads completion
|
|
||||||
- FEATURE: Email notification on download completion
|
|
||||||
- FEATURE: Added button to password-lock the UI
|
|
||||||
- FEATURE: Added label-level Pause/Resume/Delete actions
|
|
||||||
- FEATURE: Torrents can now be filtered by name
|
|
||||||
- FEATURE: Run external program on torrent completion
|
|
||||||
- FEATURE: Detect executable updates in order to advise the user to restart
|
|
||||||
|
|
||||||
* Tue Jul 27 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.3.0
|
|
||||||
- FEATURE: Simplified torrent root folder renaming/truncating (< v2.3.0 is no longer forward compatible)
|
|
||||||
- FEATURE: Remember previous save paths in torrent addition dialog
|
|
||||||
- FEATURE: Max number of half-open connections can now be edited
|
|
||||||
- FEATURE: Added support for strict super seeding
|
|
||||||
- FEATURE: The user can force listening on a particular network interface
|
|
||||||
- FEATURE: Added cookie support for RSS feeds
|
|
||||||
- FEATURE: User can force tracker reannounce
|
|
||||||
- FEATURE: Added "No action" setting for double-click action
|
|
||||||
- FEATURE: Several torrents can be moved at once
|
|
||||||
- FEATURE: Added error state for torrents (error is displayed in a tooltip)
|
|
||||||
- FEATURE: Added filter for paused/error torrents
|
|
||||||
- FEATURE: Add Check/Uncheck all feature in Web UI
|
|
||||||
- FEATURE: Search engine can now be disabled
|
|
||||||
- FEATURE: Torrents can be automatically paused once they reach a given ratio
|
|
||||||
- FEATURE: Several files can now be disabled at once
|
|
||||||
- FEATURE: Added "Select All/None" buttons to files list
|
|
||||||
- FEATURE: Added support for BitComet links (bc://bt/...)
|
|
||||||
- BUGFIX: Hide seeding torrents files priorities in Web UI
|
|
||||||
- BUGFIX: The user can disable permanently recursive torrent download
|
|
||||||
- BUGFIX: Peer Exchange status is now correctly reported
|
|
||||||
- BUGFIX: Use an INI file instead of the registry on Windows (More reliable)
|
|
||||||
- BUGFIX: Removed client spoofing feature to avoid tracker blacklisting
|
|
||||||
- COSMETIC: Display peers country name in tooltip
|
|
||||||
- COSMETIC: Display number of torrents in transfers tab label
|
|
||||||
- COSMETIC: Simplified program preferences
|
|
||||||
- COSMETIC: Fix naming of actions opening new dialogs (use Name...)
|
|
||||||
|
|
||||||
* Sun Mar 14 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.2.0
|
|
||||||
- FEATURE: User can set alternative speed limits for fast toggling
|
|
||||||
- FEATURE: Bandwidth scheduler (automatically use alternative speed limits for a given period)
|
|
||||||
- FEATURE: Added "Added/Completed On" columns to transfer list
|
|
||||||
- FEATURE: Added "Upload/Download limit" columns to transfer list
|
|
||||||
- FEATURE: Torrent files can be exported to a given directory
|
|
||||||
- FEATURE: Outgoing ports range can be customized (for QoS)
|
|
||||||
- FEATURE: User can choose to apply transfer limits on LAN too
|
|
||||||
- FEATURE: User can choose to include the protocol overhead in transfer limits
|
|
||||||
- FEATURE: Torrents can be automatically rechecked on completion
|
|
||||||
- FEATURE: If 2 torrents have the same hash, add new trackers/URL seeds to the existing torrent
|
|
||||||
- FEATURE: Trackers can be added from Web UI
|
|
||||||
- FEATURE: Global transfer information are displayed in the new Web UI status bar
|
|
||||||
- FEATURE: Allow to change the priority of several files at once
|
|
||||||
- FEATURE: Support for multiple scan folders (Patch by Christian Kandeler)
|
|
||||||
- BUGFIX: Only one log window can be opened at a time
|
|
||||||
- BUGFIX: Optimized RSS module memory usage
|
|
||||||
- BUGFIX: Consider HTTP downloads >1MB as invalid .torrent files and abort
|
|
||||||
- BUGFIX: Fix Web UI authentication with some browsers
|
|
||||||
- BUGFIX: Set Web UI ban period to 1 hour
|
|
||||||
- COSMETIC: Improved style management
|
|
||||||
|
|
||||||
* Mon Jan 18 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.1.0
|
|
||||||
- FEATURE: Graphical User Interface can be disabled at compilation time (headless running)
|
|
||||||
- FEATURE: Torrents can be labeled/categorized
|
|
||||||
- FEATURE: Labeled torrent can be downloaded corresponding subfolders
|
|
||||||
- FEATURE: Disk cache size can be set from preferences
|
|
||||||
- FEATURE: Peer Exchange (PeX) can be disabled from preferences
|
|
||||||
- FEATURE: Append !.qB extension to incomplete files option (libtorrent >= v0.15 only)
|
|
||||||
- FEATURE: Torrent files/folders can be renamed (torrent addition dialog or files properties)
|
|
||||||
- FEATURE: uTorrent compatible tracker list support (use torrentz.com url as a default)
|
|
||||||
- FEATURE: Better proxy support and preferences remodeling
|
|
||||||
- FEATURE: qBittorrent can identify itself as uTorrent, Vuze or KTorrent (Any stable version)
|
|
||||||
- FEATURE: Torrents can be renamed in transfer list
|
|
||||||
- FEATURE: Display torrent addition dialog for magnet links too
|
|
||||||
- FEATURE: Files contained in a torrent are opened on double click (files panel)
|
|
||||||
- FEATURE: Added support for magnet links in search engine
|
|
||||||
- FEATURE: Added vertor.com and torrentdownloads.net search plugins
|
|
||||||
- FEATURE: Search engine can now use a SOCKS5 proxy
|
|
||||||
- FEATURE: HTTP proxy support for peer communication
|
|
||||||
- BUGFIX: Search engine loads new proxy settings without program restart
|
|
||||||
- BUGFIX: Use XDG folders (.cache, .local) instead of .qbittorrent
|
|
||||||
- BUGFIX: Added legal notice on startup that the user must accept
|
|
||||||
- BUGFIX: Protect Web UI authentication against brute forcing
|
|
||||||
- BUGFIX: Use HTTP digest mode for Web UI authentication (instead of Basic)
|
|
||||||
- BUGFIX: Properly display torrents with one file in subfolder(s)
|
|
||||||
- BUGFIX: Display Web UI favicon
|
|
||||||
- BUGFIX: File priority can be set for finished torrents that have filtered files
|
|
||||||
- COSMETIC: Use checkboxes to filter torrent content instead of comboboxes
|
|
||||||
- COSMETIC: Use alternating row colors in transfer list (set in program preferences)
|
|
||||||
- COSMETIC: Added a spin box to speed limiting dialog for manual input
|
|
||||||
|
|
||||||
* Mon Jan 11 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.0.7
|
|
||||||
- BUGFIX: Fix 'Add in pause' setting in torrent addition dialog
|
- BUGFIX: Fix 'Add in pause' setting in torrent addition dialog
|
||||||
- BUGFIX: Update RSS feed as soon as feed downloader is enabled
|
- BUGFIX: Update RSS feed as soon as feed downloader is enabled
|
||||||
- BUGFIX: RSS Feed downloader ignores articles above maximum number of articles
|
- BUGFIX: RSS Feed downloader ignores articles above maximum number of articles
|
||||||
@@ -237,7 +8,7 @@
|
|||||||
- BUGFIX: Fix crash when renaming currently displayed RSS filter
|
- BUGFIX: Fix crash when renaming currently displayed RSS filter
|
||||||
- BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it
|
- BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it
|
||||||
|
|
||||||
* Tue Jan 5 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.0.6
|
* Tue Jan 5 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.6
|
||||||
- BUGFIX: Fix detection of invalid torrent files
|
- BUGFIX: Fix detection of invalid torrent files
|
||||||
- BUGFIX: Stop catching signals once one has been caught to avoid possible infinite loop
|
- BUGFIX: Stop catching signals once one has been caught to avoid possible infinite loop
|
||||||
- BUGFIX: Force data recheck whenever a torrent is moved
|
- BUGFIX: Force data recheck whenever a torrent is moved
|
||||||
|
|||||||
61
INSTALL
@@ -1,55 +1,32 @@
|
|||||||
qBittorrent - A BitTorrent client in C++ / Qt4
|
qBittorrent - A BitTorrent client in C++ / Qt4
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
|
||||||
1) Compile and install qBittorrent with Qt4 Graphical Interface
|
./configure
|
||||||
|
make && make install
|
||||||
|
qbittorrent
|
||||||
|
|
||||||
$ ./configure
|
will install and execute qBittorrent hopefully without any problems.
|
||||||
$ make && make install
|
|
||||||
$ qbittorrent
|
|
||||||
|
|
||||||
will install and execute qBittorrent hopefully without any problems.
|
Dependencies:
|
||||||
|
- Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml)
|
||||||
|
|
||||||
Dependencies:
|
- libtorrent-rasterbar by Arvid Norberg (>= 0.14.0 REQUIRED, >= v0.15.0 ADVISED)
|
||||||
- Qt >= 4.6.0 (libqtgui, libqtcore, libqtnetwork, libqtxml, libqtdbus/optional)
|
-> http://www.qbittorrent.org/download.php (advised)
|
||||||
|
-> http://www.libtorrent.net
|
||||||
|
Be careful: another library (the one used by rTorrent) uses a similar name.
|
||||||
|
|
||||||
- pkg-config executable
|
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
||||||
|
|
||||||
- libtorrent-rasterbar by Arvid Norberg (>= 0.15.0)
|
- python >= 2.3 (needed by search engine)
|
||||||
-> http://www.libtorrent.net
|
* Run time only dependency
|
||||||
Be careful: another library (the one used by rTorrent) uses a similar name.
|
|
||||||
|
|
||||||
- libboost 1.34.x (libboost-filesystem°) + libasio
|
- libnotify >= 0.4.2, glib-2.0 (optional)
|
||||||
or
|
* Can be used for system notifications to replace standard Qt notifications
|
||||||
- libboost >= 1.35.x (libboost-system, libboost-filesystem°)
|
so that it integrates better into the Desktop
|
||||||
|
|
||||||
°libboost-filesystem is not needed if libtorrent-rasterbar >= v0.16.x is used
|
|
||||||
|
|
||||||
- python >= 2.3 (needed by search engine)
|
|
||||||
* Run time only dependency
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
will install and execute qBittorrent hopefully without any problems.
|
|
||||||
|
|
||||||
Dependencies:
|
|
||||||
- Qt >= 4.4.0 (libqt-devel, libqtcore, libqtnetwork)
|
|
||||||
|
|
||||||
- pkg-config executable
|
|
||||||
|
|
||||||
- libtorrent-rasterbar by Arvid Norberg (>= v0.15.0)
|
|
||||||
-> http://www.libtorrent.net
|
|
||||||
Be careful: another library (the one used by rTorrent) uses a similar name.
|
|
||||||
|
|
||||||
- libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization
|
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
DOCUMENTATION:
|
DOCUMENTATION:
|
||||||
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org.
|
||||||
|
|||||||
74
README.os2
@@ -1,74 +0,0 @@
|
|||||||
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 beginn #####
|
|
||||||
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 <silvan.scherrer@aroa.ch>
|
|
||||||
|
|
||||||
|
|
||||||
372
configure
vendored
@@ -18,24 +18,12 @@ Main options:
|
|||||||
--help This help text.
|
--help This help text.
|
||||||
|
|
||||||
Dependency options:
|
Dependency options:
|
||||||
--enable-debug Enable debug mode
|
--with-libboost-inc=[path] Path to libboost include files
|
||||||
--disable-gui Disable qBittorrent
|
--disable-libnotify Disable use of libnotify
|
||||||
Graphical user interface for
|
--disable-geoip-database Disable use of geoip-database
|
||||||
headless running
|
--with-geoip-database-embedded Geoip Database will be embedded in
|
||||||
--disable-qt-dbus Disable use of qt-dbus
|
qBittorrent executable (please follow
|
||||||
--with-libboost-inc=[path] Path to libboost include
|
instructions in src/geoip/README)
|
||||||
files
|
|
||||||
--with-libboost-lib=[path] Path to libboost library
|
|
||||||
files
|
|
||||||
--disable-geoip-database Disable use of geoip-database
|
|
||||||
--with-geoip-database-embedded Geoip Database will be
|
|
||||||
embedded in qBittorrent
|
|
||||||
executable (please follow
|
|
||||||
instructions in
|
|
||||||
src/geoip/README)
|
|
||||||
--with-qtsingleapplication=[system|shipped] Use the shipped
|
|
||||||
qtsingleapplication library
|
|
||||||
or the system one
|
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
}
|
}
|
||||||
@@ -152,28 +140,13 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--enable-debug)
|
|
||||||
QC_ENABLE_DEBUG="Y"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--disable-gui)
|
|
||||||
QC_DISABLE_GUI="Y"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--disable-qt-dbus)
|
|
||||||
QC_DISABLE_qt_dbus="Y"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--with-libboost-inc=*)
|
--with-libboost-inc=*)
|
||||||
QC_WITH_LIBBOOST_INC=$optarg
|
QC_WITH_LIBBOOST_INC=$optarg
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--with-libboost-lib=*)
|
--disable-libnotify)
|
||||||
QC_WITH_LIBBOOST_LIB=$optarg
|
QC_DISABLE_libnotify="Y"
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
@@ -187,11 +160,6 @@ while [ $# -gt 0 ]; do
|
|||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
|
|
||||||
--with-qtsingleapplication=*)
|
|
||||||
QC_WITH_QTSINGLEAPPLICATION=$optarg
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
|
|
||||||
--verbose)
|
--verbose)
|
||||||
QC_VERBOSE="Y"
|
QC_VERBOSE="Y"
|
||||||
shift
|
shift
|
||||||
@@ -213,14 +181,10 @@ echo PREFIX=$PREFIX
|
|||||||
echo BINDIR=$BINDIR
|
echo BINDIR=$BINDIR
|
||||||
echo DATADIR=$DATADIR
|
echo DATADIR=$DATADIR
|
||||||
echo EX_QTDIR=$EX_QTDIR
|
echo EX_QTDIR=$EX_QTDIR
|
||||||
echo QC_ENABLE_DEBUG=$QC_ENABLE_DEBUG
|
|
||||||
echo QC_DISABLE_GUI=$QC_DISABLE_GUI
|
|
||||||
echo QC_DISABLE_qt_dbus=$QC_DISABLE_qt_dbus
|
|
||||||
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
echo QC_WITH_LIBBOOST_INC=$QC_WITH_LIBBOOST_INC
|
||||||
echo QC_WITH_LIBBOOST_LIB=$QC_WITH_LIBBOOST_LIB
|
echo QC_DISABLE_libnotify=$QC_DISABLE_libnotify
|
||||||
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
|
echo QC_DISABLE_geoip_database=$QC_DISABLE_geoip_database
|
||||||
echo QC_WITH_GEOIP_DATABASE_EMBEDDED=$QC_WITH_GEOIP_DATABASE_EMBEDDED
|
echo QC_WITH_GEOIP_DATABASE_EMBEDDED=$QC_WITH_GEOIP_DATABASE_EMBEDDED
|
||||||
echo QC_WITH_QTSINGLEAPPLICATION=$QC_WITH_QTSINGLEAPPLICATION
|
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -325,87 +289,22 @@ cat >$1/modules.cpp <<EOT
|
|||||||
#line 1 "qt4.qcm"
|
#line 1 "qt4.qcm"
|
||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.6
|
name: Qt >= 4.4
|
||||||
arg: enable-debug, Enable debug mode
|
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_qt4 : public ConfObj
|
class qc_qt4 : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.6"; }
|
QString name() const { return "Qt >= 4.4"; }
|
||||||
QString shortname() const { return "Qt 4.6"; }
|
QString shortname() const { return "Qt 4.4"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
// NOX mode
|
if(QT_VERSION >= 0x040500) {
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
conf->addDefine("QT_4_5");
|
||||||
conf->addExtra("CONFIG += nox");
|
|
||||||
}
|
|
||||||
// Debug mode
|
|
||||||
if(!conf->getenv("QC_ENABLE_DEBUG").isEmpty()) {
|
|
||||||
conf->addExtra("CONFIG -= release");
|
|
||||||
conf->addExtra("CONFIG += debug");
|
|
||||||
} else {
|
|
||||||
conf->addExtra("CONFIG -= debug");
|
|
||||||
conf->addExtra("CONFIG += release");
|
|
||||||
}
|
}
|
||||||
#ifdef Q_OS_FREEBSD
|
return(QT_VERSION >= 0x040400);
|
||||||
conf->addLib("-lexecinfo");
|
|
||||||
conf->addExtra("MANPREFIX = \$\$PREFIX");
|
|
||||||
#else
|
|
||||||
conf->addExtra("MANPREFIX = \$\$PREFIX/share");
|
|
||||||
#endif
|
|
||||||
return(QT_VERSION >= 0x040600);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#line 1 "qt-dbus.qcm"
|
|
||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: qt-dbus
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
// see Conf::findPkgConfig
|
|
||||||
class qc_qt_dbus : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qt_dbus(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "QtDBus >= 4.5"; }
|
|
||||||
QString shortname() const { return "qt-dbus"; }
|
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_dbus").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec(){
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_dbus").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return false;
|
|
||||||
QStringList incs;
|
|
||||||
QString req_ver = "4.5.0";
|
|
||||||
QString version, libs, other;
|
|
||||||
VersionMode mode = VersionMin;
|
|
||||||
if(conf->findPkgConfig("QtDBus", mode, req_ver, &version, &incs, &libs, &other)) {
|
|
||||||
conf->addExtra("CONFIG += dbus");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
#line 1 "pkg-config.qcm"
|
|
||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: pkg-config
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
#include <QProcess>
|
|
||||||
class qc_pkg_config : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_pkg_config(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "pkg-config executable"; }
|
|
||||||
QString shortname() const { return "pkg-config"; }
|
|
||||||
bool exec(){
|
|
||||||
return !conf->findProgram("pkg-config").isEmpty();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "libtorrent-rasterbar.qcm"
|
#line 1 "libtorrent-rasterbar.qcm"
|
||||||
@@ -419,17 +318,24 @@ class qc_libtorrent_rasterbar : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.15.0"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.15.0";
|
QString req_ver = "0.14.0";
|
||||||
|
QString adv_ver = "0.15.0";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
VersionMode mode = VersionMin;
|
VersionMode mode = VersionMin;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
return false;
|
return false;
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
conf->addIncludePath(incs[n]);
|
conf->addIncludePath(incs[n]);
|
||||||
|
if(!libs.isEmpty())
|
||||||
|
conf->addLib(libs);
|
||||||
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
|
printf("\nWarning: libtorrent-rasterbar v%s was detected.\nAlthough it will compile and run, you will be missing some features. Please consider updating to v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
||||||
|
else
|
||||||
|
conf->addDefine("LIBTORRENT_0_15");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -438,98 +344,99 @@ public:
|
|||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libboost
|
name: libboost
|
||||||
arg: with-libboost-inc=[path], Path to libboost include files
|
arg: with-libboost-inc=[path], Path to libboost include files
|
||||||
arg: with-libboost-lib=[path], Path to libboost library files
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
#include <boost/version.hpp>
|
|
||||||
#include <libtorrent/version.hpp>
|
|
||||||
|
|
||||||
class qc_libboost : public ConfObj
|
class qc_libboost : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libboost(Conf *c) : ConfObj(c) {}
|
qc_libboost(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libboost"; }
|
QString name() const { return "libboost"; }
|
||||||
QString shortname() const { return "libboost"; }
|
QString shortname() const { return "libboost"; }
|
||||||
|
bool exec(){
|
||||||
QString findBoostLib(QString path, QString lib) const {
|
QString s;
|
||||||
QString name;
|
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||||
QDir libDir(path);
|
if(!s.isEmpty()) {
|
||||||
QStringList filters;
|
if(!conf->checkHeader(s, "boost/format.hpp")) {
|
||||||
filters << "libboost_"+lib+"*-mt*.so";
|
return false;
|
||||||
QStringList result = libDir.entryList(filters, QDir::Files);
|
}
|
||||||
if(!result.empty()) {
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
name = result.first().mid(3);
|
return false;
|
||||||
// Remove .so
|
}
|
||||||
name.chop(3);
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
} else {
|
return false;
|
||||||
// Fall back to non -mt boost lib
|
}
|
||||||
filters.clear();
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
filters << "libboost_"+lib+"*.so";
|
return false;
|
||||||
result = libDir.entryList(filters, QDir::Files);
|
}
|
||||||
if(!result.empty()) {
|
}else{
|
||||||
name = result.first().mid(3);
|
QStringList sl;
|
||||||
// Remove .so
|
sl << "/usr/include";
|
||||||
name.chop(3);
|
sl << "/usr/local/include";
|
||||||
}
|
bool found = false;
|
||||||
}
|
foreach(s, sl){
|
||||||
return name;
|
if(conf->checkHeader(s, "boost/format.hpp")){
|
||||||
}
|
found = true;
|
||||||
|
break;
|
||||||
bool exec(){
|
}
|
||||||
QStringList sl;
|
}
|
||||||
QString s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
if(!found) {
|
||||||
if (!s.isEmpty())
|
return false;
|
||||||
sl << s;
|
}
|
||||||
sl << "/usr/include";
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
sl << "/usr/local/include";
|
return false;
|
||||||
bool found = false;
|
}
|
||||||
foreach (s, sl) {
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
if (conf->checkHeader(s, "boost/format.hpp")
|
return false;
|
||||||
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
|
}
|
||||||
&& conf->checkHeader(s, "boost/filesystem/path.hpp")
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
#endif
|
return false;
|
||||||
) {
|
}
|
||||||
found = true;
|
}
|
||||||
break;
|
conf->addIncludePath(s);
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
if (!found)
|
};
|
||||||
return false;
|
#line 1 "libnotify.qcm"
|
||||||
|
/*
|
||||||
conf->addIncludePath(s);
|
-----BEGIN QCMOD-----
|
||||||
|
name: libnotify
|
||||||
// Find library
|
-----END QCMOD-----
|
||||||
s = conf->getenv("QC_WITH_LIBBOOST_LIB");
|
*/
|
||||||
QStringList required_libs;
|
// see Conf::findPkgConfig
|
||||||
#if BOOST_VERSION >= 103500
|
class qc_libnotify : public ConfObj
|
||||||
required_libs << "system";
|
{
|
||||||
#endif
|
public:
|
||||||
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
|
qc_libnotify(Conf *c) : ConfObj(c) {}
|
||||||
required_libs << "filesystem" ;
|
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
||||||
#endif
|
QString shortname() const { return "libnotify"; }
|
||||||
required_libs << "thread";
|
bool exec(){
|
||||||
QStringList libDirs;
|
QStringList incs;
|
||||||
if (!s.isEmpty())
|
QString req_ver = "0.4.2";
|
||||||
libDirs << s;
|
QString version, libs, other;
|
||||||
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
|
VersionMode mode = VersionMin;
|
||||||
|
if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) {
|
||||||
foreach(const QString& lib, required_libs) {
|
conf->addDefine("WITH_LIBNOTIFY");
|
||||||
bool found = false;
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
foreach(const QString& libDir, libDirs) {
|
conf->addIncludePath(incs[n]);
|
||||||
QString detected_name = findBoostLib(libDir, lib);
|
if(!libs.isEmpty())
|
||||||
if(!detected_name.isEmpty()) {
|
conf->addLib(libs);
|
||||||
conf->addLib("-l"+detected_name);
|
QStringList incs2;
|
||||||
found = true;
|
QString req_ver2 = "2.0";
|
||||||
break;
|
QString version2, libs2, other2;
|
||||||
}
|
if(conf->findPkgConfig("glib-2.0", mode, req_ver2, &version2, &incs2, &libs2, &other2)) {
|
||||||
}
|
for(int n = 0; n < incs2.count(); ++n)
|
||||||
if(!found) {
|
conf->addIncludePath(incs2[n]);
|
||||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
if(!libs2.isEmpty())
|
||||||
return false;
|
conf->addLib(libs2);
|
||||||
}
|
} else {
|
||||||
}
|
return false;
|
||||||
return true;
|
}
|
||||||
}
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
#line 1 "geoip-database.qcm"
|
#line 1 "geoip-database.qcm"
|
||||||
/*
|
/*
|
||||||
@@ -545,15 +452,7 @@ public:
|
|||||||
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "GeoIP Database (optional)"; }
|
QString name() const { return "GeoIP Database (optional)"; }
|
||||||
QString shortname() const { return "GeoIP Database"; }
|
QString shortname() const { return "GeoIP Database"; }
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec() {
|
bool exec() {
|
||||||
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
||||||
#endif
|
#endif
|
||||||
@@ -569,56 +468,23 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#line 1 "qtsingleapplication.qcm"
|
|
||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: qtsingleapplication
|
|
||||||
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_qtsingleapplication : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "qtsingleapplication library"; }
|
|
||||||
QString shortname() const { return "qtsingleapplication"; }
|
|
||||||
|
|
||||||
bool exec(){
|
|
||||||
QString s;
|
|
||||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
|
||||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
|
||||||
// System
|
|
||||||
conf->addExtra("CONFIG += usesystemqtsingleapplication");
|
|
||||||
printf(" [system] ");
|
|
||||||
} else {
|
|
||||||
printf(" [shipped] ");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
cat >$1/modules_new.cpp <<EOT
|
cat >$1/modules_new.cpp <<EOT
|
||||||
o = new qc_qt4(conf);
|
o = new qc_qt4(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_qt_dbus(conf);
|
|
||||||
o->required = false;
|
|
||||||
o->disabled = false;
|
|
||||||
o = new qc_pkg_config(conf);
|
|
||||||
o->required = true;
|
|
||||||
o->disabled = false;
|
|
||||||
o = new qc_libtorrent_rasterbar(conf);
|
o = new qc_libtorrent_rasterbar(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_libboost(conf);
|
o = new qc_libboost(conf);
|
||||||
o->required = true;
|
o->required = true;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_geoip_database(conf);
|
o = new qc_libnotify(conf);
|
||||||
o->required = false;
|
o->required = false;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
o = new qc_qtsingleapplication(conf);
|
o = new qc_geoip_database(conf);
|
||||||
o->required = true;
|
o->required = false;
|
||||||
o->disabled = false;
|
o->disabled = false;
|
||||||
|
|
||||||
EOT
|
EOT
|
||||||
@@ -1565,14 +1431,10 @@ export PREFIX
|
|||||||
export BINDIR
|
export BINDIR
|
||||||
export DATADIR
|
export DATADIR
|
||||||
export EX_QTDIR
|
export EX_QTDIR
|
||||||
export QC_ENABLE_DEBUG
|
|
||||||
export QC_DISABLE_GUI
|
|
||||||
export QC_DISABLE_qt_dbus
|
|
||||||
export QC_WITH_LIBBOOST_INC
|
export QC_WITH_LIBBOOST_INC
|
||||||
export QC_WITH_LIBBOOST_LIB
|
export QC_DISABLE_libnotify
|
||||||
export QC_DISABLE_geoip_database
|
export QC_DISABLE_geoip_database
|
||||||
export QC_WITH_GEOIP_DATABASE_EMBEDDED
|
export QC_WITH_GEOIP_DATABASE_EMBEDDED
|
||||||
export QC_WITH_QTSINGLEAPPLICATION
|
|
||||||
export QC_VERBOSE
|
export QC_VERBOSE
|
||||||
rm -rf .qconftemp
|
rm -rf .qconftemp
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -1,44 +0,0 @@
|
|||||||
.\" This manpage has been automatically generated by docbook2man
|
|
||||||
.\" from a DocBook document. This tool can be found at:
|
|
||||||
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
|
||||||
.TH "QBITTORRENT\-NOX" "1" "January 16th 2010" "Command line Bittorrent client written in C++ / Qt4" ""
|
|
||||||
|
|
||||||
.SH "NAME"
|
|
||||||
qBittorrent\-nox \- a command line Bittorrent client written in C++ / Qt4
|
|
||||||
|
|
||||||
.SH "SYNOPSIS"
|
|
||||||
|
|
||||||
\fBqbittorrent\-nox\fR [\-\-webui-port=x] [TORRENT_FILE | URL]...
|
|
||||||
|
|
||||||
\fBqbittorrent\-nox\fR \-\-help
|
|
||||||
|
|
||||||
\fBqbittorrent\-nox\fR \-\-version
|
|
||||||
|
|
||||||
.PP
|
|
||||||
.SH "DESCRIPTION"
|
|
||||||
|
|
||||||
\fBqBittorrent-nox\fR is an advanced command-line Bittorrent client written in C++ / Qt4,
|
|
||||||
using the \fBlibtorrent-rasterbar\fR library by Arvid Norberg. qBittorrent\-nox aims
|
|
||||||
to be a good alternative to other command line bittorrent clients and provides features similar to popular graphical clients.
|
|
||||||
|
|
||||||
qBittorrent\-nox is fast, stable, light and it supports unicode.
|
|
||||||
It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),
|
|
||||||
FAST extension (mainline) and PeX support (utorrent compatible).
|
|
||||||
|
|
||||||
qBittorrent\-nox is meant to be controlled via its feature-rich Web UI which is accessible as a default on http://localhost:8080. The Web UI access is secured and the default account user name is "admin" with "adminadmin" as a password.
|
|
||||||
|
|
||||||
.SH "OPTIONS"
|
|
||||||
|
|
||||||
\fB--help\fR Prints the command line options.
|
|
||||||
|
|
||||||
\fB--version\fR Prints qbittorrent program version number.
|
|
||||||
|
|
||||||
\fB--webui-port=x\fR Changes Web UI port to x (default: 8080).
|
|
||||||
|
|
||||||
.SH "BUGS"
|
|
||||||
|
|
||||||
If you find a bug, please report it at http://bugs.qbittorrent.org
|
|
||||||
|
|
||||||
.SH "AUTHOR"
|
|
||||||
|
|
||||||
Christophe Dumez <chris@qbittorrent.org>
|
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
.\" This manpage has been automatically generated by docbook2man
|
.\" This manpage has been automatically generated by docbook2man
|
||||||
.\" from a DocBook document. This tool can be found at:
|
.\" from a DocBook document. This tool can be found at:
|
||||||
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/>.
|
||||||
.TH "QBITTORRENT" "1" "January 16th 2010" "Bittorrent client written in C++ / Qt4" ""
|
.TH "QBITTORRENT" "1" "September 30th 2009" "Bittorrent client written in C++ / Qt4" ""
|
||||||
|
|
||||||
.SH "NAME"
|
.SH "NAME"
|
||||||
qBittorrent \- a Bittorrent client written in C++ / Qt4
|
qBittorrent \- a Bittorrent client written in C++ / Qt4
|
||||||
|
|
||||||
.SH "SYNOPSIS"
|
.SH "SYNOPSIS"
|
||||||
|
|
||||||
\fBqbittorrent\fR [\-\-no-splash] [\-\-webui-port=x] [TORRENT_FILE | URL]...
|
\fBqbittorrent\fR [\-\-no-splash] [TORRENT_FILE | URL]...
|
||||||
|
|
||||||
\fBqbittorrent\fR \-\-help
|
\fBqbittorrent\fR \-\-help
|
||||||
|
|
||||||
@@ -18,9 +18,10 @@ qBittorrent \- a Bittorrent client written in C++ / Qt4
|
|||||||
.SH "DESCRIPTION"
|
.SH "DESCRIPTION"
|
||||||
|
|
||||||
\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4,
|
\fBqBittorrent\fR is an advanced Bittorrent client written in C++ / Qt4,
|
||||||
using the \fBlibtorrent-rasterbar\fR library by Arvid Norberg. qBittorrent is similar to uTorrent. qBittorrent
|
using the \fBrblibtorrent\fR library by Arvid Norberg. qBittorrent aims
|
||||||
|
to be a good alternative to all other bittorrent clients out there. qBittorrent
|
||||||
is fast, stable, light, it supports unicode and it provides a good integrated search engine.
|
is fast, stable, light, it supports unicode and it provides a good integrated search engine.
|
||||||
It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),
|
It also comes with UPnP port forwarding / NAT-PMP, encryption (Azureus compatible),
|
||||||
FAST extension (mainline) and PeX support (utorrent compatible).
|
FAST extension (mainline) and PeX support (utorrent compatible).
|
||||||
|
|
||||||
.SH "OPTIONS"
|
.SH "OPTIONS"
|
||||||
@@ -31,8 +32,6 @@ FAST extension (mainline) and PeX support (utorrent compatible).
|
|||||||
|
|
||||||
\fB--no-splash\fR Disables splash screen on startup.
|
\fB--no-splash\fR Disables splash screen on startup.
|
||||||
|
|
||||||
\fB--webui-port=x\fR Changes Web UI port to x (default: 8080).
|
|
||||||
|
|
||||||
.SH "BUGS"
|
.SH "BUGS"
|
||||||
|
|
||||||
If you find a bug, please report it at http://bugs.qbittorrent.org
|
If you find a bug, please report it at http://bugs.qbittorrent.org
|
||||||
|
|||||||
182
install.os2
@@ -1,182 +0,0 @@
|
|||||||
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 reproducable 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-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
|
|
||||||
|
|
||||||
31
macxconf.pri
@@ -1,31 +0,0 @@
|
|||||||
PREFIX = /usr/local
|
|
||||||
BINDIR = /usr/local/bin
|
|
||||||
DATADIR = /usr/local/share
|
|
||||||
|
|
||||||
# Use pkg-config to get all necessary libtorrent DEFINES
|
|
||||||
CONFIG += link_pkgconfig
|
|
||||||
PKGCONFIG += libtorrent-rasterbar
|
|
||||||
DEFINES += BOOST_ASIO_DYN_LINK
|
|
||||||
|
|
||||||
# Special include/libs paths (macports)
|
|
||||||
INCLUDEPATH += /usr/include/openssl /usr/include /opt/local/include/boost /opt/local/include
|
|
||||||
LIBS += -L/opt/local/lib
|
|
||||||
|
|
||||||
# OpenSSL lib
|
|
||||||
LIBS += -lssl -lcrypto
|
|
||||||
# Boost system lib
|
|
||||||
LIBS += -lboost_system-mt
|
|
||||||
# Boost filesystem lib (Not needed for libtorrent >= 0.16.0)
|
|
||||||
LIBS += -lboost_filesystem-mt
|
|
||||||
# Carbon
|
|
||||||
LIBS += -framework Carbon -framework IOKit
|
|
||||||
|
|
||||||
document_icon.path = Contents/Resources
|
|
||||||
document_icon.files = Icons/qBitTorrentDocument.icns
|
|
||||||
|
|
||||||
QMAKE_BUNDLE_DATA += document_icon
|
|
||||||
ICON = Icons/qbittorrent_mac.icns
|
|
||||||
QMAKE_INFO_PLIST = Info.plist
|
|
||||||
|
|
||||||
DEFINES += WITH_GEOIP_EMBEDDED
|
|
||||||
message("On Mac OS X, GeoIP database must be embedded.")
|
|
||||||
18
os2conf.pri
@@ -1,18 +0,0 @@
|
|||||||
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
|
|
||||||
|
|
||||||
RC_FILE = qbittorrent_os2.rc
|
|
||||||
|
|
||||||
# LIBTORRENT DEFINES
|
|
||||||
DEFINES += WITH_SHIPPED_GEOIP_H
|
|
||||||
|
|
||||||
DEFINES += WITH_GEOIP_EMBEDDED
|
|
||||||
message("On eCS(OS/2), GeoIP database must be embedded.")
|
|
||||||
199
qBittorrent.kdevelop
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
<?xml version = '1.0'?>
|
||||||
|
<kdevelop>
|
||||||
|
<general>
|
||||||
|
<author>Christophe Dumez</author>
|
||||||
|
<email>chris@qbittorrent.org</email>
|
||||||
|
<version>1.0.0</version>
|
||||||
|
<projectmanagement>KDevTrollProject</projectmanagement>
|
||||||
|
<primarylanguage>C++</primarylanguage>
|
||||||
|
<keywords>
|
||||||
|
<keyword>Qt</keyword>
|
||||||
|
</keywords>
|
||||||
|
<projectname>qBittorrent</projectname>
|
||||||
|
<ignoreparts/>
|
||||||
|
<projectdirectory>.</projectdirectory>
|
||||||
|
<absoluteprojectpath>false</absoluteprojectpath>
|
||||||
|
<description/>
|
||||||
|
<defaultencoding/>
|
||||||
|
<versioncontrol>kdevsubversion</versioncontrol>
|
||||||
|
</general>
|
||||||
|
<kdevfileview>
|
||||||
|
<groups>
|
||||||
|
<group pattern="*.cpp;*.cxx;*.h" name="Sources" />
|
||||||
|
<group pattern="*.ui" name="User Interface" />
|
||||||
|
<group pattern="*.png" name="Icons" />
|
||||||
|
<group pattern="*" name="Others" />
|
||||||
|
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||||
|
<hidenonlocation>false</hidenonlocation>
|
||||||
|
</groups>
|
||||||
|
<tree>
|
||||||
|
<hidepatterns>*.o,*.lo,CVS</hidepatterns>
|
||||||
|
<hidenonprojectfiles>false</hidenonprojectfiles>
|
||||||
|
<showvcsfields>false</showvcsfields>
|
||||||
|
</tree>
|
||||||
|
</kdevfileview>
|
||||||
|
<kdevdoctreeview>
|
||||||
|
<ignoretocs>
|
||||||
|
<toc>bash</toc>
|
||||||
|
<toc>bash_bugs</toc>
|
||||||
|
<toc>clanlib</toc>
|
||||||
|
<toc>w3c-dom-level2-html</toc>
|
||||||
|
<toc>fortran_bugs_gcc</toc>
|
||||||
|
<toc>gnome1</toc>
|
||||||
|
<toc>gnustep</toc>
|
||||||
|
<toc>gtk</toc>
|
||||||
|
<toc>gtk_bugs</toc>
|
||||||
|
<toc>haskell</toc>
|
||||||
|
<toc>haskell_bugs_ghc</toc>
|
||||||
|
<toc>java_bugs_gcc</toc>
|
||||||
|
<toc>java_bugs_sun</toc>
|
||||||
|
<toc>kde2book</toc>
|
||||||
|
<toc>opengl</toc>
|
||||||
|
<toc>pascal_bugs_fp</toc>
|
||||||
|
<toc>php</toc>
|
||||||
|
<toc>php_bugs</toc>
|
||||||
|
<toc>perl</toc>
|
||||||
|
<toc>perl_bugs</toc>
|
||||||
|
<toc>python</toc>
|
||||||
|
<toc>python_bugs</toc>
|
||||||
|
<toc>qt-kdev3</toc>
|
||||||
|
<toc>ruby</toc>
|
||||||
|
<toc>ruby_bugs</toc>
|
||||||
|
<toc>sdl</toc>
|
||||||
|
<toc>stl</toc>
|
||||||
|
<toc>w3c-svg</toc>
|
||||||
|
<toc>sw</toc>
|
||||||
|
<toc>w3c-uaag10</toc>
|
||||||
|
<toc>wxwidgets_bugs</toc>
|
||||||
|
</ignoretocs>
|
||||||
|
<ignoredoxygen>
|
||||||
|
<toc>KDE Libraries (Doxygen)</toc>
|
||||||
|
</ignoredoxygen>
|
||||||
|
</kdevdoctreeview>
|
||||||
|
<kdevdebugger>
|
||||||
|
<general>
|
||||||
|
<dbgshell/>
|
||||||
|
<gdbpath/>
|
||||||
|
<configGdbScript/>
|
||||||
|
<runShellScript/>
|
||||||
|
<runGdbScript/>
|
||||||
|
<breakonloadinglibs>true</breakonloadinglibs>
|
||||||
|
<separatetty>false</separatetty>
|
||||||
|
<floatingtoolbar>false</floatingtoolbar>
|
||||||
|
</general>
|
||||||
|
<display>
|
||||||
|
<staticmembers>false</staticmembers>
|
||||||
|
<demanglenames>true</demanglenames>
|
||||||
|
<outputradix>10</outputradix>
|
||||||
|
</display>
|
||||||
|
</kdevdebugger>
|
||||||
|
<kdevcppsupport>
|
||||||
|
<qt>
|
||||||
|
<version>4</version>
|
||||||
|
<used>true</used>
|
||||||
|
<includestyle>4</includestyle>
|
||||||
|
<designerintegration>ExternalDesigner</designerintegration>
|
||||||
|
<root>/usr/lib/qt4</root>
|
||||||
|
<qmake>/usr/bin/qmake</qmake>
|
||||||
|
<designer>/usr/bin/designer</designer>
|
||||||
|
<designerpluginpaths/>
|
||||||
|
</qt>
|
||||||
|
<references>
|
||||||
|
<pcs>automatic_%2Fhome%2Fishanarora%2Fprojects%2Fqbittorrent</pcs>
|
||||||
|
</references>
|
||||||
|
<codecompletion>
|
||||||
|
<automaticCodeCompletion>true</automaticCodeCompletion>
|
||||||
|
<automaticArgumentsHint>true</automaticArgumentsHint>
|
||||||
|
<automaticHeaderCompletion>true</automaticHeaderCompletion>
|
||||||
|
<codeCompletionDelay>250</codeCompletionDelay>
|
||||||
|
<argumentsHintDelay>400</argumentsHintDelay>
|
||||||
|
<headerCompletionDelay>250</headerCompletionDelay>
|
||||||
|
<showOnlyAccessibleItems>false</showOnlyAccessibleItems>
|
||||||
|
<completionBoxItemOrder>0</completionBoxItemOrder>
|
||||||
|
<howEvaluationContextMenu>true</howEvaluationContextMenu>
|
||||||
|
<showCommentWithArgumentHint>true</showCommentWithArgumentHint>
|
||||||
|
<statusBarTypeEvaluation>false</statusBarTypeEvaluation>
|
||||||
|
<namespaceAliases>std=_GLIBCXX_STD;__gnu_cxx=std</namespaceAliases>
|
||||||
|
<processPrimaryTypes>true</processPrimaryTypes>
|
||||||
|
<processFunctionArguments>true</processFunctionArguments>
|
||||||
|
<preProcessAllHeaders>true</preProcessAllHeaders>
|
||||||
|
<parseMissingHeadersExperimental>true</parseMissingHeadersExperimental>
|
||||||
|
<resolveIncludePathsUsingMakeExperimental>true</resolveIncludePathsUsingMakeExperimental>
|
||||||
|
<alwaysParseInBackground>true</alwaysParseInBackground>
|
||||||
|
<usePermanentCaching>true</usePermanentCaching>
|
||||||
|
<alwaysIncludeNamespaces>false</alwaysIncludeNamespaces>
|
||||||
|
<includePaths>.;</includePaths>
|
||||||
|
</codecompletion>
|
||||||
|
<creategettersetter>
|
||||||
|
<prefixGet>get</prefixGet>
|
||||||
|
<prefixSet>set</prefixSet>
|
||||||
|
<prefixVariable>m_,_</prefixVariable>
|
||||||
|
<parameterName>theValue</parameterName>
|
||||||
|
<inlineGet>true</inlineGet>
|
||||||
|
<inlineSet>true</inlineSet>
|
||||||
|
</creategettersetter>
|
||||||
|
<splitheadersource>
|
||||||
|
<enabled>false</enabled>
|
||||||
|
<synchronize>true</synchronize>
|
||||||
|
<orientation>Vertical</orientation>
|
||||||
|
</splitheadersource>
|
||||||
|
</kdevcppsupport>
|
||||||
|
<kdevfilecreate>
|
||||||
|
<filetypes/>
|
||||||
|
<useglobaltypes>
|
||||||
|
<type ext="ui" />
|
||||||
|
<type ext="cpp" />
|
||||||
|
<type ext="h" />
|
||||||
|
</useglobaltypes>
|
||||||
|
</kdevfilecreate>
|
||||||
|
<kdevtrollproject>
|
||||||
|
<general>
|
||||||
|
<activedir>src</activedir>
|
||||||
|
</general>
|
||||||
|
<run>
|
||||||
|
<directoryradio>executable</directoryradio>
|
||||||
|
<mainprogram>/home/ishanarora/projects/qbittorrent/src/qbittorrent</mainprogram>
|
||||||
|
<programargs/>
|
||||||
|
<globaldebugarguments/>
|
||||||
|
<globalcwd>/home/ishanarora/projects/qbittorrent</globalcwd>
|
||||||
|
<useglobalprogram>true</useglobalprogram>
|
||||||
|
<terminal>false</terminal>
|
||||||
|
<autocompile>true</autocompile>
|
||||||
|
<autoinstall>false</autoinstall>
|
||||||
|
<autokdesu>false</autokdesu>
|
||||||
|
<envvars/>
|
||||||
|
</run>
|
||||||
|
<make>
|
||||||
|
<abortonerror>true</abortonerror>
|
||||||
|
<runmultiplejobs>false</runmultiplejobs>
|
||||||
|
<numberofjobs>1</numberofjobs>
|
||||||
|
<dontact>false</dontact>
|
||||||
|
<makebin/>
|
||||||
|
<prio>0</prio>
|
||||||
|
<envvars/>
|
||||||
|
</make>
|
||||||
|
<qmake>
|
||||||
|
<savebehaviour>2</savebehaviour>
|
||||||
|
<replacePaths>false</replacePaths>
|
||||||
|
<disableDefaultOpts>true</disableDefaultOpts>
|
||||||
|
</qmake>
|
||||||
|
</kdevtrollproject>
|
||||||
|
<cppsupportpart>
|
||||||
|
<filetemplates>
|
||||||
|
<interfacesuffix>.h</interfacesuffix>
|
||||||
|
<implementationsuffix>.cpp</implementationsuffix>
|
||||||
|
</filetemplates>
|
||||||
|
</cppsupportpart>
|
||||||
|
<ctagspart>
|
||||||
|
<customArguments/>
|
||||||
|
<customTagfilePath>/home/ishanarora/projects/qbittorrent/tags</customTagfilePath>
|
||||||
|
<activeTagsFiles/>
|
||||||
|
</ctagspart>
|
||||||
|
<kdevdocumentation>
|
||||||
|
<projectdoc>
|
||||||
|
<docsystem/>
|
||||||
|
<docurl/>
|
||||||
|
<usermanualurl/>
|
||||||
|
</projectdoc>
|
||||||
|
</kdevdocumentation>
|
||||||
|
</kdevelop>
|
||||||
@@ -1,18 +1,6 @@
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
|
include(conf.pri)
|
||||||
|
|
||||||
SUBDIRS += src
|
SUBDIRS += src
|
||||||
|
|
||||||
include(version.pri)
|
|
||||||
|
|
||||||
# Dist
|
|
||||||
dist.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/ &&
|
|
||||||
dist.commands += git clone . ../$${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
dist.commands += rm -fR ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.git &&
|
|
||||||
dist.commands += rm -f ../$${PROJECT_NAME}-$${PROJECT_VERSION}/.gitignore &&
|
|
||||||
dist.commands += cd .. &&
|
|
||||||
dist.commands += tar czf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar.gz $${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
dist.commands += tar cf $${PROJECT_NAME}-$${PROJECT_VERSION}.tar $${PROJECT_NAME}-$${PROJECT_VERSION} &&
|
|
||||||
dist.commands += xz -f $${PROJECT_NAME}-$${PROJECT_VERSION}.tar &&
|
|
||||||
dist.commands += rm -fR $${PROJECT_NAME}-$${PROJECT_VERSION}
|
|
||||||
|
|
||||||
QMAKE_EXTRA_TARGETS += dist
|
|
||||||
|
|||||||
@@ -6,20 +6,14 @@
|
|||||||
<dep type='qt4'>
|
<dep type='qt4'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='qt-dbus'>
|
|
||||||
</dep>
|
|
||||||
<dep type='pkg-config'>
|
|
||||||
<required/>
|
|
||||||
</dep>
|
|
||||||
<dep type='libtorrent-rasterbar'>
|
<dep type='libtorrent-rasterbar'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='libboost'>
|
<dep type='libboost'>
|
||||||
<required/>
|
<required/>
|
||||||
</dep>
|
</dep>
|
||||||
|
<dep type='libnotify'>
|
||||||
|
</dep>
|
||||||
<dep type='geoip-database'>
|
<dep type='geoip-database'>
|
||||||
</dep>
|
</dep>
|
||||||
<dep type='qtsingleapplication'>
|
|
||||||
<required/>
|
|
||||||
</dep>
|
|
||||||
</qconf>
|
</qconf>
|
||||||
|
|||||||
@@ -11,15 +11,7 @@ public:
|
|||||||
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
qc_geoip_database(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "GeoIP Database (optional)"; }
|
QString name() const { return "GeoIP Database (optional)"; }
|
||||||
QString shortname() const { return "GeoIP Database"; }
|
QString shortname() const { return "GeoIP Database"; }
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec() {
|
bool exec() {
|
||||||
if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#ifdef Q_WS_X11
|
#ifdef Q_WS_X11
|
||||||
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
133
qcm/libboost.qcm
@@ -2,96 +2,55 @@
|
|||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: libboost
|
name: libboost
|
||||||
arg: with-libboost-inc=[path], Path to libboost include files
|
arg: with-libboost-inc=[path], Path to libboost include files
|
||||||
arg: with-libboost-lib=[path], Path to libboost library files
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
#include <boost/version.hpp>
|
|
||||||
#include <libtorrent/version.hpp>
|
|
||||||
|
|
||||||
class qc_libboost : public ConfObj
|
class qc_libboost : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libboost(Conf *c) : ConfObj(c) {}
|
qc_libboost(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libboost"; }
|
QString name() const { return "libboost"; }
|
||||||
QString shortname() const { return "libboost"; }
|
QString shortname() const { return "libboost"; }
|
||||||
|
bool exec(){
|
||||||
QString findBoostLib(QString path, QString lib) const {
|
QString s;
|
||||||
QString name;
|
s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
||||||
QDir libDir(path);
|
if(!s.isEmpty()) {
|
||||||
QStringList filters;
|
if(!conf->checkHeader(s, "boost/format.hpp")) {
|
||||||
filters << "libboost_"+lib+"*-mt*.so";
|
return false;
|
||||||
QStringList result = libDir.entryList(filters, QDir::Files);
|
}
|
||||||
if(!result.empty()) {
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
name = result.first().mid(3);
|
return false;
|
||||||
// Remove .so
|
}
|
||||||
name.chop(3);
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
} else {
|
return false;
|
||||||
// Fall back to non -mt boost lib
|
}
|
||||||
filters.clear();
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
filters << "libboost_"+lib+"*.so";
|
return false;
|
||||||
result = libDir.entryList(filters, QDir::Files);
|
}
|
||||||
if(!result.empty()) {
|
}else{
|
||||||
name = result.first().mid(3);
|
QStringList sl;
|
||||||
// Remove .so
|
sl << "/usr/include";
|
||||||
name.chop(3);
|
sl << "/usr/local/include";
|
||||||
}
|
bool found = false;
|
||||||
}
|
foreach(s, sl){
|
||||||
return name;
|
if(conf->checkHeader(s, "boost/format.hpp")){
|
||||||
}
|
found = true;
|
||||||
|
break;
|
||||||
bool exec(){
|
}
|
||||||
QStringList sl;
|
}
|
||||||
QString s = conf->getenv("QC_WITH_LIBBOOST_INC");
|
if(!found) {
|
||||||
if (!s.isEmpty())
|
return false;
|
||||||
sl << s;
|
}
|
||||||
sl << "/usr/include";
|
if(!conf->checkHeader(s, "boost/date_time/posix_time/posix_time.hpp")) {
|
||||||
sl << "/usr/local/include";
|
return false;
|
||||||
bool found = false;
|
}
|
||||||
foreach (s, sl) {
|
if(!conf->checkHeader(s, "boost/filesystem/path.hpp")) {
|
||||||
if (conf->checkHeader(s, "boost/format.hpp")
|
return false;
|
||||||
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
|
}
|
||||||
&& conf->checkHeader(s, "boost/filesystem/path.hpp")
|
if(!conf->checkHeader(s, "boost/thread.hpp")) {
|
||||||
#endif
|
return false;
|
||||||
) {
|
}
|
||||||
found = true;
|
}
|
||||||
break;
|
conf->addIncludePath(s);
|
||||||
}
|
return true;
|
||||||
}
|
}
|
||||||
if (!found)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
conf->addIncludePath(s);
|
|
||||||
|
|
||||||
// Find library
|
|
||||||
s = conf->getenv("QC_WITH_LIBBOOST_LIB");
|
|
||||||
QStringList required_libs;
|
|
||||||
#if BOOST_VERSION >= 103500
|
|
||||||
required_libs << "system";
|
|
||||||
#endif
|
|
||||||
#if LIBTORRENT_VERSION_MAJOR == 0 && LIBTORRENT_VERSION_MINOR < 16
|
|
||||||
required_libs << "filesystem" ;
|
|
||||||
#endif
|
|
||||||
required_libs << "thread";
|
|
||||||
QStringList libDirs;
|
|
||||||
if (!s.isEmpty())
|
|
||||||
libDirs << s;
|
|
||||||
libDirs << "/usr/lib/" << "/usr/lib64/" << "/usr/local/lib/" << "/usr/local/lib64/";
|
|
||||||
|
|
||||||
foreach(const QString& lib, required_libs) {
|
|
||||||
bool found = false;
|
|
||||||
foreach(const QString& libDir, libDirs) {
|
|
||||||
QString detected_name = findBoostLib(libDir, lib);
|
|
||||||
if(!detected_name.isEmpty()) {
|
|
||||||
conf->addLib("-l"+detected_name);
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!found) {
|
|
||||||
printf("Could not find boost %s library!\n", qPrintable(lib));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -10,21 +10,13 @@ public:
|
|||||||
qc_libnotify(Conf *c) : ConfObj(c) {}
|
qc_libnotify(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
QString name() const { return "libnotify >= 0.4.2 (optional)"; }
|
||||||
QString shortname() const { return "libnotify"; }
|
QString shortname() const { return "libnotify"; }
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec(){
|
bool exec(){
|
||||||
if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.4.2";
|
QString req_ver = "0.4.2";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
VersionMode mode = VersionMin;
|
VersionMode mode = VersionMin;
|
||||||
if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) {
|
if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) {
|
||||||
conf->addExtra("CONFIG += libnotify");
|
conf->addDefine("WITH_LIBNOTIFY");
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
conf->addIncludePath(incs[n]);
|
conf->addIncludePath(incs[n]);
|
||||||
if(!libs.isEmpty())
|
if(!libs.isEmpty())
|
||||||
@@ -40,21 +32,10 @@ public:
|
|||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
QStringList incs3;
|
|
||||||
QString req_ver3 = "2.0";
|
|
||||||
QString version3, libs3, other3;
|
|
||||||
if(conf->findPkgConfig("gtk+-2.0", mode, req_ver3, &version3, &incs3, &libs3, &other3)) {
|
|
||||||
for(int n = 0; n < incs3.count(); ++n)
|
|
||||||
conf->addIncludePath(incs3[n]);
|
|
||||||
if(!libs3.isEmpty())
|
|
||||||
conf->addLib(libs3);
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -8,17 +8,24 @@ class qc_libtorrent_rasterbar : public ConfObj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "libtorrent-rasterbar >= 0.15.0"; }
|
QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.15.0 advised)"; }
|
||||||
QString shortname() const { return "libtorrent-rasterbar"; }
|
QString shortname() const { return "libtorrent-rasterbar"; }
|
||||||
bool exec(){
|
bool exec(){
|
||||||
QStringList incs;
|
QStringList incs;
|
||||||
QString req_ver = "0.15.0";
|
QString req_ver = "0.14.0";
|
||||||
|
QString adv_ver = "0.15.0";
|
||||||
QString version, libs, other;
|
QString version, libs, other;
|
||||||
VersionMode mode = VersionMin;
|
VersionMode mode = VersionMin;
|
||||||
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other))
|
||||||
return false;
|
return false;
|
||||||
for(int n = 0; n < incs.count(); ++n)
|
for(int n = 0; n < incs.count(); ++n)
|
||||||
conf->addIncludePath(incs[n]);
|
conf->addIncludePath(incs[n]);
|
||||||
|
if(!libs.isEmpty())
|
||||||
|
conf->addLib(libs);
|
||||||
|
if(!conf->findPkgConfig("libtorrent-rasterbar", mode, adv_ver, &version, &incs, &libs, &other))
|
||||||
|
printf("\nWarning: libtorrent-rasterbar v%s was detected.\nAlthough it will compile and run, you will be missing some features. Please consider updating to v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data());
|
||||||
|
else
|
||||||
|
conf->addDefine("LIBTORRENT_0_15");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: pkg-config
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
#include <QProcess>
|
|
||||||
class qc_pkg_config : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_pkg_config(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "pkg-config executable"; }
|
|
||||||
QString shortname() const { return "pkg-config"; }
|
|
||||||
bool exec(){
|
|
||||||
return !conf->findProgram("pkg-config").isEmpty();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: qt-dbus
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
// see Conf::findPkgConfig
|
|
||||||
class qc_qt_dbus : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qt_dbus(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "QtDBus >= 4.5"; }
|
|
||||||
QString shortname() const { return "qt-dbus"; }
|
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_dbus").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec(){
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_dbus").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return false;
|
|
||||||
QStringList incs;
|
|
||||||
QString req_ver = "4.5.0";
|
|
||||||
QString version, libs, other;
|
|
||||||
VersionMode mode = VersionMin;
|
|
||||||
if(conf->findPkgConfig("QtDBus", mode, req_ver, &version, &incs, &libs, &other)) {
|
|
||||||
conf->addExtra("CONFIG += dbus");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: qt-svg
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
// see Conf::findPkgConfig
|
|
||||||
class qc_qt_svg : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qt_svg(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "QtSvg >= 4.5"; }
|
|
||||||
QString shortname() const { return "qt-svg"; }
|
|
||||||
QString checkString() const {
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_svg").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return "";
|
|
||||||
return ConfObj::checkString();
|
|
||||||
}
|
|
||||||
bool exec(){
|
|
||||||
if(!conf->getenv("QC_DISABLE_qt_svg").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty())
|
|
||||||
return false;
|
|
||||||
QStringList incs;
|
|
||||||
QString req_ver = "4.5.0";
|
|
||||||
QString version, libs, other;
|
|
||||||
VersionMode mode = VersionMin;
|
|
||||||
if(conf->findPkgConfig("QtSvg", mode, req_ver, &version, &incs, &libs, &other)) {
|
|
||||||
conf->addExtra("CONFIG += svg");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
30
qcm/qt4.qcm
@@ -1,36 +1,20 @@
|
|||||||
/*
|
/*
|
||||||
-----BEGIN QCMOD-----
|
-----BEGIN QCMOD-----
|
||||||
name: Qt >= 4.6
|
name: Qt >= 4.4
|
||||||
arg: enable-debug, Enable debug mode
|
|
||||||
arg: disable-gui, Disable qBittorrent Graphical user interface for headless running
|
|
||||||
-----END QCMOD-----
|
-----END QCMOD-----
|
||||||
*/
|
*/
|
||||||
class qc_qt4 : public ConfObj
|
class qc_qt4 : public ConfObj
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
qc_qt4(Conf *c) : ConfObj(c) {}
|
qc_qt4(Conf *c) : ConfObj(c) {}
|
||||||
QString name() const { return "Qt >= 4.6"; }
|
QString name() const { return "Qt >= 4.4"; }
|
||||||
QString shortname() const { return "Qt 4.6"; }
|
QString shortname() const { return "Qt 4.4"; }
|
||||||
bool exec()
|
bool exec()
|
||||||
{
|
{
|
||||||
// NOX mode
|
if(QT_VERSION >= 0x040500) {
|
||||||
if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) {
|
conf->addDefine("QT_4_5");
|
||||||
conf->addExtra("CONFIG += nox");
|
|
||||||
}
|
|
||||||
// Debug mode
|
|
||||||
if(!conf->getenv("QC_ENABLE_DEBUG").isEmpty()) {
|
|
||||||
conf->addExtra("CONFIG -= release");
|
|
||||||
conf->addExtra("CONFIG += debug");
|
|
||||||
} else {
|
|
||||||
conf->addExtra("CONFIG -= debug");
|
|
||||||
conf->addExtra("CONFIG += release");
|
|
||||||
}
|
}
|
||||||
#ifdef Q_OS_FREEBSD
|
return(QT_VERSION >= 0x040400);
|
||||||
conf->addLib("-lexecinfo");
|
|
||||||
conf->addExtra("MANPREFIX = $$PREFIX");
|
|
||||||
#else
|
|
||||||
conf->addExtra("MANPREFIX = $$PREFIX/share");
|
|
||||||
#endif
|
|
||||||
return(QT_VERSION >= 0x040600);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
-----BEGIN QCMOD-----
|
|
||||||
name: qtsingleapplication
|
|
||||||
arg: with-qtsingleapplication=[system|shipped], Use the shipped qtsingleapplication library or the system one
|
|
||||||
-----END QCMOD-----
|
|
||||||
*/
|
|
||||||
class qc_qtsingleapplication : public ConfObj
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
qc_qtsingleapplication(Conf *c) : ConfObj(c) {}
|
|
||||||
QString name() const { return "qtsingleapplication library"; }
|
|
||||||
QString shortname() const { return "qtsingleapplication"; }
|
|
||||||
|
|
||||||
bool exec(){
|
|
||||||
QString s;
|
|
||||||
s = conf->getenv("QC_WITH_QTSINGLEAPPLICATION");
|
|
||||||
if(s.compare("system", Qt::CaseInsensitive) == 0) {
|
|
||||||
// System
|
|
||||||
conf->addExtra("CONFIG += usesystemqtsingleapplication");
|
|
||||||
printf(" [system] ");
|
|
||||||
} else {
|
|
||||||
printf(" [shipped] ");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
918
src/GUI.cpp
Normal file
@@ -0,0 +1,918 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
#ifdef WITH_LIBNOTIFY
|
||||||
|
#include <glib.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <libnotify/notify.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QStatusBar>
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QLocalServer>
|
||||||
|
#include <QLocalSocket>
|
||||||
|
#include <QCloseEvent>
|
||||||
|
#include <QShortcut>
|
||||||
|
|
||||||
|
#include "GUI.h"
|
||||||
|
#include "transferlistwidget.h"
|
||||||
|
#include "misc.h"
|
||||||
|
#include "createtorrent_imp.h"
|
||||||
|
#include "downloadfromurldlg.h"
|
||||||
|
#include "torrentadditiondlg.h"
|
||||||
|
#include "searchengine.h"
|
||||||
|
#include "rss_imp.h"
|
||||||
|
#include "bittorrent.h"
|
||||||
|
#include "about_imp.h"
|
||||||
|
#include "trackerlogin.h"
|
||||||
|
#include "options_imp.h"
|
||||||
|
#include "speedlimitdlg.h"
|
||||||
|
#include "preferences.h"
|
||||||
|
#include "console_imp.h"
|
||||||
|
#include "torrentpersistentdata.h"
|
||||||
|
#include "transferlistfilterswidget.h"
|
||||||
|
#include "propertieswidget.h"
|
||||||
|
#include "statusbar.h"
|
||||||
|
|
||||||
|
using namespace libtorrent;
|
||||||
|
|
||||||
|
#define TIME_TRAY_BALLOON 5000
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* *
|
||||||
|
* GUI *
|
||||||
|
* *
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
GUI::GUI(QWidget *parent, QStringList torrentCmdLine) : QMainWindow(parent), displaySpeedInTitle(false), force_exit(false) {
|
||||||
|
setupUi(this);
|
||||||
|
setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent v0.x").arg(QString::fromUtf8(VERSION)));
|
||||||
|
// Setting icons
|
||||||
|
this->setWindowIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||||
|
actionOpen->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/open.png")));
|
||||||
|
actionExit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/exit.png")));
|
||||||
|
actionDownload_from_URL->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/url.png")));
|
||||||
|
actionOptions->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/settings.png")));
|
||||||
|
actionAbout->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/info.png")));
|
||||||
|
actionWebsite->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent32.png")));
|
||||||
|
actionBugReport->setIcon(QIcon(QString::fromUtf8(":/Icons/oxygen/bug.png")));
|
||||||
|
actionStart->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play.png")));
|
||||||
|
actionPause->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause.png")));
|
||||||
|
actionDelete->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||||
|
actionPause_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/pause_all.png")));
|
||||||
|
actionStart_All->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/play_all.png")));
|
||||||
|
actionClearLog->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/delete.png")));
|
||||||
|
actionPreview_file->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/preview.png")));
|
||||||
|
actionSet_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||||
|
actionSet_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png")));
|
||||||
|
actionSet_global_upload_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/seeding.png")));
|
||||||
|
actionSet_global_download_limit->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/download.png")));
|
||||||
|
actionDocumentation->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/qb_question.png")));
|
||||||
|
prioSeparator = toolBar->insertSeparator(actionDecreasePriority);
|
||||||
|
prioSeparator2 = menu_Edit->insertSeparator(actionDecreasePriority);
|
||||||
|
prioSeparator->setVisible(false);
|
||||||
|
prioSeparator2->setVisible(false);
|
||||||
|
actionCreate_torrent->setIcon(QIcon(QString::fromUtf8(":/Icons/skin/new.png")));
|
||||||
|
// Fix Tool bar layout
|
||||||
|
toolBar->layout()->setSpacing(7);
|
||||||
|
// Creating Bittorrent session
|
||||||
|
BTSession = new Bittorrent();
|
||||||
|
connect(BTSession, SIGNAL(fullDiskError(QTorrentHandle&, QString)), this, SLOT(fullDiskError(QTorrentHandle&, QString)));
|
||||||
|
connect(BTSession, SIGNAL(finishedTorrent(QTorrentHandle&)), this, SLOT(finishedTorrent(QTorrentHandle&)));
|
||||||
|
connect(BTSession, SIGNAL(trackerAuthenticationRequired(QTorrentHandle&)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle&)));
|
||||||
|
connect(BTSession, SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString)));
|
||||||
|
connect(BTSession, SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString)));
|
||||||
|
|
||||||
|
qDebug("create tabWidget");
|
||||||
|
tabs = new QTabWidget();
|
||||||
|
connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int)));
|
||||||
|
vSplitter = new QSplitter(Qt::Horizontal);
|
||||||
|
//vSplitter->setChildrenCollapsible(false);
|
||||||
|
hSplitter = new QSplitter(Qt::Vertical);
|
||||||
|
hSplitter->setChildrenCollapsible(false);
|
||||||
|
|
||||||
|
// Transfer List tab
|
||||||
|
transferList = new TransferListWidget(hSplitter, this, BTSession);
|
||||||
|
properties = new PropertiesWidget(hSplitter, this, transferList, BTSession);
|
||||||
|
transferListFilters = new TransferListFiltersWidget(vSplitter, transferList);
|
||||||
|
hSplitter->addWidget(transferList);
|
||||||
|
hSplitter->addWidget(properties);
|
||||||
|
vSplitter->addWidget(transferListFilters);
|
||||||
|
vSplitter->addWidget(hSplitter);
|
||||||
|
vSplitter->setCollapsible(0, true);
|
||||||
|
vSplitter->setCollapsible(1, false);
|
||||||
|
tabs->addTab(vSplitter, QIcon(QString::fromUtf8(":/Icons/oxygen/folder-remote.png")), tr("Transfers"));
|
||||||
|
vboxLayout->addWidget(tabs);
|
||||||
|
|
||||||
|
// Transfer list slots
|
||||||
|
connect(actionStart, SIGNAL(triggered()), transferList, SLOT(startSelectedTorrents()));
|
||||||
|
connect(actionStart_All, SIGNAL(triggered()), transferList, SLOT(startAllTorrents()));
|
||||||
|
connect(actionPause, SIGNAL(triggered()), transferList, SLOT(pauseSelectedTorrents()));
|
||||||
|
connect(actionPause_All, SIGNAL(triggered()), transferList, SLOT(pauseAllTorrents()));
|
||||||
|
connect(actionDelete, SIGNAL(triggered()), transferList, SLOT(deleteSelectedTorrents()));
|
||||||
|
connect(actionIncreasePriority, SIGNAL(triggered()), transferList, SLOT(increasePrioSelectedTorrents()));
|
||||||
|
connect(actionDecreasePriority, SIGNAL(triggered()), transferList, SLOT(decreasePrioSelectedTorrents()));
|
||||||
|
|
||||||
|
// Search engine tab
|
||||||
|
searchEngine = new SearchEngine(this, BTSession);
|
||||||
|
tabs->addTab(searchEngine, QIcon(QString::fromUtf8(":/Icons/oxygen/edit-find.png")), tr("Search"));
|
||||||
|
|
||||||
|
// Configure BT session according to options
|
||||||
|
loadPreferences(false);
|
||||||
|
// Resume unfinished torrents
|
||||||
|
BTSession->startUpTorrents();
|
||||||
|
// Add torrent given on command line
|
||||||
|
processParams(torrentCmdLine);
|
||||||
|
// Use a tcp server to allow only one instance of qBittorrent
|
||||||
|
localServer = new QLocalServer();
|
||||||
|
QString uid = QString::number(getuid());
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
if(QFile::exists(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid)) {
|
||||||
|
// Socket was not closed cleanly
|
||||||
|
std::cerr << "Warning: Local domain socket was not closed cleanly, deleting file...\n";
|
||||||
|
QFile::remove(QDir::tempPath()+QDir::separator()+QString("qBittorrent-")+uid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (!localServer->listen("qBittorrent-"+uid)) {
|
||||||
|
std::cerr << "Couldn't create socket, single instance mode won't work...\n";
|
||||||
|
}
|
||||||
|
connect(localServer, SIGNAL(newConnection()), this, SLOT(acceptConnection()));
|
||||||
|
// Start connection checking timer
|
||||||
|
guiUpdater = new QTimer(this);
|
||||||
|
connect(guiUpdater, SIGNAL(timeout()), this, SLOT(updateGUI()));
|
||||||
|
guiUpdater->start(2000);
|
||||||
|
// Accept drag 'n drops
|
||||||
|
setAcceptDrops(true);
|
||||||
|
createKeyboardShortcuts();
|
||||||
|
// Create status bar
|
||||||
|
status_bar = new StatusBar(QMainWindow::statusBar(), BTSession);
|
||||||
|
|
||||||
|
show();
|
||||||
|
|
||||||
|
// Load Window state and sizes
|
||||||
|
readSettings();
|
||||||
|
properties->readSettings();
|
||||||
|
|
||||||
|
if(Preferences::startMinimized()) {
|
||||||
|
setWindowState(Qt::WindowMinimized);
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug("GUI Built");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
GUI::~GUI() {
|
||||||
|
qDebug("GUI destruction");
|
||||||
|
hide();
|
||||||
|
// Async deletion of Bittorrent session as early as possible
|
||||||
|
// in order to speed up exit
|
||||||
|
session_proxy sp = BTSession->asyncDeletion();
|
||||||
|
// Some saving
|
||||||
|
properties->saveSettings();
|
||||||
|
disconnect(tabs, SIGNAL(currentChanged(int)), this, SLOT(tab_changed(int)));
|
||||||
|
// Delete other GUI objects
|
||||||
|
delete status_bar;
|
||||||
|
delete transferList;
|
||||||
|
delete guiUpdater;
|
||||||
|
|
||||||
|
if(rssWidget)
|
||||||
|
delete rssWidget;
|
||||||
|
delete searchEngine;
|
||||||
|
delete transferListFilters;
|
||||||
|
delete properties;
|
||||||
|
delete hSplitter;
|
||||||
|
delete vSplitter;
|
||||||
|
if(systrayCreator) {
|
||||||
|
delete systrayCreator;
|
||||||
|
}
|
||||||
|
if(systrayIcon) {
|
||||||
|
delete systrayIcon;
|
||||||
|
delete myTrayIconMenu;
|
||||||
|
}
|
||||||
|
localServer->close();
|
||||||
|
delete localServer;
|
||||||
|
delete tabs;
|
||||||
|
// Keyboard shortcuts
|
||||||
|
delete switchSearchShortcut;
|
||||||
|
delete switchSearchShortcut2;
|
||||||
|
delete switchTransferShortcut;
|
||||||
|
delete switchRSSShortcut;
|
||||||
|
// Delete BTSession objects
|
||||||
|
delete BTSession;
|
||||||
|
// May freeze for a few seconds after the next line
|
||||||
|
// because the Bittorrent session proxy will
|
||||||
|
// actually be deleted now and destruction
|
||||||
|
// becomes synchronous
|
||||||
|
qDebug("Exiting GUI destructor...");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::displayRSSTab(bool enable) {
|
||||||
|
if(enable) {
|
||||||
|
// RSS tab
|
||||||
|
if(!rssWidget) {
|
||||||
|
rssWidget = new RSSImp(BTSession);
|
||||||
|
int index_tab = tabs->addTab(rssWidget, tr("RSS"));
|
||||||
|
tabs->setTabIcon(index_tab, QIcon(QString::fromUtf8(":/Icons/rss32.png")));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(rssWidget) {
|
||||||
|
delete rssWidget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionWebsite_triggered() const {
|
||||||
|
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://www.qbittorrent.org")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionDocumentation_triggered() const {
|
||||||
|
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://doc.qbittorrent.org")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionBugReport_triggered() const {
|
||||||
|
QDesktopServices::openUrl(QUrl(QString::fromUtf8("http://bugs.qbittorrent.org")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::tab_changed(int new_tab) {
|
||||||
|
if(new_tab == TAB_TRANSFER) {
|
||||||
|
qDebug("Changed tab to transfer list, refreshing the list");
|
||||||
|
transferList->refreshList();
|
||||||
|
properties->loadDynamicData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::writeSettings() {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
settings.beginGroup(QString::fromUtf8("MainWindow"));
|
||||||
|
settings.setValue(QString::fromUtf8("size"), size());
|
||||||
|
settings.setValue(QString::fromUtf8("pos"), pos());
|
||||||
|
// Splitter size
|
||||||
|
QStringList sizes_str;
|
||||||
|
sizes_str << QString::number(vSplitter->sizes().first());
|
||||||
|
sizes_str << QString::number(vSplitter->sizes().last());
|
||||||
|
settings.setValue(QString::fromUtf8("vSplitterSizes"), sizes_str);
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
// called when a torrent has finished
|
||||||
|
void GUI::finishedTorrent(QTorrentHandle& h) const {
|
||||||
|
if(!TorrentPersistentData::isSeed(h.hash()))
|
||||||
|
showNotificationBaloon(tr("Download completion"), tr("%1 has finished downloading.", "e.g: xxx.avi has finished downloading.").arg(h.name()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notification when disk is full
|
||||||
|
void GUI::fullDiskError(QTorrentHandle& h, QString msg) const {
|
||||||
|
if(!h.is_valid()) return;
|
||||||
|
showNotificationBaloon(tr("I/O Error", "i.e: Input/Output Error"), tr("An I/O error occured for torrent %1.\n Reason: %2", "e.g: An error occured for torrent xxx.avi.\n Reason: disk is full.").arg(h.name()).arg(msg));
|
||||||
|
// Download will be paused by libtorrent. Updating GUI information accordingly
|
||||||
|
QString hash = h.hash();
|
||||||
|
qDebug("Full disk error, pausing torrent %s", hash.toLocal8Bit().data());
|
||||||
|
BTSession->addConsoleMessage(tr("An error occured (full disk?), '%1' paused.", "e.g: An error occured (full disk?), 'xxx.avi' paused.").arg(h.name()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::createKeyboardShortcuts() {
|
||||||
|
actionCreate_torrent->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+N")));
|
||||||
|
actionOpen->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+O")));
|
||||||
|
actionExit->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Q")));
|
||||||
|
switchTransferShortcut = new QShortcut(QKeySequence(tr("Alt+1", "shortcut to switch to first tab")), this);
|
||||||
|
connect(switchTransferShortcut, SIGNAL(activated()), this, SLOT(displayTransferTab()));
|
||||||
|
switchSearchShortcut = new QShortcut(QKeySequence(tr("Alt+2", "shortcut to switch to third tab")), this);
|
||||||
|
connect(switchSearchShortcut, SIGNAL(activated()), this, SLOT(displaySearchTab()));
|
||||||
|
switchSearchShortcut2 = new QShortcut(QKeySequence(tr("Ctrl+F", "shortcut to switch to search tab")), this);
|
||||||
|
connect(switchSearchShortcut2, SIGNAL(activated()), this, SLOT(displaySearchTab()));
|
||||||
|
switchRSSShortcut = new QShortcut(QKeySequence(tr("Alt+3", "shortcut to switch to fourth tab")), this);
|
||||||
|
connect(switchRSSShortcut, SIGNAL(activated()), this, SLOT(displayRSSTab()));
|
||||||
|
actionDocumentation->setShortcut(QKeySequence("F1"));
|
||||||
|
actionOptions->setShortcut(QKeySequence(QString::fromUtf8("Alt+O")));
|
||||||
|
actionDelete->setShortcut(QKeySequence(QString::fromUtf8("Del")));
|
||||||
|
actionStart->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+S")));
|
||||||
|
actionStart_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+S")));
|
||||||
|
actionPause->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+P")));
|
||||||
|
actionPause_All->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+Shift+P")));
|
||||||
|
actionDecreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl+-")));
|
||||||
|
actionIncreasePriority->setShortcut(QKeySequence(QString::fromUtf8("Ctrl++")));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keyboard shortcuts slots
|
||||||
|
void GUI::displayTransferTab() const {
|
||||||
|
tabs->setCurrentIndex(TAB_TRANSFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::displaySearchTab() const {
|
||||||
|
tabs->setCurrentIndex(TAB_SEARCH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::displayRSSTab() const {
|
||||||
|
tabs->setCurrentIndex(TAB_RSS);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End of keyboard shortcuts slots
|
||||||
|
|
||||||
|
void GUI::readSettings() {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
settings.beginGroup(QString::fromUtf8("MainWindow"));
|
||||||
|
resize(settings.value(QString::fromUtf8("size"), size()).toSize());
|
||||||
|
move(settings.value(QString::fromUtf8("pos"), screenCenter()).toPoint());
|
||||||
|
QStringList sizes_str = settings.value("vSplitterSizes", QStringList()).toStringList();
|
||||||
|
// Splitter size
|
||||||
|
QList<int> sizes;
|
||||||
|
if(sizes_str.size() == 2) {
|
||||||
|
sizes << sizes_str.first().toInt();
|
||||||
|
sizes << sizes_str.last().toInt();
|
||||||
|
} else {
|
||||||
|
qDebug("Default splitter size");
|
||||||
|
sizes << 120;
|
||||||
|
sizes << vSplitter->width()-120;
|
||||||
|
}
|
||||||
|
vSplitter->setSizes(sizes);
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::balloonClicked() {
|
||||||
|
if(isHidden()) {
|
||||||
|
show();
|
||||||
|
if(isMinimized()) {
|
||||||
|
showNormal();
|
||||||
|
}
|
||||||
|
raise();
|
||||||
|
activateWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::acceptConnection() {
|
||||||
|
QLocalSocket *clientConnection = localServer->nextPendingConnection();
|
||||||
|
connect(clientConnection, SIGNAL(disconnected()), this, SLOT(readParamsOnSocket()));
|
||||||
|
qDebug("accepted connection from another instance");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::readParamsOnSocket() {
|
||||||
|
QLocalSocket *clientConnection = static_cast<QLocalSocket*>(sender());
|
||||||
|
if(clientConnection) {
|
||||||
|
QByteArray params = clientConnection->readAll();
|
||||||
|
if(!params.isEmpty()) {
|
||||||
|
processParams(QString::fromUtf8(params.data()).split(QString::fromUtf8("\n")));
|
||||||
|
qDebug("Received parameters from another instance");
|
||||||
|
}
|
||||||
|
clientConnection->deleteLater();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::handleDownloadFromUrlFailure(QString url, QString reason) const{
|
||||||
|
// Display a message box
|
||||||
|
QMessageBox::critical(0, tr("Url download error"), tr("Couldn't download file at url: %1, reason: %2.").arg(url).arg(reason));
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionSet_global_upload_limit_triggered() {
|
||||||
|
qDebug("actionSet_global_upload_limit_triggered");
|
||||||
|
bool ok;
|
||||||
|
long new_limit = SpeedLimitDialog::askSpeedLimit(&ok, tr("Global Upload Speed Limit"), BTSession->getSession()->upload_rate_limit());
|
||||||
|
if(ok) {
|
||||||
|
qDebug("Setting global upload rate limit to %.1fKb/s", new_limit/1024.);
|
||||||
|
BTSession->getSession()->set_upload_rate_limit(new_limit);
|
||||||
|
if(new_limit <= 0)
|
||||||
|
Preferences::setGlobalUploadLimit(-1);
|
||||||
|
else
|
||||||
|
Preferences::setGlobalUploadLimit(new_limit/1024.);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionShow_console_triggered() {
|
||||||
|
new consoleDlg(this, BTSession);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::on_actionSet_global_download_limit_triggered() {
|
||||||
|
qDebug("actionSet_global_download_limit_triggered");
|
||||||
|
bool ok;
|
||||||
|
long new_limit = SpeedLimitDialog::askSpeedLimit(&ok, tr("Global Download Speed Limit"), BTSession->getSession()->download_rate_limit());
|
||||||
|
if(ok) {
|
||||||
|
qDebug("Setting global download rate limit to %.1fKb/s", new_limit/1024.);
|
||||||
|
BTSession->getSession()->set_download_rate_limit(new_limit);
|
||||||
|
if(new_limit <= 0)
|
||||||
|
Preferences::setGlobalDownloadLimit(-1);
|
||||||
|
else
|
||||||
|
Preferences::setGlobalDownloadLimit(new_limit/1024.);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Necessary if we want to close the window
|
||||||
|
// in one time if "close to systray" is enabled
|
||||||
|
void GUI::on_actionExit_triggered() {
|
||||||
|
force_exit = true;
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
int GUI::getCurrentTabIndex() const {
|
||||||
|
if(isMinimized() || !isVisible())
|
||||||
|
return -1;
|
||||||
|
return tabs->currentIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::setTabText(int index, QString text) const {
|
||||||
|
tabs->setTabText(index, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Toggle Main window visibility
|
||||||
|
void GUI::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
|
||||||
|
if(e == QSystemTrayIcon::Trigger || e == QSystemTrayIcon::DoubleClick) {
|
||||||
|
if(isHidden()) {
|
||||||
|
show();
|
||||||
|
if(isMinimized()) {
|
||||||
|
if(isMaximized()) {
|
||||||
|
showMaximized();
|
||||||
|
}else{
|
||||||
|
showNormal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
raise();
|
||||||
|
activateWindow();
|
||||||
|
}else{
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Center window
|
||||||
|
QPoint GUI::screenCenter() const{
|
||||||
|
int scrn = 0;
|
||||||
|
QWidget *w = this->topLevelWidget();
|
||||||
|
|
||||||
|
if(w)
|
||||||
|
scrn = QApplication::desktop()->screenNumber(w);
|
||||||
|
else if(QApplication::desktop()->isVirtualDesktop())
|
||||||
|
scrn = QApplication::desktop()->screenNumber(QCursor::pos());
|
||||||
|
else
|
||||||
|
scrn = QApplication::desktop()->screenNumber(this);
|
||||||
|
|
||||||
|
QRect desk(QApplication::desktop()->availableGeometry(scrn));
|
||||||
|
return QPoint((desk.width() - this->frameGeometry().width()) / 2, (desk.height() - this->frameGeometry().height()) / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display About Dialog
|
||||||
|
void GUI::on_actionAbout_triggered() {
|
||||||
|
//About dialog
|
||||||
|
new about(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::showEvent(QShowEvent *e) {
|
||||||
|
qDebug("** Show Event **");
|
||||||
|
if(getCurrentTabIndex() == TAB_TRANSFER) {
|
||||||
|
qDebug("-> Refreshing transfer list");
|
||||||
|
transferList->refreshList();
|
||||||
|
properties->loadDynamicData();
|
||||||
|
}
|
||||||
|
e->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when we close the program
|
||||||
|
void GUI::closeEvent(QCloseEvent *e) {
|
||||||
|
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
bool goToSystrayOnExit = settings.value(QString::fromUtf8("Preferences/General/CloseToTray"), false).toBool();
|
||||||
|
if(!force_exit && systrayIcon && goToSystrayOnExit && !this->isHidden()) {
|
||||||
|
hide();
|
||||||
|
//e->ignore();
|
||||||
|
e->accept();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(settings.value(QString::fromUtf8("Preferences/General/ExitConfirm"), true).toBool() && BTSession->hasActiveTorrents()) {
|
||||||
|
show();
|
||||||
|
if(!isMaximized())
|
||||||
|
showNormal();
|
||||||
|
if(e->spontaneous() == true || force_exit == true) {
|
||||||
|
if(QMessageBox::question(this,
|
||||||
|
tr("Are you sure you want to quit?")+QString::fromUtf8(" -- ")+tr("qBittorrent"),
|
||||||
|
tr("Some files are currently transferring.\nAre you sure you want to quit qBittorrent?"),
|
||||||
|
tr("&Yes"), tr("&No"),
|
||||||
|
QString(), 0, 1)) {
|
||||||
|
e->ignore();
|
||||||
|
force_exit = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hide();
|
||||||
|
if(systrayIcon) {
|
||||||
|
// Hide tray icon
|
||||||
|
systrayIcon->hide();
|
||||||
|
}
|
||||||
|
// Save window size, columns size
|
||||||
|
writeSettings();
|
||||||
|
// Accept exit
|
||||||
|
e->accept();
|
||||||
|
qApp->exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Display window to create a torrent
|
||||||
|
void GUI::on_actionCreate_torrent_triggered() {
|
||||||
|
createtorrent *ct = new createtorrent(this);
|
||||||
|
connect(ct, SIGNAL(torrent_to_seed(QString)), this, SLOT(addTorrent(QString)));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GUI::event(QEvent * e) {
|
||||||
|
if(e->type() == QEvent::WindowStateChange) {
|
||||||
|
//Now check to see if the window is minimised
|
||||||
|
if(isMinimized()) {
|
||||||
|
qDebug("minimisation");
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
if(systrayIcon && settings.value(QString::fromUtf8("Preferences/General/MinimizeToTray"), false).toBool()) {
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QMainWindow::event(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Action executed when a file is dropped
|
||||||
|
void GUI::dropEvent(QDropEvent *event) {
|
||||||
|
event->acceptProposedAction();
|
||||||
|
QStringList files;
|
||||||
|
if(event->mimeData()->hasUrls()) {
|
||||||
|
QList<QUrl> urls = event->mimeData()->urls();
|
||||||
|
foreach(const QUrl &url, urls) {
|
||||||
|
QString tmp = url.toString().trimmed();
|
||||||
|
if(!tmp.isEmpty())
|
||||||
|
files << url.toString();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
files = event->mimeData()->text().split(QString::fromUtf8("\n"));
|
||||||
|
}
|
||||||
|
// Add file to download list
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||||
|
foreach(QString file, files) {
|
||||||
|
file = file.trimmed().replace(QString::fromUtf8("file://"), QString::fromUtf8(""), Qt::CaseInsensitive);
|
||||||
|
qDebug("Dropped file %s on download list", file.toLocal8Bit().data());
|
||||||
|
if(file.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || file.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) {
|
||||||
|
BTSession->downloadFromUrl(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(file.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||||
|
// FIXME: Possibly skipped torrent addition dialog
|
||||||
|
BTSession->addMagnetUri(file);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(useTorrentAdditionDialog) {
|
||||||
|
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||||
|
dialog->showLoad(file);
|
||||||
|
}else{
|
||||||
|
BTSession->addTorrent(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode if we accept drag 'n drop or not
|
||||||
|
void GUI::dragEnterEvent(QDragEnterEvent *event) {
|
||||||
|
foreach(const QString &mime, event->mimeData()->formats()){
|
||||||
|
qDebug("mimeData: %s", mime.toLocal8Bit().data());
|
||||||
|
}
|
||||||
|
if (event->mimeData()->hasFormat(QString::fromUtf8("text/plain")) || event->mimeData()->hasFormat(QString::fromUtf8("text/uri-list"))) {
|
||||||
|
event->acceptProposedAction();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* *
|
||||||
|
* Torrent *
|
||||||
|
* *
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
// Display a dialog to allow user to add
|
||||||
|
// torrents to download list
|
||||||
|
void GUI::on_actionOpen_triggered() {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
// Open File Open Dialog
|
||||||
|
// Note: it is possible to select more than one file
|
||||||
|
QStringList pathsList = QFileDialog::getOpenFileNames(0,
|
||||||
|
tr("Open Torrent Files"), settings.value(QString::fromUtf8("MainWindowLastDir"), QDir::homePath()).toString(),
|
||||||
|
tr("Torrent Files")+QString::fromUtf8(" (*.torrent)"));
|
||||||
|
if(!pathsList.empty()) {
|
||||||
|
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||||
|
unsigned int listSize = pathsList.size();
|
||||||
|
for(unsigned int i=0; i<listSize; ++i) {
|
||||||
|
if(useTorrentAdditionDialog) {
|
||||||
|
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||||
|
dialog->showLoad(pathsList.at(i));
|
||||||
|
}else{
|
||||||
|
BTSession->addTorrent(pathsList.at(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Save last dir to remember it
|
||||||
|
QStringList top_dir = pathsList.at(0).split(QDir::separator());
|
||||||
|
top_dir.removeLast();
|
||||||
|
settings.setValue(QString::fromUtf8("MainWindowLastDir"), top_dir.join(QDir::separator()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// As program parameters, we can get paths or urls.
|
||||||
|
// This function parse the parameters and call
|
||||||
|
// the right addTorrent function, considering
|
||||||
|
// the parameter type.
|
||||||
|
void GUI::processParams(const QStringList& params) {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||||
|
foreach(QString param, params) {
|
||||||
|
param = param.trimmed();
|
||||||
|
if(param.startsWith("--")) continue;
|
||||||
|
if(param.startsWith(QString::fromUtf8("http://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("ftp://"), Qt::CaseInsensitive) || param.startsWith(QString::fromUtf8("https://"), Qt::CaseInsensitive)) {
|
||||||
|
BTSession->downloadFromUrl(param);
|
||||||
|
}else{
|
||||||
|
if(param.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||||
|
// FIXME: Possibily skipped torrent addition dialog
|
||||||
|
BTSession->addMagnetUri(param);
|
||||||
|
} else {
|
||||||
|
if(useTorrentAdditionDialog) {
|
||||||
|
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||||
|
dialog->showLoad(param);
|
||||||
|
}else{
|
||||||
|
BTSession->addTorrent(param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::addTorrent(QString path) {
|
||||||
|
BTSession->addTorrent(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::processDownloadedFiles(QString path, QString url) {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
|
||||||
|
if(useTorrentAdditionDialog) {
|
||||||
|
torrentAdditionDialog *dialog = new torrentAdditionDialog(this, BTSession);
|
||||||
|
dialog->showLoad(path, url);
|
||||||
|
}else{
|
||||||
|
BTSession->addTorrent(path, false, url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::optionsSaved() {
|
||||||
|
loadPreferences();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load program preferences
|
||||||
|
void GUI::loadPreferences(bool configure_session) {
|
||||||
|
BTSession->addConsoleMessage(tr("Options were saved successfully."));
|
||||||
|
bool newSystrayIntegration = Preferences::systrayIntegration();
|
||||||
|
if(newSystrayIntegration != (systrayIcon!=0)) {
|
||||||
|
if(newSystrayIntegration) {
|
||||||
|
// create the trayicon
|
||||||
|
if(!QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||||
|
if(!configure_session) { // Program startup
|
||||||
|
systrayCreator = new QTimer(this);
|
||||||
|
connect(systrayCreator, SIGNAL(timeout()), this, SLOT(createSystrayDelayed()));
|
||||||
|
systrayCreator->setSingleShot(true);
|
||||||
|
systrayCreator->start(2000);
|
||||||
|
qDebug("Info: System tray is unavailable, trying again later.");
|
||||||
|
} else {
|
||||||
|
qDebug("Warning: System tray is unavailable.");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
createTrayIcon();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Destroy trayicon
|
||||||
|
delete systrayIcon;
|
||||||
|
delete myTrayIconMenu;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// General
|
||||||
|
bool new_displaySpeedInTitle = Preferences::speedInTitleBar();
|
||||||
|
if(!new_displaySpeedInTitle && new_displaySpeedInTitle != displaySpeedInTitle) {
|
||||||
|
// Reset title
|
||||||
|
setWindowTitle(tr("qBittorrent %1", "e.g: qBittorrent vx.x").arg(QString::fromUtf8(VERSION)));
|
||||||
|
}
|
||||||
|
displaySpeedInTitle = new_displaySpeedInTitle;
|
||||||
|
if(Preferences::isToolbarDisplayed()) {
|
||||||
|
toolBar->setVisible(true);
|
||||||
|
toolBar->layout()->setSpacing(7);
|
||||||
|
} else {
|
||||||
|
toolBar->setVisible(false);
|
||||||
|
}
|
||||||
|
unsigned int new_refreshInterval = Preferences::getRefreshInterval();
|
||||||
|
transferList->setRefreshInterval(new_refreshInterval);
|
||||||
|
|
||||||
|
// Queueing System
|
||||||
|
if(Preferences::isQueueingSystemEnabled()) {
|
||||||
|
if(!configure_session || !BTSession->isQueueingEnabled()) {
|
||||||
|
transferList->hidePriorityColumn(false);
|
||||||
|
actionDecreasePriority->setVisible(true);
|
||||||
|
actionIncreasePriority->setVisible(true);
|
||||||
|
prioSeparator->setVisible(true);
|
||||||
|
prioSeparator2->setVisible(true);
|
||||||
|
toolBar->layout()->setSpacing(7);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(BTSession->isQueueingEnabled()) {
|
||||||
|
transferList->hidePriorityColumn(true);
|
||||||
|
actionDecreasePriority->setVisible(false);
|
||||||
|
actionIncreasePriority->setVisible(false);
|
||||||
|
prioSeparator->setVisible(false);
|
||||||
|
prioSeparator2->setVisible(false);
|
||||||
|
toolBar->layout()->setSpacing(7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RSS
|
||||||
|
if(Preferences::isRSSEnabled()) {
|
||||||
|
displayRSSTab(true);
|
||||||
|
rssWidget->updateRefreshInterval(Preferences::getRSSRefreshInterval());
|
||||||
|
} else {
|
||||||
|
displayRSSTab(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Torrent properties
|
||||||
|
properties->reloadPreferences();
|
||||||
|
|
||||||
|
if(configure_session)
|
||||||
|
BTSession->configureSession();
|
||||||
|
|
||||||
|
qDebug("GUI settings loaded");
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker) {
|
||||||
|
// Trackers whose authentication was cancelled
|
||||||
|
if(unauthenticated_trackers.indexOf(tracker) < 0) {
|
||||||
|
unauthenticated_trackers << tracker;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when a tracker requires authentication
|
||||||
|
void GUI::trackerAuthenticationRequired(QTorrentHandle& h) {
|
||||||
|
if(unauthenticated_trackers.indexOf(QPair<QTorrentHandle,QString>(h, h.current_tracker())) < 0) {
|
||||||
|
// Tracker login
|
||||||
|
new trackerLogin(this, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check connection status and display right icon
|
||||||
|
void GUI::updateGUI() {
|
||||||
|
// update global informations
|
||||||
|
if(systrayIcon) {
|
||||||
|
#ifdef Q_WS_WIN
|
||||||
|
// Windows does not support html here
|
||||||
|
QString html =tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)));
|
||||||
|
html += "\n";
|
||||||
|
html += tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)));
|
||||||
|
#else
|
||||||
|
QString html = "<div style='background-color: #678db2; color: #fff;height: 18px; font-weight: bold; margin-bottom: 5px;'>";
|
||||||
|
html += tr("qBittorrent");
|
||||||
|
html += "</div>";
|
||||||
|
html += "<div style='vertical-align: baseline; height: 18px;'>";
|
||||||
|
html += "<img src=':/Icons/skin/download.png'/> "+tr("DL speed: %1 KiB/s", "e.g: Download speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadDownloadRate()/1024., 'f', 1)));
|
||||||
|
html += "</div>";
|
||||||
|
html += "<div style='vertical-align: baseline; height: 18px;'>";
|
||||||
|
html += "<img src=':/Icons/skin/seeding.png'/> "+tr("UP speed: %1 KiB/s", "e.g: Upload speed: 10 KiB/s").arg(QString(QByteArray::number(BTSession->getPayloadUploadRate()/1024., 'f', 1)));
|
||||||
|
html += "</div>";
|
||||||
|
#endif
|
||||||
|
systrayIcon->setToolTip(html); // tray icon
|
||||||
|
}
|
||||||
|
if(displaySpeedInTitle) {
|
||||||
|
setWindowTitle(tr("qBittorrent %1 (Down: %2/s, Up: %3/s)", "%1 is qBittorrent version").arg(QString::fromUtf8(VERSION)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_download_rate)).arg(misc::friendlyUnit(BTSession->getSessionStatus().payload_upload_rate)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::showNotificationBaloon(QString title, QString msg) const {
|
||||||
|
QSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
|
||||||
|
if(settings.value(QString::fromUtf8("Preferences/General/NotificationBaloons"), true).toBool()) {
|
||||||
|
#ifdef WITH_LIBNOTIFY
|
||||||
|
if (notify_init ("summary-body")) {
|
||||||
|
NotifyNotification* notification;
|
||||||
|
notification = notify_notification_new (title.toLocal8Bit().data(), msg.toLocal8Bit().data(), "qbittorrent", 0);
|
||||||
|
gboolean success = notify_notification_show (notification, NULL);
|
||||||
|
g_object_unref(G_OBJECT(notification));
|
||||||
|
notify_uninit ();
|
||||||
|
if(success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if(systrayIcon)
|
||||||
|
systrayIcon->showMessage(title, msg, QSystemTrayIcon::Information, TIME_TRAY_BALLOON);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* *
|
||||||
|
* Utils *
|
||||||
|
* *
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
void GUI::downloadFromURLList(const QStringList& url_list) {
|
||||||
|
foreach(const QString url, url_list) {
|
||||||
|
if(url.startsWith("magnet:", Qt::CaseInsensitive)) {
|
||||||
|
BTSession->addMagnetUri(url);
|
||||||
|
} else {
|
||||||
|
BTSession->downloadFromUrl(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* *
|
||||||
|
* Options *
|
||||||
|
* *
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
void GUI::createSystrayDelayed() {
|
||||||
|
static int timeout = 20;
|
||||||
|
if(QSystemTrayIcon::isSystemTrayAvailable()) {
|
||||||
|
// Ok, systray integration is now supported
|
||||||
|
// Create systray icon
|
||||||
|
createTrayIcon();
|
||||||
|
delete systrayCreator;
|
||||||
|
} else {
|
||||||
|
if(timeout) {
|
||||||
|
// Retry a bit later
|
||||||
|
systrayCreator->start(2000);
|
||||||
|
--timeout;
|
||||||
|
} else {
|
||||||
|
// Timed out, apparently system really does not
|
||||||
|
// support systray icon
|
||||||
|
delete systrayCreator;
|
||||||
|
// Disable it in program preferences to
|
||||||
|
// avoid trying at earch startup
|
||||||
|
Preferences::setSystrayIntegration(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GUI::createTrayIcon() {
|
||||||
|
// Tray icon
|
||||||
|
#ifdef Q_WS_WIN
|
||||||
|
systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent16.png")), this);
|
||||||
|
#endif
|
||||||
|
#ifndef Q_WS_WIN
|
||||||
|
systrayIcon = new QSystemTrayIcon(QIcon(QString::fromUtf8(":/Icons/skin/qbittorrent22.png")), this);
|
||||||
|
#endif
|
||||||
|
// Tray icon Menu
|
||||||
|
myTrayIconMenu = new QMenu(this);
|
||||||
|
myTrayIconMenu->addAction(actionOpen);
|
||||||
|
myTrayIconMenu->addAction(actionDownload_from_URL);
|
||||||
|
myTrayIconMenu->addSeparator();
|
||||||
|
myTrayIconMenu->addAction(actionSet_global_download_limit);
|
||||||
|
myTrayIconMenu->addAction(actionSet_global_upload_limit);
|
||||||
|
myTrayIconMenu->addSeparator();
|
||||||
|
myTrayIconMenu->addAction(actionStart_All);
|
||||||
|
myTrayIconMenu->addAction(actionPause_All);
|
||||||
|
myTrayIconMenu->addSeparator();
|
||||||
|
myTrayIconMenu->addAction(actionExit);
|
||||||
|
systrayIcon->setContextMenu(myTrayIconMenu);
|
||||||
|
connect(systrayIcon, SIGNAL(messageClicked()), this, SLOT(balloonClicked()));
|
||||||
|
// End of Icon Menu
|
||||||
|
connect(systrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(toggleVisibility(QSystemTrayIcon::ActivationReason)));
|
||||||
|
systrayIcon->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display Program Options
|
||||||
|
void GUI::on_actionOptions_triggered() {
|
||||||
|
options = new options_imp(this);
|
||||||
|
connect(options, SIGNAL(status_changed()), this, SLOT(optionsSaved()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************
|
||||||
|
* *
|
||||||
|
* HTTP Downloader *
|
||||||
|
* *
|
||||||
|
*****************************************************/
|
||||||
|
|
||||||
|
// Display an input dialog to prompt user for
|
||||||
|
// an url
|
||||||
|
void GUI::on_actionDownload_from_URL_triggered() {
|
||||||
|
downloadFromURL *downloadFromURLDialog = new downloadFromURL(this);
|
||||||
|
connect(downloadFromURLDialog, SIGNAL(urlsReadyToBeDownloaded(const QStringList&)), this, SLOT(downloadFromURLList(const QStringList&)));
|
||||||
|
}
|
||||||
|
|
||||||
163
src/GUI.h
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
/*
|
||||||
|
* Bittorrent Client using Qt4 and libtorrent.
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Contact : chris@qbittorrent.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef GUI_H
|
||||||
|
#define GUI_H
|
||||||
|
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QSystemTrayIcon>
|
||||||
|
#include <QPointer>
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
#include "qtorrenthandle.h"
|
||||||
|
|
||||||
|
enum TabIndex{TAB_TRANSFER, TAB_SEARCH, TAB_RSS};
|
||||||
|
|
||||||
|
class Bittorrent;
|
||||||
|
class QTimer;
|
||||||
|
class downloadFromURL;
|
||||||
|
class SearchEngine;
|
||||||
|
class QLocalServer;
|
||||||
|
class QCloseEvent;
|
||||||
|
class RSSImp;
|
||||||
|
class QShortcut;
|
||||||
|
class about;
|
||||||
|
class options_imp;
|
||||||
|
class QTabWidget;
|
||||||
|
class TransferListWidget;
|
||||||
|
class TransferListFiltersWidget;
|
||||||
|
class QSplitter;
|
||||||
|
class PropertiesWidget;
|
||||||
|
class StatusBar;
|
||||||
|
|
||||||
|
class GUI : public QMainWindow, private Ui::MainWindow{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Bittorrent
|
||||||
|
Bittorrent *BTSession;
|
||||||
|
QList<QPair<QTorrentHandle,QString> > unauthenticated_trackers; // Still needed?
|
||||||
|
// GUI related
|
||||||
|
QTimer *guiUpdater;
|
||||||
|
QTabWidget *tabs;
|
||||||
|
StatusBar *status_bar;
|
||||||
|
QPointer<options_imp> options;
|
||||||
|
QPointer<QSystemTrayIcon> systrayIcon;
|
||||||
|
QPointer<QTimer> systrayCreator;
|
||||||
|
QMenu *myTrayIconMenu;
|
||||||
|
TransferListWidget *transferList;
|
||||||
|
TransferListFiltersWidget *transferListFilters;
|
||||||
|
PropertiesWidget *properties;
|
||||||
|
bool displaySpeedInTitle;
|
||||||
|
bool force_exit;
|
||||||
|
// Keyboard shortcuts
|
||||||
|
QShortcut *switchSearchShortcut;
|
||||||
|
QShortcut *switchSearchShortcut2;
|
||||||
|
QShortcut *switchTransferShortcut;
|
||||||
|
QShortcut *switchRSSShortcut;
|
||||||
|
// Widgets
|
||||||
|
QAction *prioSeparator;
|
||||||
|
QAction *prioSeparator2;
|
||||||
|
QSplitter *hSplitter;
|
||||||
|
QSplitter *vSplitter;
|
||||||
|
// Search
|
||||||
|
SearchEngine *searchEngine;
|
||||||
|
// RSS
|
||||||
|
QPointer<RSSImp> rssWidget;
|
||||||
|
// Misc
|
||||||
|
QLocalServer *localServer;
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
// GUI related slots
|
||||||
|
void dropEvent(QDropEvent *event);
|
||||||
|
void dragEnterEvent(QDragEnterEvent *event);
|
||||||
|
void toggleVisibility(QSystemTrayIcon::ActivationReason e);
|
||||||
|
void on_actionAbout_triggered();
|
||||||
|
void on_actionCreate_torrent_triggered();
|
||||||
|
void on_actionWebsite_triggered() const;
|
||||||
|
void on_actionBugReport_triggered() const;
|
||||||
|
void on_actionShow_console_triggered();
|
||||||
|
void readParamsOnSocket();
|
||||||
|
void acceptConnection();
|
||||||
|
void balloonClicked();
|
||||||
|
void writeSettings();
|
||||||
|
void readSettings();
|
||||||
|
void on_actionExit_triggered();
|
||||||
|
void createTrayIcon();
|
||||||
|
void fullDiskError(QTorrentHandle& h, QString msg) const;
|
||||||
|
void handleDownloadFromUrlFailure(QString, QString) const;
|
||||||
|
void createSystrayDelayed();
|
||||||
|
void tab_changed(int);
|
||||||
|
// Keyboard shortcuts
|
||||||
|
void createKeyboardShortcuts();
|
||||||
|
void displayTransferTab() const;
|
||||||
|
void displaySearchTab() const;
|
||||||
|
void displayRSSTab() const;
|
||||||
|
// Torrent actions
|
||||||
|
void on_actionSet_global_upload_limit_triggered();
|
||||||
|
void on_actionSet_global_download_limit_triggered();
|
||||||
|
void on_actionDocumentation_triggered() const;
|
||||||
|
void on_actionOpen_triggered();
|
||||||
|
void updateGUI();
|
||||||
|
void loadPreferences(bool configure_session=true);
|
||||||
|
void processParams(const QStringList& params);
|
||||||
|
void addTorrent(QString path);
|
||||||
|
void addUnauthenticatedTracker(QPair<QTorrentHandle,QString> tracker);
|
||||||
|
void processDownloadedFiles(QString path, QString url);
|
||||||
|
void downloadFromURLList(const QStringList& urls);
|
||||||
|
void finishedTorrent(QTorrentHandle& h) const;
|
||||||
|
// Options slots
|
||||||
|
void on_actionOptions_triggered();
|
||||||
|
void optionsSaved();
|
||||||
|
// HTTP slots
|
||||||
|
void on_actionDownload_from_URL_triggered();
|
||||||
|
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void trackerAuthenticationRequired(QTorrentHandle& h);
|
||||||
|
void setTabText(int index, QString text) const;
|
||||||
|
void showNotificationBaloon(QString title, QString msg) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *);
|
||||||
|
void showEvent(QShowEvent *);
|
||||||
|
bool event(QEvent * event);
|
||||||
|
void displayRSSTab(bool enable);
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Construct / Destruct
|
||||||
|
GUI(QWidget *parent=0, QStringList torrentCmdLine=QStringList());
|
||||||
|
~GUI();
|
||||||
|
// Methods
|
||||||
|
int getCurrentTabIndex() const;
|
||||||
|
QPoint screenCenter() const;
|
||||||
|
TransferListWidget* getTransferList() const { return transferList; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
Before Width: | Height: | Size: 322 B |
BIN
src/Icons/L.gif
|
Before Width: | Height: | Size: 66 B |
BIN
src/Icons/downarrow.png
Normal file
|
After Width: | Height: | Size: 722 B |
|
Before Width: | Height: | Size: 643 B |
|
Before Width: | Height: | Size: 408 B |
|
Before Width: | Height: | Size: 604 B |
|
Before Width: | Height: | Size: 591 B |
|
Before Width: | Height: | Size: 643 B |
|
Before Width: | Height: | Size: 600 B |
BIN
src/Icons/flags/algeria.png
Normal file
|
After Width: | Height: | Size: 473 B |
|
Before Width: | Height: | Size: 497 B |
|
Before Width: | Height: | Size: 488 B |
|
Before Width: | Height: | Size: 428 B |
|
Before Width: | Height: | Size: 506 B |
BIN
src/Icons/flags/argentina.png
Normal file
|
After Width: | Height: | Size: 308 B |
|
Before Width: | Height: | Size: 647 B |
|
Before Width: | Height: | Size: 403 B |
|
Before Width: | Height: | Size: 673 B |
BIN
src/Icons/flags/australia.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
src/Icons/flags/austria.png
Normal file
|
After Width: | Height: | Size: 285 B |
|
Before Width: | Height: | Size: 524 B |
|
Before Width: | Height: | Size: 663 B |
|
Before Width: | Height: | Size: 589 B |
|
Before Width: | Height: | Size: 593 B |
|
Before Width: | Height: | Size: 585 B |
|
Before Width: | Height: | Size: 504 B |
|
Before Width: | Height: | Size: 449 B |
BIN
src/Icons/flags/belarus.png
Normal file
|
After Width: | Height: | Size: 373 B |
BIN
src/Icons/flags/belgium.png
Normal file
|
After Width: | Height: | Size: 173 B |
|
Before Width: | Height: | Size: 497 B |
|
Before Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 457 B |
|
Before Width: | Height: | Size: 675 B |
|
Before Width: | Height: | Size: 486 B |
|
Before Width: | Height: | Size: 611 B |
|
Before Width: | Height: | Size: 639 B |
|
Before Width: | Height: | Size: 500 B |
BIN
src/Icons/flags/bosnia.png
Normal file
|
After Width: | Height: | Size: 583 B |
|
Before Width: | Height: | Size: 593 B |
BIN
src/Icons/flags/brazil.png
Normal file
|
After Width: | Height: | Size: 799 B |
|
Before Width: | Height: | Size: 526 B |
|
Before Width: | Height: | Size: 631 B |
BIN
src/Icons/flags/bulgaria.png
Normal file
|
After Width: | Height: | Size: 200 B |
|
Before Width: | Height: | Size: 512 B |
|
Before Width: | Height: | Size: 443 B |
|
Before Width: | Height: | Size: 514 B |
|
Before Width: | Height: | Size: 600 B |
|
Before Width: | Height: | Size: 628 B |
BIN
src/Icons/flags/canada.png
Normal file
|
After Width: | Height: | Size: 686 B |
|
Before Width: | Height: | Size: 625 B |
|
Before Width: | Height: | Size: 528 B |
|
Before Width: | Height: | Size: 614 B |
|
Before Width: | Height: | Size: 521 B |
|
Before Width: | Height: | Size: 367 B |
BIN
src/Icons/flags/china.png
Normal file
|
After Width: | Height: | Size: 329 B |
|
Before Width: | Height: | Size: 453 B |
|
Before Width: | Height: | Size: 586 B |
|
Before Width: | Height: | Size: 450 B |
|
Before Width: | Height: | Size: 525 B |
|
Before Width: | Height: | Size: 472 B |
|
Before Width: | Height: | Size: 483 B |
BIN
src/Icons/flags/costa_rica.png
Normal file
|
After Width: | Height: | Size: 203 B |
|
Before Width: | Height: | Size: 477 B |
BIN
src/Icons/flags/croatia.png
Normal file
|
After Width: | Height: | Size: 479 B |
|
Before Width: | Height: | Size: 423 B |
|
Before Width: | Height: | Size: 563 B |
|
Before Width: | Height: | Size: 529 B |
|
Before Width: | Height: | Size: 608 B |
|
Before Width: | Height: | Size: 428 B |
|
Before Width: | Height: | Size: 476 B |
BIN
src/Icons/flags/czech.png
Normal file
|
After Width: | Height: | Size: 455 B |
|
Before Width: | Height: | Size: 545 B |
BIN
src/Icons/flags/denmark.png
Normal file
|
After Width: | Height: | Size: 270 B |
|
Before Width: | Height: | Size: 572 B |
|
Before Width: | Height: | Size: 495 B |