diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-05-08 11:18:36 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-05-08 11:18:36 +0000 |
| commit | d52bce74d3a40d75dcfa3496e67abbed9f1fcba8 (patch) | |
| tree | 09c82779bd07f661340800db790e68fe612ca56c /src/DownloadEngine.cc | |
| parent | d8f911b5815f2f6857b1c0035182391e5d6ecaf5 (diff) | |
2008-05-08 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Rewritten name resolver. Now async DNS can be disabled by
--async-dns
option.
The asynchronous DNS is not capable of IPv6 yet.
By disabling asynchronous DNS, aria2 is IPv6 enabled
application, at
least for HTTP download.
* src/AbstractCommand.cc
* src/AbstractCommand.h
* src/AsyncNameResolver.cc
* src/AsyncNameResolver.h
* src/DHTEntryPointNameResolveCommand.cc
* src/DHTEntryPointNameResolveCommand.h
* src/DownloadEngine.cc
* src/DownloadEngine.h
* src/FtpInitiateConnectionCommand.cc
* src/FtpInitiateConnectionCommand.h
* src/HelpItemFactory.cc
* src/HttpInitiateConnectionCommand.cc
* src/HttpInitiateConnectionCommand.h
* src/InitiateConnectionCommand.cc
* src/InitiateConnectionCommand.h
* src/Makefile.am
* src/Makefile.in
* src/NameResolver.cc
* src/NameResolver.h
* src/OptionHandlerFactory.cc
* src/SocketCore.cc
* src/SocketCore.h
* src/Util.cc
* src/Util.h
* src/option_processing.cc
* src/prefs.h
* src/usage_text.h
Diffstat (limited to 'src/DownloadEngine.cc')
| -rw-r--r-- | src/DownloadEngine.cc | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/src/DownloadEngine.cc b/src/DownloadEngine.cc index 4fbdbc2f..c36fe7ef 100644 --- a/src/DownloadEngine.cc +++ b/src/DownloadEngine.cc @@ -33,7 +33,9 @@ */ /* copyright --> */ #include "DownloadEngine.h" -#include "NameResolver.h" +#ifdef ENABLE_ASYNC_DNS +#include "AsyncNameResolver.h" +#endif // ENABLE_ASYNC_DNS #include "StatCalc.h" #include "RequestGroup.h" #include "RequestGroupMan.h" @@ -73,11 +75,12 @@ bool SocketEntry::operator==(const SocketEntry& entry) } #ifdef ENABLE_ASYNC_DNS -NameResolverEntry::NameResolverEntry(const NameResolverHandle& nameResolver, - Command* command): +AsyncNameResolverEntry::AsyncNameResolverEntry +(const SharedHandle<AsyncNameResolver>& nameResolver, + Command* command): nameResolver(nameResolver), command(command) {} -bool NameResolverEntry::operator==(const NameResolverEntry& entry) +bool AsyncNameResolverEntry::operator==(const AsyncNameResolverEntry& entry) { return nameResolver == entry.nameResolver && command == entry.command; @@ -164,9 +167,9 @@ void DownloadEngine::waitData() { memcpy(&wfds, &wfdset, sizeof(fd_set)); #ifdef ENABLE_ASYNC_DNS - for(NameResolverEntries::iterator itr = nameResolverEntries.begin(); + for(AsyncNameResolverEntries::iterator itr = nameResolverEntries.begin(); itr != nameResolverEntries.end(); ++itr) { - NameResolverEntry& entry = *itr; + AsyncNameResolverEntry& entry = *itr; int fd = entry.nameResolver->getFds(&rfds, &wfds); // TODO force error if fd == 0 if(fdmax < fd) { @@ -189,13 +192,13 @@ void DownloadEngine::waitData() { } } #ifdef ENABLE_ASYNC_DNS - for(NameResolverEntries::iterator itr = nameResolverEntries.begin(); + for(AsyncNameResolverEntries::iterator itr = nameResolverEntries.begin(); itr != nameResolverEntries.end(); ++itr) { - NameResolverEntry& entry = *itr; + AsyncNameResolverEntry& entry = *itr; entry.nameResolver->process(&rfds, &wfds); switch(entry.nameResolver->getStatus()) { - case NameResolver::STATUS_SUCCESS: - case NameResolver::STATUS_ERROR: + case AsyncNameResolver::STATUS_SUCCESS: + case AsyncNameResolver::STATUS_ERROR: entry.command->setStatusActive(); break; default: @@ -323,12 +326,13 @@ void DownloadEngine::addCommand(const Commands& commands) } #ifdef ENABLE_ASYNC_DNS -bool DownloadEngine::addNameResolverCheck(const NameResolverHandle& resolver, - Command* command) { - NameResolverEntry entry(resolver, command); - NameResolverEntries::iterator itr = std::find(nameResolverEntries.begin(), - nameResolverEntries.end(), - entry); +bool DownloadEngine::addNameResolverCheck +(const SharedHandle<AsyncNameResolver>& resolver, + Command* command) +{ + AsyncNameResolverEntry entry(resolver, command); + AsyncNameResolverEntries::iterator itr = + std::find(nameResolverEntries.begin(), nameResolverEntries.end(), entry); if(itr == nameResolverEntries.end()) { nameResolverEntries.push_back(entry); return true; @@ -337,12 +341,13 @@ bool DownloadEngine::addNameResolverCheck(const NameResolverHandle& resolver, } } -bool DownloadEngine::deleteNameResolverCheck(const NameResolverHandle& resolver, - Command* command) { - NameResolverEntry entry(resolver, command); - NameResolverEntries::iterator itr = std::find(nameResolverEntries.begin(), - nameResolverEntries.end(), - entry); +bool DownloadEngine::deleteNameResolverCheck +(const SharedHandle<AsyncNameResolver>& resolver, + Command* command) +{ + AsyncNameResolverEntry entry(resolver, command); + AsyncNameResolverEntries::iterator itr = + std::find(nameResolverEntries.begin(), nameResolverEntries.end(), entry); if(itr == nameResolverEntries.end()) { return false; } else { @@ -388,4 +393,18 @@ DownloadEngine::popPooledSocket(const std::string& ipaddr, uint16_t port) } } +SharedHandle<SocketCore> +DownloadEngine::popPooledSocket +(const std::deque<std::string>& ipaddrs, uint16_t port) +{ + for(std::deque<std::string>::const_iterator i = ipaddrs.begin(); + i != ipaddrs.end(); ++i) { + SharedHandle<SocketCore> s = popPooledSocket(*i, port); + if(!s.isNull()) { + return s; + } + } + return SharedHandle<SocketCore>(); +} + } // namespace aria2 |
