/* */ #include "BtDependency.h" #include "RequestGroup.h" #include "Option.h" #include "LogFactory.h" #include "Logger.h" #include "DefaultBtContext.h" #include "RecoverableException.h" #include "message.h" #include "prefs.h" #include "Util.h" #include "PieceStorage.h" #include "DiskAdaptor.h" #include "File.h" namespace aria2 { BtDependency::BtDependency(const RequestGroupWeakHandle& dependant, const RequestGroupHandle& dependee, const Option* option): _dependant(dependant), _dependee(dependee), _option(option), _logger(LogFactory::getInstance()) {} BtDependency::~BtDependency() {} bool BtDependency::resolve() { if(_dependee->getNumCommand() == 0 && _dependee->downloadFinished()) { RequestGroupHandle dependee = _dependee; // cut reference here _dependee.reset(); DefaultBtContextHandle btContext(new DefaultBtContext()); try { DiskAdaptorHandle diskAdaptor = dependee->getPieceStorage()->getDiskAdaptor(); diskAdaptor->openExistingFile(); std::string content = Util::toString(diskAdaptor); btContext->loadFromMemory(content, File(dependee->getFilePath()).getBasename()); if(_option->defined(PREF_PEER_ID_PREFIX)) { btContext->setPeerIdPrefix(_option->get(PREF_PEER_ID_PREFIX)); } btContext->setDir(_dependant->getDownloadContext()->getDir()); } catch(RecoverableException& e) { _logger->error(EX_EXCEPTION_CAUGHT, e); _logger->debug("BtDependency for GID#%d failed. Go without Bt.", _dependant->getGID()); return true; } _logger->debug("Dependency resolved for GID#%d", _dependant->getGID()); _dependant->setDownloadContext(btContext); btContext->setOwnerRequestGroup(_dependant.get()); return true; } else if(_dependee->getNumCommand() == 0) { // _dependee's download failed. // cut reference here _dependee.reset(); _logger->debug("BtDependency for GID#%d failed. Go without Bt.", _dependant->getGID()); return true; } else { return false; } } } // namespace aria2