/* */ #include "IteratableChunkChecksumValidator.h" #include "Util.h" #include "message.h" #include "MessageDigestHelper.h" #include "DiskAdaptor.h" #include "RecoverableException.h" void IteratableChunkChecksumValidator::validateChunk() { if(!finished()) { string actualChecksum; try { actualChecksum = calculateActualChecksum(); } catch(RecoverableException* ex) { _logger->debug("Caught exception while validating piece index=%d. Some part of file may be missing. Continue operation.", ex, _currentIndex); delete ex; _bitfield->unsetBit(_currentIndex); _currentIndex++; return; } if(actualChecksum == _dctx->getPieceHashes()[_currentIndex]) { _bitfield->setBit(_currentIndex); } else { _logger->info(EX_INVALID_CHUNK_CHECKSUM, _currentIndex, Util::llitos(getCurrentOffset(), true).c_str(), _dctx->getPieceHashes()[_currentIndex].c_str(), actualChecksum.c_str()); _bitfield->unsetBit(_currentIndex); } _currentIndex++; } } string IteratableChunkChecksumValidator::calculateActualChecksum() { int64_t offset = getCurrentOffset(); int32_t length; // When validating last piece if(_currentIndex+1 == (uint32_t)_dctx->getNumPieces()) { length = _dctx->getTotalLength()-offset; } else { length = _dctx->getPieceLength(); } return MessageDigestHelper::digest(_dctx->getPieceHashAlgo(), _pieceStorage->getDiskAdaptor(), offset, length); } void IteratableChunkChecksumValidator::init() { _bitfield->clearAllBit(); _currentIndex = 0; } void IteratableChunkChecksumValidator::updatePieceStorage() { _pieceStorage->setBitfield(_bitfield->getBitfield(), _bitfield->getBitfieldLength()); }