You've already forked qBittorrent
							
							
				mirror of
				https://github.com/qbittorrent/qBittorrent
				synced 2025-11-02 08:10:54 +01:00 
			
		
		
		
	Compare commits
	
		
			44 Commits
		
	
	
		
			release-2.
			...
			v2_9_x
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					8b53028828 | ||
| 
						 | 
					17b7ff3fd2 | ||
| 
						 | 
					9ca171c96f | ||
| 
						 | 
					cfd2576002 | ||
| 
						 | 
					ca0af8c858 | ||
| 
						 | 
					70320ed4b3 | ||
| 
						 | 
					869af25826 | ||
| 
						 | 
					b3ac151302 | ||
| 
						 | 
					d02ff9cd66 | ||
| 
						 | 
					32c0b7801c | ||
| 
						 | 
					6049b2ce03 | ||
| 
						 | 
					b3aec8e6f9 | ||
| 
						 | 
					e1933e9382 | ||
| 
						 | 
					5cc4f31b4b | ||
| 
						 | 
					ad918651a5 | ||
| 
						 | 
					2fa3e9ae8e | ||
| 
						 | 
					5fd7bad57c | ||
| 
						 | 
					d7eb29ab71 | ||
| 
						 | 
					33147d842c | ||
| 
						 | 
					11e0b7c9b5 | ||
| 
						 | 
					e8cd92e245 | ||
| 
						 | 
					a757953b76 | ||
| 
						 | 
					a26da65419 | ||
| 
						 | 
					1d9ef166bd | ||
| 
						 | 
					81a5201e41 | ||
| 
						 | 
					9f9354af12 | ||
| 
						 | 
					ac1ebf4e13 | ||
| 
						 | 
					b9ccd3e74f | ||
| 
						 | 
					4177a37d63 | ||
| 
						 | 
					24a73c05b9 | ||
| 
						 | 
					960d8d1bc9 | ||
| 
						 | 
					da69983e64 | ||
| 
						 | 
					6db7d36e4d | ||
| 
						 | 
					571963b1bd | ||
| 
						 | 
					9e50e1ba7e | ||
| 
						 | 
					82af132d8a | ||
| 
						 | 
					80dd666107 | ||
| 
						 | 
					ac50f0cdc2 | ||
| 
						 | 
					bf685773e6 | ||
| 
						 | 
					a0ada5c3ba | ||
| 
						 | 
					220fd4a7b8 | ||
| 
						 | 
					d5622da576 | ||
| 
						 | 
					55be2aa9a0 | ||
| 
						 | 
					96f619b486 | 
							
								
								
									
										22
									
								
								Changelog
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								Changelog
									
									
									
									
									
								
							@@ -1,4 +1,24 @@
 | 
			
		||||
* Sun May 20 - Christophe Dumez <chris@qbittorrent.org> - v2.9.9
 | 
			
		||||
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.9.12
 | 
			
		||||
    - BUGFIX: Fix issue when "Minimize to tray" and "Start minimized" are both enabled
 | 
			
		||||
 | 
			
		||||
* Sun Jul 1 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.11
 | 
			
		||||
    - BUGFIX: Fix unreversible "Minimize to tray" on some window managers
 | 
			
		||||
    - BUGFIX: Fix torrent availability computation (closes #988869)
 | 
			
		||||
    - BUGFIX: Bring window to front after restoring from systray
 | 
			
		||||
    - BUGFIX: Fix keyboard focus problems on main window (closes #1019563)
 | 
			
		||||
    - BUGFIX: Fix ThePirateBay search plugin
 | 
			
		||||
 | 
			
		||||
* Sun Jun 24 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.10
 | 
			
		||||
    - BUGFIX: Fix possible crash when showing torrent content (closes #1002586)
 | 
			
		||||
    - BUGFIX: Add support for RSS feeds using magnet links (closes #1016379)
 | 
			
		||||
    - BUGFIX: Remove 100kb limit for torrent file size in Web UI
 | 
			
		||||
    - BUGFIX: Fix ratio limiting bug (closes #835217)
 | 
			
		||||
    - BUGFIX: Do not display .!qB file extensions in Web UI
 | 
			
		||||
    - BUGFIX: Stop using absolute URLs in Web UI ajax requests (closes #1011226)
 | 
			
		||||
    - BUGFIX: Fix torrent association and loading on Mac OS X (closes #1011229)
 | 
			
		||||
    - BUGFIX: Fix unreversible "Minimize to tray" on some window managers (closes #917825)
 | 
			
		||||
 | 
			
		||||
* Sun May 20 2012 - Christophe Dumez <chris@qbittorrent.org> - v2.9.9
 | 
			
		||||
    - BUGFIX: More reliable RSS feed parsing (closes #1001777)
 | 
			
		||||
    - BUGFIX: Better support for cookies in RSS
 | 
			
		||||
    - BUGFIX: Make sure show/hide text in tray icon menu is correct
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,6 @@
 | 
			
		||||
			<string>qBitTorrentDocument</string>
 | 
			
		||||
			<key>CFBundleTypeName</key>
 | 
			
		||||
			<string>BitTorrent Document</string>
 | 
			
		||||
			<key>CFBundleTypeMIMETypes</key>
 | 
			
		||||
			<array>
 | 
			
		||||
				<string>application/x-bittorrent</string>
 | 
			
		||||
			</array>
 | 
			
		||||
			<key>CFBundleTypeRole</key>
 | 
			
		||||
			<string>Viewer</string>
 | 
			
		||||
			<key>LSHandlerRank</key>
 | 
			
		||||
@@ -40,21 +36,55 @@
 | 
			
		||||
			<string>BitTorrent Magnet URL</string>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</array>
 | 
			
		||||
	<key>CFBundleName</key>
 | 
			
		||||
	<string>qBittorrent</string>
 | 
			
		||||
	<key>CFBundleIconFile</key>
 | 
			
		||||
	<string>qbittorrent_mac.icns</string>
 | 
			
		||||
	<key>CFBundleInfoDictionaryVersion</key>
 | 
			
		||||
	<string>6.0</string>
 | 
			
		||||
	<key>CFBundlePackageType</key>
 | 
			
		||||
	<string>APPL</string>
 | 
			
		||||
	<key>CFBundleGetInfoString</key>
 | 
			
		||||
	<string>2.9.9</string>
 | 
			
		||||
	<key>CFBundleShortVersionString</key>
 | 
			
		||||
	<string>2.9.11</string>
 | 
			
		||||
	<key>CFBundleSignature</key>
 | 
			
		||||
	<string>????</string>
 | 
			
		||||
	<string>qBit</string>
 | 
			
		||||
	<key>CFBundleExecutable</key>
 | 
			
		||||
	<string>qbittorrent</string>
 | 
			
		||||
	<key>CFBundleIdentifier</key>
 | 
			
		||||
	<string>org.qbittorrent</string>
 | 
			
		||||
	<key>NOTE</key>
 | 
			
		||||
	<string>This file was generated by Qt/QMake.</string>
 | 
			
		||||
	<key>NSAppleScriptEnabled</key>
 | 
			
		||||
	<string>YES</string>
 | 
			
		||||
	<key>NSHumanReadableCopyright</key>
 | 
			
		||||
	<string>Copyright © 2006-2012 Christophe Dumez</string>
 | 
			
		||||
	<key>UTExportedTypeDeclarations</key>
 | 
			
		||||
	<array>
 | 
			
		||||
		<dict>
 | 
			
		||||
			<key>UTTypeConformsTo</key>
 | 
			
		||||
			<array>
 | 
			
		||||
				<string>public.data</string>
 | 
			
		||||
				<string>public.item</string>
 | 
			
		||||
				<string>com.bittorrent.torrent</string>
 | 
			
		||||
			</array>
 | 
			
		||||
			<key>UTTypeDescription</key>
 | 
			
		||||
			<string>BitTorrent Document</string>
 | 
			
		||||
			<key>UTTypeIconFile</key>
 | 
			
		||||
			<string>qBitTorrentDocument</string>
 | 
			
		||||
			<key>UTTypeIdentifier</key>
 | 
			
		||||
			<string>org.bittorrent.torrent</string>
 | 
			
		||||
			<key>UTTypeReferenceURL</key>
 | 
			
		||||
			<string>http://www.bittorrent.org/beps/bep_0000.html</string>
 | 
			
		||||
			<key>UTTypeTagSpecification</key>
 | 
			
		||||
			<dict>
 | 
			
		||||
				<key>com.apple.ostype</key>
 | 
			
		||||
				<string>TORR</string>
 | 
			
		||||
				<key>public.filename-extension</key>
 | 
			
		||||
				<array>
 | 
			
		||||
					<string>torrent</string>
 | 
			
		||||
				</array>
 | 
			
		||||
				<key>public.mime-type</key>
 | 
			
		||||
				<string>application/x-bittorrent</string>
 | 
			
		||||
			</dict>
 | 
			
		||||
		</dict>
 | 
			
		||||
	</array>
 | 
			
		||||
</dict>
 | 
			
		||||
</plist>
 | 
			
		||||
 
 | 
			
		||||
@@ -37,8 +37,8 @@ QT_BEGIN_NAMESPACE
 | 
			
		||||
namespace Ui {
 | 
			
		||||
    class ExecutionLog;
 | 
			
		||||
}
 | 
			
		||||
class LogListWidget;
 | 
			
		||||
QT_END_NAMESPACE
 | 
			
		||||
class LogListWidget;
 | 
			
		||||
 | 
			
		||||
class ExecutionLog : public QWidget
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -307,6 +307,9 @@ int main(int argc, char *argv[]){
 | 
			
		||||
  QObject::connect(&app, SIGNAL(messageReceived(const QString&)),
 | 
			
		||||
                   &window, SLOT(processParams(const QString&)));
 | 
			
		||||
  app.setActivationWindow(&window);
 | 
			
		||||
#ifdef Q_WS_MAC
 | 
			
		||||
  static_cast<QMacApplication*>(&app)->setReadyToProcessEvents();
 | 
			
		||||
#endif // Q_WS_MAC
 | 
			
		||||
#else
 | 
			
		||||
  // Load Headless class
 | 
			
		||||
  HeadlessLoader loader(torrentCmdLine);
 | 
			
		||||
 
 | 
			
		||||
@@ -145,6 +145,7 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(finishedTorrent(QTorrentHandle)), this, SLOT(finishedTorrent(QTorrentHandle)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(trackerAuthenticationRequired(QTorrentHandle)), this, SLOT(trackerAuthenticationRequired(QTorrentHandle)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(newDownloadedTorrent(QString, QString)), this, SLOT(processDownloadedFiles(QString, QString)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(newMagnetLink(QString)), this, SLOT(processNewMagnetLink(QString)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(downloadFromUrlFailure(QString, QString)), this, SLOT(handleDownloadFromUrlFailure(QString, QString)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(alternativeSpeedsModeChanged(bool)), this, SLOT(updateAltSpeedsBtn(bool)));
 | 
			
		||||
  connect(QBtSession::instance(), SIGNAL(recursiveTorrentDownloadPossible(QTorrentHandle)), this, SLOT(askRecursiveTorrentDownloadConfirmation(QTorrentHandle)));
 | 
			
		||||
@@ -254,9 +255,13 @@ MainWindow::MainWindow(QWidget *parent, QStringList torrentCmdLine) : QMainWindo
 | 
			
		||||
  readSettings();
 | 
			
		||||
 | 
			
		||||
  if(!ui_locked) {
 | 
			
		||||
    if(pref.startMinimized() && systrayIcon)
 | 
			
		||||
      showMinimized();
 | 
			
		||||
    else {
 | 
			
		||||
    if(pref.startMinimized() && systrayIcon) {
 | 
			
		||||
      show();
 | 
			
		||||
      minimizeWindow();
 | 
			
		||||
      // XXX: Using showMinimized() makes it impossible to restore
 | 
			
		||||
      // the window if "Minimize to systray" is enabled.
 | 
			
		||||
      //showMinimized();
 | 
			
		||||
    } else {
 | 
			
		||||
      show();
 | 
			
		||||
      activateWindow();
 | 
			
		||||
      raise();
 | 
			
		||||
@@ -700,14 +705,10 @@ void MainWindow::toggleVisibility(QSystemTrayIcon::ActivationReason e) {
 | 
			
		||||
        if(!unlockUI())
 | 
			
		||||
          return;
 | 
			
		||||
      }
 | 
			
		||||
      // Make sure the window is not minimized
 | 
			
		||||
      setWindowState(windowState() & ~Qt::WindowMinimized | Qt::WindowActive);
 | 
			
		||||
      // Then show it
 | 
			
		||||
      show();
 | 
			
		||||
      if(isMinimized()) {
 | 
			
		||||
        if(isMaximized()) {
 | 
			
		||||
          showMaximized();
 | 
			
		||||
        }else{
 | 
			
		||||
          showNormal();
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      raise();
 | 
			
		||||
      activateWindow();
 | 
			
		||||
    }else{
 | 
			
		||||
@@ -817,7 +818,7 @@ bool MainWindow::event(QEvent * e) {
 | 
			
		||||
        // Iconify if there is no modal window
 | 
			
		||||
        if(!has_modal_window) {
 | 
			
		||||
          qDebug("Minimize to Tray enabled, hiding!");
 | 
			
		||||
          e->accept();
 | 
			
		||||
          e->ignore();
 | 
			
		||||
          QTimer::singleShot(0, this, SLOT(hide()));
 | 
			
		||||
          return true;
 | 
			
		||||
        }
 | 
			
		||||
@@ -992,6 +993,17 @@ void MainWindow::processDownloadedFiles(QString path, QString url) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::processNewMagnetLink(const QString& link)
 | 
			
		||||
{
 | 
			
		||||
  QIniSettings settings(QString::fromUtf8("qBittorrent"), QString::fromUtf8("qBittorrent"));
 | 
			
		||||
  const bool useTorrentAdditionDialog = settings.value(QString::fromUtf8("Preferences/Downloads/AdditionDialog"), true).toBool();
 | 
			
		||||
  if (useTorrentAdditionDialog) {
 | 
			
		||||
    torrentAdditionDialog *dialog = new torrentAdditionDialog(this);
 | 
			
		||||
    dialog->showLoadMagnetURI(link);
 | 
			
		||||
  } else
 | 
			
		||||
    QBtSession::instance()->addMagnetUri(link);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void MainWindow::optionsSaved() {
 | 
			
		||||
  loadPreferences();
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -129,6 +129,7 @@ protected slots:
 | 
			
		||||
  void addTorrent(QString path);
 | 
			
		||||
  void addUnauthenticatedTracker(const QPair<QTorrentHandle,QString> &tracker);
 | 
			
		||||
  void processDownloadedFiles(QString path, QString url);
 | 
			
		||||
  void processNewMagnetLink(const QString& link);
 | 
			
		||||
  void finishedTorrent(const QTorrentHandle& h) const;
 | 
			
		||||
  void askRecursiveTorrentDownloadConfirmation(const QTorrentHandle &h);
 | 
			
		||||
  // Options slots
 | 
			
		||||
 
 | 
			
		||||
@@ -652,7 +652,7 @@ void PropertiesWidget::deleteSelectedUrlSeeds(){
 | 
			
		||||
 | 
			
		||||
bool PropertiesWidget::applyPriorities() {
 | 
			
		||||
  qDebug("Saving files priorities");
 | 
			
		||||
  const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(h.get_torrent_info().num_files());
 | 
			
		||||
  const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
 | 
			
		||||
  // Save first/last piece first option state
 | 
			
		||||
  bool first_last_piece_first = h.first_last_piece_first();
 | 
			
		||||
  // Prioritize the files
 | 
			
		||||
 
 | 
			
		||||
@@ -39,6 +39,7 @@
 | 
			
		||||
PropTabBar::PropTabBar(QWidget *parent) :
 | 
			
		||||
  QHBoxLayout(parent), m_currentIndex(-1)
 | 
			
		||||
{
 | 
			
		||||
  setSpacing(2);
 | 
			
		||||
  m_btnGroup = new QButtonGroup(this);
 | 
			
		||||
  // General tab
 | 
			
		||||
  QPushButton *main_infos_button = new QPushButton(IconProvider::instance()->getIcon("document-properties"), tr("General"), parent);
 | 
			
		||||
 
 | 
			
		||||
@@ -81,9 +81,9 @@ TrackerList::~TrackerList() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QList<QTreeWidgetItem*> TrackerList::getSelectedTrackerItems() const {
 | 
			
		||||
  QList<QTreeWidgetItem*> selected_items = selectedItems();
 | 
			
		||||
  const QList<QTreeWidgetItem*> selected_items = selectedItems();
 | 
			
		||||
  QList<QTreeWidgetItem*> selected_trackers;
 | 
			
		||||
  foreach(QTreeWidgetItem *item, selectedItems()) {
 | 
			
		||||
  foreach(QTreeWidgetItem *item, selected_items) {
 | 
			
		||||
    if(indexOfTopLevelItem(item) >= NB_STICKY_ITEM) { // Ignore STICKY ITEMS
 | 
			
		||||
      selected_trackers << item;
 | 
			
		||||
    }
 | 
			
		||||
@@ -188,11 +188,12 @@ void TrackerList::clear() {
 | 
			
		||||
void TrackerList::loadStickyItems(const QTorrentHandle &h) {
 | 
			
		||||
  // XXX: libtorrent should provide this info...
 | 
			
		||||
  // Count peers from DHT, LSD, PeX
 | 
			
		||||
  uint nb_dht=0, nb_lsd=0, nb_pex=0;
 | 
			
		||||
  uint nb_dht = 0, nb_lsd = 0, nb_pex = 0;
 | 
			
		||||
  std::vector<peer_info> peers;
 | 
			
		||||
  h.get_peer_info(peers);
 | 
			
		||||
  std::vector<peer_info>::iterator it;
 | 
			
		||||
  for(it=peers.begin(); it!=peers.end(); it++) {
 | 
			
		||||
  std::vector<peer_info>::iterator it = peers.begin();
 | 
			
		||||
  std::vector<peer_info>::iterator end = peers.end();
 | 
			
		||||
  for ( ; it != end; ++it) {
 | 
			
		||||
    if(it->source & peer_info::dht)
 | 
			
		||||
      ++nb_dht;
 | 
			
		||||
    if(it->source & peer_info::lsd)
 | 
			
		||||
@@ -201,7 +202,7 @@ void TrackerList::loadStickyItems(const QTorrentHandle &h) {
 | 
			
		||||
      ++nb_pex;
 | 
			
		||||
  }
 | 
			
		||||
  // load DHT information
 | 
			
		||||
  if(QBtSession::instance()->isDHTEnabled() && h.has_metadata() && !h.priv()) {
 | 
			
		||||
  if (QBtSession::instance()->isDHTEnabled() && !h.priv()) {
 | 
			
		||||
    dht_item->setText(COL_STATUS, tr("Working"));
 | 
			
		||||
  } else {
 | 
			
		||||
    dht_item->setText(COL_STATUS, tr("Disabled"));
 | 
			
		||||
@@ -233,7 +234,9 @@ void TrackerList::loadTrackers() {
 | 
			
		||||
  QHash<QString, TrackerInfos> trackers_data = QBtSession::instance()->getTrackersInfo(h.hash());
 | 
			
		||||
  QStringList old_trackers_urls = tracker_items.keys();
 | 
			
		||||
  const std::vector<announce_entry> trackers = h.trackers();
 | 
			
		||||
  for(std::vector<announce_entry>::const_iterator it = trackers.begin(); it != trackers.end(); it++) {
 | 
			
		||||
  std::vector<announce_entry>::const_iterator it = trackers.begin();
 | 
			
		||||
  std::vector<announce_entry>::const_iterator end = trackers.end();
 | 
			
		||||
  for( ; it != end; ++it) {
 | 
			
		||||
    QString tracker_url = misc::toQString(it->url);
 | 
			
		||||
    QTreeWidgetItem *item = tracker_items.value(tracker_url, 0);
 | 
			
		||||
    if(!item) {
 | 
			
		||||
 
 | 
			
		||||
@@ -34,11 +34,21 @@
 | 
			
		||||
#include "qmacapplication.h"
 | 
			
		||||
 | 
			
		||||
QMacApplication::QMacApplication(QString appid, int &argc, char** argv) :
 | 
			
		||||
    QtSingleApplication(appid, argc, argv)
 | 
			
		||||
  QtSingleApplication(appid, argc, argv),
 | 
			
		||||
  m_readyToProcessEvents(false)
 | 
			
		||||
{
 | 
			
		||||
  qDebug("Constructing a QMacApplication to receive file open events");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QMacApplication::setReadyToProcessEvents()
 | 
			
		||||
{
 | 
			
		||||
  m_readyToProcessEvents = true;
 | 
			
		||||
  if (!m_torrentsQueue.isEmpty()) {
 | 
			
		||||
    emit newFileOpenMacEvent(m_torrentsQueue.join("|"));
 | 
			
		||||
    m_torrentsQueue.clear();
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool QMacApplication::event(QEvent * ev) {
 | 
			
		||||
  switch (ev->type()) {
 | 
			
		||||
  case QEvent::FileOpen:
 | 
			
		||||
@@ -49,7 +59,10 @@ bool QMacApplication::event(QEvent * ev) {
 | 
			
		||||
        path = static_cast<QFileOpenEvent *>(ev)->url().toString();
 | 
			
		||||
      }
 | 
			
		||||
      qDebug("Received a mac file open event: %s", qPrintable(path));
 | 
			
		||||
      emit newFileOpenMacEvent(path);
 | 
			
		||||
      if (m_readyToProcessEvents)
 | 
			
		||||
        emit newFileOpenMacEvent(path);
 | 
			
		||||
      else
 | 
			
		||||
        m_torrentsQueue.append(path);
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  default:
 | 
			
		||||
 
 | 
			
		||||
@@ -31,12 +31,14 @@
 | 
			
		||||
#define QMACAPPLICATION_H
 | 
			
		||||
 | 
			
		||||
#include "qtsingleapplication.h"
 | 
			
		||||
#include <QStringList>
 | 
			
		||||
 | 
			
		||||
class QMacApplication : public QtSingleApplication
 | 
			
		||||
{
 | 
			
		||||
  Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
  explicit QMacApplication(QString appid, int &argc, char** argv);
 | 
			
		||||
  void setReadyToProcessEvents();
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
  void newFileOpenMacEvent(const QString &path);
 | 
			
		||||
@@ -44,6 +46,9 @@ signals:
 | 
			
		||||
protected:
 | 
			
		||||
  bool event(QEvent *);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  bool m_readyToProcessEvents;
 | 
			
		||||
  QStringList m_torrentsQueue;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // QMACAPPLICATION_H
 | 
			
		||||
 
 | 
			
		||||
@@ -181,7 +181,7 @@ QBtSession::QBtSession()
 | 
			
		||||
  const QString peer_id = "qB";
 | 
			
		||||
  // Construct session
 | 
			
		||||
  s = new session(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)), 0);
 | 
			
		||||
  std::cout << "Peer ID: " << fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string() << std::endl;
 | 
			
		||||
  //std::cout << "Peer ID: " << fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string() << std::endl;
 | 
			
		||||
  addConsoleMessage("Peer ID: "+misc::toQString(fingerprint(peer_id.toLocal8Bit().constData(), version.at(0), version.at(1), version.at(2), version.at(3)).to_string()));
 | 
			
		||||
 | 
			
		||||
  // Set severity level of libtorrent session
 | 
			
		||||
@@ -280,10 +280,10 @@ void QBtSession::processBigRatios() {
 | 
			
		||||
      const QString hash = h.hash();
 | 
			
		||||
      const qreal ratio = getRealRatio(hash);
 | 
			
		||||
      qreal ratio_limit = TorrentPersistentData::getRatioLimit(hash);
 | 
			
		||||
      if(ratio_limit == TorrentPersistentData::NO_RATIO_LIMIT)
 | 
			
		||||
        continue;
 | 
			
		||||
      if(ratio_limit == TorrentPersistentData::USE_GLOBAL_RATIO)
 | 
			
		||||
        ratio_limit = global_ratio_limit;
 | 
			
		||||
      if(ratio_limit == TorrentPersistentData::NO_RATIO_LIMIT)
 | 
			
		||||
        continue;
 | 
			
		||||
      qDebug("Ratio: %f (limit: %f)", ratio, ratio_limit);
 | 
			
		||||
      Q_ASSERT(ratio_limit >= 0.f);
 | 
			
		||||
      if(ratio <= MAX_RATIO && ratio >= ratio_limit) {
 | 
			
		||||
@@ -445,7 +445,7 @@ void QBtSession::configureSession() {
 | 
			
		||||
  // * Session settings
 | 
			
		||||
  session_settings sessionSettings = s->settings();
 | 
			
		||||
  sessionSettings.user_agent = "qBittorrent "VERSION;
 | 
			
		||||
  std::cout << "HTTP user agent is " << sessionSettings.user_agent << std::endl;
 | 
			
		||||
  //std::cout << "HTTP user agent is " << sessionSettings.user_agent << std::endl;
 | 
			
		||||
  addConsoleMessage(tr("HTTP user agent is %1").arg(misc::toQString(sessionSettings.user_agent)));
 | 
			
		||||
 | 
			
		||||
  sessionSettings.upnp_ignore_nonrouters = true;
 | 
			
		||||
@@ -972,7 +972,17 @@ QTorrentHandle QBtSession::addMagnetUri(QString magnet_uri, bool resumed) {
 | 
			
		||||
  add_torrent_params p = initializeAddTorrentParams(hash);
 | 
			
		||||
 | 
			
		||||
  // Get save path
 | 
			
		||||
  const QString savePath(getSavePath(hash, false));
 | 
			
		||||
  QString savePath;
 | 
			
		||||
  if (!resumed && savepathLabel_fromurl.contains(magnet_uri)) {
 | 
			
		||||
    QPair<QString, QString> savePath_label = savepathLabel_fromurl.take(magnet_uri);
 | 
			
		||||
    if(!savePath_label.first.isEmpty())
 | 
			
		||||
      savePath = savePath_label.first;
 | 
			
		||||
    // Remember label
 | 
			
		||||
    if(!savePath_label.second.isEmpty())
 | 
			
		||||
      TorrentTempData::setLabel(hash, savePath_label.second);
 | 
			
		||||
  }
 | 
			
		||||
  if (savePath.isEmpty())
 | 
			
		||||
    savePath = getSavePath(hash, false);
 | 
			
		||||
  if(!defaultTempPath.isEmpty() && !TorrentPersistentData::isSeed(hash) && resumed) {
 | 
			
		||||
    qDebug("addMagnetURI: Temp folder is enabled.");
 | 
			
		||||
    QString torrent_tmp_path = defaultTempPath.replace("\\", "/");
 | 
			
		||||
@@ -2775,14 +2785,22 @@ void QBtSession::downloadFromURLList(const QStringList& urls) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QBtSession::addMagnetSkipAddDlg(QString uri) {
 | 
			
		||||
void QBtSession::addMagnetInteractive(const QString& uri)
 | 
			
		||||
{
 | 
			
		||||
  emit newMagnetLink(uri);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QBtSession::addMagnetSkipAddDlg(const QString& uri, const QString& save_path, const QString& label) {
 | 
			
		||||
  if (!save_path.isEmpty() || !label.isEmpty())
 | 
			
		||||
    savepathLabel_fromurl[uri] = qMakePair(save_path, label);
 | 
			
		||||
  addMagnetUri(uri, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void QBtSession::downloadUrlAndSkipDialog(QString url, QString save_path, QString label) {
 | 
			
		||||
  //emit aboutToDownloadFromUrl(url);
 | 
			
		||||
  const QUrl qurl = QUrl::fromEncoded(url.toUtf8());
 | 
			
		||||
  savepathLabel_fromurl[qurl] = qMakePair(save_path, label);
 | 
			
		||||
  if (!save_path.isEmpty() || !label.isEmpty())
 | 
			
		||||
    savepathLabel_fromurl[qurl] = qMakePair(save_path, label);
 | 
			
		||||
  url_skippingDlg << qurl;
 | 
			
		||||
  // Launch downloader thread
 | 
			
		||||
  downloader->downloadTorrentUrl(url);
 | 
			
		||||
 
 | 
			
		||||
@@ -164,7 +164,8 @@ public slots:
 | 
			
		||||
#endif
 | 
			
		||||
  void addPeerBanMessage(QString msg, bool from_ipfilter);
 | 
			
		||||
  void processDownloadedFile(QString, QString);
 | 
			
		||||
  void addMagnetSkipAddDlg(QString uri);
 | 
			
		||||
  void addMagnetSkipAddDlg(const QString& uri, const QString& save_path = QString(), const QString& label = QString());
 | 
			
		||||
  void addMagnetInteractive(const QString& uri);
 | 
			
		||||
  void downloadFromURLList(const QStringList& urls);
 | 
			
		||||
  void configureSession();
 | 
			
		||||
  void banIP(QString ip);
 | 
			
		||||
@@ -205,6 +206,7 @@ signals:
 | 
			
		||||
  void trackerError(const QString &hash, QString time, QString msg);
 | 
			
		||||
  void trackerAuthenticationRequired(const QTorrentHandle& h);
 | 
			
		||||
  void newDownloadedTorrent(QString path, QString url);
 | 
			
		||||
  void newMagnetLink(const QString& link);
 | 
			
		||||
  void updateFileSize(const QString &hash);
 | 
			
		||||
  void downloadFromUrlFailure(QString url, QString reason);
 | 
			
		||||
  void torrentFinishedChecking(const QTorrentHandle& h);
 | 
			
		||||
 
 | 
			
		||||
@@ -556,7 +556,7 @@ void QTorrentHandle::downloading_pieces(bitfield &bf) const {
 | 
			
		||||
 | 
			
		||||
bool QTorrentHandle::has_metadata() const {
 | 
			
		||||
#if LIBTORRENT_VERSION_MINOR > 15
 | 
			
		||||
  return torrent_handle::status(query_distributed_copies).has_metadata;
 | 
			
		||||
  return torrent_handle::status(0x0).has_metadata;
 | 
			
		||||
#else
 | 
			
		||||
  return torrent_handle::has_metadata();
 | 
			
		||||
#endif
 | 
			
		||||
@@ -564,7 +564,7 @@ bool QTorrentHandle::has_metadata() const {
 | 
			
		||||
 | 
			
		||||
float QTorrentHandle::distributed_copies() const {
 | 
			
		||||
#if LIBTORRENT_VERSION_MINOR > 15
 | 
			
		||||
return torrent_handle::status(0x0).distributed_copies;
 | 
			
		||||
return torrent_handle::status(query_distributed_copies).distributed_copies;
 | 
			
		||||
#else
 | 
			
		||||
  return torrent_handle::status().distributed_copies;
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -326,23 +326,28 @@ void RSSImp::downloadTorrent() {
 | 
			
		||||
  foreach(const QListWidgetItem* item, selected_items) {
 | 
			
		||||
    const RssArticle article =  m_feedList->getRSSItemFromUrl(item->data(Article::FeedUrlRole).toString())
 | 
			
		||||
        ->getItem(item->data(Article::IdRole).toString());
 | 
			
		||||
    // Load possible cookies
 | 
			
		||||
    QList<QNetworkCookie> cookies;
 | 
			
		||||
    QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first());
 | 
			
		||||
    QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host();
 | 
			
		||||
    const QList<QByteArray> raw_cookies = RssSettings().getHostNameCookies(feed_hostname);
 | 
			
		||||
    foreach (const QByteArray& raw_cookie, raw_cookies) {
 | 
			
		||||
      QList<QByteArray> cookie_parts = raw_cookie.split('=');
 | 
			
		||||
      if (cookie_parts.size() == 2) {
 | 
			
		||||
        qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData());
 | 
			
		||||
        cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
 | 
			
		||||
 | 
			
		||||
    QString torrentLink = article.hasAttachment() ? article.torrentUrl() : article.link();
 | 
			
		||||
 | 
			
		||||
    // Check if it is a magnet link
 | 
			
		||||
    if (torrentLink.startsWith("magnet:", Qt::CaseInsensitive))
 | 
			
		||||
      QBtSession::instance()->addMagnetInteractive(torrentLink);
 | 
			
		||||
    else {
 | 
			
		||||
      // Load possible cookies
 | 
			
		||||
      QList<QNetworkCookie> cookies;
 | 
			
		||||
      QString feed_url = m_feedList->getItemID(m_feedList->selectedItems().first());
 | 
			
		||||
      QString feed_hostname = QUrl::fromEncoded(feed_url.toUtf8()).host();
 | 
			
		||||
      const QList<QByteArray> raw_cookies = RssSettings().getHostNameCookies(feed_hostname);
 | 
			
		||||
      foreach (const QByteArray& raw_cookie, raw_cookies) {
 | 
			
		||||
        QList<QByteArray> cookie_parts = raw_cookie.split('=');
 | 
			
		||||
        if (cookie_parts.size() == 2) {
 | 
			
		||||
          qDebug("Loading cookie: %s = %s", cookie_parts.first().constData(), cookie_parts.last().constData());
 | 
			
		||||
          cookies << QNetworkCookie(cookie_parts.first(), cookie_parts.last());
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    qDebug("Loaded %d cookies for RSS item\n", cookies.size());
 | 
			
		||||
    if (article.hasAttachment()) {
 | 
			
		||||
      QBtSession::instance()->downloadFromUrl(article.torrentUrl(), cookies);
 | 
			
		||||
    } else {
 | 
			
		||||
      QBtSession::instance()->downloadFromUrl(article.link(), cookies);
 | 
			
		||||
      qDebug("Loaded %d cookies for RSS item\n", cookies.size());
 | 
			
		||||
 | 
			
		||||
      QBtSession::instance()->downloadFromUrl(torrentLink, cookies);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -314,7 +314,10 @@ void RssFeed::downloadMatchingArticleTorrents() {
 | 
			
		||||
      item.markAsRead();
 | 
			
		||||
      // Download the torrent
 | 
			
		||||
      QBtSession::instance()->addConsoleMessage(tr("Automatically downloading %1 torrent from %2 RSS feed...").arg(item.title()).arg(displayName()));
 | 
			
		||||
      QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
 | 
			
		||||
      if (torrent_url.startsWith("magnet:", Qt::CaseInsensitive))
 | 
			
		||||
        QBtSession::instance()->addMagnetSkipAddDlg(torrent_url, matching_rule.savePath(), matching_rule.label());
 | 
			
		||||
      else
 | 
			
		||||
        QBtSession::instance()->downloadUrlAndSkipDialog(torrent_url, matching_rule.savePath(), matching_rule.label());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#VERSION: 1.41
 | 
			
		||||
#VERSION: 1.50
 | 
			
		||||
#AUTHORS: Fabien Devaux (fab@gnux.info)
 | 
			
		||||
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
 | 
			
		||||
 | 
			
		||||
@@ -31,14 +31,14 @@ import sgmllib
 | 
			
		||||
from helpers import retrieve_url, download_file
 | 
			
		||||
 | 
			
		||||
class piratebay(object):
 | 
			
		||||
	url = 'http://thepiratebay.org'
 | 
			
		||||
	url = 'http://thepiratebay.se'
 | 
			
		||||
	name = 'The Pirate Bay'
 | 
			
		||||
	supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	def __init__(self):
 | 
			
		||||
		self.results = []
 | 
			
		||||
		self.parser = self.SimpleSGMLParser(self.results, self.url)
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
	def download_torrent(self, info):
 | 
			
		||||
		print download_file(info)
 | 
			
		||||
 | 
			
		||||
@@ -57,10 +57,9 @@ class piratebay(object):
 | 
			
		||||
			if params['href'].startswith('/torrent/'):
 | 
			
		||||
				self.current_item = {}
 | 
			
		||||
				self.td_counter = 0
 | 
			
		||||
				self.code = params['href'].split('/')[2]
 | 
			
		||||
				self.current_item['desc_link'] = 'http://thepiratebay.org'+params['href'].strip()
 | 
			
		||||
				self.current_item['desc_link'] = 'http://thepiratebay.se'+params['href'].strip()
 | 
			
		||||
				self.in_name = True
 | 
			
		||||
			elif params['href'].startswith('http://torrents.thepiratebay.org/%s'%self.code):
 | 
			
		||||
			elif params['href'].startswith('magnet:'):
 | 
			
		||||
				self.current_item['link']=params['href'].strip()
 | 
			
		||||
				self.in_name = False
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#VERSION: 1.40
 | 
			
		||||
#VERSION: 1.50
 | 
			
		||||
#AUTHORS: Fabien Devaux (fab@gnux.info)
 | 
			
		||||
#CONTRIBUTORS: Christophe Dumez (chris@qbittorrent.org)
 | 
			
		||||
 | 
			
		||||
@@ -31,14 +31,14 @@ import sgmllib3
 | 
			
		||||
from helpers import retrieve_url, download_file
 | 
			
		||||
 | 
			
		||||
class piratebay(object):
 | 
			
		||||
	url = 'http://thepiratebay.org'
 | 
			
		||||
	url = 'http://thepiratebay.se'
 | 
			
		||||
	name = 'The Pirate Bay'
 | 
			
		||||
	supported_categories = {'all': '0', 'movies': '200', 'music': '100', 'games': '400', 'software': '300'}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	def __init__(self):
 | 
			
		||||
		self.results = []
 | 
			
		||||
		self.parser = self.SimpleSGMLParser(self.results, self.url)
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
	def download_torrent(self, info):
 | 
			
		||||
		print(download_file(info))
 | 
			
		||||
 | 
			
		||||
@@ -57,10 +57,9 @@ class piratebay(object):
 | 
			
		||||
			if params['href'].startswith('/torrent/'):
 | 
			
		||||
				self.current_item = {}
 | 
			
		||||
				self.td_counter = 0
 | 
			
		||||
				self.code = params['href'].split('/')[2]
 | 
			
		||||
				self.current_item['desc_link'] = 'http://thepiratebay.org'+params['href'].strip()
 | 
			
		||||
				self.current_item['desc_link'] = 'http://thepiratebay.se'+params['href'].strip()
 | 
			
		||||
				self.in_name = True
 | 
			
		||||
			elif params['href'].startswith('http://torrents.thepiratebay.org/%s'%self.code):
 | 
			
		||||
			elif params['href'].startswith('magnet:'):
 | 
			
		||||
				self.current_item['link']=params['href'].strip()
 | 
			
		||||
				self.in_name = False
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@ void SearchEngine::installPython() {
 | 
			
		||||
  DownloadThread *pydownloader = new DownloadThread(this);
 | 
			
		||||
  connect(pydownloader, SIGNAL(downloadFinished(QString,QString)), this, SLOT(pythonDownloadSuccess(QString,QString)));
 | 
			
		||||
  connect(pydownloader, SIGNAL(downloadFailure(QString,QString)), this, SLOT(pythonDownloadFailure(QString,QString)));
 | 
			
		||||
  pydownloader->downloadUrl("http://python.org/ftp/python/2.7.2/python-2.7.2.msi");
 | 
			
		||||
  pydownloader->downloadUrl("http://python.org/ftp/python/2.7.3/python-2.7.3.msi");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SearchEngine::pythonDownloadSuccess(QString url, QString file_path) {
 | 
			
		||||
 
 | 
			
		||||
@@ -501,10 +501,8 @@ void torrentAdditionDialog::updateDiskSpaceLabels() {
 | 
			
		||||
    // Determine torrent size
 | 
			
		||||
    qulonglong torrent_size = 0;
 | 
			
		||||
    if(t->num_files() > 1) {
 | 
			
		||||
      const unsigned int nbFiles = t->num_files();
 | 
			
		||||
      const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(nbFiles);
 | 
			
		||||
 | 
			
		||||
      for(unsigned int i=0; i<nbFiles; ++i) {
 | 
			
		||||
      const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
 | 
			
		||||
      for(unsigned int i=0; i<priorities.size(); ++i) {
 | 
			
		||||
        if(priorities[i] > 0)
 | 
			
		||||
          torrent_size += t->file_at(i).size;
 | 
			
		||||
      }
 | 
			
		||||
@@ -598,7 +596,7 @@ bool torrentAdditionDialog::allFiltered() const {
 | 
			
		||||
void torrentAdditionDialog::savePiecesPriorities(){
 | 
			
		||||
  qDebug("Saving pieces priorities");
 | 
			
		||||
  Q_ASSERT(!is_magnet);
 | 
			
		||||
  const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(t->num_files());
 | 
			
		||||
  const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
 | 
			
		||||
  TorrentTempData::setFilesPriority(hash, priorities);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -338,11 +338,10 @@ class TorrentFilesModel:  public QAbstractItemModel {
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  TorrentFileItem *rootItem;
 | 
			
		||||
  TorrentFileItem **files_index;
 | 
			
		||||
  std::vector<TorrentFileItem *> files_index;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  TorrentFilesModel(QObject *parent=0): QAbstractItemModel(parent) {
 | 
			
		||||
    files_index = 0;
 | 
			
		||||
    QList<QVariant> rootData;
 | 
			
		||||
    rootData << tr("Name") << tr("Size") << tr("Progress") << tr("Priority");
 | 
			
		||||
    rootItem = new TorrentFileItem(rootData);
 | 
			
		||||
@@ -350,13 +349,16 @@ public:
 | 
			
		||||
 | 
			
		||||
  ~TorrentFilesModel() {
 | 
			
		||||
    qDebug() << Q_FUNC_INFO << "ENTER";
 | 
			
		||||
    delete [] files_index;
 | 
			
		||||
    delete rootItem;
 | 
			
		||||
    qDebug() << Q_FUNC_INFO << "EXIT";
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void updateFilesProgress(std::vector<libtorrent::size_type> fp) {
 | 
			
		||||
  void updateFilesProgress(const std::vector<libtorrent::size_type>& fp) {
 | 
			
		||||
    emit layoutAboutToBeChanged();
 | 
			
		||||
 | 
			
		||||
    if (fp.size() != files_index.size())
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    for(unsigned int i=0; i<fp.size(); ++i) {
 | 
			
		||||
      Q_ASSERT(fp[i] >= 0);
 | 
			
		||||
      files_index[i]->setProgress(fp[i]);
 | 
			
		||||
@@ -366,6 +368,10 @@ public:
 | 
			
		||||
 | 
			
		||||
  void updateFilesPriorities(const std::vector<int> &fprio) {
 | 
			
		||||
    emit layoutAboutToBeChanged();
 | 
			
		||||
 | 
			
		||||
    if (fprio.size() != files_index.size())
 | 
			
		||||
      return;
 | 
			
		||||
 | 
			
		||||
    for(unsigned int i=0; i<fprio.size(); ++i) {
 | 
			
		||||
      //qDebug("Called updateFilesPriorities with %d", fprio[i]);
 | 
			
		||||
      files_index[i]->setPriority(fprio[i]);
 | 
			
		||||
@@ -373,9 +379,9 @@ public:
 | 
			
		||||
    emit dataChanged(index(0,0), index(rowCount(), columnCount()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::vector<int> getFilesPriorities(unsigned int nbFiles) const {
 | 
			
		||||
  std::vector<int> getFilesPriorities() const {
 | 
			
		||||
    std::vector<int> prio;
 | 
			
		||||
    for(unsigned int i=0; i<nbFiles; ++i) {
 | 
			
		||||
    for(unsigned int i=0; i<files_index.size(); ++i) {
 | 
			
		||||
      //qDebug("Called getFilesPriorities: %d", files_index[i]->getPriority());
 | 
			
		||||
      prio.push_back(files_index[i]->getPriority());
 | 
			
		||||
    }
 | 
			
		||||
@@ -409,7 +415,7 @@ public:
 | 
			
		||||
          item->setPriority(prio::IGNORED);
 | 
			
		||||
        else
 | 
			
		||||
          item->setPriority(prio::NORMAL);
 | 
			
		||||
        emit dataChanged(this->index(0,0), this->index(rowCount(), columnCount()));
 | 
			
		||||
        emit dataChanged(this->index(0,0), this->index(rowCount()-1, columnCount()-1));
 | 
			
		||||
        emit filteredFilesChanged();
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
@@ -541,10 +547,7 @@ public:
 | 
			
		||||
  void clear() {
 | 
			
		||||
    qDebug("clear called");
 | 
			
		||||
    beginResetModel();
 | 
			
		||||
    if(files_index) {
 | 
			
		||||
      delete [] files_index;
 | 
			
		||||
      files_index = 0;
 | 
			
		||||
    }
 | 
			
		||||
    files_index.clear();
 | 
			
		||||
    rootItem->deleteAllChildren();
 | 
			
		||||
    endResetModel();
 | 
			
		||||
  }
 | 
			
		||||
@@ -555,7 +558,7 @@ public:
 | 
			
		||||
    emit layoutAboutToBeChanged();
 | 
			
		||||
    // Initialize files_index array
 | 
			
		||||
    qDebug("Torrent contains %d files", t.num_files());
 | 
			
		||||
    files_index = new TorrentFileItem*[t.num_files()];
 | 
			
		||||
    files_index.reserve(t.num_files());
 | 
			
		||||
 | 
			
		||||
    TorrentFileItem *parent = this->rootItem;
 | 
			
		||||
    TorrentFileItem *root_folder = parent;
 | 
			
		||||
@@ -582,8 +585,7 @@ public:
 | 
			
		||||
        current_parent = new_parent;
 | 
			
		||||
      }
 | 
			
		||||
      // Actually create the file
 | 
			
		||||
      TorrentFileItem *f = new TorrentFileItem(t, fentry, current_parent, i);
 | 
			
		||||
      files_index[i] = f;
 | 
			
		||||
      files_index.push_back(new TorrentFileItem(t, fentry, current_parent, i));
 | 
			
		||||
    }
 | 
			
		||||
    emit layoutChanged();
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -64,6 +64,9 @@ public:
 | 
			
		||||
    setAcceptDrops(true);
 | 
			
		||||
    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
 | 
			
		||||
    setStyleSheet("QListWidget { background: transparent; border: 0 }");
 | 
			
		||||
#if defined(Q_WS_MAC)
 | 
			
		||||
    setAttribute(Qt::WA_MacShowFocusRect, false);
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Redefine addItem() to make sure the list stays sorted
 | 
			
		||||
@@ -161,6 +164,9 @@ public:
 | 
			
		||||
    // Height is fixed (sizeHint().height() is used)
 | 
			
		||||
    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
 | 
			
		||||
    setStyleSheet("QListWidget { background: transparent; border: 0 }");
 | 
			
		||||
#if defined(Q_WS_MAC)
 | 
			
		||||
    setAttribute(Qt::WA_MacShowFocusRect, false);
 | 
			
		||||
#endif
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
@@ -202,14 +208,12 @@ public:
 | 
			
		||||
    vLayout->addWidget(torrentsLabel);
 | 
			
		||||
    statusFilters = new StatusFiltersWidget(this);
 | 
			
		||||
    vLayout->addWidget(statusFilters);
 | 
			
		||||
    statusFilters->setFocusPolicy(Qt::NoFocus);
 | 
			
		||||
    QLabel *labelsLabel = new QLabel(tr("Labels"));
 | 
			
		||||
    labelsLabel->setIndent(2);
 | 
			
		||||
    labelsLabel->setFont(font);
 | 
			
		||||
    vLayout->addWidget(labelsLabel);
 | 
			
		||||
    labelFilters = new LabelFiltersList(this);
 | 
			
		||||
    vLayout->addWidget(labelFilters);
 | 
			
		||||
    labelFilters->setFocusPolicy(Qt::NoFocus);
 | 
			
		||||
    setLayout(vLayout);
 | 
			
		||||
    labelFilters->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 | 
			
		||||
    statusFilters->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 | 
			
		||||
 
 | 
			
		||||
@@ -106,6 +106,9 @@ TransferListWidget::TransferListWidget(QWidget *parent, MainWindow *main_window,
 | 
			
		||||
  setItemsExpandable(false);
 | 
			
		||||
  setAutoScroll(true);
 | 
			
		||||
  setDragDropMode(QAbstractItemView::DragOnly);
 | 
			
		||||
#if defined(Q_WS_MAC)
 | 
			
		||||
  setAttribute(Qt::WA_MacShowFocusRect, false);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
  // Default hidden columns
 | 
			
		||||
  if(!column_loaded) {
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,10 @@ QList<QVariantMap> EventManager::getPropFilesInfo(QString hash) const {
 | 
			
		||||
  h.file_progress(fp);
 | 
			
		||||
  for(int i=0; i<h.num_files(); ++i) {
 | 
			
		||||
    QVariantMap file;
 | 
			
		||||
    file["name"] = h.filename_at(i);
 | 
			
		||||
    QString fileName = h.filename_at(i);
 | 
			
		||||
    if (fileName.endsWith(".!qB"))
 | 
			
		||||
      fileName.chop(4);
 | 
			
		||||
    file["name"] = fileName;
 | 
			
		||||
    libtorrent::size_type size = h.filesize_at(i);
 | 
			
		||||
    file["size"] = misc::friendlyUnit((double)size);
 | 
			
		||||
    if(size > 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
<img src="../images/skin/mascot.png" align="right"></img>
 | 
			
		||||
<img src="images/skin/mascot.png" align="right"></img>
 | 
			
		||||
<p>qBittorrent ${VERSION} (Web UI)</p>
 | 
			
		||||
<p>Copyright (c) 2011 <a href="mailto:chris@qbittorrent.org">Christophe Dumez</a></p>
 | 
			
		||||
<p>Homepage: <a href="http://www.qbittorrent.com">http://www.qbittorrent.com</a></p>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
	$('addTrackersButton').addEvent('click', function(e){
 | 
			
		||||
		new Event(e).stop();
 | 
			
		||||
		var hash = new URI().getData('hash');
 | 
			
		||||
		new Request({url: '/command/addTrackers', method: 'post', data: {hash: hash, urls: $('trackersUrls').value},
 | 
			
		||||
		new Request({url: 'command/addTrackers', method: 'post', data: {hash: hash, urls: $('trackersUrls').value},
 | 
			
		||||
			onComplete: function() {
 | 
			
		||||
				window.parent.document.getElementById('trackersPage').parentNode.removeChild(window.parent.document.getElementById('trackersPage'));
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -45,9 +45,9 @@ window.addEvent('domready', function(){
 | 
			
		||||
        });
 | 
			
		||||
	$('confirmBtn').addEvent('click', function(e){
 | 
			
		||||
		new Event(e).stop();
 | 
			
		||||
		var cmd = '/command/delete';
 | 
			
		||||
		var cmd = 'command/delete';
 | 
			
		||||
                if($('deleteFromDiskCB').get('checked'))
 | 
			
		||||
			 cmd = '/command/deletePerm';
 | 
			
		||||
			 cmd = 'command/deletePerm';
 | 
			
		||||
                new Request({url: cmd, 
 | 
			
		||||
                             method: 'post', 
 | 
			
		||||
                             data: {hashes: hashes.join('|')},
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
	setDlLimit = function() {
 | 
			
		||||
		var limit = $("dllimitUpdatevalue").get('html').toInt() * 1024;
 | 
			
		||||
		if(hash == "global") {
 | 
			
		||||
			new Request({url: '/command/setGlobalDlLimit',
 | 
			
		||||
			new Request({url: 'command/setGlobalDlLimit',
 | 
			
		||||
				    method: 'post',
 | 
			
		||||
				    data: {'limit': limit},
 | 
			
		||||
				    onComplete: function() {
 | 
			
		||||
@@ -33,7 +33,7 @@
 | 
			
		||||
				    }
 | 
			
		||||
			}).send();
 | 
			
		||||
		} else {
 | 
			
		||||
			new Request({url: '/command/setTorrentDlLimit',
 | 
			
		||||
			new Request({url: 'command/setTorrentDlLimit',
 | 
			
		||||
				    method: 'post',
 | 
			
		||||
				    data: {'hash': hash, 'limit': limit},
 | 
			
		||||
				    onComplete: function() {
 | 
			
		||||
@@ -51,4 +51,4 @@
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -196,7 +196,7 @@
 | 
			
		||||
 | 
			
		||||
<fieldset class="settings">
 | 
			
		||||
  <legend>_(Torrent Queueing)</legend>
 | 
			
		||||
  <input type="checkbox" id="queueing_checkbox" onclick="updateQueuingSystem();"/>
 | 
			
		||||
  <input type="checkbox" id="queueing_checkbox" onclick="updateQueueingSystem();"/>
 | 
			
		||||
  <label for="queueing_checkbox">_(Torrent Queueing)</label><br/>
 | 
			
		||||
  <div class="formRow">
 | 
			
		||||
  <label for="max_active_dl_value" style="margin-left: 20px;" class="leftLabelLarge">_(Maximum active downloads:)</label>
 | 
			
		||||
@@ -1043,7 +1043,7 @@ applyPreferences = function() {
 | 
			
		||||
  // Send it to qBT
 | 
			
		||||
  var json_str = JSON.encode(settings);
 | 
			
		||||
 | 
			
		||||
  new Request({url: '/command/setPreferences',
 | 
			
		||||
  new Request({url: 'command/setPreferences',
 | 
			
		||||
			    method: 'post',
 | 
			
		||||
			    data: {'json': json_str,
 | 
			
		||||
                                   },
 | 
			
		||||
 
 | 
			
		||||
@@ -88,7 +88,7 @@ var allCBUnchecked = function() {
 | 
			
		||||
    
 | 
			
		||||
var setFilePriority = function(id, priority) {
 | 
			
		||||
  if(current_hash == "") return;
 | 
			
		||||
  new Request({url: '/command/setFilePrio', method: 'post', data: {'hash': current_hash, 'id': id, 'priority': priority}}).send();
 | 
			
		||||
  new Request({url: 'command/setFilePrio', method: 'post', data: {'hash': current_hash, 'id': id, 'priority': priority}}).send();
 | 
			
		||||
  // Display or add combobox
 | 
			
		||||
  if(priority > 0) {
 | 
			
		||||
    $('comboPrio'+id).set("value", 1);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,7 +15,7 @@ function hideAll() {
 | 
			
		||||
<iframe id="upload_frame" name="upload_frame" style="width:1px;height:1px;border:0px;" src="javascript:false;"></iframe>
 | 
			
		||||
<center>
 | 
			
		||||
	<h1 class="vcenter"><img class="vcenter" title="Download local torrent" src="theme/list-add"/>_(Download local torrent)</h1>
 | 
			
		||||
<form action="/command/upload" enctype="multipart/form-data" method="post" id="uploadForm" target="upload_frame">
 | 
			
		||||
<form action="command/upload" enctype="multipart/form-data" method="post" id="uploadForm" target="upload_frame">
 | 
			
		||||
  <input type="file" name="torrentfile" id="torrentfile" size="40"/><br/><br/>
 | 
			
		||||
  <input type="submit" value="_(Download)" id="upButton"/>
 | 
			
		||||
</form>
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,7 @@
 | 
			
		||||
	setUpLimit = function() {
 | 
			
		||||
		var limit = $("uplimitUpdatevalue").get('html').toInt() * 1024;
 | 
			
		||||
		if(hash == "global") {
 | 
			
		||||
			new Request({url: '/command/setGlobalUpLimit',
 | 
			
		||||
			new Request({url: 'command/setGlobalUpLimit',
 | 
			
		||||
				    method: 'post',
 | 
			
		||||
				    data: {'limit': limit},
 | 
			
		||||
				    onComplete: function() {
 | 
			
		||||
@@ -33,7 +33,7 @@
 | 
			
		||||
				    }
 | 
			
		||||
			}).send();
 | 
			
		||||
		}else {
 | 
			
		||||
			new Request({url: '/command/setTorrentUpLimit',
 | 
			
		||||
			new Request({url: 'command/setTorrentUpLimit',
 | 
			
		||||
				    method: 'post',
 | 
			
		||||
				    data: {'hash': hash, 'limit': limit},
 | 
			
		||||
				    onComplete: function() {
 | 
			
		||||
@@ -51,4 +51,4 @@
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user