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

39
src/properties/trackerlist.cpp

@ -186,42 +186,45 @@ void TrackerList::clear() { @@ -186,42 +186,45 @@ 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;
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
if (QBtSession::instance()->isDHTEnabled() && !h.priv()) {
if (QBtSession::instance()->isDHTEnabled() && (!h.has_metadata() || !h.priv())) {
dht_item->setText(COL_STATUS, tr("Working"));
} else {
dht_item->setText(COL_STATUS, tr("Disabled"));
}
dht_item->setText(COL_PEERS, QString::number(nb_dht));
if (h.has_metadata() && h.priv()) {
dht_item->setText(COL_MSG, tr("This torrent is private"));
}
// Load PeX Information
if (QBtSession::instance()->isPexEnabled())
pex_item->setText(COL_STATUS, tr("Working"));
else
pex_item->setText(COL_STATUS, tr("Disabled"));
pex_item->setText(COL_PEERS, QString::number(nb_pex));
// Load LSD Information
if (QBtSession::instance()->isLSDEnabled())
lsd_item->setText(COL_STATUS, tr("Working"));
else
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));
}

11
src/sessionapplication.cpp

@ -28,6 +28,7 @@ @@ -28,6 +28,7 @@
* Contact : chris@qbittorrent.org
*/
#include <QDebug>
#include "sessionapplication.h"
SessionApplication::SessionApplication(const QString &id, int &argc, char **argv) :
@ -42,3 +43,13 @@ void SessionApplication::commitData(QSessionManager & manager) { @@ -42,3 +43,13 @@ void SessionApplication::commitData(QSessionManager & manager) {
Q_UNUSED(manager);
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: @@ -54,6 +54,9 @@ public:
SessionApplication(const QString &id, int &argc, char **argv);
void commitData(QSessionManager & manager);
protected:
virtual bool notify(QObject* receiver, QEvent* event);
signals:
void sessionIsShuttingDown();
};

Loading…
Cancel
Save