diff --git a/src/libsync/propagatedownload.cpp b/src/libsync/propagatedownload.cpp index 0dd920573a..f3cce6bc03 100644 --- a/src/libsync/propagatedownload.cpp +++ b/src/libsync/propagatedownload.cpp @@ -552,11 +552,11 @@ void PropagateDownloadFileQNAM::slotGetFinished() } // Do checksum validation for the download. If there is no checksum header, the validator - // will also emit the validated() signal to continue the flow in slot downloadFinished() + // will also emit the validated() signal to continue the flow in slot transmissionChecksumValidated() // as this is (still) also correct. ValidateChecksumHeader *validator = new ValidateChecksumHeader(this); connect(validator, SIGNAL(validated(QByteArray,QByteArray)), - SLOT(downloadFinished())); + SLOT(transmissionChecksumValidated(QByteArray,QByteArray))); connect(validator, SIGNAL(validationFailed(QString)), SLOT(slotChecksumFail(QString))); auto checksumHeader = job->reply()->rawHeader(checkSumHeaderC); @@ -644,6 +644,35 @@ static void handleRecallFile(const QString &fn) } } // end namespace +void PropagateDownloadFileQNAM::transmissionChecksumValidated(const QByteArray &checksumType, const QByteArray &checksum) +{ + const auto theContentChecksumType = QByteArray("SHA1"); + + // Reuse transmission checksum as content checksum. + // + // We could do this more aggressively and accept both MD5 and SHA1 + // instead of insisting on the exactly correct checksum type. + if (theContentChecksumType == checksumType || theContentChecksumType.isEmpty()) { + return contentChecksumComputed(checksumType, checksum); + } + + // Compute the content checksum. + auto computeChecksum = new ComputeChecksum(this); + computeChecksum->setChecksumType(theContentChecksumType); + + connect(computeChecksum, SIGNAL(done(QByteArray,QByteArray)), + SLOT(contentChecksumComputed(QByteArray,QByteArray))); + computeChecksum->start(_tmpFile.fileName()); +} + +void PropagateDownloadFileQNAM::contentChecksumComputed(const QByteArray &checksumType, const QByteArray &checksum) +{ + _item->_contentChecksum = checksum; + _item->_contentChecksumType = checksumType; + + downloadFinished(); +} + void PropagateDownloadFileQNAM::downloadFinished() { QString fn = _propagator->getFilePath(_item->_file); diff --git a/src/libsync/propagatedownload.h b/src/libsync/propagatedownload.h index 8ba11f1b5d..32829fa8f8 100644 --- a/src/libsync/propagatedownload.h +++ b/src/libsync/propagatedownload.h @@ -128,6 +128,8 @@ public: private slots: void slotGetFinished(); void abort() Q_DECL_OVERRIDE; + void transmissionChecksumValidated(const QByteArray& checksumType, const QByteArray& checksum); + void contentChecksumComputed(const QByteArray& checksumType, const QByteArray& checksum); void downloadFinished(); void slotDownloadProgress(qint64,qint64); void slotChecksumFail( const QString& errMsg );