Browse Source

Fix possible crash when adding a tracker to a magnet torrent without metadata (Closes #1034254)

adaptive-webui-19844
Christophe Dumez 12 years ago
parent
commit
8104c41332
  1. 4
      src/properties/propertieswidget.cpp
  2. 39
      src/properties/trackerlist.cpp
  3. 11
      src/sessionapplication.cpp
  4. 3
      src/sessionapplication.h

4
src/properties/propertieswidget.cpp

@ -396,7 +396,9 @@ void PropertiesWidget::loadDynamicData() {
filesList->setUpdatesEnabled(true); filesList->setUpdatesEnabled(true);
} }
} }
} catch(invalid_handle e) {} } catch(const invalid_handle& e) {
qWarning() << "Caught exception in PropertiesWidget::loadDynamicData(): " << e.what();
}
} }
void PropertiesWidget::loadUrlSeeds() { void PropertiesWidget::loadUrlSeeds() {

39
src/properties/trackerlist.cpp

@ -186,42 +186,45 @@ void TrackerList::clear() {
} }
void TrackerList::loadStickyItems(const QTorrentHandle &h) { 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;
std::vector<peer_info> peers;
h.get_peer_info(peers);
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)
++nb_lsd;
if (it->source & peer_info::pex)
++nb_pex;
}
// load DHT information // load DHT information
if (QBtSession::instance()->isDHTEnabled() && !h.priv()) { if (QBtSession::instance()->isDHTEnabled() && (!h.has_metadata() || !h.priv())) {
dht_item->setText(COL_STATUS, tr("Working")); dht_item->setText(COL_STATUS, tr("Working"));
} else { } else {
dht_item->setText(COL_STATUS, tr("Disabled")); dht_item->setText(COL_STATUS, tr("Disabled"));
} }
dht_item->setText(COL_PEERS, QString::number(nb_dht));
if (h.has_metadata() && h.priv()) { if (h.has_metadata() && h.priv()) {
dht_item->setText(COL_MSG, tr("This torrent is private")); dht_item->setText(COL_MSG, tr("This torrent is private"));
} }
// Load PeX Information // Load PeX Information
if (QBtSession::instance()->isPexEnabled()) if (QBtSession::instance()->isPexEnabled())
pex_item->setText(COL_STATUS, tr("Working")); pex_item->setText(COL_STATUS, tr("Working"));
else else
pex_item->setText(COL_STATUS, tr("Disabled")); pex_item->setText(COL_STATUS, tr("Disabled"));
pex_item->setText(COL_PEERS, QString::number(nb_pex));
// Load LSD Information // Load LSD Information
if (QBtSession::instance()->isLSDEnabled()) if (QBtSession::instance()->isLSDEnabled())
lsd_item->setText(COL_STATUS, tr("Working")); lsd_item->setText(COL_STATUS, tr("Working"));
else else
lsd_item->setText(COL_STATUS, tr("Disabled")); lsd_item->setText(COL_STATUS, tr("Disabled"));
// XXX: libtorrent should provide this info...
// Count peers from DHT, LSD, PeX
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 = 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)
++nb_lsd;
if (it->source & peer_info::pex)
++nb_pex;
}
dht_item->setText(COL_PEERS, QString::number(nb_dht));
pex_item->setText(COL_PEERS, QString::number(nb_pex));
lsd_item->setText(COL_PEERS, QString::number(nb_lsd)); lsd_item->setText(COL_PEERS, QString::number(nb_lsd));
} }

11
src/sessionapplication.cpp

@ -28,6 +28,7 @@
* Contact : chris@qbittorrent.org * Contact : chris@qbittorrent.org
*/ */
#include <QDebug>
#include "sessionapplication.h" #include "sessionapplication.h"
SessionApplication::SessionApplication(const QString &id, int &argc, char **argv) : SessionApplication::SessionApplication(const QString &id, int &argc, char **argv) :
@ -42,3 +43,13 @@ void SessionApplication::commitData(QSessionManager & manager) {
Q_UNUSED(manager); Q_UNUSED(manager);
emit sessionIsShuttingDown(); emit sessionIsShuttingDown();
} }
bool SessionApplication::notify(QObject* receiver, QEvent* event) {
try {
return QApplication::notify(receiver, event);
} catch(const std::exception& e) {
qCritical() << "Exception thrown:" << e.what() << ", receiver: " << receiver->objectName();
receiver->dumpObjectInfo();
}
return false;
}

3
src/sessionapplication.h

@ -54,6 +54,9 @@ public:
SessionApplication(const QString &id, int &argc, char **argv); SessionApplication(const QString &id, int &argc, char **argv);
void commitData(QSessionManager & manager); void commitData(QSessionManager & manager);
protected:
virtual bool notify(QObject* receiver, QEvent* event);
signals: signals:
void sessionIsShuttingDown(); void sessionIsShuttingDown();
}; };

Loading…
Cancel
Save