diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-05-14 15:18:59 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-05-14 15:18:59 +0000 |
| commit | 83465ff83d76e7748747b3cfcb30f902aa8b8a78 (patch) | |
| tree | 2b9230352caf8d696176eeee5fdd774f0da6b047 | |
| parent | b305edd7c5ccd2c0ca78ecb3e92f9840065b5c31 (diff) | |
2010-05-15 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Store both whole checksum and piece hash in metalink file.
Dispatch whole checksum verification only when piece hash is not
set.
* src/DownloadCommand.cc
* src/Metalink2RequestGroup.cc
* test/Metalink2RequestGroupTest.cc
| -rw-r--r-- | ChangeLog | 9 | ||||
| -rw-r--r-- | src/DownloadCommand.cc | 23 | ||||
| -rw-r--r-- | src/Metalink2RequestGroup.cc | 11 | ||||
| -rw-r--r-- | test/Metalink2RequestGroupTest.cc | 7 |
4 files changed, 32 insertions, 18 deletions
@@ -1,3 +1,12 @@ +2010-05-15 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + + Store both whole checksum and piece hash in metalink file. + Dispatch whole checksum verification only when piece hash is not + set. + * src/DownloadCommand.cc + * src/Metalink2RequestGroup.cc + * test/Metalink2RequestGroupTest.cc + 2010-05-14 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> Left only IANA hash function textual name in messageDigest.cc. diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc index 226720d8..256b7c94 100644 --- a/src/DownloadCommand.cc +++ b/src/DownloadCommand.cc @@ -210,7 +210,7 @@ bool DownloadCommand::executeInternal() { #ifdef ENABLE_MESSAGE_DIGEST { - std::string expectedPieceHash = + const std::string& expectedPieceHash = _requestGroup->getDownloadContext()->getPieceHash(segment->getIndex()); if(_pieceHashValidationEnabled && !expectedPieceHash.empty()) { if(segment->isHashCalculated()) { @@ -271,26 +271,29 @@ void DownloadCommand::checkLowestDownloadSpeed() const bool DownloadCommand::prepareForNextSegment() { if(_requestGroup->downloadFinished()) { + const SharedHandle<DownloadContext>& dctx = + _requestGroup->getDownloadContext(); // Remove in-flight request here. _fileEntry->poolRequest(req); // If this is a single file download, and file size becomes known // just after downloading, set total length to FileEntry object // here. - if(_requestGroup->getDownloadContext()->getFileEntries().size() == 1) { - const SharedHandle<FileEntry>& fileEntry = - _requestGroup->getDownloadContext()->getFirstFileEntry(); + if(dctx->getFileEntries().size() == 1) { + const SharedHandle<FileEntry>& fileEntry = dctx->getFirstFileEntry(); if(fileEntry->getLength() == 0) { fileEntry->setLength (_requestGroup->getPieceStorage()->getCompletedLength()); } } #ifdef ENABLE_MESSAGE_DIGEST - SharedHandle<CheckIntegrityEntry> entry - (new ChecksumCheckIntegrityEntry(_requestGroup)); - if(entry->isValidationReady()) { - entry->initValidator(); - // TODO do we need cuttrailinggarbage here? - e->_checkIntegrityMan->pushEntry(entry); + if(dctx->getPieceHashAlgo().empty()) { + SharedHandle<CheckIntegrityEntry> entry + (new ChecksumCheckIntegrityEntry(_requestGroup)); + if(entry->isValidationReady()) { + entry->initValidator(); + // TODO do we need cuttrailinggarbage here? + e->_checkIntegrityMan->pushEntry(entry); + } } // Following 2lines are needed for DownloadEngine to detect // completed RequestGroups without 1sec delay. diff --git a/src/Metalink2RequestGroup.cc b/src/Metalink2RequestGroup.cc index bd86413a..a027a91f 100644 --- a/src/Metalink2RequestGroup.cc +++ b/src/Metalink2RequestGroup.cc @@ -256,12 +256,11 @@ Metalink2RequestGroup::createRequestGroup dctx->getFirstFileEntry()->disableSingleHostMultiConnection(); } #ifdef ENABLE_MESSAGE_DIGEST - if(entry->chunkChecksum.isNull()) { - if(!entry->checksum.isNull()) { - dctx->setChecksum(entry->checksum->getMessageDigest()); - dctx->setChecksumHashAlgo(entry->checksum->getAlgo()); - } - } else { + if(!entry->checksum.isNull()) { + dctx->setChecksum(entry->checksum->getMessageDigest()); + dctx->setChecksumHashAlgo(entry->checksum->getAlgo()); + } + if(!entry->chunkChecksum.isNull()) { dctx->setPieceHashes(entry->chunkChecksum->getChecksums().begin(), entry->chunkChecksum->getChecksums().end()); dctx->setPieceHashAlgo(entry->chunkChecksum->getAlgo()); diff --git a/test/Metalink2RequestGroupTest.cc b/test/Metalink2RequestGroupTest.cc index 82adb407..b2450b46 100644 --- a/test/Metalink2RequestGroupTest.cc +++ b/test/Metalink2RequestGroupTest.cc @@ -85,8 +85,11 @@ void Metalink2RequestGroupTest::testGenerate() CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, dctx->getPieceHashAlgo()); CPPUNIT_ASSERT_EQUAL((size_t)2, dctx->getPieceHashes().size()); CPPUNIT_ASSERT_EQUAL((size_t)262144, dctx->getPieceLength()); - CPPUNIT_ASSERT_EQUAL(std::string(""), dctx->getChecksumHashAlgo()); - CPPUNIT_ASSERT_EQUAL(std::string(""), dctx->getChecksum()); + CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, + dctx->getChecksumHashAlgo()); + CPPUNIT_ASSERT_EQUAL + (std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"), + dctx->getChecksum()); #endif // ENABLE_MESSAGE_DIGEST CPPUNIT_ASSERT(dctx->getSignature().isNull()); } |
