summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-05-14 15:18:59 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-05-14 15:18:59 +0000
commit83465ff83d76e7748747b3cfcb30f902aa8b8a78 (patch)
tree2b9230352caf8d696176eeee5fdd774f0da6b047
parentb305edd7c5ccd2c0ca78ecb3e92f9840065b5c31 (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--ChangeLog9
-rw-r--r--src/DownloadCommand.cc23
-rw-r--r--src/Metalink2RequestGroup.cc11
-rw-r--r--test/Metalink2RequestGroupTest.cc7
4 files changed, 32 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index b61517c6..52043f52 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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());
}