+bool DownloadItem::needsDownload(qint64 offset) {
+ return offset < m_offset || offset > m_offset + m_bytesReceived;
+}
+
+bool DownloadItem::isBuffered(qint64 offset) {
+ QMap<qint64, qint64>::iterator i;
+ for (i = buffers.begin(); i != buffers.end(); ++i) {
+ if (offset >= i.key() && offset <= i.value()) {
+ // qDebug() << "Buffered! " << i.key() << ":" << i.value();
+ return true;
+ }
+ }
+ // qDebug() << offset << "is not buffered";
+ return false;
+}
+
+qint64 DownloadItem::blankAtOffset(qint64 offset) {
+ // qDebug() << buffers;
+ QMap<qint64, qint64>::iterator i;
+ for (i = buffers.begin(); i != buffers.end(); ++i) {
+ if (offset >= i.key() && offset <= i.value()) {
+ // qDebug() << "Offset was" << offset << "now" << i.value();
+ return i.value() + 1;
+ }
+ }
+ return offset;
+}
+
+void DownloadItem::seekTo(qint64 offset, bool sendStatusChanges) {
+ // qDebug() << __PRETTY_FUNCTION__ << offset << sendStatusChanges;
+ stop();
+ if (m_bytesReceived > 0) {
+ bool bufferModified = false;
+ QMap<qint64, qint64>::iterator i;
+ for (i = buffers.begin(); i != buffers.end(); ++i) {
+ if (m_offset - 1 <= i.value()) {
+ /*
+ qDebug() << "Extending existing buffer "
+ << i.key() << i.value() << "now" << m_offset + m_bytesReceived;
+ */
+ bufferModified = true;
+ i.value() = m_offset + m_bytesReceived;
+ break;
+ }
+ }
+ if (!bufferModified)
+ buffers.insert(m_offset, m_offset + m_bytesReceived);
+ }
+ m_offset = offset;
+ this->sendStatusChanges = sendStatusChanges;
+ bool seekSuccess = m_file.seek(offset);
+ if (!seekSuccess) {
+ qWarning() << "Cannot seek to offset" << offset << "in file" << m_file.fileName();
+ return;
+ }
+ start();
+}
+