/* */ #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