| 
					
				 | 
			
			
				@@ -53,9 +53,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace aria2 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define BUFSIZE (256*1024) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define ALIGNMENT 512 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 IteratableChunkChecksumValidator::IteratableChunkChecksumValidator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 (const SharedHandle<DownloadContext>& dctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  const PieceStorageHandle& pieceStorage) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -63,14 +60,10 @@ IteratableChunkChecksumValidator::IteratableChunkChecksumValidator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     pieceStorage_(pieceStorage), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     bitfield_(new BitfieldMan(dctx_->getPieceLength(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                               dctx_->getTotalLength())), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    currentIndex_(0), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    buffer_(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    currentIndex_(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-IteratableChunkChecksumValidator::~IteratableChunkChecksumValidator() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  delete [] buffer_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+IteratableChunkChecksumValidator::~IteratableChunkChecksumValidator() {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void IteratableChunkChecksumValidator::validateChunk() 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -121,8 +114,6 @@ std::string IteratableChunkChecksumValidator::calculateActualChecksum() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void IteratableChunkChecksumValidator::init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  delete [] buffer_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  buffer_ = new unsigned char[BUFSIZE]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ctx_ = MessageDigest::create(dctx_->getPieceHashType()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bitfield_->clearAllBit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   currentIndex_ = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -130,37 +121,23 @@ void IteratableChunkChecksumValidator::init() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 std::string IteratableChunkChecksumValidator::digest(off_t offset, size_t length) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unsigned char buf[4096]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ctx_->reset(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  off_t curoffset = offset/ALIGNMENT*ALIGNMENT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   off_t max = offset+length; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  off_t woffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if(curoffset < offset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    woffset = offset-curoffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    woffset = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  while(curoffset < max) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    size_t r = pieceStorage_->getDiskAdaptor()->readData(buffer_, BUFSIZE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                         curoffset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(r == 0 || r < static_cast<size_t>(woffset)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  while(offset < max) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    size_t r = pieceStorage_->getDiskAdaptor()->readData 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (buf, std::min(static_cast<off_t>(sizeof(buf)), max-offset), offset); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if(r == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       throw DL_ABORT_EX 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         (fmt(EX_FILE_READ, dctx_->getBasePath().c_str(), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				              "data is too short")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    size_t wlength; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if(max < static_cast<off_t>(curoffset+r)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      wlength = max-curoffset-woffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      wlength = r-woffset; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    ctx_->update(buffer_+woffset, wlength); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    curoffset += r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    woffset = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ctx_->update(buf, r); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    offset += r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return ctx_->digest(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool IteratableChunkChecksumValidator::finished() const 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if(currentIndex_ >= dctx_->getNumPieces()) { 
			 |