/* * 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. * * Contact : chris@qbittorrent.org */ #ifndef DELETETHREAD_H #define DELETETHREAD_H #include #include #include #include #include #include "misc.h" class subDeleteThread : public QThread { Q_OBJECT private: QString save_path; QStringList files_path; bool abort; public: subDeleteThread(QObject *parent, QString save_path, QStringList files_path) : QThread(parent), save_path(save_path), files_path(files_path){ abort = false; } ~subDeleteThread(){ abort = true; wait(); } signals: // For subthreads void deletionSuccessST(subDeleteThread* st); void deletionFailureST(subDeleteThread* st); protected: void run(){ if(misc::removeTorrentSavePath(save_path, files_path)) emit deletionSuccessST(this); else emit deletionFailureST(this); } }; class deleteThread : public QThread { Q_OBJECT private: QList > torrents_list; QMutex mutex; QWaitCondition condition; bool abort; QList subThreads; public: deleteThread(QObject* parent) : QThread(parent){ abort = false; } ~deleteThread(){ mutex.lock(); abort = true; condition.wakeOne(); mutex.unlock(); qDeleteAll(subThreads); wait(); } void deleteTorrent(QString save_path, QStringList files_path){ QMutexLocker locker(&mutex); torrents_list << QPair(save_path, files_path); if(!isRunning()){ start(); }else{ condition.wakeOne(); } } protected: void run(){ forever{ if(abort) return; mutex.lock(); if(torrents_list.size() != 0){ QPair torrent = torrents_list.takeFirst(); mutex.unlock(); subDeleteThread *st = new subDeleteThread(0, torrent.first, torrent.second); subThreads << st; connect(st, SIGNAL(deletionSuccessST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*))); connect(st, SIGNAL(deletionFailureST(subDeleteThread*)), this, SLOT(deleteSubThread(subDeleteThread*))); st->start(); }else{ condition.wait(&mutex); mutex.unlock(); } } } protected slots: void deleteSubThread(subDeleteThread* st){ int index = subThreads.indexOf(st); Q_ASSERT(index != -1); subThreads.removeAt(index); delete st; } }; #endif