/* */ #include "IteratableChecksumValidator.h" #include #include "util.h" #include "message.h" #include "PieceStorage.h" #include "messageDigest.h" #include "LogFactory.h" #include "Logger.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), logger_(LogFactory::getInstance()), buffer_(0) {} IteratableChecksumValidator::~IteratableChecksumValidator() { #ifdef HAVE_POSIX_MEMALIGN free(buffer_); #else // !HAVE_POSIX_MEMALIGN delete [] buffer_; #endif // !HAVE_POSIX_MEMALIGN } void IteratableChecksumValidator::validateChunk() { if(!finished()) { size_t length = pieceStorage_->getDiskAdaptor()->readData(buffer_, BUFSIZE, currentOffset_); ctx_->digestUpdate(buffer_, length); currentOffset_ += length; if(finished()) { std::string actualChecksum = util::toHex(ctx_->digestFinal()); if(dctx_->getChecksum() == actualChecksum) { 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()) { pieceStorage_->getDiskAdaptor()->disableDirectIO(); return true; } else { return false; } } uint64_t IteratableChecksumValidator::getTotalLength() const { return dctx_->getTotalLength(); } void IteratableChecksumValidator::init() { #ifdef HAVE_POSIX_MEMALIGN free(buffer_); buffer_ = reinterpret_cast (util::allocateAlignedMemory(ALIGNMENT, BUFSIZE)); #else // !HAVE_POSIX_MEMALIGN delete [] buffer_; buffer_ = new unsigned char[BUFSIZE]; #endif // !HAVE_POSIX_MEMALIGN pieceStorage_->getDiskAdaptor()->enableDirectIO(); currentOffset_ = 0; ctx_.reset(new MessageDigestContext()); ctx_->trySetAlgo(dctx_->getChecksumHashAlgo()); ctx_->digestInit(); } } // namespace aria2