diff options
author | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 02:37:40 +0000 |
---|---|---|
committer | tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2010-01-20 02:37:40 +0000 |
commit | 9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0 (patch) | |
tree | d088b5210e77d9fa91d954d8550e00e372b47378 /libktorrent/torrent/torrentfile.cpp | |
download | ktorrent-9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0.tar.gz ktorrent-9ad5c7b5e23b4940e7a3ea3ca3a6fb77e6a8fab0.zip |
Updated to final KDE3 ktorrent release (2.2.6)
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/ktorrent@1077377 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'libktorrent/torrent/torrentfile.cpp')
-rw-r--r-- | libktorrent/torrent/torrentfile.cpp | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/libktorrent/torrent/torrentfile.cpp b/libktorrent/torrent/torrentfile.cpp new file mode 100644 index 0000000..9c21a4a --- /dev/null +++ b/libktorrent/torrent/torrentfile.cpp @@ -0,0 +1,200 @@ +/*************************************************************************** + * Copyright (C) 2005 by * + * Joris Guisson <[email protected]> * + * Ivan Vasic <[email protected]> * + * * + * 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. * + ***************************************************************************/ +#include <math.h> +#include <util/log.h> +#include <util/bitset.h> +#include <util/functions.h> +#include "globals.h" +#include "torrentfile.h" + +namespace bt +{ + + TorrentFile::TorrentFile() : TorrentFileInterface(QString::null,0),missing(false),filetype(UNKNOWN) + {} + + TorrentFile::TorrentFile(Uint32 index,const QString & path, + Uint64 off,Uint64 size,Uint64 chunk_size) + : TorrentFileInterface(path,size),index(index),cache_offset(off),missing(false),filetype(UNKNOWN) + { + first_chunk = off / chunk_size; + first_chunk_off = off % chunk_size; + if (size > 0) + last_chunk = (off + size - 1) / chunk_size; + else + last_chunk = first_chunk; + last_chunk_size = (off + size) - last_chunk * chunk_size; + priority = old_priority = NORMAL_PRIORITY; + } + + TorrentFile::TorrentFile(const TorrentFile & tf) + : TorrentFileInterface(QString::null,0) + { + index = tf.getIndex(); + path = tf.getPath(); + size = tf.getSize(); + cache_offset = tf.getCacheOffset(); + first_chunk = tf.getFirstChunk(); + first_chunk_off = tf.getFirstChunkOffset(); + last_chunk = tf.getLastChunk(); + last_chunk_size = tf.getLastChunkSize(); + old_priority = priority = tf.getPriority(); + missing = tf.isMissing(); + filetype = UNKNOWN; + } + + TorrentFile::~TorrentFile() + {} + + void TorrentFile::setDoNotDownload(bool dnd) + { + if (priority != EXCLUDED && dnd) + { + if(m_emitDlStatusChanged) + old_priority = priority; + + priority = EXCLUDED; + + if(m_emitDlStatusChanged) + emit downloadPriorityChanged(this,priority,old_priority); + } + if (priority == EXCLUDED && (!dnd)) + { + if(m_emitDlStatusChanged) + old_priority = priority; + + priority = NORMAL_PRIORITY; + + if(m_emitDlStatusChanged) + emit downloadPriorityChanged(this,priority,old_priority); + } + } + + void TorrentFile::emitDownloadStatusChanged() + { + // only emit when old_priority is not equal to the new priority + if (priority != old_priority) + emit downloadPriorityChanged(this,priority,old_priority); + } + + + bool TorrentFile::isMultimedia() const + { + if (filetype == UNKNOWN) + { + if (IsMultimediaFile(getPath())) + { + filetype = MULTIMEDIA; + return true; + } + else + { + filetype = NORMAL; + return false; + } + } + return filetype == MULTIMEDIA; + } + + void TorrentFile::setPriority(Priority newpriority) + { + if(priority != newpriority) + { + if (priority == EXCLUDED) + { + setDoNotDownload(false); + } + if (newpriority == EXCLUDED) + { + setDoNotDownload(true); + } + else + { + old_priority = priority; + priority = newpriority; + emit downloadPriorityChanged(this,newpriority,old_priority); + } + } + } + + TorrentFile & TorrentFile::operator = (const TorrentFile & tf) + { + index = tf.getIndex(); + path = tf.getPath(); + size = tf.getSize(); + cache_offset = tf.getCacheOffset(); + first_chunk = tf.getFirstChunk(); + first_chunk_off = tf.getFirstChunkOffset(); + last_chunk = tf.getLastChunk(); + last_chunk_size = tf.getLastChunkSize(); + priority = tf.getPriority(); + missing = tf.isMissing(); + return *this; + } + + TorrentFile TorrentFile::null; + + + Uint64 TorrentFile::fileOffset(Uint32 cindex,Uint64 chunk_size) const + { + Uint64 off = 0; + if (getFirstChunkOffset() == 0) + { + off = (cindex - getFirstChunk()) * chunk_size; + } + else + { + if (cindex - this->getFirstChunk() > 0) + off = (cindex - this->getFirstChunk() - 1) * chunk_size; + if (cindex > 0) + off += (chunk_size - this->getFirstChunkOffset()); + } + return off; + } + + void TorrentFile::updateNumDownloadedChunks(const BitSet & bs) + { + float p = getDownloadPercentage(); + num_chunks_downloaded = 0; + bool prev = preview; + preview = true; + for (Uint32 i = first_chunk;i <= last_chunk;i++) + { + if (bs.get(i)) + { + num_chunks_downloaded++; + } + else if (i == first_chunk || i == first_chunk + 1) + { + preview = false; + } + } + preview = isMultimedia() && preview; + + float np = getDownloadPercentage(); + if (fabs(np - p) >= 0.01f) + downloadPercentageChanged(np); + + if (prev != preview) + previewAvailable(preview); + } +} +#include "torrentfile.moc" |