From 5962ef79cb7194eeb871d6d70a75d02994fa0a92 Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 15 Nov 2009 10:00:07 +0000 Subject: [PATCH] - Added option to disable peer host name resolution (disabled as a default) - Fix several other bugs related to properties and preferences --- src/GUI.cpp | 9 ++++++++- src/GUI.h | 1 + src/options_imp.cpp | 6 ++++++ src/peerlistwidget.cpp | 43 +++++++++++++++++++++++++++++++++------- src/peerlistwidget.h | 11 +++++++--- src/preferences.h | 10 ++++++++++ src/propertieswidget.cpp | 13 +++++++++--- src/propertieswidget.h | 3 ++- 8 files changed, 81 insertions(+), 15 deletions(-) diff --git a/src/GUI.cpp b/src/GUI.cpp index d31e5bd18..ef7e1b575 100644 --- a/src/GUI.cpp +++ b/src/GUI.cpp @@ -760,6 +760,10 @@ void GUI::processDownloadedFiles(QString path, QString url) { } } +void GUI::optionsSaved() { + loadPreferences(); +} + // Load program preferences void GUI::loadPreferences(bool configure_session) { BTSession->addConsoleMessage(tr("Options were saved successfully.")); @@ -830,6 +834,9 @@ void GUI::loadPreferences(bool configure_session) { displayRSSTab(false); } + // Torrent properties + properties->reloadPreferences(); + if(configure_session) BTSession->configureSession(); @@ -1001,7 +1008,7 @@ void GUI::createTrayIcon() { // Display Program Options void GUI::on_actionOptions_triggered() { options = new options_imp(this); - connect(options, SIGNAL(status_changed()), this, SLOT(loadPreferences(bool))); + connect(options, SIGNAL(status_changed()), this, SLOT(optionsSaved())); } bool GUI::initWebUi(QString username, QString password, int port) { diff --git a/src/GUI.h b/src/GUI.h index a10c9a35a..4021e9794 100644 --- a/src/GUI.h +++ b/src/GUI.h @@ -156,6 +156,7 @@ class GUI : public QMainWindow, private Ui::MainWindow{ void scrapeTrackers(); // Options slots void on_actionOptions_triggered(); + void optionsSaved(); // HTTP slots void on_actionDownload_from_URL_triggered(); diff --git a/src/options_imp.cpp b/src/options_imp.cpp index 3234a20b1..48a2d8e49 100644 --- a/src/options_imp.cpp +++ b/src/options_imp.cpp @@ -364,6 +364,8 @@ void options_imp::saveOptions(){ settings.setValue(QString::fromUtf8("NAT-PMP"), isNATPMPEnabled()); settings.setValue(QString::fromUtf8("GlobalDLLimit"), getGlobalBandwidthLimits().first); settings.setValue(QString::fromUtf8("GlobalUPLimit"), getGlobalBandwidthLimits().second); + settings.setValue("ResolvePeerCountries", checkResolveCountries->isChecked()); + settings.setValue("ResolvePeerHostNames", checkResolveHosts->isChecked()); settings.setValue(QString::fromUtf8("ProxyType"), getProxyType()); //if(isProxyEnabled()) { settings.beginGroup("Proxy"); @@ -604,6 +606,10 @@ void options_imp::loadOptions(){ checkUploadLimit->setChecked(false); spinUploadLimit->setEnabled(false); } + // Peer connections + checkResolveCountries->setChecked(Preferences::resolvePeerCountries()); + checkResolveHosts->setChecked(Preferences::resolvePeerHostNames()); + intValue = Preferences::getProxyType(); if(intValue <= 0) { intValue = 0; diff --git a/src/peerlistwidget.cpp b/src/peerlistwidget.cpp index 0db32b0c5..e97f4ca22 100644 --- a/src/peerlistwidget.cpp +++ b/src/peerlistwidget.cpp @@ -31,13 +31,15 @@ #include "peerlistwidget.h" #include "peerlistdelegate.h" #include "reverseresolution.h" +#include "preferences.h" +#include "propertieswidget.h" #include #include #include #include #include -PeerListWidget::PeerListWidget() { +PeerListWidget::PeerListWidget(PropertiesWidget *parent): properties(parent) { // Visual settings setRootIsDecorated(false); setItemsExpandable(false); @@ -64,9 +66,7 @@ PeerListWidget::PeerListWidget() { // Load settings loadSettings(); // IP to Hostname resolver - resolver = new ReverseResolution(this); - connect(resolver, SIGNAL(ip_resolved(QString,QString)), this, SLOT(handleResolved(QString,QString))); - resolver->start(); + updatePeerHostNameResolutionState(); } PeerListWidget::~PeerListWidget() { @@ -74,7 +74,33 @@ PeerListWidget::~PeerListWidget() { delete proxyModel; delete listModel; delete listDelegate; - delete resolver; + if(resolver) + delete resolver; +} + +void PeerListWidget::updatePeerHostNameResolutionState() { + if(Preferences::resolvePeerHostNames()) { + if(!resolver) { + resolver = new ReverseResolution(this); + connect(resolver, SIGNAL(ip_resolved(QString,QString)), this, SLOT(handleResolved(QString,QString))); + resolver->start(); + clear(); + loadPeers(properties->getCurrentTorrent()); + } + } else { + if(resolver) + delete resolver; + } +} + +void PeerListWidget::clear() { + qDebug("clearing peer list"); + peerItems.clear(); + int nbrows = listModel->rowCount(); + if(nbrows > 0) { + qDebug("Cleared %d peers", nbrows); + listModel->removeRows(0, nbrows); + } } void PeerListWidget::loadSettings() { @@ -96,7 +122,8 @@ void PeerListWidget::saveSettings() const { settings.setValue(QString::fromUtf8("TorrentProperties/Peers/peersColsWidth"), contentColsWidths); } -void PeerListWidget::loadPeers(QTorrentHandle &h) { +void PeerListWidget::loadPeers(const QTorrentHandle &h) { + if(!h.is_valid()) return; std::vector peers; h.get_peer_info(peers); std::vector::iterator itr; @@ -126,7 +153,9 @@ QStandardItem* PeerListWidget::addPeer(QString ip, peer_info peer) { // Adding Peer to peer list listModel->insertRow(row); listModel->setData(listModel->index(row, IP), ip); - resolver->resolve(peer.ip); + // Resolve peer host name is asked + if(resolver) + resolver->resolve(peer.ip); listModel->setData(listModel->index(row, CLIENT), misc::toQString(peer.client)); listModel->setData(listModel->index(row, PROGRESS), peer.progress); listModel->setData(listModel->index(row, DOWN_SPEED), peer.payload_down_speed); diff --git a/src/peerlistwidget.h b/src/peerlistwidget.h index f89b99532..e6841cb51 100644 --- a/src/peerlistwidget.h +++ b/src/peerlistwidget.h @@ -33,6 +33,7 @@ #include #include +#include #include "qtorrenthandle.h" #include "misc.h" @@ -41,6 +42,7 @@ class QStandardItem; class QSortFilterProxyModel; class PeerListDelegate; class ReverseResolution; +class PropertiesWidget; class PeerListWidget : public QTreeView { Q_OBJECT @@ -50,17 +52,20 @@ private: PeerListDelegate *listDelegate; QSortFilterProxyModel * proxyModel; QHash peerItems; - ReverseResolution *resolver; + QPointer resolver; + PropertiesWidget* properties; public: - PeerListWidget(); + PeerListWidget(PropertiesWidget *parent); ~PeerListWidget(); public slots: - void loadPeers(QTorrentHandle &h); + void loadPeers(const QTorrentHandle &h); QStandardItem* addPeer(QString ip, peer_info peer); void updatePeer(QString ip, peer_info peer); void handleResolved(QString ip, QString hostname); + void updatePeerHostNameResolutionState(); + void clear(); protected slots: void loadSettings(); diff --git a/src/preferences.h b/src/preferences.h index 201717dcb..95264248e 100644 --- a/src/preferences.h +++ b/src/preferences.h @@ -187,6 +187,16 @@ public: return settings.value(QString::fromUtf8("Preferences/Connection/GlobalUPLimit"), -1).toInt(); } + static bool resolvePeerCountries() { + QSettings settings("qBittorrent", "qBittorrent"); + return settings.value(QString::fromUtf8("Preferences/Connection/ResolvePeerCountries"), false).toBool(); + } + + static bool resolvePeerHostNames() { + QSettings settings("qBittorrent", "qBittorrent"); + return settings.value(QString::fromUtf8("Preferences/Connection/ResolvePeerHostNames"), false).toBool(); + } + // Proxy options static bool isHTTPProxyEnabled() { QSettings settings("qBittorrent", "qBittorrent"); diff --git a/src/propertieswidget.cpp b/src/propertieswidget.cpp index 067a0497d..5a4e4c3c6 100644 --- a/src/propertieswidget.cpp +++ b/src/propertieswidget.cpp @@ -92,7 +92,7 @@ PropertiesWidget::PropertiesWidget(QWidget *parent, TransferListWidget *transfer progressBar->setForegroundColor(Qt::blue); ProgressHLayout->insertWidget(1, progressBar); // Peers list - peersList = new PeerListWidget(); + peersList = new PeerListWidget(this); peerpage_layout->addWidget(peersList); // Pointers init progressBarUpdater = 0; @@ -144,6 +144,7 @@ void PropertiesWidget::slide() { } void PropertiesWidget::clear() { + qDebug("Clearing torrent properties"); save_path->clear(); lbl_creationDate->clear(); hash_lbl->clear(); @@ -155,6 +156,7 @@ void PropertiesWidget::clear() { wasted->clear(); upTotal->clear(); dlTotal->clear(); + peersList->clear(); lbl_uplimit->clear(); lbl_dllimit->clear(); lbl_elapsed->clear(); @@ -165,6 +167,10 @@ void PropertiesWidget::clear() { setEnabled(false); } +const QTorrentHandle& PropertiesWidget::getCurrentTorrent() const { + return h; +} + void PropertiesWidget::loadTorrentInfos(QTorrentHandle &_h) { h = _h; if(!h.is_valid()) { @@ -258,8 +264,9 @@ void PropertiesWidget::saveSettings() { } } -void PropertiesWidget::loadPeers() { - // TODO +void PropertiesWidget::reloadPreferences() { + // Take program preferences into consideration + peersList->updatePeerHostNameResolutionState(); } void PropertiesWidget::loadDynamicData() { diff --git a/src/propertieswidget.h b/src/propertieswidget.h index 9e57e46ac..cefce5e4b 100644 --- a/src/propertieswidget.h +++ b/src/propertieswidget.h @@ -81,7 +81,6 @@ protected slots: void setIncrementalDownload(int checkboxState); void loadTrackers(); void loadUrlSeeds(); - void loadPeers(); void on_main_infos_button_clicked(); void on_trackers_button_clicked(); void on_peers_button_clicked(); @@ -108,10 +107,12 @@ public slots: void clear(); void readSettings(); void saveSettings(); + void reloadPreferences(); public: PropertiesWidget(QWidget *parent, TransferListWidget *transferList, bittorrent* BTSession); ~PropertiesWidget(); + const QTorrentHandle& getCurrentTorrent() const; }; #endif // PROPERTIESWIDGET_H