void VerificationThread::doBrokenPieces() { m_mutex.lock(); const QString type = m_types.takeFirst(); const QStringList checksums = m_checksums; m_checksums.clear(); const KUrl url = m_files.takeFirst(); const KIO::filesize_t length = m_length; m_mutex.unlock(); QList<KIO::fileoffset_t> broken; if (QFile::exists(url.pathOrUrl())) { QFile file(url.pathOrUrl()); if (!file.open(QIODevice::ReadOnly)) { emit brokenPieces(broken, length); return; } const KIO::filesize_t fileSize = file.size(); if (!length || !fileSize) { emit brokenPieces(broken, length); return; } const QStringList fileChecksums = Verifier::partialChecksums(url, type, length, &m_abort).checksums(); if (m_abort) { emit brokenPieces(broken, length); return; } if (fileChecksums.size() != checksums.size()) { kDebug(5001) << "Number of checksums differs!"; emit brokenPieces(broken, length); return; } for (int i = 0; i < checksums.size(); ++i) { if (fileChecksums.at(i) != checksums.at(i)) { const int brokenStart = length * i; kDebug(5001) << url << "broken segment" << i << "start" << brokenStart << "length" << length; broken.append(brokenStart); } } } emit brokenPieces(broken, length); }
DBusVerifierWrapper::DBusVerifierWrapper(Verifier *verifier) : QObject(verifier), m_verifier(verifier) { connect(m_verifier, SIGNAL(brokenPieces(QList<KIO::fileoffset_t>,KIO::filesize_t)), this, SLOT(slotBrokenPieces(QList<KIO::fileoffset_t>,KIO::filesize_t))); connect(m_verifier, SIGNAL(verified(bool)), this, SIGNAL(verified(bool))); }
void DBusVerifierWrapper::slotBrokenPieces(const QList<KIO::fileoffset_t> &offsets, KIO::filesize_t length) { //FIXME seems to work correct though is not correctly received at TestTransfers or maybe wrong converted // QList<QVariant> broken; // for (int i = 0; i < brokenPieces.count(); ++i) { // broken << brokenPieces[i]; // } // // QDBusVariant dbusBroken; // dbusBroken.setVariant(QVariant(broken)); // emit this->brokenPieces(dbusBroken); QStringList broken; for (int i = 0; i < offsets.count(); ++i) { broken << QString::number(offsets[i]); } emit brokenPieces(broken, length); }
Verifier::Verifier(const KUrl &dest, QObject *parent) : QObject(parent), d(new VerifierPrivate(this)) { d->dest = dest; d->status = NoResult; static int dBusObjIdx = 0; d->dBusObjectPath = "/KGet/Verifiers/" + QString::number(dBusObjIdx++); DBusVerifierWrapper *wrapper = new DBusVerifierWrapper(this); new VerifierAdaptor(wrapper); QDBusConnection::sessionBus().registerObject(d->dBusObjectPath, wrapper); qRegisterMetaType<KIO::filesize_t>("KIO::filesize_t"); qRegisterMetaType<KIO::fileoffset_t>("KIO::fileoffset_t"); qRegisterMetaType<QList<KIO::fileoffset_t> >("QList<KIO::fileoffset_t>"); d->model = new VerificationModel(); connect(&d->thread, SIGNAL(verified(QString,bool,KUrl)), this, SLOT(changeStatus(QString,bool))); connect(&d->thread, SIGNAL(brokenPieces(QList<KIO::fileoffset_t>,KIO::filesize_t)), this, SIGNAL(brokenPieces(QList<KIO::fileoffset_t>,KIO::filesize_t))); }