/* */ #include "IteratableChunkChecksumValidator.h" #include "Util.h" #include "message.h" void IteratableChunkChecksumValidator::validateChunk() { if(!finished()) { string actualChecksum = calculateActualChecksum(); if(!_chunkChecksum->validateChunk(actualChecksum, _currentIndex)) { int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength(); // wrong checksum logger->info(EX_INVALID_CHUNK_CHECKSUM, _currentIndex, offset, _chunkChecksum->getChecksum(_currentIndex).c_str(), actualChecksum.c_str()); int32_t startIndex; int32_t endIndex; Util::indexRange(startIndex, endIndex, offset, _chunkChecksum->getChecksumLength(), _bitfield->getBlockLength()); _bitfield->unsetBitRange(startIndex, endIndex); } _currentIndex++; } } string IteratableChunkChecksumValidator::calculateActualChecksum() { int64_t offset = ((int64_t)_currentIndex)*_chunkChecksum->getChecksumLength(); int32_t length = _diskWriter->size() < offset+_chunkChecksum->getChecksumLength() ? _diskWriter->size()-offset : _chunkChecksum->getChecksumLength(); return _diskWriter->messageDigest(offset, length, _chunkChecksum->getAlgo()); } bool IteratableChunkChecksumValidator::canValidate() const { // We assume file is already opened using DiskWriter::open or openExistingFile. return _chunkChecksum->getEstimatedDataLength() >= _diskWriter->size(); } void IteratableChunkChecksumValidator::init() { _bitfield->setAllBit(); _currentIndex = 0; }