summaryrefslogtreecommitdiff
path: root/src/DownloadEngine.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-05-08 11:18:36 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-05-08 11:18:36 +0000
commitd52bce74d3a40d75dcfa3496e67abbed9f1fcba8 (patch)
tree09c82779bd07f661340800db790e68fe612ca56c /src/DownloadEngine.cc
parentd8f911b5815f2f6857b1c0035182391e5d6ecaf5 (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.cc63
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