From 9e62780a6d3a7e9b8e19bf506bc1281da7ccfcbc Mon Sep 17 00:00:00 2001 From: Ishan Arora Date: Sun, 18 Nov 2007 19:40:49 +0000 Subject: [PATCH] Added files missing in last revision --- src/qrealarray.cpp | 24 +++++ src/qrealarray.h | 32 +++++++ src/realprogressbarthread.cpp | 169 ++++++++++++++++++++++++++++++++++ src/realprogressbarthread.h | 70 ++++++++++++++ 4 files changed, 295 insertions(+) create mode 100644 src/qrealarray.cpp create mode 100644 src/qrealarray.h create mode 100644 src/realprogressbarthread.cpp create mode 100644 src/realprogressbarthread.h diff --git a/src/qrealarray.cpp b/src/qrealarray.cpp new file mode 100644 index 000000000..079e649b2 --- /dev/null +++ b/src/qrealarray.cpp @@ -0,0 +1,24 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * 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, arnaud@qbittorrent.org + */ + +#include "qrealarray.h" + +int id = qRegisterMetaType(); diff --git a/src/qrealarray.h b/src/qrealarray.h new file mode 100644 index 000000000..d6187bcc1 --- /dev/null +++ b/src/qrealarray.h @@ -0,0 +1,32 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * 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, arnaud@qbittorrent.org + */ + +#ifndef QREALARRAY_H +#define QREALARRAY_H + +#include +#include + +typedef QVarLengthArray QRealArray; + +Q_DECLARE_METATYPE(QRealArray) + +#endif diff --git a/src/realprogressbarthread.cpp b/src/realprogressbarthread.cpp new file mode 100644 index 000000000..576cdce6e --- /dev/null +++ b/src/realprogressbarthread.cpp @@ -0,0 +1,169 @@ +/* + * Bittorrent Client using Qt4 and libtorrent. + * Copyright (C) 2006 Christophe Dumez, Arnaud Demaiziere + * + * 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, arnaud@qbittorrent.org + */ + +#include "realprogressbarthread.h" +#include "realprogressbar.h" +#include +#include + +RealProgressBarThread::RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle) : QThread(pb), thandle(handle), array(pb->width()){ + size = pb->width(); + abort = false; + connect(pb, SIGNAL(widthChanged(int)), this, SLOT(resize(int)), Qt::DirectConnection); + connect(this, SIGNAL(refreshed(QRealArray)), pb, SLOT(setProgress(QRealArray))); +} + +RealProgressBarThread::~RealProgressBarThread(){ + qDebug("RealProgressBarThread destruction"); + resize(-1); + qDebug("RealProgressBarThread waiting"); + wait(); + qDebug("RealProgressBarThread destroyed"); +} + +void RealProgressBarThread::resize(int width) +{ + QMutexLocker locker(&mutex); + size = width; + abort = true; + condition.wakeOne(); +} + +void RealProgressBarThread::refresh() +{ + QMutexLocker locker(&mutex); + condition.wakeOne(); +} + +//this is called inside run() +#define CHECK_INTERRUPT \ + switch(ifInterrupted())\ + {\ + case stop:\ + qDebug("RealProgressBarThread stop");\ + return;\ + case restart:\ + qDebug("RealProgressBarThread restart");\ + goto start;\ + } + +void RealProgressBarThread::run(){ + //wait for refresh or rezise slot +wait: + QMutexLocker locker(&mutex); + condition.wait(&mutex); + locker.unlock(); + + //start checking the torrent information +start: + CHECK_INTERRUPT + size_type total_size = thandle.total_size(); + size_type piece_length = thandle.piece_length(); + int num_pieces = thandle.num_pieces(); + const std::vector* pieces = thandle.pieces(); + if (pieces == 0) + return; + //empty the array + locker.relock(); + for(int i=0; i queue; + thandle.get_download_queue(queue); + for(unsigned int i=0; i size) + end = size; + int start_int, end_int; + qreal temp, start_frac, end_frac; + start_frac = modf(start, &temp); + start_int = (int) temp; + end_frac = modf(end, &temp); + end_int = (int) temp; + if(start_int == end_int) + { + array[start_int] += progress * (end - start); + return; + } + if (start_frac > 0.) + array[start_int] += progress * (1 - start_frac); + if (end_frac > 0.) + array[end_int] += progress * end_frac; + for(int i=start_int+1; i +#include +#include + +class RealProgressBar; + +enum Interrupt +{ + ignore, + restart, + stop +}; + +class RealProgressBarThread : public QThread { + Q_OBJECT + private: + bool abort; + int size; + QTorrentHandle thandle; + QMutex mutex; + QWaitCondition condition; + QRealArray array; + + public: + RealProgressBarThread(RealProgressBar *pb, QTorrentHandle &handle); + ~RealProgressBarThread(); + + public slots: + void resize(int width); + void refresh(); + + signals: + void refreshed(QRealArray progress); + + protected: + void run(); + + private: + Interrupt ifInterrupted(); + void mark(qreal start, qreal end, qreal progress = 1.); +}; + +#endif