summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-11-12 18:12:47 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-11-12 18:12:47 (GMT)
commitfdd8755e2363e8d706a3d0bdc2e71f234abdf829 (patch)
tree470401f6f80873c4e1ce5af5cd30ab6837854d04 /Swiften/Network/Connector.cpp
parent6a20be61e229255f93d55f13be3346525698237a (diff)
downloadswift-fdd8755e2363e8d706a3d0bdc2e71f234abdf829.zip
swift-fdd8755e2363e8d706a3d0bdc2e71f234abdf829.tar.bz2
Refactored DNS handling.
Connections now fallback on other DNS entries upon failure, taking into account SRV priorities.
Diffstat (limited to 'Swiften/Network/Connector.cpp')
-rw-r--r--Swiften/Network/Connector.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/Swiften/Network/Connector.cpp b/Swiften/Network/Connector.cpp
new file mode 100644
index 0000000..5b4fe22
--- /dev/null
+++ b/Swiften/Network/Connector.cpp
@@ -0,0 +1,48 @@
+#include "Swiften/Network/Connector.h"
+
+#include <boost/bind.hpp>
+
+#include "Swiften/Network/ConnectionFactory.h"
+#include "Swiften/Network/DomainNameResolver.h"
+#include "Swiften/Network/DomainNameResolveException.h"
+
+namespace Swift {
+
+Connector::Connector(const String& hostname, DomainNameResolver* resolver, ConnectionFactory* connectionFactory) : hostname(hostname), resolver(resolver), connectionFactory(connectionFactory) {
+}
+
+void Connector::start() {
+ assert(!currentConnection);
+ try {
+ std::vector<HostAddressPort> resolveResult = resolver->resolve(hostname.getUTF8String());
+ resolvedHosts = std::deque<HostAddressPort>(resolveResult.begin(), resolveResult.end());
+ tryNextHostname();
+ }
+ catch (const DomainNameResolveException&) {
+ onConnectFinished(boost::shared_ptr<Connection>());
+ }
+}
+
+void Connector::tryNextHostname() {
+ if (resolvedHosts.empty()) {
+ onConnectFinished(boost::shared_ptr<Connection>());
+ }
+ else {
+ HostAddressPort remote = resolvedHosts.front();
+ resolvedHosts.pop_front();
+ currentConnection = connectionFactory->createConnection();
+ currentConnection->onConnectFinished.connect(boost::bind(&Connector::handleConnectionConnectFinished, this, _1));
+ currentConnection->connect(remote);
+ }
+}
+
+void Connector::handleConnectionConnectFinished(bool error) {
+ if (error) {
+ tryNextHostname();
+ }
+ else {
+ onConnectFinished(currentConnection);
+ }
+}
+
+};