/* */ #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" namespace aria2 { #define BUFSIZE (256*1024) #define ALIGNMENT 512 IteratableChecksumValidator::IteratableChecksumValidator (const SharedHandle& dctx, const PieceStorageHandle& pieceStorage) : dctx_(dctx), pieceStorage_(pieceStorage), currentOffset_(0), buffer_(0) {} IteratableChecksumValidator::~IteratableChecksumValidator() { delete [] buffer_; } void IteratableChecksumValidator::validateChunk() { if(!finished()) { size_t length = pieceStorage_->getDiskAdaptor()->readData(buffer_, BUFSIZE, currentOffset_); ctx_->update(buffer_, length); currentOffset_ += length; if(finished()) { std::string actualDigest = ctx_->hexDigest(); if(dctx_->getDigest() == actualDigest) { pieceStorage_->markAllPiecesDone(); } else { 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() { delete [] buffer_; buffer_ = new unsigned char[BUFSIZE]; currentOffset_ = 0; ctx_ = MessageDigest::create(dctx_->getHashType()); } } // namespace aria2