summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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);
+ }
+}
+
+};