/* */ #include "UnknownLengthPieceStorage.h" #include #include "DefaultDiskWriter.h" #include "DirectDiskAdaptor.h" #include "prefs.h" #include "DefaultDiskWriterFactory.h" #include "DownloadContext.h" #include "Piece.h" #include "FileEntry.h" #include "BitfieldMan.h" namespace aria2 { UnknownLengthPieceStorage::UnknownLengthPieceStorage (const std::shared_ptr& downloadContext) : downloadContext_(downloadContext), diskWriterFactory_(std::make_shared()), totalLength_(0), downloadFinished_(false) {} UnknownLengthPieceStorage::~UnknownLengthPieceStorage() {} void UnknownLengthPieceStorage::initStorage() { auto directDiskAdaptor = std::make_shared(); directDiskAdaptor->setTotalLength(downloadContext_->getTotalLength()); directDiskAdaptor->setFileEntries(downloadContext_->getFileEntries().begin(), downloadContext_->getFileEntries().end()); directDiskAdaptor->setDiskWriter (diskWriterFactory_->newDiskWriter(directDiskAdaptor->getFilePath())); diskAdaptor_ = std::move(directDiskAdaptor); } #ifdef ENABLE_BITTORRENT bool UnknownLengthPieceStorage::hasMissingPiece(const std::shared_ptr& peer) { abort(); } void UnknownLengthPieceStorage::getMissingPiece (std::vector >& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, cuid_t cuid) { abort(); } void UnknownLengthPieceStorage::getMissingPiece (std::vector >& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) { abort(); } void UnknownLengthPieceStorage::getMissingFastPiece (std::vector >& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, cuid_t cuid) { abort(); } void UnknownLengthPieceStorage::getMissingFastPiece (std::vector >& pieces, size_t minMissingBlocks, const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) { abort(); } std::shared_ptr UnknownLengthPieceStorage::getMissingPiece (const std::shared_ptr& peer, cuid_t cuid) { abort(); } std::shared_ptr UnknownLengthPieceStorage::getMissingPiece (const std::shared_ptr& peer, const std::vector& excludedIndexes, cuid_t cuid) { abort(); } #endif // ENABLE_BITTORRENT bool UnknownLengthPieceStorage::hasMissingUnusedPiece() { abort(); } std::shared_ptr UnknownLengthPieceStorage::getMissingPiece (size_t minSplitSize, const unsigned char* ignoreBitfield, size_t length, cuid_t cuid) { if(downloadFinished_) { return nullptr; } if(!piece_) { piece_ = std::make_shared(); return piece_; } else { return nullptr; } } std::shared_ptr UnknownLengthPieceStorage::getMissingPiece (size_t index, cuid_t cuid) { if(index == 0) { return getMissingPiece(0, nullptr, 0, cuid); } else { return nullptr; } } std::shared_ptr UnknownLengthPieceStorage::getPiece(size_t index) { if(index == 0) { if(!piece_) { return std::make_shared(); } else { return piece_; } } else { return nullptr; } } void UnknownLengthPieceStorage::completePiece(const std::shared_ptr& piece) { if(*piece_ == *piece) { downloadFinished_ = true; totalLength_ = piece_->getLength(); diskAdaptor_->setTotalLength(totalLength_); piece_.reset(); createBitfield(); } } void UnknownLengthPieceStorage::cancelPiece (const std::shared_ptr& piece, cuid_t cuid) { if(*piece_ == *piece) { piece_.reset(); } } bool UnknownLengthPieceStorage::hasPiece(size_t index) { if(index == 0 && downloadFinished_) { return true; } else { return false; } } bool UnknownLengthPieceStorage::isPieceUsed(size_t index) { if(index == 0 && piece_) { return true; } else { return false; } } std::shared_ptr UnknownLengthPieceStorage::getDiskAdaptor() { return diskAdaptor_; } int32_t UnknownLengthPieceStorage::getPieceLength(size_t index) { // TODO Basically, PieceStorage::getPieceLength() is only used by // BitTorrent, and it does not use UnknownLengthPieceStorage. abort(); } void UnknownLengthPieceStorage::createBitfield() { if(totalLength_ > 0) { bitfield_ = make_unique(downloadContext_->getPieceLength(), totalLength_); bitfield_->setAllBit(); } } void UnknownLengthPieceStorage::markAllPiecesDone() { if(piece_) { totalLength_ = piece_->getLength(); piece_.reset(); } createBitfield(); downloadFinished_ = true; } void UnknownLengthPieceStorage::markPiecesDone(int64_t length) { // TODO not implemented yet abort(); } void UnknownLengthPieceStorage::markPieceMissing(size_t index) { // TODO not implemented yet abort(); } void UnknownLengthPieceStorage::getInFlightPieces (std::vector >& pieces) {} void UnknownLengthPieceStorage::setDiskWriterFactory (const std::shared_ptr& diskWriterFactory) { diskWriterFactory_ = diskWriterFactory; } const unsigned char* UnknownLengthPieceStorage::getBitfield() { if(bitfield_) { return bitfield_->getBitfield(); } return nullptr; } size_t UnknownLengthPieceStorage::getBitfieldLength() { if(bitfield_) { return bitfield_->getBitfieldLength(); } return 0; } } // namespace aria2