/* */ #include "IteratableChecksumValidator.h" #include "Util.h" #include "message.h" #define BUFSIZE 16*1024 void IteratableChecksumValidator::validateChunk() { if(!finished()) { char data[BUFSIZE]; int32_t size = _diskWriter->readData(data, sizeof(data), _currentOffset); _ctx->digestUpdate(data, size); _currentOffset += sizeof(data); if(finished()) { unsigned char* digest = new unsigned char[_ctx->digestLength()]; try { _ctx->digestFinal(digest); if(_checksum->getMessageDigest() != Util::toHex(digest, _ctx->digestLength())) { _bitfield->clearAllBit(); } delete [] digest; } catch(...) { delete [] digest; throw; } } } } bool IteratableChecksumValidator::canValidate() const { // We assume file is already opened using DiskWriter::open or openExistingFile. return !_checksum.isNull() && !_checksum->isEmpty(); } void IteratableChecksumValidator::init() { _bitfield->setAllBit(); _currentOffset = 0; _ctx = new MessageDigestContext(); _ctx->trySetAlgo(_checksum->getAlgo()); _ctx->digestInit(); }