Selaa lähdekoodia

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
Tatsuhiro Tsujikawa 15 vuotta sitten
vanhempi
commit
83465ff83d
4 muutettua tiedostoa jossa 32 lisäystä ja 18 poistoa
  1. 9 0
      ChangeLog
  2. 13 10
      src/DownloadCommand.cc
  3. 5 6
      src/Metalink2RequestGroup.cc
  4. 5 2
      test/Metalink2RequestGroupTest.cc

+ 9 - 0
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.

+ 13 - 10
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.

+ 5 - 6
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());

+ 5 - 2
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());
   }