From cef3c9a34d99a6b6f815eef55a2a7c09e0b192a7 Mon Sep 17 00:00:00 2001 From: ngosang Date: Sat, 6 Jun 2015 07:07:08 +0200 Subject: [PATCH] Add multiple peers in Peers addition dialog. Closes #1563, #2245, #3133, #1419, #3287, #1419 --- src/gui/properties/peer.ui | 109 ------------------ src/gui/properties/peeraddition.cpp | 81 ------------- src/gui/properties/peerlistwidget.cpp | 31 +++-- src/gui/properties/peersadditiondlg.cpp | 103 +++++++++++++++++ .../{peeraddition.h => peersadditiondlg.h} | 23 ++-- src/gui/properties/peersadditiondlg.ui | 75 ++++++++++++ src/gui/properties/properties.pri | 8 +- 7 files changed, 212 insertions(+), 218 deletions(-) delete mode 100644 src/gui/properties/peer.ui delete mode 100644 src/gui/properties/peeraddition.cpp create mode 100644 src/gui/properties/peersadditiondlg.cpp rename src/gui/properties/{peeraddition.h => peersadditiondlg.h} (82%) create mode 100644 src/gui/properties/peersadditiondlg.ui diff --git a/src/gui/properties/peer.ui b/src/gui/properties/peer.ui deleted file mode 100644 index ad92877ed..000000000 --- a/src/gui/properties/peer.ui +++ /dev/null @@ -1,109 +0,0 @@ - - - addPeerDialog - - - - 0 - 0 - 400 - 112 - - - - - 0 - 0 - - - - Peer addition - - - - - - - - - - - 75 - true - - - - IP - - - Qt::AlignCenter - - - - - - - - - - - - - - - 75 - true - - - - Port - - - Qt::AlignCenter - - - - - - - - 60 - 0 - - - - - 70 - 16777215 - - - - 1000 - - - 65535 - - - 6881 - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - diff --git a/src/gui/properties/peeraddition.cpp b/src/gui/properties/peeraddition.cpp deleted file mode 100644 index 491c7418b..000000000 --- a/src/gui/properties/peeraddition.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Bittorrent Client using Qt 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 - */ - -#include -#include - -#include "core/bittorrent/peerinfo.h" -#include "peeraddition.h" - -PeerAdditionDlg::PeerAdditionDlg(QWidget *parent) - : QDialog(parent) -{ - setupUi(this); - connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); - connect(buttonBox, SIGNAL(accepted()), this, SLOT(validateInput())); -} - -QHostAddress PeerAdditionDlg::getAddress() const -{ - return QHostAddress(lineIP->text()); -} - - -ushort PeerAdditionDlg::getPort() const -{ - return spinPort->value(); -} - - -BitTorrent::PeerAddress PeerAdditionDlg::askForPeerAddress() -{ - BitTorrent::PeerAddress addr; - - PeerAdditionDlg dlg; - if (dlg.exec() == QDialog::Accepted) { - addr.ip = dlg.getAddress(); - if (addr.ip.isNull()) - qDebug("Unable to parse the provided IP."); - else - qDebug("Provided IP is correct"); - addr.port = dlg.getPort(); - } - - return addr; -} - - -void PeerAdditionDlg::validateInput() -{ - if (getAddress().isNull()) - QMessageBox::warning(this, tr("Invalid IP"), tr("The IP you provided is invalid."), QMessageBox::Ok); - else - accept(); -} diff --git a/src/gui/properties/peerlistwidget.cpp b/src/gui/properties/peerlistwidget.cpp index 1c84728c7..7094c9b53 100644 --- a/src/gui/properties/peerlistwidget.cpp +++ b/src/gui/properties/peerlistwidget.cpp @@ -43,7 +43,7 @@ #include "core/logger.h" #include "propertieswidget.h" #include "geoipmanager.h" -#include "peeraddition.h" +#include "peersadditiondlg.h" #include "speedlimitdlg.h" #include "guiiconprovider.h" #include "peerlistdelegate.h" @@ -159,7 +159,10 @@ void PeerListWidget::showPeerListMenu(const QPoint&) QString myip = m_listModel->data(m_listModel->index(row, PeerListDelegate::IP_HIDDEN)).toString(); QString myport = m_listModel->data(m_listModel->index(row, PeerListDelegate::PORT)).toString(); selectedPeerIPs << myip; - selectedPeerIPPort << myip + ":" + myport; + if (myip.indexOf(".") == -1) // IPv6 + selectedPeerIPPort << "[" + myip + "]:" + myport; + else // IPv4 + selectedPeerIPPort << myip + ":" + myport; } // Add Peer Action QAction *addPeerAct = 0; @@ -179,16 +182,22 @@ void PeerListWidget::showPeerListMenu(const QPoint&) QAction *act = menu.exec(QCursor::pos()); if (act == 0) return; if (act == addPeerAct) { - BitTorrent::PeerAddress addr = PeerAdditionDlg::askForPeerAddress(); - if (!addr.ip.isNull()) { - if (torrent->connectPeer(addr)) - QMessageBox::information(0, tr("Peer addition"), tr("The peer was added to this torrent.")); - else - QMessageBox::critical(0, tr("Peer addition"), tr("The peer could not be added to this torrent.")); - } - else { - qDebug("No peer was added"); + QList peersList = PeersAdditionDlg::askForPeers(); + int peerCount = 0; + foreach (const BitTorrent::PeerAddress &addr, peersList) { + if (torrent->connectPeer(addr)) { + qDebug("Adding peer %s...", qPrintable(addr.ip.toString())); + Logger::instance()->addMessage(tr("Manually adding peer %1...").arg(addr.ip.toString())); + peerCount++; + } + else { + Logger::instance()->addMessage(tr("The peer %1 could not be added to this torrent.").arg(addr.ip.toString()), Log::WARNING); + } } + if (peerCount < peersList.length()) + QMessageBox::information(0, tr("Peer addition"), tr("Some peers could not be added. Check the Log for details.")); + else if (peerCount > 0) + QMessageBox::information(0, tr("Peer addition"), tr("The peers were added to this torrent.")); return; } if (act == banAct) { diff --git a/src/gui/properties/peersadditiondlg.cpp b/src/gui/properties/peersadditiondlg.cpp new file mode 100644 index 000000000..3dd1f7737 --- /dev/null +++ b/src/gui/properties/peersadditiondlg.cpp @@ -0,0 +1,103 @@ +/* + * 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 + */ + +#include +#include + +#include "peersadditiondlg.h" + +PeersAdditionDlg::PeersAdditionDlg(QWidget *parent) + : QDialog(parent) +{ + setupUi(this); + connect(buttonBox, SIGNAL(accepted()), this, SLOT(validateInput())); + +#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) + label_format->hide(); + peers_txt->setPlaceholderText("Format: IPv4:port / [IPv6]:port"); +#endif +} + +QList PeersAdditionDlg::askForPeers() +{ + PeersAdditionDlg dlg; + dlg.exec(); + return dlg.m_peersList; +} + +void PeersAdditionDlg::validateInput() +{ + if (peers_txt->toPlainText().trimmed().isEmpty()) { + QMessageBox::warning(this, tr("No peer entered"), + tr("Please type at least one peer."), + QMessageBox::Ok); + return; + } + foreach (const QString &peer, peers_txt->toPlainText().trimmed().split("\n")) { + BitTorrent::PeerAddress addr = parsePeer(peer); + if (!addr.ip.isNull()) { + m_peersList.append(addr); + } + else { + QMessageBox::warning(this, tr("Invalid peer"), + tr("The peer %1 is invalid.").arg(peer), + QMessageBox::Ok); + m_peersList.clear(); + return; + } + } + accept(); +} + +BitTorrent::PeerAddress PeersAdditionDlg::parsePeer(QString peer) +{ + BitTorrent::PeerAddress addr; + QStringList ipPort; + + if (peer[0] == '[' && peer.indexOf("]:") != -1) // IPv6 + ipPort = peer.remove(QChar('[')).split("]:"); + else if (peer.indexOf(":") != -1) // IPv4 + ipPort = peer.split(":"); + else + return addr; + + QHostAddress ip(ipPort[0]); + if (ip.isNull()) + return addr; + + bool ok; + int port = ipPort[1].toInt(&ok); + if (!ok || port < 1 || port > 65535) + return addr; + + addr.ip = ip; + addr.port = port; + return addr; +} diff --git a/src/gui/properties/peeraddition.h b/src/gui/properties/peersadditiondlg.h similarity index 82% rename from src/gui/properties/peeraddition.h rename to src/gui/properties/peersadditiondlg.h index fd5ae4e05..d92a6c39e 100644 --- a/src/gui/properties/peeraddition.h +++ b/src/gui/properties/peersadditiondlg.h @@ -32,29 +32,26 @@ #define PEERADDITION_H #include -#include "ui_peer.h" -class QHostAddress; +#include "core/bittorrent/peerinfo.h" +#include "ui_peersadditiondlg.h" -namespace BitTorrent -{ - struct PeerAddress; -} - -class PeerAdditionDlg : public QDialog, private Ui::addPeerDialog +class PeersAdditionDlg: public QDialog, private Ui::addPeersDialog { Q_OBJECT public: - PeerAdditionDlg(QWidget *parent = 0); - - QHostAddress getAddress() const; - ushort getPort() const; + PeersAdditionDlg(QWidget *parent = 0); - static BitTorrent::PeerAddress askForPeerAddress(); + static QList askForPeers(); protected slots: void validateInput(); + +private: + BitTorrent::PeerAddress parsePeer(QString peer); + QList m_peersList; + }; #endif // PEERADDITION_H diff --git a/src/gui/properties/peersadditiondlg.ui b/src/gui/properties/peersadditiondlg.ui new file mode 100644 index 000000000..2b24bdf25 --- /dev/null +++ b/src/gui/properties/peersadditiondlg.ui @@ -0,0 +1,75 @@ + + + addPeersDialog + + + + 0 + 0 + 367 + 274 + + + + Add Peers + + + + + + List of peers to add (one per line): + + + + + + + QTextEdit::NoWrap + + + false + + + + + + + Format: IPv4:port / [IPv6]:port + + + + + + + true + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + rejected() + addPeersDialog + reject() + + + 183 + 251 + + + 183 + 136 + + + + + diff --git a/src/gui/properties/properties.pri b/src/gui/properties/properties.pri index 3551a3796..0535e4634 100644 --- a/src/gui/properties/properties.pri +++ b/src/gui/properties/properties.pri @@ -2,7 +2,7 @@ INCLUDEPATH += $$PWD FORMS += $$PWD/propertieswidget.ui \ $$PWD/trackersadditiondlg.ui \ - $$PWD/peer.ui + $$PWD/peersadditiondlg.ui HEADERS += $$PWD/propertieswidget.h \ $$PWD/peerlistwidget.h \ @@ -11,7 +11,7 @@ HEADERS += $$PWD/propertieswidget.h \ $$PWD/downloadedpiecesbar.h \ $$PWD/peerlistdelegate.h \ $$PWD/peerlistsortmodel.h \ - $$PWD/peeraddition.h \ + $$PWD/peersadditiondlg.h \ $$PWD/trackersadditiondlg.h \ $$PWD/pieceavailabilitybar.h \ $$PWD/proptabbar.h \ @@ -22,10 +22,10 @@ SOURCES += $$PWD/propertieswidget.cpp \ $$PWD/proplistdelegate.cpp \ $$PWD/peerlistwidget.cpp \ $$PWD/trackerlist.cpp \ - $$PWD/proptabbar.cpp \ + $$PWD/peersadditiondlg.cpp \ $$PWD/downloadedpiecesbar.cpp \ - $$PWD/peeraddition.cpp \ $$PWD/trackersadditiondlg.cpp \ $$PWD/pieceavailabilitybar.cpp \ + $$PWD/proptabbar.cpp \ $$PWD/speedwidget.cpp \ $$PWD/speedplotview.cpp