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
pull/1/head
Tatsuhiro Tsujikawa 2010-05-14 15:18:59 +00:00
parent b305edd7c5
commit 83465ff83d
4 changed files with 32 additions and 18 deletions

View File

@ -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> 2010-05-14 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Left only IANA hash function textual name in messageDigest.cc. Left only IANA hash function textual name in messageDigest.cc.

View File

@ -210,7 +210,7 @@ bool DownloadCommand::executeInternal() {
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST
{ {
std::string expectedPieceHash = const std::string& expectedPieceHash =
_requestGroup->getDownloadContext()->getPieceHash(segment->getIndex()); _requestGroup->getDownloadContext()->getPieceHash(segment->getIndex());
if(_pieceHashValidationEnabled && !expectedPieceHash.empty()) { if(_pieceHashValidationEnabled && !expectedPieceHash.empty()) {
if(segment->isHashCalculated()) { if(segment->isHashCalculated()) {
@ -271,26 +271,29 @@ void DownloadCommand::checkLowestDownloadSpeed() const
bool DownloadCommand::prepareForNextSegment() { bool DownloadCommand::prepareForNextSegment() {
if(_requestGroup->downloadFinished()) { if(_requestGroup->downloadFinished()) {
const SharedHandle<DownloadContext>& dctx =
_requestGroup->getDownloadContext();
// Remove in-flight request here. // Remove in-flight request here.
_fileEntry->poolRequest(req); _fileEntry->poolRequest(req);
// If this is a single file download, and file size becomes known // If this is a single file download, and file size becomes known
// just after downloading, set total length to FileEntry object // just after downloading, set total length to FileEntry object
// here. // here.
if(_requestGroup->getDownloadContext()->getFileEntries().size() == 1) { if(dctx->getFileEntries().size() == 1) {
const SharedHandle<FileEntry>& fileEntry = const SharedHandle<FileEntry>& fileEntry = dctx->getFirstFileEntry();
_requestGroup->getDownloadContext()->getFirstFileEntry();
if(fileEntry->getLength() == 0) { if(fileEntry->getLength() == 0) {
fileEntry->setLength fileEntry->setLength
(_requestGroup->getPieceStorage()->getCompletedLength()); (_requestGroup->getPieceStorage()->getCompletedLength());
} }
} }
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST
SharedHandle<CheckIntegrityEntry> entry if(dctx->getPieceHashAlgo().empty()) {
(new ChecksumCheckIntegrityEntry(_requestGroup)); SharedHandle<CheckIntegrityEntry> entry
if(entry->isValidationReady()) { (new ChecksumCheckIntegrityEntry(_requestGroup));
entry->initValidator(); if(entry->isValidationReady()) {
// TODO do we need cuttrailinggarbage here? entry->initValidator();
e->_checkIntegrityMan->pushEntry(entry); // TODO do we need cuttrailinggarbage here?
e->_checkIntegrityMan->pushEntry(entry);
}
} }
// Following 2lines are needed for DownloadEngine to detect // Following 2lines are needed for DownloadEngine to detect
// completed RequestGroups without 1sec delay. // completed RequestGroups without 1sec delay.

View File

@ -256,12 +256,11 @@ Metalink2RequestGroup::createRequestGroup
dctx->getFirstFileEntry()->disableSingleHostMultiConnection(); dctx->getFirstFileEntry()->disableSingleHostMultiConnection();
} }
#ifdef ENABLE_MESSAGE_DIGEST #ifdef ENABLE_MESSAGE_DIGEST
if(entry->chunkChecksum.isNull()) { if(!entry->checksum.isNull()) {
if(!entry->checksum.isNull()) { dctx->setChecksum(entry->checksum->getMessageDigest());
dctx->setChecksum(entry->checksum->getMessageDigest()); dctx->setChecksumHashAlgo(entry->checksum->getAlgo());
dctx->setChecksumHashAlgo(entry->checksum->getAlgo()); }
} if(!entry->chunkChecksum.isNull()) {
} else {
dctx->setPieceHashes(entry->chunkChecksum->getChecksums().begin(), dctx->setPieceHashes(entry->chunkChecksum->getChecksums().begin(),
entry->chunkChecksum->getChecksums().end()); entry->chunkChecksum->getChecksums().end());
dctx->setPieceHashAlgo(entry->chunkChecksum->getAlgo()); dctx->setPieceHashAlgo(entry->chunkChecksum->getAlgo());

View File

@ -85,8 +85,11 @@ void Metalink2RequestGroupTest::testGenerate()
CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, dctx->getPieceHashAlgo()); CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1, dctx->getPieceHashAlgo());
CPPUNIT_ASSERT_EQUAL((size_t)2, dctx->getPieceHashes().size()); CPPUNIT_ASSERT_EQUAL((size_t)2, dctx->getPieceHashes().size());
CPPUNIT_ASSERT_EQUAL((size_t)262144, dctx->getPieceLength()); CPPUNIT_ASSERT_EQUAL((size_t)262144, dctx->getPieceLength());
CPPUNIT_ASSERT_EQUAL(std::string(""), dctx->getChecksumHashAlgo()); CPPUNIT_ASSERT_EQUAL(MessageDigestContext::SHA1,
CPPUNIT_ASSERT_EQUAL(std::string(""), dctx->getChecksum()); dctx->getChecksumHashAlgo());
CPPUNIT_ASSERT_EQUAL
(std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"),
dctx->getChecksum());
#endif // ENABLE_MESSAGE_DIGEST #endif // ENABLE_MESSAGE_DIGEST
CPPUNIT_ASSERT(dctx->getSignature().isNull()); CPPUNIT_ASSERT(dctx->getSignature().isNull());
} }