summaryrefslogtreecommitdiffstats
path: root/libktorrent/torrent/downloader.h
diff options
context:
space:
mode:
Diffstat (limited to 'libktorrent/torrent/downloader.h')
-rw-r--r--libktorrent/torrent/downloader.h221
1 files changed, 221 insertions, 0 deletions
diff --git a/libktorrent/torrent/downloader.h b/libktorrent/torrent/downloader.h
new file mode 100644
index 0000000..5b39eeb
--- /dev/null
+++ b/libktorrent/torrent/downloader.h
@@ -0,0 +1,221 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * 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. *
+ ***************************************************************************/
+#ifndef BTDOWNLOADER_H
+#define BTDOWNLOADER_H
+
+#include <qobject.h>
+#include <util/ptrmap.h>
+#include "globals.h"
+
+namespace kt
+{
+ class MonitorInterface;
+}
+
+
+namespace bt
+{
+ class BitSet;
+ class Torrent;
+ class ChunkManager;
+ class PeerManager;
+ class Peer;
+ class Chunk;
+ class ChunkDownload;
+ class PeerDownloader;
+ class Piece;
+ class Request;
+ class ChunkSelector;
+
+ typedef PtrMap<Uint32,ChunkDownload>::iterator CurChunkItr;
+ typedef PtrMap<Uint32,ChunkDownload>::const_iterator CurChunkCItr;
+
+ #define CURRENT_CHUNK_MAGIC 0xABCDEF00
+
+ struct CurrentChunksHeader
+ {
+ Uint32 magic; // CURRENT_CHUNK_MAGIC
+ Uint32 major;
+ Uint32 minor;
+ Uint32 num_chunks;
+ };
+
+ /**
+ * @author Joris Guisson
+ * @brief Manages the downloading
+ *
+ * This class manages the downloading of the file. It should
+ * regurarly be updated.
+ */
+ class Downloader : public QObject
+ {
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor.
+ * @param tor The Torrent
+ * @param pman The PeerManager
+ * @param cman The ChunkManager
+ */
+ Downloader(Torrent & tor,PeerManager & pman,ChunkManager & cman);
+ virtual ~Downloader();
+
+ /// Get the number of bytes we have downloaded
+ Uint64 bytesDownloaded() const {return downloaded + curr_chunks_downloaded;}
+
+ /// Get the current dowload rate
+ Uint32 downloadRate() const;
+
+ /// Get the number of chunks we are dowloading
+ Uint32 numActiveDownloads() const {return current_chunks.count();}
+
+ /// See if the download is finished.
+ bool isFinished() const;
+
+ /**
+ * Clear all downloads. Deletes all active downloads.
+ */
+ void clearDownloads();
+
+ CurChunkCItr beginDownloads() const {return current_chunks.begin();}
+ CurChunkCItr endDownloads() const {return current_chunks.end();}
+
+ /**
+ * See if we are downloading a Chunk
+ * @param chunk ID of Chunk
+ * @return true if we are, false if not
+ */
+ bool areWeDownloading(Uint32 chunk) const;
+
+ /**
+ * Save the current downloads.
+ * @param file The file to save to
+ */
+ void saveDownloads(const QString & file);
+
+ /**
+ * Load the current downloads.
+ * @param file The file to load from
+ */
+ void loadDownloads(const QString & file);
+
+ /**
+ * Get the number of bytes already downloaded in the current_chunks file.
+ * @param file The path of the current_chunks file
+ * @return The bytes already downloading
+ */
+ Uint32 getDownloadedBytesOfCurrentChunksFile(const QString & file);
+
+ /**
+ * A corrupted chunk has been detected, make sure we redownload it.
+ * @param chunk The chunk
+ */
+ void corrupted(Uint32 chunk);
+ public slots:
+ /**
+ * Update the downloader.
+ */
+ void update();
+
+ /**
+ * We got a new connection.
+ * @param peer The Peer
+ */
+ void onNewPeer(Peer* peer);
+
+ /**
+ * A Peer has disconnected.
+ * @param peer The Peer
+ */
+ void onPeerKilled(Peer* peer);
+
+ /**
+ * Set the TorrentMonitor.
+ * @param tmo
+ */
+ void setMonitor(kt::MonitorInterface* tmo);
+
+ static void setMemoryUsage(Uint32 m);
+
+ /**
+ * Data has been checked, and these chunks are OK.
+ * @param ok_chunks The ok_chunks
+ */
+ void dataChecked(const BitSet & ok_chunks);
+
+ /**
+ * Recalculate the number of bytes downloaded.
+ */
+ void recalcDownloaded();
+
+ private slots:
+ void pieceRecieved(const Piece & p);
+ bool finished(ChunkDownload* c);
+
+ /**
+ * Kill all ChunkDownload's which have been excluded.
+ * @param from First chunk of range
+ * @param to Last chunk of range
+ */
+ void onExcluded(Uint32 from,Uint32 to);
+
+ /**
+ * Make sure chunk selector is back OK, when chunks are included back again.
+ * @param from First chunk
+ * @param to Last chunk
+ */
+ void onIncluded(Uint32 from,Uint32 to);
+
+ signals:
+ /**
+ * An error occurred while we we're writing or reading from disk.
+ * @param msg Message
+ */
+ void ioError(const QString & msg);
+
+ private:
+ void downloadFrom(PeerDownloader* pd);
+ void normalUpdate();
+ Uint32 maxMemoryUsage();
+ Uint32 numNonIdle();
+ bool findDownloadForPD(PeerDownloader* pd,bool warmup);
+ ChunkDownload* selectCD(PeerDownloader* pd,Uint32 num);
+ ChunkDownload* selectWorst(PeerDownloader* pd);
+
+ private:
+ Torrent & tor;
+ PeerManager & pman;
+ ChunkManager & cman;
+ Uint64 downloaded;
+ Uint64 curr_chunks_downloaded;
+ Uint64 unnecessary_data;
+ PtrMap<Uint32,ChunkDownload> current_chunks;
+ ChunkSelector* chunk_selector;
+
+ kt::MonitorInterface* tmon;
+ static Uint32 mem_usage;
+ };
+
+
+
+}
+
+#endif