From 57f1902ee1fd24e2fa94a5e5c0ee357335366d7d Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Thu, 4 Jul 2013 00:39:11 +0900 Subject: Use std::unique_ptr for StreamFilter instead of std::shared_ptr --- src/HttpResponseCommand.cc | 58 +++++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 31 deletions(-) (limited to 'src/HttpResponseCommand.cc') diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc index 04824a8f..b6027f24 100644 --- a/src/HttpResponseCommand.cc +++ b/src/HttpResponseCommand.cc @@ -84,51 +84,44 @@ namespace aria2 { namespace { -std::shared_ptr getTransferEncodingStreamFilter +std::unique_ptr getTransferEncodingStreamFilter (HttpResponse* httpResponse, - const std::shared_ptr& delegate = std::shared_ptr()) + std::unique_ptr delegate = std::unique_ptr{}) { - std::shared_ptr filter; if(httpResponse->isTransferEncodingSpecified()) { - filter = httpResponse->getTransferEncodingStreamFilter(); + auto filter = httpResponse->getTransferEncodingStreamFilter(); if(!filter) { throw DL_ABORT_EX (fmt(EX_TRANSFER_ENCODING_NOT_SUPPORTED, httpResponse->getTransferEncoding().c_str())); } filter->init(); - filter->installDelegate(delegate); + filter->installDelegate(std::move(delegate)); + return filter; } - if(!filter) { - filter = delegate; - } - return filter; + return delegate; } } // namespace namespace { -std::shared_ptr getContentEncodingStreamFilter +std::unique_ptr getContentEncodingStreamFilter (HttpResponse* httpResponse, - const std::shared_ptr& delegate = std::shared_ptr()) + std::unique_ptr delegate = std::unique_ptr{}) { - std::shared_ptr filter; if(httpResponse->isContentEncodingSpecified()) { - filter = httpResponse->getContentEncodingStreamFilter(); + auto filter = httpResponse->getContentEncodingStreamFilter(); if(!filter) { A2_LOG_INFO (fmt("Content-Encoding %s is specified, but the current implementation" "doesn't support it. The decoding process is skipped and the" "downloaded content will be still encoded.", httpResponse->getContentEncoding().c_str())); - } else { - filter->init(); - filter->installDelegate(delegate); } + filter->init(); + filter->installDelegate(std::move(delegate)); + return filter; } - if(!filter) { - filter = delegate; - } - return filter; + return delegate; } } // namespace @@ -311,11 +304,13 @@ bool HttpResponseCommand::executeInternal() (httpResponse.get(), getContentEncodingStreamFilter(httpResponse.get())); getDownloadEngine()->addCommand - (createHttpDownloadCommand(std::move(httpResponse), teFilter)); + (createHttpDownloadCommand(std::move(httpResponse), + std::move(teFilter))); } else { auto teFilter = getTransferEncodingStreamFilter(httpResponse.get()); getDownloadEngine()->addCommand - (createHttpDownloadCommand(std::move(httpResponse), teFilter)); + (createHttpDownloadCommand(std::move(httpResponse), + std::move(teFilter))); } return true; } @@ -375,7 +370,8 @@ bool HttpResponseCommand::handleDefaultEncoding !getRequest()->isPipeliningEnabled()) { auto teFilter = getTransferEncodingStreamFilter(httpResponse.get()); checkEntry->pushNextCommand - (createHttpDownloadCommand(std::move(httpResponse), teFilter)); + (createHttpDownloadCommand(std::move(httpResponse), + std::move(teFilter))); } else { getSegmentMan()->cancelSegment(getCuid()); getFileEntry()->poolRequest(getRequest()); @@ -477,7 +473,8 @@ bool HttpResponseCommand::handleOtherEncoding getSegmentMan()->getSegmentWithIndex(getCuid(), 0); getDownloadEngine()->addCommand - (createHttpDownloadCommand(std::move(httpResponse), streamFilter)); + (createHttpDownloadCommand(std::move(httpResponse), + std::move(streamFilter))); return true; } @@ -492,7 +489,7 @@ bool HttpResponseCommand::skipResponseBody (getCuid(), getRequest(), getFileEntry(), getRequestGroup(), httpConnection_, std::move(httpResponse), getDownloadEngine(), getSocket()); - command->installStreamFilter(filter); + command->installStreamFilter(std::move(filter)); // If request method is HEAD or the response body is zero-length, // set command's status to real time so that avoid read check blocking @@ -510,11 +507,10 @@ bool HttpResponseCommand::skipResponseBody } namespace { -bool decideFileAllocation -(const std::shared_ptr& filter) +bool decideFileAllocation(StreamFilter* filter) { #ifdef HAVE_ZLIB - for(std::shared_ptr f = filter; f; f = f->getDelegate()){ + for(StreamFilter* f = filter; f; f = f->getDelegate().get()){ // Since the compressed file's length are returned in the response header // and the decompressed file size is unknown at this point, disable file // allocation here. @@ -530,7 +526,7 @@ bool decideFileAllocation std::unique_ptr HttpResponseCommand::createHttpDownloadCommand (std::unique_ptr httpResponse, - const std::shared_ptr& filter) + std::unique_ptr filter) { auto command = make_unique @@ -541,11 +537,11 @@ HttpResponseCommand::createHttpDownloadCommand command->setStartupIdleTime(getOption()->getAsInt(PREF_STARTUP_IDLE_TIME)); command->setLowestDownloadSpeedLimit (getOption()->getAsInt(PREF_LOWEST_SPEED_LIMIT)); - command->installStreamFilter(filter); if(getRequestGroup()->isFileAllocationEnabled() && - !decideFileAllocation(filter)) { + !decideFileAllocation(filter.get())) { getRequestGroup()->setFileAllocationEnabled(false); } + command->installStreamFilter(std::move(filter)); getRequestGroup()->getURISelector()->tuneDownloadCommand (getFileEntry()->getRemainingUris(), command.get()); -- cgit