From 6240345fd5ed90f2293bf401473ba02c94475d23 Mon Sep 17 00:00:00 2001 From: Nils Maier <maierman@web.de> Date: Thu, 29 May 2014 18:21:49 +0200 Subject: [PATCH] Revert "Cleanup AbstractCommand" This reverts commit 0465aa54557e802156d1df0661c29d2aadb5541d. --- src/AbstractCommand.cc | 946 +++++++++++++++++++---------------------- src/AbstractCommand.h | 90 ++-- src/ConnectCommand.cc | 2 +- src/ConnectCommand.h | 2 +- src/RequestGroup.h | 5 - 5 files changed, 479 insertions(+), 566 deletions(-) diff --git a/src/AbstractCommand.cc b/src/AbstractCommand.cc index d9bfc3bd..313155ba 100644 --- a/src/AbstractCommand.cc +++ b/src/AbstractCommand.cc @@ -74,15 +74,13 @@ namespace aria2 { -AbstractCommand::AbstractCommand( - cuid_t cuid, - const std::shared_ptr<Request> &req, - const std::shared_ptr<FileEntry> &fileEntry, - RequestGroup *requestGroup, - DownloadEngine *e, - const std::shared_ptr<SocketCore> &s, - const std::shared_ptr<SocketRecvBuffer> &socketRecvBuffer, - bool incNumConnection) +AbstractCommand::AbstractCommand(cuid_t cuid, + const std::shared_ptr<Request>& req, + const std::shared_ptr<FileEntry>& fileEntry, + RequestGroup* requestGroup, DownloadEngine* e, + const std::shared_ptr<SocketCore>& s, + const std::shared_ptr<SocketRecvBuffer>& socketRecvBuffer, + bool incNumConnection) : Command(cuid), req_(req), fileEntry_(fileEntry), @@ -100,10 +98,10 @@ AbstractCommand::AbstractCommand( checkSocketIsWritable_(false), incNumConnection_(incNumConnection) { - if (socket_ && socket_->isOpen()) { + if(socket_ && socket_->isOpen()) { setReadCheckSocket(socket_); } - if (incNumConnection_) { + if(incNumConnection_) { requestGroup->increaseStreamConnection(); } requestGroup_->increaseStreamCommand(); @@ -113,8 +111,7 @@ AbstractCommand::AbstractCommand( #endif // ENABLE_ASYNC_DNS } -AbstractCommand::~AbstractCommand() -{ +AbstractCommand::~AbstractCommand() { disableReadCheckSocket(); disableWriteCheckSocket(); #ifdef ENABLE_ASYNC_DNS @@ -122,13 +119,13 @@ AbstractCommand::~AbstractCommand() #endif // ENABLE_ASYNC_DNS requestGroup_->decreaseNumCommand(); requestGroup_->decreaseStreamCommand(); - if (incNumConnection_) { + if(incNumConnection_) { requestGroup_->decreaseStreamConnection(); } } -void -AbstractCommand::useFasterRequest(const std::shared_ptr<Request> &fasterRequest) +void AbstractCommand::useFasterRequest +(const std::shared_ptr<Request>& fasterRequest) { A2_LOG_INFO(fmt("CUID#%" PRId64 " - Use faster Request hostname=%s, port=%u", getCuid(), @@ -137,261 +134,234 @@ AbstractCommand::useFasterRequest(const std::shared_ptr<Request> &fasterRequest) // Cancel current Request object and use faster one. fileEntry_->removeRequest(req_); e_->setNoWait(true); - e_->addCommand( - InitiateConnectionCommandFactory::createInitiateConnectionCommand( - getCuid(), fasterRequest, fileEntry_, requestGroup_, e_)); + e_->addCommand(InitiateConnectionCommandFactory:: + createInitiateConnectionCommand + (getCuid(), fasterRequest, fileEntry_, requestGroup_, e_)); } -bool AbstractCommand::shouldCheck() const -{ - if (checkSocketIsReadable_) { - if (readEventEnabled()) { - return true; - } - - if (socketRecvBuffer_ && !socketRecvBuffer_->bufferEmpty()) { - return true; - } - } - - if (checkSocketIsWritable_ && writeEventEnabled()) { - return true; - } - -#ifdef ENABLE_ASYNC_DNS - const auto resolverChecked = asyncNameResolverMan_->resolverChecked(); - if (resolverChecked && asyncNameResolverMan_->getStatus() != 0) { - return true; - } - - if (!checkSocketIsReadable_ && !checkSocketIsWritable_ && !resolverChecked) { - return true; - } -#endif // ENABLE_ASYNC_DNS - - return noCheck(); -} - -bool AbstractCommand::execute() -{ - A2_LOG_DEBUG(fmt("CUID#%" PRId64 - " - socket: read:%d, write:%d, hup:%d, err:%d", +bool AbstractCommand::execute() { + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - socket: read:%d, write:%d, hup:%d, err:%d", getCuid(), readEventEnabled(), writeEventEnabled(), hupEventEnabled(), errorEventEnabled())); try { - if (requestGroup_->downloadFinished() || requestGroup_->isHaltRequested()) { + if(requestGroup_->downloadFinished() || requestGroup_->isHaltRequested()) { return true; } - - if (req_ && req_->removalRequested()) { - A2_LOG_DEBUG(fmt("CUID#%" PRId64 - " - Discard original URI=%s because it is" + if(req_ && req_->removalRequested()) { + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Discard original URI=%s because it is" " requested.", - getCuid(), - req_->getUri().c_str())); + getCuid(), req_->getUri().c_str())); return prepareForRetry(0); } - - auto sm = getSegmentMan(); - - if (getPieceStorage()) { + if(getPieceStorage()) { segments_.clear(); - sm->getInFlightSegment(segments_, getCuid()); - - if (req_ && segments_.empty()) { + getSegmentMan()->getInFlightSegment(segments_, getCuid()); + if(req_ && segments_.empty()) { // This command previously has assigned segments, but it is // canceled. So discard current request chain. Plus, if no // segment is available when http pipelining is used. - A2_LOG_DEBUG(fmt("CUID#%" PRId64 - " - It seems previously assigned segments" + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - It seems previously assigned segments" " are canceled. Restart.", getCuid())); // Request::isPipeliningEnabled() == true means aria2 // accessed the remote server and discovered that the server // supports pipelining. - if (req_ && req_->isPipeliningEnabled()) { + if(req_ && req_->isPipeliningEnabled()) { e_->poolSocket(req_, createProxyRequest(), socket_); } return prepareForRetry(0); } - // TODO it is not needed to check other PeerStats every time. // Find faster Request when no segment split is allowed. - if (req_ && fileEntry_->countPooledRequest() > 0 && - requestGroup_->getPendingLength() < calculateMinSplitSize() * 2) { - auto fasterRequest = fileEntry_->findFasterRequest(req_); - if (fasterRequest) { + if(req_ && fileEntry_->countPooledRequest() > 0 && + requestGroup_->getTotalLength()-requestGroup_->getCompletedLength() + < calculateMinSplitSize()*2) { + std::shared_ptr<Request> fasterRequest = fileEntry_->findFasterRequest(req_); + if(fasterRequest) { useFasterRequest(fasterRequest); return true; } } // Don't use this feature if PREF_MAX_{OVERALL_}DOWNLOAD_LIMIT // is used or total length is unknown. - if (req_ && fileEntry_->getLength() > 0 && - e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 && - requestGroup_->getMaxDownloadSpeedLimit() == 0 && - serverStatTimer_.difference(global::wallclock()) >= 10) { + if(req_ && fileEntry_->getLength() > 0 && + e_->getRequestGroupMan()->getMaxOverallDownloadSpeedLimit() == 0 && + requestGroup_->getMaxDownloadSpeedLimit() == 0 && + serverStatTimer_.difference(global::wallclock()) >= 10) { serverStatTimer_ = global::wallclock(); - std::vector<std::pair<size_t, std::string>> usedHosts; - if (getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) { + std::vector<std::pair<size_t, std::string> > usedHosts; + if(getOption()->getAsBool(PREF_SELECT_LEAST_USED_HOST)) { getDownloadEngine()->getRequestGroupMan()->getUsedHosts(usedHosts); } - auto fasterRequest = fileEntry_->findFasterRequest( - req_, usedHosts, e_->getRequestGroupMan()->getServerStatMan()); - if (fasterRequest) { + std::shared_ptr<Request> fasterRequest = + fileEntry_->findFasterRequest + (req_, usedHosts, e_->getRequestGroupMan()->getServerStatMan()); + if(fasterRequest) { useFasterRequest(fasterRequest); return true; } } } - - if (shouldCheck()) { + if((checkSocketIsReadable_ && + (readEventEnabled() || + (socketRecvBuffer_ && !socketRecvBuffer_->bufferEmpty()))) || + (checkSocketIsWritable_ && writeEventEnabled()) || + hupEventEnabled() || +#ifdef ENABLE_ASYNC_DNS + (asyncNameResolverMan_->resolverChecked() && + asyncNameResolverMan_->getStatus() != 0) || +#endif // ENABLE_ASYNC_DNS + (!checkSocketIsReadable_ && !checkSocketIsWritable_ +#ifdef ENABLE_ASYNC_DNS + && !asyncNameResolverMan_->resolverChecked() +#endif // ENABLE_ASYNC_DNS + ) || noCheck()) { checkPoint_ = global::wallclock(); - - if (!getPieceStorage()) { - return executeInternal(); - } - - if (!req_ || req_->getMaxPipelinedRequest() == 1 || - // Why the following condition is necessary? That's because - // For single file download, SegmentMan::getSegment(cuid) - // is more efficient. - getDownloadContext()->getFileEntries().size() == 1) { - size_t maxSegments = req_ ? req_->getMaxPipelinedRequest() : 1; - size_t minSplitSize = calculateMinSplitSize(); - while (segments_.size() < maxSegments) { - auto segment = sm->getSegment(getCuid(), minSplitSize); - if (!segment) { - break; + if(getPieceStorage()) { + if(!req_ || req_->getMaxPipelinedRequest() == 1 || + // Why the following condition is necessary? That's because + // For single file download, SegmentMan::getSegment(cuid) + // is more efficient. + getDownloadContext()->getFileEntries().size() == 1) { + size_t maxSegments = req_?req_->getMaxPipelinedRequest():1; + size_t minSplitSize = calculateMinSplitSize(); + while(segments_.size() < maxSegments) { + std::shared_ptr<Segment> segment = + getSegmentMan()->getSegment(getCuid(), minSplitSize); + if(!segment) { + break; + } else { + segments_.push_back(segment); + } } - segments_.push_back(segment); - } - if (segments_.empty()) { - // TODO socket could be pooled here if pipelining is - // enabled... Hmm, I don't think if pipelining is enabled - // it does not go here. - A2_LOG_INFO(fmt(MSG_NO_SEGMENT_AVAILABLE, getCuid())); - // When all segments are ignored in SegmentMan, there are - // no URIs available, so don't retry. - if (sm->allSegmentsIgnored()) { - A2_LOG_DEBUG("All segments are ignored."); - // This will execute other idle Commands and let them - // finish quickly. - e_->setRefreshInterval(0); - return true; + if(segments_.empty()) { + // TODO socket could be pooled here if pipelining is + // enabled... Hmm, I don't think if pipelining is enabled + // it does not go here. + A2_LOG_INFO(fmt(MSG_NO_SEGMENT_AVAILABLE, + getCuid())); + // When all segments are ignored in SegmentMan, there are + // no URIs available, so don't retry. + if(getSegmentMan()->allSegmentsIgnored()) { + A2_LOG_DEBUG("All segments are ignored."); + // This will execute other idle Commands and let them + // finish quickly. + e_->setRefreshInterval(0); + return true; + } else { + return prepareForRetry(1); + } + } + } else { + // For multi-file downloads + size_t minSplitSize = calculateMinSplitSize(); + size_t maxSegments = req_->getMaxPipelinedRequest(); + if(segments_.size() < maxSegments) { + getSegmentMan()->getSegment + (segments_, getCuid(), minSplitSize, fileEntry_, maxSegments); + } + if(segments_.empty()) { + return prepareForRetry(0); } - - return prepareForRetry(1); } } - else { - // For multi-file downloads - size_t minSplitSize = calculateMinSplitSize(); - size_t maxSegments = req_->getMaxPipelinedRequest(); - if (segments_.size() < maxSegments) { - sm->getSegment( - segments_, getCuid(), minSplitSize, fileEntry_, maxSegments); - } - if (segments_.empty()) { - return prepareForRetry(0); - } - } - return executeInternal(); - } - - if (errorEventEnabled()) { - throw DL_RETRY_EX( - fmt(MSG_NETWORK_PROBLEM, socket_->getSocketError().c_str())); - } - - if (checkPoint_.difference(global::wallclock()) >= timeout_) { - // timeout triggers ServerStat error state. - auto ss = e_->getRequestGroupMan()->getOrCreateServerStat( - req_->getHost(), req_->getProtocol()); - ss->setError(); - // When DNS query was timeout, req_->getConnectedAddr() is - // empty. - if (!req_->getConnectedAddr().empty()) { - // Purging IP address cache to renew IP address. - A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Marking IP address %s as bad", - getCuid(), - req_->getConnectedAddr().c_str())); - e_->markBadIPAddress(req_->getConnectedHostname(), - req_->getConnectedAddr(), - req_->getConnectedPort()); + } else if(errorEventEnabled()) { + throw DL_RETRY_EX(fmt(MSG_NETWORK_PROBLEM, + socket_->getSocketError().c_str())); + } else { + if(checkPoint_.difference(global::wallclock()) >= timeout_) { + // timeout triggers ServerStat error state. + std::shared_ptr<ServerStat> ss = + e_->getRequestGroupMan()->getOrCreateServerStat(req_->getHost(), + req_->getProtocol()); + ss->setError(); + // When DNS query was timeout, req_->getConnectedAddr() is + // empty. + if(!req_->getConnectedAddr().empty()) { + // Purging IP address cache to renew IP address. + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Marking IP address %s as bad", + getCuid(), + req_->getConnectedAddr().c_str())); + e_->markBadIPAddress(req_->getConnectedHostname(), + req_->getConnectedAddr(), + req_->getConnectedPort()); + } + if(e_->findCachedIPAddress + (req_->getConnectedHostname(), req_->getConnectedPort()).empty()) { + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - All IP addresses were marked bad." + " Removing Entry.", + getCuid())); + e_->removeCachedIPAddress + (req_->getConnectedHostname(), req_->getConnectedPort()); + } + throw DL_RETRY_EX2(EX_TIME_OUT, error_code::TIME_OUT); } - if (e_->findCachedIPAddress(req_->getConnectedHostname(), - req_->getConnectedPort()).empty()) { - A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - All IP addresses were marked bad." - " Removing Entry.", - getCuid())); - e_->removeCachedIPAddress(req_->getConnectedHostname(), - req_->getConnectedPort()); - } - throw DL_RETRY_EX2(EX_TIME_OUT, error_code::TIME_OUT); + addCommandSelf(); + return false; } - - addCommandSelf(); - return false; - } - catch (DlAbortEx &err) { + } catch(DlAbortEx& err) { requestGroup_->setLastErrorCode(err.getErrorCode()); - if (req_) { - A2_LOG_ERROR_EX( - fmt(MSG_DOWNLOAD_ABORTED, getCuid(), req_->getUri().c_str()), - DL_ABORT_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), err)); + if(req_) { + A2_LOG_ERROR_EX(fmt(MSG_DOWNLOAD_ABORTED, + getCuid(), + req_->getUri().c_str()), + DL_ABORT_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), + err)); fileEntry_->addURIResult(req_->getUri(), err.getErrorCode()); - if (err.getErrorCode() == error_code::CANNOT_RESUME) { + if(err.getErrorCode() == error_code::CANNOT_RESUME) { requestGroup_->increaseResumeFailureCount(); } - } - else { + } else { A2_LOG_DEBUG_EX(EX_EXCEPTION_CAUGHT, err); } onAbort(); tryReserved(); return true; - } - catch (DlRetryEx &err) { + } catch(DlRetryEx& err) { assert(req_); - A2_LOG_INFO_EX( - fmt(MSG_RESTARTING_DOWNLOAD, getCuid(), req_->getUri().c_str()), - DL_RETRY_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), err)); + A2_LOG_INFO_EX(fmt(MSG_RESTARTING_DOWNLOAD, + getCuid(), req_->getUri().c_str()), + DL_RETRY_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), + err)); req_->addTryCount(); req_->resetRedirectCount(); req_->resetUri(); - const int maxTries = getOption()->getAsInt(PREF_MAX_TRIES); bool isAbort = maxTries != 0 && req_->getTryCount() >= maxTries; - if (isAbort) { - A2_LOG_INFO(fmt(MSG_MAX_TRY, getCuid(), req_->getTryCount())); - A2_LOG_ERROR_EX( - fmt(MSG_DOWNLOAD_ABORTED, getCuid(), req_->getUri().c_str()), err); + if(isAbort) { + A2_LOG_INFO(fmt(MSG_MAX_TRY, + getCuid(), + req_->getTryCount())); + A2_LOG_ERROR_EX(fmt(MSG_DOWNLOAD_ABORTED, + getCuid(), + req_->getUri().c_str()), + err); fileEntry_->addURIResult(req_->getUri(), err.getErrorCode()); requestGroup_->setLastErrorCode(err.getErrorCode()); - if (err.getErrorCode() == error_code::CANNOT_RESUME) { + if(err.getErrorCode() == error_code::CANNOT_RESUME) { requestGroup_->increaseResumeFailureCount(); } onAbort(); tryReserved(); return true; + } else { + Timer wakeTime(global::wallclock()); + wakeTime.advance(getOption()->getAsInt(PREF_RETRY_WAIT)); + req_->setWakeTime(wakeTime); + return prepareForRetry(0); } - - Timer wakeTime(global::wallclock()); - wakeTime.advance(getOption()->getAsInt(PREF_RETRY_WAIT)); - req_->setWakeTime(wakeTime); - return prepareForRetry(0); - } - catch (DownloadFailureException &err) { + } catch(DownloadFailureException& err) { requestGroup_->setLastErrorCode(err.getErrorCode()); - if (req_) { - A2_LOG_ERROR_EX( - fmt(MSG_DOWNLOAD_ABORTED, getCuid(), req_->getUri().c_str()), - DL_ABORT_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), err)); + if(req_) { + A2_LOG_ERROR_EX(fmt(MSG_DOWNLOAD_ABORTED, + getCuid(), + req_->getUri().c_str()), + DL_ABORT_EX2(fmt("URI=%s", req_->getCurrentUri().c_str()), + err)); fileEntry_->addURIResult(req_->getUri(), err.getErrorCode()); } else { A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, err); @@ -402,14 +372,14 @@ bool AbstractCommand::execute() } } -void AbstractCommand::tryReserved() -{ - if (getDownloadContext()->getFileEntries().size() == 1) { - const auto &entry = getDownloadContext()->getFirstFileEntry(); +void AbstractCommand::tryReserved() { + if(getDownloadContext()->getFileEntries().size() == 1) { + const std::shared_ptr<FileEntry>& entry = + getDownloadContext()->getFirstFileEntry(); // Don't create new command if currently file length is unknown // and there are no URI left. Because file length is unknown, we // can assume that there are no in-flight request object. - if (entry->getLength() == 0 && entry->getRemainingUris().empty()) { + if(entry->getLength() == 0 && entry->getRemainingUris().empty()) { A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Not trying next request." " No reserved/pooled request is remaining and" " total length is still unknown.", @@ -417,20 +387,19 @@ void AbstractCommand::tryReserved() return; } } - A2_LOG_DEBUG( - fmt("CUID#%" PRId64 " - Trying reserved/pooled request.", getCuid())); + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Trying reserved/pooled request.", + getCuid())); std::vector<std::unique_ptr<Command>> commands; requestGroup_->createNextCommand(commands, e_, 1); e_->setNoWait(true); e_->addCommand(std::move(commands)); } -bool AbstractCommand::prepareForRetry(time_t wait) -{ - if (getPieceStorage()) { +bool AbstractCommand::prepareForRetry(time_t wait) { + if(getPieceStorage()) { getSegmentMan()->cancelSegment(getCuid()); } - if (req_) { + if(req_) { // Reset persistentConnection and maxPipelinedRequest to handle // the situation where remote server returns Connection: close // after several pipelined requests. @@ -439,19 +408,17 @@ bool AbstractCommand::prepareForRetry(time_t wait) fileEntry_->poolRequest(req_); A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Pooling request URI=%s", - getCuid(), - req_->getUri().c_str())); - if (getSegmentMan()) { + getCuid(), req_->getUri().c_str())); + if(getSegmentMan()) { getSegmentMan()->recognizeSegmentFor(fileEntry_); } } - auto command = - make_unique<CreateRequestCommand>(getCuid(), requestGroup_, e_); - if (wait == 0) { + auto command = make_unique<CreateRequestCommand>(getCuid(), + requestGroup_, e_); + if(wait == 0) { e_->setNoWait(true); - } - else { + } else { // We don't use wait so that Command can be executed by // DownloadEngine::setRefreshInterval(0). command->setStatus(Command::STATUS_INACTIVE); @@ -460,157 +427,134 @@ bool AbstractCommand::prepareForRetry(time_t wait) return true; } -void AbstractCommand::onAbort() -{ - if (req_) { +void AbstractCommand::onAbort() { + if(req_) { fileEntry_->removeIdenticalURI(req_->getUri()); fileEntry_->removeRequest(req_); } - - A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Aborting download", getCuid())); - if (!getPieceStorage()) { - return; - } - - getSegmentMan()->cancelSegment(getCuid()); - // Don't do following process if BitTorrent is involved or files - // in DownloadContext is more than 1. The latter condition is - // limitation of current implementation. - if (getOption()->getAsBool(PREF_ALWAYS_RESUME) || !fileEntry_ || - getDownloadContext()->getNetStat().getSessionDownloadLength() != 0 || - requestGroup_->p2pInvolved() || - getDownloadContext()->getFileEntries().size() != 1) { - return; - } - - const int maxTries = getOption()->getAsInt(PREF_MAX_RESUME_FAILURE_TRIES); - if (!(maxTries > 0 && requestGroup_->getResumeFailureCount() >= maxTries) && - !fileEntry_->emptyRequestUri()) { - return; - } - // Local file exists, but given servers(or at least contacted - // ones) doesn't support resume. Let's restart download from - // scratch. - A2_LOG_NOTICE(fmt(_("CUID#%" PRId64 " - Failed to resume download." - " Download from scratch."), - getCuid())); - A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Gathering URIs that has CANNOT_RESUME" - " error", + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Aborting download", getCuid())); - // Set PREF_ALWAYS_RESUME to A2_V_TRUE to avoid repeating this - // process. - getOption()->put(PREF_ALWAYS_RESUME, A2_V_TRUE); - std::deque<URIResult> res; - fileEntry_->extractURIResult(res, error_code::CANNOT_RESUME); - if (res.empty()) { - return; + if(getPieceStorage()) { + getSegmentMan()->cancelSegment(getCuid()); + // Don't do following process if BitTorrent is involved or files + // in DownloadContext is more than 1. The latter condition is + // limitation of current implementation. + if(!getOption()->getAsBool(PREF_ALWAYS_RESUME) && + fileEntry_ && + getDownloadContext()->getNetStat().getSessionDownloadLength() == 0 && + !requestGroup_->p2pInvolved() && + getDownloadContext()->getFileEntries().size() == 1) { + const int maxTries = getOption()->getAsInt(PREF_MAX_RESUME_FAILURE_TRIES); + if((maxTries > 0 && requestGroup_->getResumeFailureCount() >= maxTries)|| + fileEntry_->emptyRequestUri()) { + // Local file exists, but given servers(or at least contacted + // ones) doesn't support resume. Let's restart download from + // scratch. + A2_LOG_NOTICE(fmt(_("CUID#%" PRId64 " - Failed to resume download." + " Download from scratch."), + getCuid())); + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Gathering URIs that has CANNOT_RESUME" + " error", + getCuid())); + // Set PREF_ALWAYS_RESUME to A2_V_TRUE to avoid repeating this + // process. + getOption()->put(PREF_ALWAYS_RESUME, A2_V_TRUE); + std::deque<URIResult> res; + fileEntry_->extractURIResult(res, error_code::CANNOT_RESUME); + if(!res.empty()) { + getSegmentMan()->cancelAllSegments(); + getSegmentMan()->eraseSegmentWrittenLengthMemo(); + getPieceStorage()->markPiecesDone(0); + std::vector<std::string> uris; + uris.reserve(res.size()); + std::transform(res.begin(), res.end(), std::back_inserter(uris), + std::mem_fn(&URIResult::getURI)); + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.", + getCuid(), + static_cast<unsigned long int>(uris.size()))); + fileEntry_->addUris(uris.begin(), uris.end()); + getSegmentMan()->recognizeSegmentFor(fileEntry_); + } + } + } } - - getSegmentMan()->cancelAllSegments(); - getSegmentMan()->eraseSegmentWrittenLengthMemo(); - getPieceStorage()->markPiecesDone(0); - std::vector<std::string> uris; - uris.reserve(res.size()); - std::transform(res.begin(), - res.end(), - std::back_inserter(uris), - std::mem_fn(&URIResult::getURI)); - A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - %lu URIs found.", - getCuid(), - static_cast<unsigned long int>(uris.size()))); - fileEntry_->addUris(uris.begin(), uris.end()); - getSegmentMan()->recognizeSegmentFor(fileEntry_); } -void AbstractCommand::disableReadCheckSocket() -{ - if (!checkSocketIsReadable_) { - return; +void AbstractCommand::disableReadCheckSocket() { + if(checkSocketIsReadable_) { + e_->deleteSocketForReadCheck(readCheckTarget_, this); + checkSocketIsReadable_ = false; + readCheckTarget_.reset(); } - - e_->deleteSocketForReadCheck(readCheckTarget_, this); - checkSocketIsReadable_ = false; - readCheckTarget_.reset(); } -void -AbstractCommand::setReadCheckSocket(const std::shared_ptr<SocketCore> &socket) -{ - if (!socket->isOpen()) { +void AbstractCommand::setReadCheckSocket +(const std::shared_ptr<SocketCore>& socket) { + if(!socket->isOpen()) { disableReadCheckSocket(); - return; - } - - if (checkSocketIsReadable_) { - if (*readCheckTarget_ != *socket) { - e_->deleteSocketForReadCheck(readCheckTarget_, this); + } else { + if(checkSocketIsReadable_) { + if(*readCheckTarget_ != *socket) { + e_->deleteSocketForReadCheck(readCheckTarget_, this); + e_->addSocketForReadCheck(socket, this); + readCheckTarget_ = socket; + } + } else { e_->addSocketForReadCheck(socket, this); + checkSocketIsReadable_ = true; readCheckTarget_ = socket; } - return; } - - e_->addSocketForReadCheck(socket, this); - checkSocketIsReadable_ = true; - readCheckTarget_ = socket; } -void -AbstractCommand::setReadCheckSocketIf(const std::shared_ptr<SocketCore> &socket, - bool pred) +void AbstractCommand::setReadCheckSocketIf +(const std::shared_ptr<SocketCore>& socket, bool pred) { - if (pred) { + if(pred) { setReadCheckSocket(socket); - return; + } else { + disableReadCheckSocket(); } - - disableReadCheckSocket(); } -void AbstractCommand::disableWriteCheckSocket() -{ - if (!checkSocketIsWritable_) { - return; +void AbstractCommand::disableWriteCheckSocket() { + if(checkSocketIsWritable_) { + e_->deleteSocketForWriteCheck(writeCheckTarget_, this); + checkSocketIsWritable_ = false; + writeCheckTarget_.reset(); } - e_->deleteSocketForWriteCheck(writeCheckTarget_, this); - checkSocketIsWritable_ = false; - writeCheckTarget_.reset(); } -void -AbstractCommand::setWriteCheckSocket(const std::shared_ptr<SocketCore> &socket) -{ - if (!socket->isOpen()) { +void AbstractCommand::setWriteCheckSocket +(const std::shared_ptr<SocketCore>& socket) { + if(!socket->isOpen()) { disableWriteCheckSocket(); - return; - } - - if (checkSocketIsWritable_) { - if (*writeCheckTarget_ != *socket) { - e_->deleteSocketForWriteCheck(writeCheckTarget_, this); + } else { + if(checkSocketIsWritable_) { + if(*writeCheckTarget_ != *socket) { + e_->deleteSocketForWriteCheck(writeCheckTarget_, this); + e_->addSocketForWriteCheck(socket, this); + writeCheckTarget_ = socket; + } + } else { e_->addSocketForWriteCheck(socket, this); + checkSocketIsWritable_ = true; writeCheckTarget_ = socket; } - return; } - - e_->addSocketForWriteCheck(socket, this); - checkSocketIsWritable_ = true; - writeCheckTarget_ = socket; } -void AbstractCommand::setWriteCheckSocketIf( - const std::shared_ptr<SocketCore> &socket, bool pred) +void AbstractCommand::setWriteCheckSocketIf +(const std::shared_ptr<SocketCore>& socket, bool pred) { - if (pred) { + if(pred) { setWriteCheckSocket(socket); - return; + } else { + disableWriteCheckSocket(); } - - disableWriteCheckSocket(); } -void AbstractCommand::swapSocket(std::shared_ptr<SocketCore> &socket) +void AbstractCommand::swapSocket(std::shared_ptr<SocketCore>& socket) { disableReadCheckSocket(); disableWriteCheckSocket(); @@ -620,72 +564,76 @@ void AbstractCommand::swapSocket(std::shared_ptr<SocketCore> &socket) namespace { // Constructs proxy URI, merging username and password if they are // defined. -std::string makeProxyUri(PrefPtr proxyPref, - PrefPtr proxyUser, - PrefPtr proxyPasswd, - const Option *option) +std::string makeProxyUri +(PrefPtr proxyPref, + PrefPtr proxyUser, + PrefPtr proxyPasswd, + const Option* option) { uri::UriStruct us; - if (!uri::parse(us, option->get(proxyPref))) { + if(uri::parse(us, option->get(proxyPref))) { + if(option->defined(proxyUser)) { + us.username = option->get(proxyUser); + } + if(option->defined(proxyPasswd)) { + us.password = option->get(proxyPasswd); + us.hasPassword = true; + } + return uri::construct(us); + } else { return ""; } - if (option->defined(proxyUser)) { - us.username = option->get(proxyUser); - } - if (option->defined(proxyPasswd)) { - us.password = option->get(proxyPasswd); - us.hasPassword = true; - } - return uri::construct(us); } } // namespace namespace { // Returns proxy option value for the given protocol. -std::string getProxyOptionFor(PrefPtr proxyPref, - PrefPtr proxyUser, - PrefPtr proxyPasswd, - const Option *option) +std::string getProxyOptionFor +(PrefPtr proxyPref, + PrefPtr proxyUser, + PrefPtr proxyPasswd, + const Option* option) { std::string uri = makeProxyUri(proxyPref, proxyUser, proxyPasswd, option); - if (uri.empty()) { - return makeProxyUri( - PREF_ALL_PROXY, PREF_ALL_PROXY_USER, PREF_ALL_PROXY_PASSWD, option); + if(uri.empty()) { + return makeProxyUri(PREF_ALL_PROXY, PREF_ALL_PROXY_USER, + PREF_ALL_PROXY_PASSWD, option); + } else { + return uri; } - - return uri; } } // namespace // Returns proxy URI for given protocol. If no proxy URI is defined, // then returns an empty string. -std::string getProxyUri(const std::string &protocol, const Option *option) +std::string getProxyUri +(const std::string& protocol, const Option* option) { - if (protocol == "http") { - return getProxyOptionFor( - PREF_HTTP_PROXY, PREF_HTTP_PROXY_USER, PREF_HTTP_PROXY_PASSWD, option); - } - - if (protocol == "https") { + if(protocol == "http") { + return getProxyOptionFor(PREF_HTTP_PROXY, + PREF_HTTP_PROXY_USER, + PREF_HTTP_PROXY_PASSWD, + option); + } else if(protocol == "https") { return getProxyOptionFor(PREF_HTTPS_PROXY, PREF_HTTPS_PROXY_USER, PREF_HTTPS_PROXY_PASSWD, option); + } else if(protocol == "ftp") { + return getProxyOptionFor(PREF_FTP_PROXY, + PREF_FTP_PROXY_USER, + PREF_FTP_PROXY_PASSWD, + option); + } else { + return A2STR::NIL; } - - if (protocol == "ftp") { - return getProxyOptionFor( - PREF_FTP_PROXY, PREF_FTP_PROXY_USER, PREF_FTP_PROXY_PASSWD, option); - } - - return A2STR::NIL; } namespace { // Returns true if proxy is defined for the given protocol. Otherwise // returns false. -bool isProxyRequest(const std::string &protocol, - const std::shared_ptr<Option> &option) +bool isProxyRequest +(const std::string& protocol, const std::shared_ptr<Option>& option) { std::string proxyUri = getProxyUri(protocol, option.get()); return !proxyUri.empty(); @@ -693,34 +641,37 @@ bool isProxyRequest(const std::string &protocol, } // namespace namespace { -bool inNoProxy(const std::shared_ptr<Request> &req, const std::string &noProxy) +bool inNoProxy(const std::shared_ptr<Request>& req, + const std::string& noProxy) { std::vector<Scip> entries; - util::splitIter( - noProxy.begin(), noProxy.end(), std::back_inserter(entries), ',', true); - if (entries.empty()) { + util::splitIter(noProxy.begin(), noProxy.end(), std::back_inserter(entries), + ',', true); + if(entries.empty()) { return false; } - - for (const auto &e : entries) { - const auto slashpos = std::find(e.first, e.second, '/'); - if (slashpos == e.second) { - if (util::noProxyDomainMatch(req->getHost(), - std::string(e.first, e.second))) { + for(std::vector<Scip>::const_iterator i = entries.begin(), + eoi = entries.end(); i != eoi; ++i) { + std::string::const_iterator slashpos = + std::find((*i).first, (*i).second, '/'); + if(slashpos == (*i).second) { + if(util::noProxyDomainMatch + (req->getHost(), std::string((*i).first, (*i).second))) { + return true; + } + } else { + // TODO We don't resolve hostname here. More complete + // implementation is that we should first resolve + // hostname(which may result in several IP addresses) and + // evaluates against all of them + std::string ip((*i).first, slashpos); + uint32_t bits; + if(!util::parseUIntNoThrow(bits, std::string(slashpos+1, (*i).second))) { + continue; + } + if(util::inSameCidrBlock(ip, req->getHost(), bits)) { return true; } - } - // TODO We don't resolve hostname here. More complete - // implementation is that we should first resolve - // hostname(which may result in several IP addresses) and - // evaluates against all of them - std::string ip(e.first, slashpos); - uint32_t bits; - if (!util::parseUIntNoThrow(bits, std::string(slashpos + 1, e.second))) { - continue; - } - if (util::inSameCidrBlock(ip, req->getHost(), bits)) { - return true; } } return false; @@ -736,151 +687,141 @@ bool AbstractCommand::isProxyDefined() const std::shared_ptr<Request> AbstractCommand::createProxyRequest() const { std::shared_ptr<Request> proxyRequest; - if (inNoProxy(req_, getOption()->get(PREF_NO_PROXY))) { + if(inNoProxy(req_, getOption()->get(PREF_NO_PROXY))) { return proxyRequest; } - std::string proxy = getProxyUri(req_->getProtocol(), getOption().get()); - if (!proxy.empty()) { + if(!proxy.empty()) { proxyRequest.reset(new Request()); - if (proxyRequest->setUri(proxy)) { + if(proxyRequest->setUri(proxy)) { A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Using proxy", getCuid())); - } - else { - A2_LOG_DEBUG( - fmt("CUID#%" PRId64 " - Failed to parse proxy string", getCuid())); + } else { + A2_LOG_DEBUG(fmt("CUID#%" PRId64 " - Failed to parse proxy string", + getCuid())); proxyRequest.reset(); } } return proxyRequest; } -std::string AbstractCommand::resolveHostname(std::vector<std::string> &addrs, - const std::string &hostname, - uint16_t port) +std::string AbstractCommand::resolveHostname +(std::vector<std::string>& addrs, const std::string& hostname, uint16_t port) { - if (util::isNumericHost(hostname)) { + if(util::isNumericHost(hostname)) { addrs.push_back(hostname); return hostname; } - e_->findAllCachedIPAddresses(std::back_inserter(addrs), hostname, port); - if (!addrs.empty()) { - auto ipaddr = addrs.front(); + std::string ipaddr; + if(addrs.empty()) { +#ifdef ENABLE_ASYNC_DNS + if(getOption()->getAsBool(PREF_ASYNC_DNS)) { + if(!asyncNameResolverMan_->started()) { + asyncNameResolverMan_->startAsync(hostname, e_, this); + } + switch(asyncNameResolverMan_->getStatus()) { + case -1: + if(!isProxyRequest(req_->getProtocol(), getOption())) { + e_->getRequestGroupMan()->getOrCreateServerStat + (req_->getHost(), req_->getProtocol())->setError(); + } + throw DL_ABORT_EX2 + (fmt(MSG_NAME_RESOLUTION_FAILED, getCuid(), hostname.c_str(), + asyncNameResolverMan_->getLastError().c_str()), + error_code::NAME_RESOLVE_ERROR); + case 0: + return A2STR::NIL; + case 1: + asyncNameResolverMan_->getResolvedAddress(addrs); + if(addrs.empty()) { + throw DL_ABORT_EX2 + (fmt(MSG_NAME_RESOLUTION_FAILED, getCuid(), hostname.c_str(), + "No address returned"), + error_code::NAME_RESOLVE_ERROR); + } + break; + } + } else +#endif // ENABLE_ASYNC_DNS + { + NameResolver res; + res.setSocktype(SOCK_STREAM); + if(e_->getOption()->getAsBool(PREF_DISABLE_IPV6)) { + res.setFamily(AF_INET); + } + res.resolve(addrs, hostname); + } + A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE, + getCuid(), + hostname.c_str(), + strjoin(addrs.begin(), addrs.end(), ", ").c_str())); + for(std::vector<std::string>::const_iterator i = addrs.begin(), + eoi = addrs.end(); i != eoi; ++i) { + e_->cacheIPAddress(hostname, *i, port); + } + ipaddr = e_->findCachedIPAddress(hostname, port); + } else { + ipaddr = addrs.front(); A2_LOG_INFO(fmt(MSG_DNS_CACHE_HIT, getCuid(), hostname.c_str(), strjoin(addrs.begin(), addrs.end(), ", ").c_str())); - return ipaddr; } - - std::string ipaddr; -#ifdef ENABLE_ASYNC_DNS - if (getOption()->getAsBool(PREF_ASYNC_DNS)) { - if (!asyncNameResolverMan_->started()) { - asyncNameResolverMan_->startAsync(hostname, e_, this); - } - switch (asyncNameResolverMan_->getStatus()) { - case -1: - if (!isProxyRequest(req_->getProtocol(), getOption())) { - e_->getRequestGroupMan() - ->getOrCreateServerStat(req_->getHost(), req_->getProtocol()) - ->setError(); - } - throw DL_ABORT_EX2(fmt(MSG_NAME_RESOLUTION_FAILED, - getCuid(), - hostname.c_str(), - asyncNameResolverMan_->getLastError().c_str()), - error_code::NAME_RESOLVE_ERROR); - case 0: - return A2STR::NIL; - - case 1: - asyncNameResolverMan_->getResolvedAddress(addrs); - if (addrs.empty()) { - throw DL_ABORT_EX2(fmt(MSG_NAME_RESOLUTION_FAILED, - getCuid(), - hostname.c_str(), - "No address returned"), - error_code::NAME_RESOLVE_ERROR); - } - break; - } - } - else -#endif // ENABLE_ASYNC_DNS - { - NameResolver res; - res.setSocktype(SOCK_STREAM); - if (e_->getOption()->getAsBool(PREF_DISABLE_IPV6)) { - res.setFamily(AF_INET); - } - res.resolve(addrs, hostname); - } - A2_LOG_INFO(fmt(MSG_NAME_RESOLUTION_COMPLETE, - getCuid(), - hostname.c_str(), - strjoin(addrs.begin(), addrs.end(), ", ").c_str())); - for (const auto &addr: addrs) { - e_->cacheIPAddress(hostname, addr, port); - } - ipaddr = e_->findCachedIPAddress(hostname, port); return ipaddr; } -void AbstractCommand::prepareForNextAction( - std::unique_ptr<CheckIntegrityEntry> checkEntry) +void AbstractCommand::prepareForNextAction +(std::unique_ptr<CheckIntegrityEntry> checkEntry) { std::vector<std::unique_ptr<Command>> commands; - requestGroup_->processCheckIntegrityEntry( - commands, std::move(checkEntry), e_); + requestGroup_->processCheckIntegrityEntry(commands, std::move(checkEntry), + e_); e_->addCommand(std::move(commands)); e_->setNoWait(true); } -bool AbstractCommand::checkIfConnectionEstablished( - const std::shared_ptr<SocketCore> &socket, - const std::string &connectedHostname, - const std::string &connectedAddr, - uint16_t connectedPort) +bool AbstractCommand::checkIfConnectionEstablished +(const std::shared_ptr<SocketCore>& socket, + const std::string& connectedHostname, + const std::string& connectedAddr, + uint16_t connectedPort) { std::string error = socket->getSocketError(); - if (error.empty()) { - return true; - } - - // See also InitiateConnectionCommand::executeInternal() - e_->markBadIPAddress(connectedHostname, connectedAddr, connectedPort); - if (e_->findCachedIPAddress(connectedHostname, connectedPort).empty()) { + if(!error.empty()) { + // See also InitiateConnectionCommand::executeInternal() + e_->markBadIPAddress(connectedHostname, connectedAddr, connectedPort); + if(!e_->findCachedIPAddress(connectedHostname, connectedPort).empty()) { + A2_LOG_INFO(fmt(MSG_CONNECT_FAILED_AND_RETRY, + getCuid(), + connectedAddr.c_str(), connectedPort)); + e_->setNoWait(true); + e_->addCommand(InitiateConnectionCommandFactory:: + createInitiateConnectionCommand + (getCuid(), req_, fileEntry_, requestGroup_, e_)); + return false; + } e_->removeCachedIPAddress(connectedHostname, connectedPort); // Don't set error if proxy server is used and its method is GET. - if (resolveProxyMethod(req_->getProtocol()) != V_GET || - !isProxyRequest(req_->getProtocol(), getOption())) { - e_->getRequestGroupMan() - ->getOrCreateServerStat(req_->getHost(), req_->getProtocol()) - ->setError(); + if(resolveProxyMethod(req_->getProtocol()) != V_GET || + !isProxyRequest(req_->getProtocol(), getOption())) { + e_->getRequestGroupMan()->getOrCreateServerStat + (req_->getHost(), req_->getProtocol())->setError(); } - throw DL_RETRY_EX(fmt(MSG_ESTABLISHING_CONNECTION_FAILED, error.c_str())); + throw DL_RETRY_EX + (fmt(MSG_ESTABLISHING_CONNECTION_FAILED, error.c_str())); } - - A2_LOG_INFO(fmt(MSG_CONNECT_FAILED_AND_RETRY, - getCuid(), - connectedAddr.c_str(), - connectedPort)); - e_->setNoWait(true); - e_->addCommand( - InitiateConnectionCommandFactory::createInitiateConnectionCommand( - getCuid(), req_, fileEntry_, requestGroup_, e_)); - return false; + return true; } -const std::string& -AbstractCommand::resolveProxyMethod(const std::string &protocol) const +const std::string& AbstractCommand::resolveProxyMethod +(const std::string& protocol) const { - if (getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || protocol == "https") { + if(getOption()->get(PREF_PROXY_METHOD) == V_TUNNEL || + protocol == "https") { return V_TUNNEL; + } else { + return V_GET; } - return V_GET; } const std::shared_ptr<Option>& AbstractCommand::getOption() const @@ -895,11 +836,11 @@ void AbstractCommand::createSocket() int32_t AbstractCommand::calculateMinSplitSize() const { - if (req_ && req_->isPipeliningEnabled()) { + if(req_ && req_->isPipeliningEnabled()) { return getDownloadContext()->getPieceLength(); + } else { + return getOption()->getAsInt(PREF_MIN_SPLIT_SIZE); } - - return getOption()->getAsInt(PREF_MIN_SPLIT_SIZE); } void AbstractCommand::setRequest(const std::shared_ptr<Request>& request) @@ -922,8 +863,7 @@ void AbstractCommand::setSocket(const std::shared_ptr<SocketCore>& s) socket_ = s; } -const std::shared_ptr<DownloadContext>& -AbstractCommand::getDownloadContext() const +const std::shared_ptr<DownloadContext>& AbstractCommand::getDownloadContext() const { return requestGroup_->getDownloadContext(); } @@ -940,12 +880,10 @@ const std::shared_ptr<PieceStorage>& AbstractCommand::getPieceStorage() const void AbstractCommand::checkSocketRecvBuffer() { - if (socketRecvBuffer_->bufferEmpty()) { - return; + if(!socketRecvBuffer_->bufferEmpty()) { + setStatus(Command::STATUS_ONESHOT_REALTIME); + e_->setNoWait(true); } - - setStatus(Command::STATUS_ONESHOT_REALTIME); - e_->setNoWait(true); } void AbstractCommand::addCommandSelf() diff --git a/src/AbstractCommand.h b/src/AbstractCommand.h index c930e125..7f6c9429 100644 --- a/src/AbstractCommand.h +++ b/src/AbstractCommand.h @@ -43,8 +43,7 @@ #include "TimerA2.h" -namespace aria2 -{ +namespace aria2 { class FileEntry; class RequestGroup; @@ -63,8 +62,7 @@ class AsyncNameResolver; class AsyncNameResolverMan; #endif // ENABLE_ASYNC_DNS -class AbstractCommand : public Command -{ +class AbstractCommand : public Command { private: std::shared_ptr<Request> req_; std::shared_ptr<FileEntry> fileEntry_; @@ -77,10 +75,10 @@ private: std::unique_ptr<AsyncNameResolverMan> asyncNameResolverMan_; #endif // ENABLE_ASYNC_DNS - RequestGroup *requestGroup_; - DownloadEngine *e_; + RequestGroup* requestGroup_; + DownloadEngine* e_; - std::vector<std::shared_ptr<Segment>> segments_; + std::vector<std::shared_ptr<Segment> > segments_; Timer checkPoint_; Timer serverStatTimer_; @@ -92,10 +90,7 @@ private: bool incNumConnection_; int32_t calculateMinSplitSize() const; - - void useFasterRequest(const std::shared_ptr<Request> &fasterRequest); - - bool shouldCheck() const; + void useFasterRequest(const std::shared_ptr<Request>& fasterRequest); public: RequestGroup* getRequestGroup() const @@ -108,7 +103,7 @@ public: return req_; } - void setRequest(const std::shared_ptr<Request> &request); + void setRequest(const std::shared_ptr<Request>& request); // Resets request_. This method is more efficient than // setRequest(std::shared_ptr<Request>()); @@ -119,9 +114,9 @@ public: return fileEntry_; } - void setFileEntry(const std::shared_ptr<FileEntry> &fileEntry); + void setFileEntry(const std::shared_ptr<FileEntry>& fileEntry); - DownloadEngine *getDownloadEngine() const + DownloadEngine* getDownloadEngine() const { return e_; } @@ -131,12 +126,12 @@ public: return socket_; } - std::shared_ptr<SocketCore> &getSocket() + std::shared_ptr<SocketCore>& getSocket() { return socket_; } - void setSocket(const std::shared_ptr<SocketCore> &s); + void setSocket(const std::shared_ptr<SocketCore>& s); void createSocket(); @@ -145,7 +140,7 @@ public: return socketRecvBuffer_; } - const std::vector<std::shared_ptr<Segment>>& getSegments() const + const std::vector<std::shared_ptr<Segment> >& getSegments() const { return segments_; } @@ -155,46 +150,37 @@ public: // return empty string. In this case, call this function with same // arguments until resolved address is returned. Exception is // thrown on error. port is used for retrieving cached addresses. - std::string resolveHostname(std::vector<std::string> &addrs, - const std::string &hostname, - uint16_t port); + std::string resolveHostname + (std::vector<std::string>& addrs, const std::string& hostname, uint16_t port); void tryReserved(); - void setReadCheckSocket(const std::shared_ptr<SocketCore> &socket); - - void setWriteCheckSocket(const std::shared_ptr<SocketCore> &socket); - + void setReadCheckSocket(const std::shared_ptr<SocketCore>& socket); + void setWriteCheckSocket(const std::shared_ptr<SocketCore>& socket); void disableReadCheckSocket(); - void disableWriteCheckSocket(); /** * If pred == true, calls setReadCheckSocket(socket). Otherwise, calls * disableReadCheckSocket(). */ - void setReadCheckSocketIf(const std::shared_ptr<SocketCore> &socket, - bool pred); + void setReadCheckSocketIf(const std::shared_ptr<SocketCore>& socket, bool pred); /** * If pred == true, calls setWriteCheckSocket(socket). Otherwise, calls * disableWriteCheckSocket(). */ - void setWriteCheckSocketIf(const std::shared_ptr<SocketCore> &socket, - bool pred); + void setWriteCheckSocketIf(const std::shared_ptr<SocketCore>& socket, bool pred); // Swaps socket_ with socket. This disables current read and write // check. - void swapSocket(std::shared_ptr<SocketCore> &socket); + void swapSocket(std::shared_ptr<SocketCore>& socket); time_t getTimeout() const { return timeout_; } - void setTimeout(time_t timeout) - { - timeout_ = timeout; - } + void setTimeout(time_t timeout) { timeout_ = timeout; } void prepareForNextAction(std::unique_ptr<CheckIntegrityEntry> checkEntry); @@ -203,10 +189,11 @@ public: // InitiateConnectionCommandFactory and it is pushed to // DownloadEngine and returns false. If no addresses left, DlRetryEx // exception is thrown. - bool checkIfConnectionEstablished(const std::shared_ptr<SocketCore> &socket, - const std::string &connectedHostname, - const std::string &connectedAddr, - uint16_t connectedPort); + bool checkIfConnectionEstablished + (const std::shared_ptr<SocketCore>& socket, + const std::string& connectedHostname, + const std::string& connectedAddr, + uint16_t connectedPort); /* * Returns true if proxy for the procol indicated by Request::getProtocol() @@ -222,7 +209,7 @@ public: // Returns proxy method for given protocol. Either V_GET or V_TUNNEL // is returned. For HTTPS, always returns V_TUNNEL. - const std::string& resolveProxyMethod(const std::string &protocol) const; + const std::string& resolveProxyMethod(const std::string& protocol) const; const std::shared_ptr<Option>& getOption() const; @@ -230,7 +217,7 @@ public: const std::shared_ptr<SegmentMan>& getSegmentMan() const; const std::shared_ptr<PieceStorage>& getPieceStorage() const; - Timer &getCheckPoint() + Timer& getCheckPoint() { return checkPoint_; } @@ -238,40 +225,33 @@ public: void checkSocketRecvBuffer(); void addCommandSelf(); - protected: virtual bool prepareForRetry(time_t wait); - virtual void onAbort(); - virtual bool executeInternal() = 0; - // Returns true if the derived class wants to execute // executeInternal() unconditionally - virtual bool noCheck() const + virtual bool noCheck() { return false; } public: - AbstractCommand(cuid_t cuid, - const std::shared_ptr<Request> &req, - const std::shared_ptr<FileEntry> &fileEntry, - RequestGroup *requestGroup, - DownloadEngine *e, - const std::shared_ptr<SocketCore> &s = nullptr, - const std::shared_ptr<SocketRecvBuffer> &socketRecvBuffer = - nullptr, + AbstractCommand(cuid_t cuid, const std::shared_ptr<Request>& req, + const std::shared_ptr<FileEntry>& fileEntry, + RequestGroup* requestGroup, DownloadEngine* e, + const std::shared_ptr<SocketCore>& s = nullptr, + const std::shared_ptr<SocketRecvBuffer>& socketRecvBuffer = nullptr, bool incNumConnection = true); virtual ~AbstractCommand(); - virtual bool execute() CXX11_OVERRIDE; }; // Returns proxy URI for given protocol. If no proxy URI is defined, // then returns an empty string. -std::string getProxyUri(const std::string &protocol, const Option *option); +std::string getProxyUri +(const std::string& protocol, const Option* option); } // namespace aria2 diff --git a/src/ConnectCommand.cc b/src/ConnectCommand.cc index 063fa457..4bb6a33a 100644 --- a/src/ConnectCommand.cc +++ b/src/ConnectCommand.cc @@ -115,7 +115,7 @@ bool ConnectCommand::executeInternal() return true; } -bool ConnectCommand::noCheck() const +bool ConnectCommand::noCheck() { return backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty(); } diff --git a/src/ConnectCommand.h b/src/ConnectCommand.h index 29a4cca1..82d08361 100644 --- a/src/ConnectCommand.h +++ b/src/ConnectCommand.h @@ -58,7 +58,7 @@ public: const std::shared_ptr<Request>& getProxyRequest() const; protected: virtual bool executeInternal() CXX11_OVERRIDE; - virtual bool noCheck() const CXX11_OVERRIDE; + virtual bool noCheck() CXX11_OVERRIDE; private: std::shared_ptr<Request> proxyRequest_; std::shared_ptr<BackupConnectInfo> backupConnectionInfo_; diff --git a/src/RequestGroup.h b/src/RequestGroup.h index 81581d88..25c163f0 100644 --- a/src/RequestGroup.h +++ b/src/RequestGroup.h @@ -241,11 +241,6 @@ public: int64_t getCompletedLength() const; - inline int64_t getPendingLength() const - { - return getTotalLength() - getCompletedLength(); - } - /** * Compares expected filename with specified actualFilename. * The expected filename refers to FileEntry::getBasename() of the first