/* */ #include "PiecedSegment.h" #include "Piece.h" #include namespace aria2 { PiecedSegment::PiecedSegment(size_t pieceLength, const PieceHandle& piece): _pieceLength(pieceLength), _overflowLength(0), _piece(piece) { size_t index; bool t = _piece->getFirstMissingBlockIndexWithoutLock(index); assert(t); _writtenLength = index*_piece->getBlockLength(); } PiecedSegment::~PiecedSegment() {} bool PiecedSegment::complete() const { return _piece->pieceComplete(); } size_t PiecedSegment::getIndex() const { return _piece->getIndex(); } off_t PiecedSegment::getPosition() const { return ((off_t)_piece->getIndex())*_pieceLength; } off_t PiecedSegment::getPositionToWrite() const { return getPosition()+_writtenLength; } size_t PiecedSegment::getLength() const { return _piece->getLength(); } void PiecedSegment::updateWrittenLength(size_t bytes) { size_t newWrittenLength = _writtenLength+bytes; if(newWrittenLength > _piece->getLength()) { _overflowLength = newWrittenLength-_piece->getLength(); newWrittenLength = _piece->getLength(); } for(size_t i = _writtenLength/_piece->getBlockLength(); i < newWrittenLength/_piece->getBlockLength(); ++i) { _piece->completeBlock(i); } if(newWrittenLength == _piece->getLength()) { _piece->completeBlock(_piece->countBlock()-1); } _writtenLength = newWrittenLength; } #ifdef ENABLE_MESSAGE_DIGEST bool PiecedSegment::updateHash(uint32_t begin, const unsigned char* data, size_t dataLength) { return _piece->updateHash(begin, data, dataLength); } bool PiecedSegment::isHashCalculated() const { return _piece->isHashCalculated(); } std::string PiecedSegment::getHashString() { return _piece->getHashString(); } #endif // ENABLE_MESSAGE_DIGEST void PiecedSegment::clear() { _writtenLength = 0; _overflowLength = 0; _piece->clearAllBlock(); #ifdef ENABLE_MESSAGE_DIGEST _piece->destroyHashContext(); #endif // ENABLE_MESSAGE_DIGEST } PieceHandle PiecedSegment::getPiece() const { return _piece; } } // namespace aria2