BUGFIX: Fix possible crash when showing torrent content (closes #1002586)

This commit is contained in:
Christophe Dumez 2012-05-22 21:20:23 +03:00
parent 89a1eb1bca
commit 96f619b486
4 changed files with 22 additions and 19 deletions

View file

@ -1,3 +1,6 @@
* Unreleased - Christophe Dumez <chris@qbittorrent.org> - v2.9.10
- BUGFIX: Fix possible crash when showing torrent content (closes #1002586)
* Sun May 20 - Christophe Dumez <chris@qbittorrent.org> - v2.9.9
- BUGFIX: More reliable RSS feed parsing (closes #1001777)
- BUGFIX: Better support for cookies in RSS

View file

@ -652,7 +652,7 @@ void PropertiesWidget::deleteSelectedUrlSeeds(){
bool PropertiesWidget::applyPriorities() {
qDebug("Saving files priorities");
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(h.get_torrent_info().num_files());
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
// Save first/last piece first option state
bool first_last_piece_first = h.first_last_piece_first();
// Prioritize the files

View file

@ -501,10 +501,8 @@ void torrentAdditionDialog::updateDiskSpaceLabels() {
// Determine torrent size
qulonglong torrent_size = 0;
if(t->num_files() > 1) {
const unsigned int nbFiles = t->num_files();
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(nbFiles);
for(unsigned int i=0; i<nbFiles; ++i) {
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
for(unsigned int i=0; i<priorities.size(); ++i) {
if(priorities[i] > 0)
torrent_size += t->file_at(i).size;
}
@ -598,7 +596,7 @@ bool torrentAdditionDialog::allFiltered() const {
void torrentAdditionDialog::savePiecesPriorities(){
qDebug("Saving pieces priorities");
Q_ASSERT(!is_magnet);
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities(t->num_files());
const std::vector<int> priorities = PropListModel->model()->getFilesPriorities();
TorrentTempData::setFilesPriority(hash, priorities);
}

View file

@ -338,11 +338,10 @@ class TorrentFilesModel: public QAbstractItemModel {
private:
TorrentFileItem *rootItem;
TorrentFileItem **files_index;
std::vector<TorrentFileItem *> files_index;
public:
TorrentFilesModel(QObject *parent=0): QAbstractItemModel(parent) {
files_index = 0;
QList<QVariant> rootData;
rootData << tr("Name") << tr("Size") << tr("Progress") << tr("Priority");
rootItem = new TorrentFileItem(rootData);
@ -350,13 +349,16 @@ public:
~TorrentFilesModel() {
qDebug() << Q_FUNC_INFO << "ENTER";
delete [] files_index;
delete rootItem;
qDebug() << Q_FUNC_INFO << "EXIT";
}
void updateFilesProgress(std::vector<libtorrent::size_type> fp) {
void updateFilesProgress(const std::vector<libtorrent::size_type>& fp) {
emit layoutAboutToBeChanged();
if (fp.size() != files_index.size())
return;
for(unsigned int i=0; i<fp.size(); ++i) {
Q_ASSERT(fp[i] >= 0);
files_index[i]->setProgress(fp[i]);
@ -366,6 +368,10 @@ public:
void updateFilesPriorities(const std::vector<int> &fprio) {
emit layoutAboutToBeChanged();
if (fprio.size() != files_index.size())
return;
for(unsigned int i=0; i<fprio.size(); ++i) {
//qDebug("Called updateFilesPriorities with %d", fprio[i]);
files_index[i]->setPriority(fprio[i]);
@ -373,9 +379,9 @@ public:
emit dataChanged(index(0,0), index(rowCount(), columnCount()));
}
std::vector<int> getFilesPriorities(unsigned int nbFiles) const {
std::vector<int> getFilesPriorities() const {
std::vector<int> prio;
for(unsigned int i=0; i<nbFiles; ++i) {
for(unsigned int i=0; i<files_index.size(); ++i) {
//qDebug("Called getFilesPriorities: %d", files_index[i]->getPriority());
prio.push_back(files_index[i]->getPriority());
}
@ -541,10 +547,7 @@ public:
void clear() {
qDebug("clear called");
beginResetModel();
if(files_index) {
delete [] files_index;
files_index = 0;
}
files_index.clear();
rootItem->deleteAllChildren();
endResetModel();
}
@ -555,7 +558,7 @@ public:
emit layoutAboutToBeChanged();
// Initialize files_index array
qDebug("Torrent contains %d files", t.num_files());
files_index = new TorrentFileItem*[t.num_files()];
files_index.reserve(t.num_files());
TorrentFileItem *parent = this->rootItem;
TorrentFileItem *root_folder = parent;
@ -582,8 +585,7 @@ public:
current_parent = new_parent;
}
// Actually create the file
TorrentFileItem *f = new TorrentFileItem(t, fentry, current_parent, i);
files_index[i] = f;
files_index.push_back(new TorrentFileItem(t, fentry, current_parent, i));
}
emit layoutChanged();
}