From 390508e7dbc4e019b563e036b788eb9c7b92d07e Mon Sep 17 00:00:00 2001 From: Christophe Dumez Date: Sun, 31 Oct 2010 14:19:55 +0000 Subject: [PATCH] Fix possible crash on qBittorrent shutdown --- src/qtlibtorrent/qbtsession.cpp | 41 ++++++++++++++++++--------------- src/torrentfilesmodel.h | 3 +++ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/qtlibtorrent/qbtsession.cpp b/src/qtlibtorrent/qbtsession.cpp index 6c4a742e8..3e3b14fe1 100644 --- a/src/qtlibtorrent/qbtsession.cpp +++ b/src/qtlibtorrent/qbtsession.cpp @@ -1534,13 +1534,15 @@ void QBtSession::saveFastResumeData() { for(torrentIT = torrents.begin(); torrentIT != torrents.end(); torrentIT++) { QTorrentHandle h = QTorrentHandle(*torrentIT); if(!h.is_valid() || !h.has_metadata()) continue; - if(isQueueingEnabled()) - TorrentPersistentData::savePriority(h); - // Actually with should save fast resume data for paused files too - //if(h.is_paused()) continue; - if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) continue; - h.save_resume_data(); - ++num_resume_data; + try { + if(isQueueingEnabled()) + TorrentPersistentData::savePriority(h); + // Actually with should save fast resume data for paused files too + //if(h.is_paused()) continue; + if(h.state() == torrent_status::checking_files || h.state() == torrent_status::queued_for_checking) continue; + h.save_resume_data(); + ++num_resume_data; + } catch(libtorrent::invalid_handle&) {} } while (num_resume_data > 0) { alert const* a = s->wait_for_alert(seconds(30)); @@ -1556,7 +1558,8 @@ void QBtSession::saveFastResumeData() { s->pop_alert(); try { // Remove torrent from session - s->remove_torrent(rda->handle); + if(rda->handle.is_valid()) + s->remove_torrent(rda->handle); }catch(libtorrent::libtorrent_exception){} continue; } @@ -1571,16 +1574,18 @@ void QBtSession::saveFastResumeData() { QDir torrentBackup(misc::BTBackupLocation()); const QTorrentHandle h(rd->handle); if(!h.is_valid()) continue; - // Remove old fastresume file if it exists - const QString file = torrentBackup.absoluteFilePath(h.hash()+".fastresume"); - if(QFile::exists(file)) - misc::safeRemove(file); - boost::filesystem::ofstream out(boost::filesystem::path(file.toLocal8Bit().constData()), std::ios_base::binary); - out.unsetf(std::ios_base::skipws); - bencode(std::ostream_iterator(out), *rd->resume_data); - // Remove torrent from session - s->remove_torrent(rd->handle); - s->pop_alert(); + try { + // Remove old fastresume file if it exists + const QString file = torrentBackup.absoluteFilePath(h.hash()+".fastresume"); + if(QFile::exists(file)) + misc::safeRemove(file); + boost::filesystem::ofstream out(boost::filesystem::path(file.toLocal8Bit().constData()), std::ios_base::binary); + out.unsetf(std::ios_base::skipws); + bencode(std::ostream_iterator(out), *rd->resume_data); + // Remove torrent from session + s->remove_torrent(rd->handle); + s->pop_alert(); + } catch(libtorrent::invalid_handle&){} } } diff --git a/src/torrentfilesmodel.h b/src/torrentfilesmodel.h index 9f5e39040..fcd596208 100644 --- a/src/torrentfilesmodel.h +++ b/src/torrentfilesmodel.h @@ -46,6 +46,9 @@ enum FilePriority {IGNORED=0, NORMAL=1, HIGH=2, MAXIMUM=7}; enum TreeItemType {TFILE, FOLDER, ROOT}; class TreeItem { +private: + enum TreeItemColumns {COL_NAME, COL_SIZE, COL_PROGRESS, COL_PRIO}; + private: QList childItems; QList itemData;