Compare commits
	
		
			2 Commits
		
	
	
		
			release-2.
			...
			release-1.
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | fdff493568 | ||
|   | 11276174c1 | 
							
								
								
									
										20
									
								
								AUTHORS
									
									
									
									
									
								
							
							
						
						| @@ -2,9 +2,8 @@ Author: | ||||
| * Christophe Dumez <chris@qbittorrent.org> | ||||
|  | ||||
| Contributors: | ||||
| * Stefanos Antaris <santaris@csd.auth.gr> | ||||
| * Ishan Arora <ishan@qbittorrent.org> | ||||
| * Arnaud Demaizière <arnaud@qbittorrent.org> | ||||
| * Ishan Arora <ishan@qbittorrent.org> | ||||
| * Grigis Gaëtan <cipher16@gmail.com> | ||||
|  | ||||
| Code from other projects: | ||||
| @@ -12,10 +11,6 @@ Code from other projects: | ||||
|   copyright: Malte Starostik <malte@kde.org> | ||||
|   license: LGPL | ||||
|  | ||||
| * files src/search_engine/socks.py | ||||
|   copyright: Dan Haim <negativeiq@users.sourceforge.net> | ||||
|   license: BSD | ||||
|  | ||||
| Images Authors: | ||||
| * files: src/Icons/*.png | ||||
|   copyright: Gnome Icon Theme | ||||
| @@ -61,7 +56,7 @@ Translations authors: | ||||
|   copyright: | ||||
|   - Brazilian: Nick Marinho (nickmarinho@gmail.com) | ||||
|   - Bulgarian: Tsvetan & Boiko Bankov (emerge_life@users.sourceforge.net) | ||||
|   - Catalan: Francisco Luque Contreras (frannoe@ya.com) | ||||
|   - Catalan: Gekko Dam Beer (gekko04@users.sourceforge.net) | ||||
|   - Chinese (Simplified): Guo Yue (yue.guo0418@gmail.com) | ||||
|   - Chinese (Traditional): Yi-Shun Wang (dnextstep@gmail.com) | ||||
|   - Czech: Jirka Vilim (web@tets.cz) | ||||
| @@ -71,20 +66,19 @@ Translations authors: | ||||
|   - Finnish: Niklas Laxström (nikerabbit@users.sourceforge.net) | ||||
|   - French: Christophe Dumez (chris@qbittorrent.org) | ||||
|   - 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) | ||||
|   - Hungarian: Majoros Péter (majoros.j.p@t-online.hu) | ||||
|   - Italian: Mirko Ferrari (mirkoferrari@gmail.com) and Ferraro Luciano (luciano.ferraro@gmail.com) | ||||
|   - Japanese: Nardog (alphisation@gmail.com) | ||||
|   - Japanese: Nardog (nardog@e2umail.com) | ||||
|   - Korean: Jin Woo Sin (jin828sin@users.sourceforge.net) | ||||
|   - Norwegian: Lars-Erik Labori (hamil@users.sourceforge.net) | ||||
|   - Polish: Mariusz Fik (fisiu@opensuse.org) | ||||
|   - Polish: Jarek Smieja (ajep9691@wp.pl) | ||||
|   - Portuguese: Nick Marinho (nickmarinho@gmail.com) | ||||
|   - Romanian: Obada Denis (obadadenis@users.sourceforge.net) | ||||
|   - Russian: Nick Khazov (m2k3d0n at users.sourceforge.net) | ||||
|   - Serbian: Anaximandar Milet (anaximandar at operamail.com) | ||||
|   - Slovak:  helix84 | ||||
|   - Spanish: Francisco Luque Contreras (frannoe@ya.com) | ||||
|   - Spanish: Vicente Raul Plata Fonseca (silverxnt@users.sourceforge.net) | ||||
|   - Swedish: Daniel Nylander (po@danielnylander.se) | ||||
|   - Turkish: Hasan Yilmaz (iletisim@hedefturkce.com) | ||||
|   - Turkish: Erdem Bingöl (erdem84@gmail.com) | ||||
|   - Ukrainian: Andrey Shpachenko (masterfix@users.sourceforge.net) | ||||
|   license: GPLv2 | ||||
|   | ||||
							
								
								
									
										221
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						| @@ -1,221 +1,4 @@ | ||||
| * Sun Jan 24 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.1.2 | ||||
|     - FEATURE: Added back file prioritizing in a torrent | ||||
|     - BUGFIX: Fix issue causing torrents not to be displayed in the list | ||||
|     - BUGFIX: Make sure invalid torrent are removed from the transfer list | ||||
|     - BUGFIX: Fix overwrite check when renaming a folder in a torrent | ||||
|     - BUGFIX: Force a recheck after renaming files to avoid overwriting | ||||
|     - BUGFIX: Improve "Open destination folder" behavior | ||||
|     - BUGFIX: Fix race condition in RSS that could cause a crash on startup | ||||
|     - BUGFIX: Improved user friendlyness of size units | ||||
|     - BUGFIX: Optimized transfer list repainting | ||||
|     - COSMETIC: Improved transfer speed display in peers list | ||||
|  | ||||
| * Wed Jan 20 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.1.1 | ||||
|     - BUGFIX: Fix compilation with Qt4.4 | ||||
|     - BUGFIX: Save torrent metadata so that it does not have to be re-downloaded on restart (Magnet links) | ||||
|     - BUGFIX: Fix folder renaming in a torrent (would rename children under certain conditions) | ||||
|     - BUGFIX: Nox version no longer requires libQtXml | ||||
|     - BUGFIX: Configure file now checks for pkg-config executable which is required | ||||
|     - BUGFIX: Torrents added from magnet links were not remembered on restart | ||||
|     - BUGFIX: "Add in pause" setting can be ignored from torrent addition dialog | ||||
|     - BUGFIX: Fix renaming of files with unicode characters in their name | ||||
|     - BUGFIX: Fix typo in legal notice (startup) | ||||
|     - BUGFIX: Can listen on ports < 1024 (must be root) | ||||
|     - BUGFIX: Paused torrents can now be rechecked | ||||
|     - BUGFIX: Fix "open torrent destination" feature when path contains spaces | ||||
|     - I18N: Updated translations (Hungarian, Chinese, Russian) | ||||
|  | ||||
| * 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: Update RSS feed as soon as feed downloader is enabled | ||||
|     - BUGFIX: RSS Feed downloader ignores articles above maximum number of articles | ||||
|     - BUGFIX: Fix possible bug when deleting a RSS folder | ||||
|     - BUGFIX: Remove persistant data when a RSS feed is deleted | ||||
|     - BUGFIX: RSS filters are now alphabetically sorted | ||||
|     - BUGFIX: Fix crash when renaming currently displayed RSS filter | ||||
|     - BUGFIX: Remove overwriting confirmation when exporting RSS filters since Qt takes care of it | ||||
|  | ||||
| * Tue Jan 5 2010 - Christophe Dumez <chris@qbittorrent.org> - v2.0.6 | ||||
|     - BUGFIX: Fix detection of invalid torrent files | ||||
|     - BUGFIX: Stop catching signals once one has been caught to avoid possible infinite loop | ||||
|     - BUGFIX: Force data recheck whenever a torrent is moved | ||||
|     - BUGFIX: Detect existing torrent data even if incomplete torrents are saved to a different folder | ||||
|     - COSMETIC: Improve torrent deletion confirmation dialog so that the text that not get truncated | ||||
|  | ||||
| * Thu Dec 31 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.5 | ||||
|     - BUGFIX: Fix crash with downloaded/availability bars when the torrent has too many pieces | ||||
|  | ||||
| * Wed Dec 30 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.4 | ||||
|     - BUGFIX: Fix PeerGuardian .p2b binary filter support | ||||
|     - BUGFIX: Fix possible crash when closing a search engine tab | ||||
|     - BUGFIX: Make sure service port does not change | ||||
|     - BUGFIX: Fix possible DHT port saving issue | ||||
|     - BUGFIX: Fix communication between qBittorrent and Web UI (Qt 4.6) | ||||
|     - BUGFIX: Use Wildcard matching instead of full regex in RSS feed downloader | ||||
|     - BUGFIX: Fix code for listening on a random port whenever it failed to listen on the one defined | ||||
|     - BUGFIX: Use global maximum transfer rates as maximum values in per-torrent speed limiting dialogs | ||||
|     - BUGFIX: Fix global download rate limiting from Web UI | ||||
|     - COSMETIC: Display a disconnected icon in status bar whenever qBittorrent failed to listen on the port defined | ||||
|  | ||||
| * Wed Dec 23 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.3 | ||||
|     - BUGFIX: Minor cosmetic fix to program preferences | ||||
|     - BUGFIX: Fix "Temp path" button in program preferences | ||||
|     - BUGFIX: Handle paths with [~, ., ..] properly | ||||
|     - BUGFIX: Trackers are now displayed for torrents without metadata | ||||
|     - BUGFIX: Fix issue with speed limiting (unlimited was not handled properly) | ||||
|     - BUGFIX: Use the save path set in program preferences as a default in torrent addition dialog | ||||
|  | ||||
| * Fri Dec 18 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.2 | ||||
|     - BUGFIX: Fix .qbittorrent folder not being created (critical bug introduced in v2.0.1 that makes qBittorrent unusuable for new users) | ||||
|     - BUGFIX: Fix RSS Feed downloader for some feeds | ||||
|     - BUGFIX: Do not use home folder as a fallback when the save path is not accessible | ||||
|     - BUGFIX: Fix Mininova, ThePirateBay search engine plugins | ||||
|     - BUGFIX: Read RSS articles are remembered on restart for feeds with no torrents attached | ||||
|  | ||||
| * Sun Dec 13 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.1 | ||||
|     - BUGFIX: µTorrent user-agent is now spoofed correctly | ||||
|     - BUGFIX: Fix column hiding behavior when queueing system is disabled | ||||
|     - BUGFIX: Fix link to plugins.qbittorrent.org in plugins dialog | ||||
|     - BUGFIX: ~/qBT_dir is created only when it is actually used | ||||
|     - BUGFIX: Fix possible missing slot message (toggleSelectedTorrentsSuperSeeding) | ||||
|     - BUGFIX: Fix possible crash in torrent properties (files) | ||||
|     - BUGFIX: Added Hex Magnet Links support (Thanks Haypo) | ||||
|  | ||||
| * Thu Dec 10 2009 - Christophe Dumez <chris@qbittorrent.org> - v2.0.0 | ||||
|     - FEATURE: Added program option to disable splash screen | ||||
|     - FEATURE: Dropped dependency on libcurl and libzzip | ||||
|     - FEATURE: Display more information regarding the torrent in its properties | ||||
|     - FEATURE: Various optimizations to save CPU and memory | ||||
|     - FEATURE: Folder scanning now works with CIFS and NFS mounted folders | ||||
|     - FEATURE: Speed up qBittorrent startup and shutdown | ||||
|     - FEATURE: Display per-torrent peer list | ||||
|     - FEATURE: Make sure torrent files are always sorted by name | ||||
|     - FEATURE: Seeds and Peers columns are now sortable | ||||
|     - FEATURE: Torrents can be rechecked from Web UI (Stephanos Antaris) | ||||
|     - FEATURE: New peers can manually be added to the torrents | ||||
|     - FEATURE: Support per-peer rate limiting | ||||
|     - FEATURE: Support peer manual ban | ||||
|     - FEATURE: Display total amounts transferred in status bar | ||||
|     - FEATURE: Display trackers status as well as error/warning messages | ||||
|     - FEATURE: Display the number of peers returned by each tracker & DHT/PeX/LSD | ||||
|     - FEATURE: Global upload/download speeds can be capped from status bar (µTorrent behavior) | ||||
|     - FEATURE: Added option to download first and last piece of a torrent main file first (for preview) | ||||
|     - FEATURE: Graphically display piece availability in torrent properties | ||||
|     - FEATURE: Dropped Qt 4.3 support (Qt >= 4.4 is now required) | ||||
|     - FEATURE: Display close tab button into the tabs in search engine (Qt >= 4.5 only) | ||||
|     - FEATURE: Show official documentation when pressing F1 key | ||||
|     - FEATURE: Search engine plugins now handle HTTP protocol gzip compression | ||||
|     - FEATURE: Enabled lazy bitfield as a counter-measure for ISP speed throttling | ||||
|     - FEATURE: Fall back to a random port if qBittorrent could not listen on the chosen port | ||||
|     - FEATURE: Announce to all trackers specified for a torrent (µTorrent behavior) (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Added per-torrent super seeding mode (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Support for storing symbolic links in .torrent files (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Support for uTorrent interpretation of multi-tracker torrents (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Handle torrents with duplicate filenames (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Support for merkle hash tree torrents (.merkle.torrent) (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Metadata download from swarm is now compatible with µtorrent (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Support tracker exchange between peers (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Better http seed support (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Tracker connections are now also subject to IP filtering (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Include DHT traffic in the rate limiter (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Support for bitcomet padding files (libtorrent >= v0.15 only) | ||||
|     - FEATURE: Option to skip file checking and start seeding immediately in torrent addition dialog (Stephanos Antaris) (libtorrent >= v0.15 only) | ||||
|     - BUGFIX: Made sure qBittorrent does not scrape the tracker too frequently (libtorrent >= 0.15 only) | ||||
|     - BUGFIX: Fix Paste action in search engine field | ||||
|     - BUGFIX: Fix possible double free in search engine destructor | ||||
|     - BUGFIX: Properly handle trackers error messages | ||||
|     - WEB UI: Remodeled Web UI to match new qBittorrent UI (Properties and preferences available) | ||||
|     - WEB UI: Added internationalization support | ||||
|     - WEB UI: Reduced computation in Javascript (do this one server side instead) | ||||
|     - WEB UI: Fixed Transfer list flickering | ||||
|     - WEB UI: Password is now stored as md5 | ||||
|     - I18N: Added Serbian translation (By Anaximandar Milet) | ||||
|     - COSMETIC: Merged download / upload lists | ||||
|     - COSMETIC: Torrents can be filtered based on their status | ||||
|     - COSMETIC: Torrent properties are now displayed in main window | ||||
|     - COSMETIC: Made program preferences scrollable for usability on small screens (e.g. netbooks) | ||||
|     - COSMETIC: Added a "torrent status" column to transfer list | ||||
|     - COSMETIC: Display Seeds and Peers in two separate columns | ||||
|     - COSMETIC: New deletion confirmation dialog (Merged delete/delete permanently actions) | ||||
|     - COSMETIC: Improved status bar layout spacing | ||||
|     - COSMETIC: Display speeds with more user friendly units instead of always using KiB/s | ||||
|     - COSMETIC: New torrent status icons by Mateusz Tolola | ||||
|     - COSMETIC: Make use of libnotify if available for system notifications (Ubuntu, ...) | ||||
|  | ||||
| * Tue Nov 17 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.6 | ||||
|   - BUGFIX: RSS feed articles can now be displayed using keyboard arrows | ||||
|   - BUGFIX: RSS feed downloader can only process unread articles now | ||||
|   - BUGFIX: Fixed memory leak in RSS parser | ||||
|   - BUGFIX: Fixed possible crash in search autocompletion | ||||
|   - BUGFIX: Improved ETA calculation for big torrents | ||||
|   - BUGFIX: Fixed per-torrent speed limiting | ||||
|  | ||||
| * Wed Nov 4 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.5 | ||||
|   - BUGFIX: Fixed man page | ||||
|   - BUGFIX: Fix crash on torrent addition (if libtorrent-rasterbar has debug enabled) | ||||
|   - BUGFIX: Fix trackers addition to torrents (bug introduced in v1.5.4) | ||||
|   - BUGFIX: Suppress compilation warning regarding sortNewsList() not being used | ||||
|   - BUGFIX: Make sure scan folder is different than qBittorrent backup directory to avoid torrents deletion | ||||
|   - BUGFIX: Added safety mecanism which adds the torrents back to the list in case qbittorrent-resume.conf gets deleted or corrupted. | ||||
|  | ||||
| * Sun Oct 25 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.4 | ||||
|   - BUGFIX: Updated man page | ||||
|   - BUGFIX: Fixed possible crash with torrents containing unicode characters | ||||
|   - BUGFIX: Fixed problem when disabling systray integration and starting minimized | ||||
|   - BUGFIX: Fixed PirateBay search plugin | ||||
|   - BUGFIX: Using Download button in search results list now downloads the right torrents | ||||
|   - BUGFIX: The search results list is no longer sorted automatically when a row color is updated | ||||
|  | ||||
| * Wed Sep 30 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.3 | ||||
|   - BUGFIX: Fix a possible crash when pausing then deleting a torrent quickly | ||||
|   - BUGFIX: Fix a race condition in folder scanning and torrent downloader | ||||
|   - BUGFIX: Hide download url column in search results | ||||
|   - BUGFIX: Fix a crash when scanned directory does not exist | ||||
|   - BUGFIX: Fix compilation on Mac OS | ||||
|   - BUGFIX: Added a command line parameter to disable splash screen | ||||
|   - BUGFIX: Ignore permanent deletion button when no torrent is selected | ||||
|   - BUGFIX: When a selected torrent is deleted, select next suitable torrent | ||||
|  | ||||
| * Sun Sep 20 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.2 | ||||
|   - BUGFIX: Some torrents were pausing for no reason | ||||
|   - I18N: Updated Korean translation | ||||
|  | ||||
| * Thu Sep 7 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.1 | ||||
|    - BUGFIX: Fix crash in torrent addition dialog when save path does not exist (closes #425227) | ||||
|    - BUGFIX: Fix downloading from URL (broken in v1.5.0) | ||||
|    - BUGFIX: Pause torrents in error state | ||||
|  | ||||
| * Thu Sep 3 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.5.0 | ||||
| * Unknown - Christophe Dumez <chris@qbittorrent.org> - v1.5.0 | ||||
|     - FEATURE: Added Magnet URI support | ||||
|     - FEATURE: Search engine supports category-based requests | ||||
|     - FEATURE: Make use of torrent enclosure in RSS feeds for direct download | ||||
| @@ -229,13 +12,11 @@ | ||||
|     - FEATURE: If a torrent contains a torrent file, process downloaded torrent file too | ||||
|     - FEATURE: A random listening port can be chosen automatically | ||||
|     - BUGFIX: torrent resume code rewrited | ||||
|     - BUGFIX: Fixed uTorrent spoofing code | ||||
|     - BUGFIX: Greatly improved column sorting code | ||||
|     - BUGFIX: Possibility to create trackerless torrents | ||||
|     - BUGFIX: Better item coloring in torrent content filtering dialog | ||||
|     - COSMETIC: Redesigned search tab to improve usability | ||||
|     - COSMETIC: Redesigned RSS tab to improve usability | ||||
|     - COSMETIC: Improved tracker errors readability | ||||
|  | ||||
| * Sun Aug 21 2009 - Christophe Dumez <chris@qbittorrent.org> - v1.4.1 | ||||
|     - BUGFIX: Fix problems when changing save path (if using temporary download folder) | ||||
|   | ||||
							
								
								
									
										65
									
								
								INSTALL
									
									
									
									
									
								
							
							
						
						| @@ -1,55 +1,42 @@ | ||||
| qBittorrent - A BitTorrent client in C++ / Qt4 | ||||
| ------------------------------------------ | ||||
|  | ||||
| 1) Compile and install qBittorrent with Qt4 Graphical Interface | ||||
| *** Necessary if qt3 is default on your system *** | ||||
| export QTDIR=/usr/include/qt4 | ||||
| export PATH=$QTDIR/bin:$PATH | ||||
| export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib | ||||
| *** End *** | ||||
|  | ||||
|   $ ./configure | ||||
|   $ make && make install | ||||
|   $ qbittorrent | ||||
| ./configure | ||||
| make && make install | ||||
| qbittorrent | ||||
|  | ||||
|   will install and execute qBittorrent hopefully without any problems. | ||||
| will install and execute qBittorrent hopefully without any problems. | ||||
|  | ||||
|   Dependencies: | ||||
|     - Qt >= 4.4.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) | ||||
| Dependencies: | ||||
| - Qt >= 4.3.0 (libqt-devel, libqtgui, libqtcore, libqtnetwork, libqtxml) | ||||
|   Qt >= 4.4.0 is advised | ||||
|  | ||||
|     - pkg-config executable | ||||
| - libtorrent-rasterbar by Arvid Norberg (>= v0.14.0 REQUIRED) | ||||
|     -> http://www.qbittorrent.org/download.php (advised) | ||||
|     -> http://www.libtorrent.net | ||||
|     Be careful: another library (the one used by rTorrent) uses a similar name. | ||||
|  | ||||
|     - libtorrent-rasterbar by Arvid Norberg (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED) | ||||
|         -> 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 | ||||
|  | ||||
|     - libboost: libboost-filesystem, libboost-date-time, libboost-thread, libboost-serialization | ||||
| - libcurl | ||||
|  | ||||
|     - python >= 2.3 (needed by search engine) | ||||
|         * Run time only dependency | ||||
| - python >= 2.3 (needed by search engine) | ||||
|  | ||||
|     - libnotify >= 0.4.2, glib-2.0 (optional) | ||||
|         * Can be used for system notifications to replace standard Qt notifications | ||||
|           so that it integrates better into the Desktop | ||||
| - libmagick++ (advised, not required) | ||||
|   * Needed for favicons support (RSS / Search plugins) | ||||
|  | ||||
|     - 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 (>= 0.14.4 REQUIRED, >= v0.15.0 ADVISED) | ||||
|         -> 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 | ||||
| - libzzip (advised, not required) | ||||
|   * Needed for zip support (Search plugins) | ||||
|  | ||||
| NOTE FOR NON-KDE USERS: | ||||
| - qt4-qtconfig package is advised when using other systems than KDE. | ||||
|   You can also change qBittorrent style to Cleanlooks (GNOME like) | ||||
|  | ||||
| DOCUMENTATION: | ||||
| Please note that there is a documentation with a "compiling howto" at http://wiki.qbittorrent.org. | ||||
|   | ||||
							
								
								
									
										6
									
								
								README
									
									
									
									
									
								
							
							
						
						| @@ -10,9 +10,6 @@ It aims to be a good alternative to all other bittorrent clients | ||||
| out there. qBittorrent is fast, stable and provides unicode | ||||
| support as well as many features. | ||||
|  | ||||
| This product includes GeoLite data created by MaxMind, available from | ||||
| http://maxmind.com/ | ||||
|  | ||||
| Installation: | ||||
| ******************************** | ||||
| For installation, follow the instructions from INSTALL file, but simple: | ||||
| @@ -26,9 +23,6 @@ will install and execute qBittorrent hopefully without any problem. | ||||
| For more information please visit: | ||||
| http://www.qbittorrent.org | ||||
|  | ||||
| or our wiki here: | ||||
| http://wiki.qbittorrent.org | ||||
|  | ||||
| Please report any bug (or feature request) to: | ||||
| http://bugs.qbittorrent.org | ||||
|  | ||||
|   | ||||
| @@ -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,42 +1,28 @@ | ||||
| .\" 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" "1" "January 16th 2010" "Bittorrent client written in C++ / Qt4" "" | ||||
| .TH "QBITTORRENT" "1" "September 1st 2007" "Bittorrent client written in C++ / Qt4" "" | ||||
|  | ||||
| .SH "NAME" | ||||
| .SH NAME | ||||
| qBittorrent \- a Bittorrent client written in C++ / Qt4 | ||||
| .SH SYNOPSIS | ||||
|  | ||||
| .SH "SYNOPSIS" | ||||
|  | ||||
| \fBqbittorrent\fR [\-\-no-splash] [\-\-webui-port=x] [TORRENT_FILE | URL]... | ||||
| \fBqbittorrent\fR [FILE | URL] [FILE | URL...] | ||||
|  | ||||
| \fBqbittorrent\fR \-\-help | ||||
|  | ||||
| \fBqbittorrent\fR \-\-version | ||||
|  | ||||
| .PP | ||||
| .SH "DESCRIPTION" | ||||
|  | ||||
| \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. | ||||
| It also comes with UPnP port forwarding / NAT-PMP, encryption (Vuze compatible),  | ||||
| FAST extension (mainline) and PeX support (utorrent compatible). | ||||
|  | ||||
| .SH "OPTIONS" | ||||
|  | ||||
| \fB--help\fR Prints the command line options. | ||||
|  | ||||
| \fB--version\fR Prints qbittorrent program version number. | ||||
|  | ||||
| \fB--no-splash\fR Disables splash screen on startup. | ||||
|  | ||||
| \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 | ||||
| It also comes with UPnP port forwarding / NAT-PMP, encryption (Azureus compatible), FAST extension (mainline) and PeX support (utorrent compatible). | ||||
|  | ||||
| Please report any problem to http://bugs.qbittorrent.org | ||||
| .PP | ||||
| .SH "AUTHOR" | ||||
|  | ||||
| Christophe Dumez <chris@qbittorrent.org> | ||||
|   | ||||
| @@ -1,4 +1,6 @@ | ||||
| TEMPLATE = subdirs | ||||
|  | ||||
| include(conf.pri) | ||||
|  | ||||
| SUBDIRS += src | ||||
|  | ||||
|   | ||||
| @@ -6,17 +6,14 @@ | ||||
|   <dep type='qt4'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='pkg-config'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='libtorrent-rasterbar'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='libboost'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='libnotify'> | ||||
|   </dep> | ||||
|   <dep type='geoip-database'> | ||||
|   <dep type='libcurl'> | ||||
|     <required/> | ||||
|   </dep> | ||||
|   <dep type='libzzip'/> | ||||
| </qconf> | ||||
|   | ||||
| @@ -1,37 +0,0 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: geoip-database | ||||
| arg: with-geoip-database-embedded, Geoip Database will be embedded in qBittorrent executable (please follow instructions in src/geoip/README) | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| // see  Conf::findPkgConfig | ||||
| class qc_geoip_database : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_geoip_database(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "GeoIP Database (optional)"; } | ||||
| 	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() { | ||||
| 	if(!conf->getenv("QC_DISABLE_geoip_database").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 		return false; | ||||
| 	} | ||||
| #ifdef Q_WS_X11 | ||||
| 		if(!conf->getenv("QC_WITH_GEOIP_DATABASE_EMBEDDED").isEmpty()) { | ||||
| #endif | ||||
| 			conf->addDefine("WITH_GEOIP_EMBEDDED"); | ||||
|                         printf(" embedded and"); | ||||
| 			return true; | ||||
| #ifdef Q_WS_X11 | ||||
| 		} | ||||
|                 if(QFile::exists("/usr/share/GeoIP/GeoIP.dat") || QFile::exists("/usr/local/share/GeoIP/GeoIP.dat") || QFile::exists("/var/lib/GeoIP/GeoIP.dat")) | ||||
| 			return true; | ||||
|                 printf("\nWarning: GeoIP database was not found at /usr/share/GeoIP/GeoIP.dat or /var/lib/GeoIP/GeoIP.dat\nCountry resolution will be slow."); | ||||
| 		return false; | ||||
| #endif | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										61
									
								
								qcm/libcurl.qcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,61 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: libcommoncpp2 | ||||
| arg: with-libcurl-inc=[path], Path to libcurl include files | ||||
| arg: with-libcurl-lib=[path], Path to libcurl library files | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| class qc_libcurl : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libcurl(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libcurl"; } | ||||
| 	QString shortname() const { return "libcurl"; } | ||||
| 	bool exec(){ | ||||
|     QString s; | ||||
| 		s = conf->getenv("QC_WITH_LIBCURL_INC"); | ||||
| 		if(!s.isEmpty()) { | ||||
| 			if(!conf->checkHeader(s, "curl/curl.h")) { | ||||
| 				return false; | ||||
|     	} | ||||
| 		}else{ | ||||
| 			QStringList sl; | ||||
| 			sl << "/usr/include"; | ||||
| 			sl << "/usr/local/include"; | ||||
| 			bool found = false; | ||||
| 			foreach(s, sl){ | ||||
| 				if(conf->checkHeader(s, "curl/curl.h")){ | ||||
| 					found = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if(!found) { | ||||
| 				return false; | ||||
|       } | ||||
| 		} | ||||
| 		conf->addIncludePath(s); | ||||
|  | ||||
| 		s = conf->getenv("QC_WITH_LIBCURL_LIB"); | ||||
| 		if(!s.isEmpty()) { | ||||
| 			if(!QFile::exists(s+QString("/libcurl.so"))) | ||||
| 		          return false; | ||||
|     	conf->addLib(QString("-L") + s); | ||||
| 		}else{ | ||||
| 			QStringList sl; | ||||
| 			sl << "/usr/lib/"; | ||||
| 			sl << "/usr/lib64/"; | ||||
| 			sl << "/usr/local/lib/"; | ||||
| 			sl << "/usr/local/lib64/"; | ||||
| 			bool found = false; | ||||
| 			foreach(s, sl){ | ||||
| 				if(QFile::exists(s+QString("libcurl.so"))){ | ||||
| 					found = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if(!found) return false; | ||||
| 			conf->addLib(QString("-L") + s); | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
| }; | ||||
| @@ -1,49 +0,0 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: libnotify | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| // see  Conf::findPkgConfig | ||||
| class qc_libnotify : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libnotify(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libnotify >= 0.4.2 (optional)"; } | ||||
| 	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(){ | ||||
| 		if(!conf->getenv("QC_DISABLE_libnotify").isEmpty() || !conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.4.2"; | ||||
| 		QString version, libs, other; | ||||
| 		VersionMode mode = VersionMin; | ||||
| 		if(conf->findPkgConfig("libnotify", mode, req_ver, &version, &incs, &libs, &other)) { | ||||
| 			conf->addDefine("WITH_LIBNOTIFY"); | ||||
| 			for(int n = 0; n < incs.count(); ++n) | ||||
| 				conf->addIncludePath(incs[n]); | ||||
| 			if(!libs.isEmpty()) | ||||
| 				conf->addLib(libs); | ||||
| 			QStringList incs2; | ||||
| 			QString req_ver2 = "2.0"; | ||||
| 			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) | ||||
| 				conf->addIncludePath(incs2[n]); | ||||
| 				if(!libs2.isEmpty()) | ||||
| 					conf->addLib(libs2); | ||||
| 			} else { | ||||
| 				return false; | ||||
| 			} | ||||
| 		} else { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		return true; | ||||
| 	} | ||||
| }; | ||||
| @@ -8,12 +8,12 @@ class qc_libtorrent_rasterbar : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libtorrent_rasterbar(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.4"; } | ||||
| 	QString name() const { return "libtorrent-rasterbar >= 0.14.0 (>= 0.14.4 advised)"; } | ||||
| 	QString shortname() const { return "libtorrent-rasterbar"; } | ||||
| 	bool exec(){ | ||||
| 		QStringList incs; | ||||
| 		QString req_ver = "0.14.4"; | ||||
| 		QString adv_ver = "0.15.0"; | ||||
| 		QString req_ver = "0.14.0"; | ||||
| 		QString adv_ver = "0.14.4"; | ||||
| 		QString version, libs, other; | ||||
| 		VersionMode mode = VersionMin; | ||||
| 		if(!conf->findPkgConfig("libtorrent-rasterbar", mode, req_ver, &version, &incs, &libs, &other)) | ||||
| @@ -23,9 +23,7 @@ public: | ||||
| 		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. Some feature will be disabled because they require v%s.\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
| 		else | ||||
| 			conf->addDefine("LIBTORRENT_0_15"); | ||||
| 			printf("\nWarning: libtorrent-rasterbar v%s was detected. Although it will compile and run, you will probably experience some bugs. Please consider updating to v%s!\n", version.toLocal8Bit().data(), adv_ver.toUtf8().data()); | ||||
| 		return true; | ||||
| 	} | ||||
| }; | ||||
|   | ||||
							
								
								
									
										71
									
								
								qcm/libzzip.qcm
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,71 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: libzzip | ||||
| arg: with-libzzip-inc=[path], Path to libzzip++ include files | ||||
| arg: with-libzzip-lib=[path], Path to libzzip++ library files | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| #include <QProcess> | ||||
| class qc_libzzip : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_libzzip(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "Zzip library (libzzip)"; } | ||||
| 	QString shortname() const { return "libzzip"; } | ||||
| 	QString checkString() const { | ||||
| 		if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) | ||||
| 			return ""; | ||||
| 		return ConfObj::checkString(); | ||||
| 	} | ||||
| 	bool exec(){ | ||||
| 		if(!conf->getenv("QC_DISABLE_LIBZZIP").isEmpty()) | ||||
| 			return false; | ||||
| 		QString s; | ||||
| 		s = conf->getenv("QC_WITH_LIBZZIP_INC"); | ||||
| 		if(!s.isEmpty()) { | ||||
| 			if(!conf->checkHeader(s, "zzip/zzip.h")) { | ||||
| 				return false; | ||||
|     			} | ||||
| 		}else{ | ||||
| 			QStringList sl; | ||||
| 			sl << "/usr/include"; | ||||
| 			sl << "/usr/local/include"; | ||||
| 			bool found = false; | ||||
| 			foreach(s, sl){ | ||||
| 				if(conf->checkHeader(s, "zzip/zzip.h")){ | ||||
| 					found = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if(!found) | ||||
| 				return false; | ||||
| 		} | ||||
| 		conf->addIncludePath(s); | ||||
|  | ||||
| 		s = conf->getenv("QC_WITH_LIBZZIP_LIB"); | ||||
| 		if(!s.isEmpty()) { | ||||
| 			if(!QFile::exists(s+QString("/libzzip.so"))){ | ||||
|                           return false; | ||||
|                         } | ||||
| 		}else{ | ||||
| 			QStringList sl; | ||||
| 			sl << "/usr/lib/"; | ||||
| 			sl << "/usr/lib64/"; | ||||
| 			sl << "/usr/local/lib/"; | ||||
| 			sl << "/usr/local/lib64/"; | ||||
| 			bool found = false; | ||||
| 			foreach(s, sl){ | ||||
| 				if(QFile::exists(s+QString("libzzip.so"))){ | ||||
| 					found = true; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			if(!found) | ||||
|                          	return false; | ||||
| 		} | ||||
| 		conf->addLib(QString("-L") + s); | ||||
| 		conf->addLib("-lzzip"); | ||||
| 		conf->addDefine("HAVE_ZZIP"); | ||||
| 		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(); | ||||
| 	} | ||||
| }; | ||||
							
								
								
									
										18
									
								
								qcm/qt4.qcm
									
									
									
									
									
								
							
							
						
						| @@ -1,24 +1,20 @@ | ||||
| /* | ||||
| -----BEGIN QCMOD----- | ||||
| name: Qt >= 4.4 | ||||
| arg: disable-gui, Disable qBittorrent Graphical user interface for headless running | ||||
| name: Qt >= 4.3 | ||||
| -----END QCMOD----- | ||||
| */ | ||||
| class qc_qt4 : public ConfObj | ||||
| { | ||||
| public: | ||||
| 	qc_qt4(Conf *c) : ConfObj(c) {} | ||||
| 	QString name() const { return "Qt >= 4.4"; } | ||||
| 	QString shortname() const { return "Qt 4.4"; } | ||||
| 	QString name() const { return "Qt >= 4.3"; } | ||||
| 	QString shortname() const { return "Qt 4.3"; } | ||||
| 	bool exec() | ||||
| 	{ | ||||
| 		if(!conf->getenv("QC_DISABLE_GUI").isEmpty()) { | ||||
| 			conf->addDefine("DISABLE_GUI"); | ||||
| 		}	 | ||||
| 		if(QT_VERSION >= 0x040500) { | ||||
|                         conf->addDefine("QT_4_5"); | ||||
|                 } | ||||
| 		return(QT_VERSION >= 0x040400); | ||||
| 		if(QT_VERSION >= 0x040400) { | ||||
| 			conf->addDefine("QT_4_4"); | ||||
| 		} | ||||
| 		return(QT_VERSION >= 0x040300); | ||||
| 		 | ||||
| 	} | ||||
| }; | ||||
|   | ||||
							
								
								
									
										116
									
								
								src/DLListDelegate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,116 @@ | ||||
| /* | ||||
|  * 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 DLLISTDELEGATE_H | ||||
| #define DLLISTDELEGATE_H | ||||
|  | ||||
| #include <QItemDelegate> | ||||
| #include <QModelIndex> | ||||
| #include <QPainter> | ||||
| #include <QStyleOptionProgressBarV2> | ||||
| #include <QStyleOptionViewItemV2> | ||||
| #include <QProgressBar> | ||||
| #include <QApplication> | ||||
| #include "misc.h" | ||||
|  | ||||
| // Defines for download list list columns | ||||
| #define NAME 0 | ||||
| #define SIZE 1 | ||||
| #define PROGRESS 2 | ||||
| #define DLSPEED 3 | ||||
| #define UPSPEED 4 | ||||
| #define SEEDSLEECH 5 | ||||
| #define RATIO 6 | ||||
| #define ETA 7 | ||||
| #define PRIORITY 8 | ||||
| #define HASH 9 | ||||
|  | ||||
| class DLListDelegate: public QItemDelegate { | ||||
|   Q_OBJECT | ||||
|  | ||||
|   public: | ||||
|     DLListDelegate(QObject *parent) : QItemDelegate(parent){} | ||||
|  | ||||
|     ~DLListDelegate(){} | ||||
|  | ||||
|     void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ | ||||
|       QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); | ||||
|       switch(index.column()){ | ||||
|         case SIZE: | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); | ||||
|           break; | ||||
|         case ETA: | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           QItemDelegate::drawDisplay(painter, opt, option.rect, misc::userFriendlyDuration(index.data().toLongLong())); | ||||
|           break; | ||||
|         case UPSPEED: | ||||
|         case DLSPEED:{ | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           double speed = index.data().toDouble(); | ||||
|           QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); | ||||
|           break; | ||||
|         } | ||||
|         case RATIO:{ | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           double ratio = index.data().toDouble(); | ||||
|           if(ratio > 100.) | ||||
|               QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); | ||||
|           else | ||||
|               QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); | ||||
|           break; | ||||
|         } | ||||
|         case PROGRESS:{ | ||||
|           QStyleOptionProgressBarV2 newopt; | ||||
|           double progress = index.data().toDouble()*100.; | ||||
|           newopt.rect = opt.rect; | ||||
|           newopt.text = QString(QByteArray::number(progress, 'f', 1))+QString::fromUtf8("%"); | ||||
|           newopt.progress = (int)progress; | ||||
|           newopt.maximum = 100; | ||||
|           newopt.minimum = 0; | ||||
|           newopt.state |= QStyle::State_Enabled; | ||||
|           newopt.textVisible = true; | ||||
|           QApplication::style()->drawControl(QStyle::CE_ProgressBar, &newopt, | ||||
|           painter); | ||||
|           break; | ||||
|         } | ||||
|         default: | ||||
|           QItemDelegate::paint(painter, option, index); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { | ||||
|       // No editor here | ||||
|       return 0; | ||||
|     } | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| @@ -32,6 +32,7 @@ | ||||
| #define FEEDDOWNLOADER_H | ||||
|  | ||||
| #include <QString> | ||||
| #include <QHash> | ||||
| #include <QSettings> | ||||
| #include <QListWidget> | ||||
| #include <QListWidgetItem> | ||||
| @@ -44,15 +45,7 @@ | ||||
| #include <QFileDialog> | ||||
|  | ||||
| #include "bittorrent.h" | ||||
| #include "ui_feeddownloader.h" | ||||
|  | ||||
| #ifdef QT_4_5 | ||||
| #include <QHash> | ||||
| #else | ||||
| #include <QMap> | ||||
| #define QHash QMap | ||||
| #define toHash toMap | ||||
| #endif | ||||
| #include "ui_FeedDownloader.h" | ||||
|  | ||||
| class FeedFilter: public QHash<QString, QVariant> { | ||||
| private: | ||||
| @@ -64,21 +57,17 @@ public: | ||||
|  | ||||
|   bool matches(QString s) { | ||||
|     QStringList match_tokens = getMatchingTokens(); | ||||
|     //qDebug("Checking matching tokens: \"%s\"", getMatchingTokens_str().toLocal8Bit().data()); | ||||
|     foreach(const QString& token, match_tokens) { | ||||
|       if(token.isEmpty() || token == "") | ||||
|         continue; | ||||
|       //qDebug("Token: %s", token.toLocal8Bit().data()); | ||||
|       QRegExp reg(token, Qt::CaseInsensitive, QRegExp::Wildcard); | ||||
|       //reg.setMinimal(false); | ||||
|       QRegExp reg(token, Qt::CaseInsensitive); | ||||
|       if(reg.indexIn(s) < 0) return false; | ||||
|     } | ||||
|     qDebug("Checking not matching tokens"); | ||||
|     // Checking not matching | ||||
|     QStringList notmatch_tokens = getNotMatchingTokens(); | ||||
|     foreach(const QString& token, notmatch_tokens) { | ||||
|       if(token.isEmpty()) continue; | ||||
|       QRegExp reg(token, Qt::CaseInsensitive, QRegExp::Wildcard); | ||||
|       QRegExp reg(token, Qt::CaseInsensitive); | ||||
|       if(reg.indexIn(s) > -1) return false; | ||||
|     } | ||||
|     return true; | ||||
| @@ -239,11 +228,11 @@ private: | ||||
|   QString feed_url; | ||||
|   QString feed_name; | ||||
|   FeedFilters filters; | ||||
|   Bittorrent *BTSession; | ||||
|   bittorrent *BTSession; | ||||
|   QString selected_filter; // name | ||||
|  | ||||
| public: | ||||
|   FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, Bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){ | ||||
|   FeedDownloaderDlg(QWidget *parent, QString feed_url, QString feed_name, bittorrent* BTSession): QDialog(parent), feed_url(feed_url), feed_name(feed_name), BTSession(BTSession), selected_filter(QString::null){ | ||||
|     setupUi(this); | ||||
|     setAttribute(Qt::WA_DeleteOnClose); | ||||
|     Q_ASSERT(!feed_name.isEmpty()); | ||||
| @@ -261,7 +250,6 @@ public: | ||||
|     // Restore saved info | ||||
|     enableDl_cb->setChecked(filters.isDownloadingEnabled()); | ||||
|     fillFiltersList(); | ||||
|     filtersList->sortItems(Qt::AscendingOrder); | ||||
|     if(filters.size() > 0) { | ||||
|       // Select first filter | ||||
|       filtersList->setCurrentItem(filtersList->item(0)); | ||||
| @@ -272,8 +260,6 @@ public: | ||||
|   } | ||||
|  | ||||
|   ~FeedDownloaderDlg() { | ||||
|     if(enableDl_cb->isChecked()) | ||||
|       emit filteringEnabled(); | ||||
|     // Make sure we save everything | ||||
|     saveCurrentFilterSettings(); | ||||
|     filters.save(); | ||||
| @@ -294,17 +280,6 @@ protected slots: | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void on_browse_button_clicked() { | ||||
|     QString default_path = savepath_line->text(); | ||||
|     if(default_path.isEmpty() || !QDir(default_path).exists()) { | ||||
|       default_path = QDir::homePath(); | ||||
|     } | ||||
|     QString dir = QFileDialog::getExistingDirectory(this, tr("Choose save path"), QDir::homePath()); | ||||
|     if(!dir.isNull() and QDir(dir).exists()) { | ||||
|       savepath_line->setText(dir); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   void fillFiltersList() { | ||||
|     // Fill filter list | ||||
|     foreach(QString filter_name, filters.names()) { | ||||
| @@ -381,14 +356,11 @@ protected slots: | ||||
|           QMessageBox::warning(0, tr("Invalid filter name"), tr("This filter name is already in use.")); | ||||
|         } | ||||
|       }while(!validated); | ||||
|       // Save the current filter | ||||
|       saveCurrentFilterSettings(); | ||||
|       // Rename the filter | ||||
|       filters.rename(current_name, new_name); | ||||
|       if(selected_filter == current_name) | ||||
|         selected_filter = new_name; | ||||
|       item->setText(new_name); | ||||
|       filtersList->sortItems(Qt::AscendingOrder); | ||||
|     } | ||||
|   } | ||||
|  | ||||
| @@ -442,7 +414,6 @@ protected slots: | ||||
|       } | ||||
|     }while(!validated); | ||||
|     QListWidgetItem *it = new QListWidgetItem(filter_name, filtersList); | ||||
|     filtersList->sortItems(Qt::AscendingOrder); | ||||
|     filtersList->setCurrentItem(it); | ||||
|     //showFilterSettings(it); | ||||
|   } | ||||
| @@ -456,11 +427,7 @@ protected slots: | ||||
|   } | ||||
|  | ||||
|   void on_testButton_clicked(bool) { | ||||
|     test_res_lbl->clear(); | ||||
|     if(selected_filter.isEmpty()) { | ||||
|       qDebug("No filter is selected!!!"); | ||||
|       return; | ||||
|     } | ||||
|     if(selected_filter.isEmpty()) return; | ||||
|     QString s = test_line->text().trimmed(); | ||||
|     if(s.isEmpty()) { | ||||
|       QMessageBox::warning(0, tr("Filter testing error"), tr("Please specify a test torrent name.")); | ||||
| @@ -498,22 +465,16 @@ protected slots: | ||||
|     // Append file extension | ||||
|     if(!destination.endsWith(".filters")) | ||||
|       destination += ".filters"; | ||||
|     /*if(QFile::exists(destination)) { | ||||
|     if(QFile::exists(destination)) { | ||||
|       int ret = QMessageBox::question(0, tr("Overwriting confirmation"), tr("Are you sure you want to overwrite existing file?"), QMessageBox::Yes|QMessageBox::No); | ||||
|       if(ret != QMessageBox::Yes) return; | ||||
|     }*/ | ||||
|     } | ||||
|     if(filters.serialize(destination)) | ||||
|       QMessageBox::information(0, tr("Export successful"), tr("Filters export was successful.")); | ||||
|     else | ||||
|       QMessageBox::warning(0, tr("Export failure"), tr("Filters could not be exported due to an I/O error.")); | ||||
|   } | ||||
|  | ||||
| signals: | ||||
|   void filteringEnabled(); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #undef QHash | ||||
| #undef toHash | ||||
|  | ||||
| #endif // FEEDDOWNLOADER_H | ||||
							
								
								
									
										98
									
								
								src/FinishedListDelegate.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,98 @@ | ||||
| /* | ||||
|  * 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 FINISHEDLISTDELEGATE_H | ||||
| #define FINISHEDLISTDELEGATE_H | ||||
|  | ||||
| #include <QItemDelegate> | ||||
| #include <QModelIndex> | ||||
| #include <QPainter> | ||||
| #include <QStyleOptionProgressBarV2> | ||||
| #include <QStyleOptionViewItemV2> | ||||
| #include <QProgressBar> | ||||
| #include <QApplication> | ||||
| #include "misc.h" | ||||
|  | ||||
| // Defines for download list list columns | ||||
| #define F_NAME 0 | ||||
| #define F_SIZE 1 | ||||
| #define F_UPSPEED 2 | ||||
| #define F_SWARM 3 | ||||
| #define F_PEERS 4 | ||||
| #define F_UPLOAD 5 | ||||
| #define F_RATIO 6 | ||||
| #define F_HASH 7 | ||||
|  | ||||
| #define MAX_RATIO 100. | ||||
|  | ||||
| class FinishedListDelegate: public QItemDelegate { | ||||
|   Q_OBJECT | ||||
|  | ||||
|   public: | ||||
|     FinishedListDelegate(QObject *parent) : QItemDelegate(parent){} | ||||
|  | ||||
|     ~FinishedListDelegate(){} | ||||
|  | ||||
|     void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const{ | ||||
|       QStyleOptionViewItemV2 opt = QItemDelegate::setOptions(index, option); | ||||
|       switch(index.column()){ | ||||
|         case F_SIZE: | ||||
|         case F_UPLOAD: | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           QItemDelegate::drawDisplay(painter, opt, option.rect, misc::friendlyUnit(index.data().toLongLong())); | ||||
|           break; | ||||
|         case F_UPSPEED:{ | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           double speed = index.data().toDouble(); | ||||
|           QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(speed/1024., 'f', 1))+QString::fromUtf8(" ")+tr("KiB/s")); | ||||
|           break; | ||||
|         } | ||||
|         case F_RATIO:{ | ||||
|           QItemDelegate::drawBackground(painter, opt, index); | ||||
|           double ratio = index.data().toDouble(); | ||||
|           if(ratio > MAX_RATIO) | ||||
|             QItemDelegate::drawDisplay(painter, opt, opt.rect, QString::fromUtf8("∞")); | ||||
|           else | ||||
|             QItemDelegate::drawDisplay(painter, opt, opt.rect, QString(QByteArray::number(ratio, 'f', 1))); | ||||
|           break; | ||||
|         } | ||||
|         default: | ||||
|           QItemDelegate::paint(painter, option, index); | ||||
|       } | ||||
|     } | ||||
|  | ||||
|     QWidget* createEditor(QWidget*, const QStyleOptionViewItem &, const QModelIndex &) const { | ||||
|       // No editor here | ||||
|       return 0; | ||||
|     } | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										626
									
								
								src/FinishedTorrents.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										104
									
								
								src/FinishedTorrents.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						| @@ -0,0 +1,104 @@ | ||||
| /* | ||||
|  * 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 SEEDING_H | ||||
| #define SEEDING_H | ||||
|  | ||||
| #include "ui_seeding.h" | ||||
| #include "qtorrenthandle.h" | ||||
|  | ||||
| class QStandardItemModel; | ||||
| class QSortFilterProxyModel; | ||||
| class bittorrent; | ||||
| class FinishedListDelegate; | ||||
|  | ||||
| using namespace libtorrent; | ||||
|  | ||||
| class FinishedTorrents : public QWidget, public Ui::seeding { | ||||
|   Q_OBJECT | ||||
|   private: | ||||
|     QObject *parent; | ||||
|     bittorrent *BTSession; | ||||
|     FinishedListDelegate *finishedListDelegate; | ||||
|     QStandardItemModel *finishedListModel; | ||||
|     QSortFilterProxyModel *proxyModel; | ||||
|     unsigned int nbFinished; | ||||
|     void hideOrShowColumn(int index); | ||||
|     bool loadHiddenColumns(); | ||||
|     void saveHiddenColumns(); | ||||
|     QAction* getActionHoSCol(int index); | ||||
|  | ||||
|   public: | ||||
|     FinishedTorrents(QObject *parent, bittorrent *BTSession); | ||||
|     ~FinishedTorrents(); | ||||
|     // Methods | ||||
|     bool loadColWidthFinishedList(); | ||||
|     int getRowFromHash(QString hash) const; | ||||
|     QStringList getSelectedTorrents(bool only_one=false) const; | ||||
|     unsigned int getNbTorrentsInList() const; | ||||
|     QString getHashFromRow(unsigned int row) const; | ||||
|  | ||||
|   protected slots: | ||||
|     void showProperties(const QModelIndex &index); | ||||
|     void displayFinishedListMenu(const QPoint&); | ||||
|     void displayFinishedHoSMenu(const QPoint&); | ||||
|     void setRowColor(int row, QString color); | ||||
|     void saveColWidthFinishedList() const; | ||||
|     void updateFileSize(QString hash); | ||||
|     void on_actionSet_upload_limit_triggered(); | ||||
|     void notifyTorrentDoubleClicked(const QModelIndex& index); | ||||
|     void hideOrShowColumnName(); | ||||
|     void hideOrShowColumnSize(); | ||||
|     void hideOrShowColumnUpSpeed(); | ||||
|     void hideOrShowColumnSwarm(); | ||||
|     void hideOrShowColumnPeers(); | ||||
|     void hideOrShowColumnUpload(); | ||||
|     void hideOrShowColumnRatio(); | ||||
|     void forceRecheck(); | ||||
|  | ||||
|   public slots: | ||||
|     void addTorrent(QString hash); | ||||
|     void updateTorrent(QTorrentHandle h); | ||||
|     void pauseTorrent(QString hash); | ||||
|     void propertiesSelection(); | ||||
|     void deleteTorrent(QString hash); | ||||
|     void showPropertiesFromHash(QString hash); | ||||
|     void loadLastSortedColumn(); | ||||
|     void saveLastSortedColumn(); | ||||
|     void updateMetadata(QTorrentHandle &h); | ||||
|  | ||||
|   signals: | ||||
|     void torrentMovedFromFinishedList(QString); | ||||
|     void torrentDoubleClicked(QString hash, bool finished); | ||||
|     void finishedTorrentsNumberChanged(unsigned int); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										2205
									
								
								src/GUI.cpp
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 473 B | 
| Before Width: | Height: | Size: 308 B | 
| Before Width: | Height: | Size: 1.1 KiB | 
| Before Width: | Height: | Size: 285 B | 
| Before Width: | Height: | Size: 373 B | 
| Before Width: | Height: | Size: 173 B | 
| Before Width: | Height: | Size: 583 B | 
| Before Width: | Height: | Size: 686 B |