/* */ #include "IteratableChecksumValidator.h" #include #include "util.h" #include "message.h" #include "PieceStorage.h" #include "MessageDigest.h" #include "DiskAdaptor.h" #include "FileEntry.h" #include "BitfieldMan.h" #include "DownloadContext.h" #include "LogFactory.h" #include "fmt.h" namespace aria2 { IteratableChecksumValidator::IteratableChecksumValidator (const SharedHandle& dctx, const PieceStorageHandle& pieceStorage) : dctx_(dctx), pieceStorage_(pieceStorage), currentOffset_(0) {} IteratableChecksumValidator::~IteratableChecksumValidator() {} void IteratableChecksumValidator::validateChunk() { if(!finished()) { unsigned char buf[4096]; size_t length = pieceStorage_->getDiskAdaptor()->readData (buf, sizeof(buf), currentOffset_); ctx_->update(buf, length); currentOffset_ += length; if(finished()) { std::string actualDigest = ctx_->digest(); if(dctx_->getDigest() == actualDigest) { pieceStorage_->markAllPiecesDone(); } else { A2_LOG_INFO(fmt("Checksum validation failed. expected=%s, actual=%s", util::toHex(dctx_->getDigest()).c_str(), util::toHex(actualDigest).c_str())); BitfieldMan bitfield(dctx_->getPieceLength(), dctx_->getTotalLength()); pieceStorage_->setBitfield(bitfield.getBitfield(), bitfield.getBitfieldLength()); } } } } bool IteratableChecksumValidator::finished() const { if((uint64_t)currentOffset_ >= dctx_->getTotalLength()) { return true; } else { return false; } } uint64_t IteratableChecksumValidator::getTotalLength() const { return dctx_->getTotalLength(); } void IteratableChecksumValidator::init() { currentOffset_ = 0; ctx_ = MessageDigest::create(dctx_->getHashType()); } } // namespace aria2