diff options
author | Kevin Smith <git@kismith.co.uk> | 2010-06-11 17:47:25 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2010-06-11 18:16:23 (GMT) |
commit | 094280d3a9cc10252f50f1787c14d08363db9f11 (patch) | |
tree | 6ed36debda59a67d1f8053333864af927789f8bb | |
parent | d020f1078d7fe4d0f85c967a45b22ae38c2adc66 (diff) | |
download | swift-contrib-094280d3a9cc10252f50f1787c14d08363db9f11.zip swift-contrib-094280d3a9cc10252f50f1787c14d08363db9f11.tar.bz2 |
Back off reconnects after an error.
Resolves: #342
-rw-r--r-- | Swift/Controllers/MainController.cpp | 37 | ||||
-rw-r--r-- | Swift/Controllers/MainController.h | 3 |
2 files changed, 33 insertions, 7 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 573bff9..3e3affd 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -10,11 +10,14 @@ #include <boost/lexical_cast.hpp> #include <boost/shared_ptr.hpp> #include <stdlib.h> +#include <sstream> #include "Swiften/Application/Application.h" #include "Swiften/Application/ApplicationMessageDisplay.h" #include "Swiften/Network/TimerFactory.h" #include "Swiften/Network/BoostTimerFactory.h" +#include "Swiften/Network/BoostIOServiceThread.h" +#include "Swiften/Network/MainBoostIOServiceThread.h" #include "Swift/Controllers/BuildVersion.h" #include "Swift/Controllers/Chat/ChatController.h" #include "Swift/Controllers/Chat/MUCSearchController.h" @@ -78,7 +81,9 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF presenceSender_ = NULL; client_ = NULL; mucSearchController_ = NULL; + reconnectTimer_ = NULL; + timeBeforeNextReconnect_ = -1; mucSearchWindowFactory_ = mucSearchWindowFactory; eventWindowFactory_ = eventWindowFactory; chatListWindowFactory_ = chatListWindowFactory; @@ -164,6 +169,9 @@ void MainController::resetClient() { } void MainController::handleConnected() { + timeBeforeNextReconnect_ = -1; + delete reconnectTimer_; + reconnectTimer_ = NULL; loginWindow_->setIsLoggingIn(false); if (lastDisconnectError_) { lastDisconnectError_->conclude(); @@ -366,17 +374,30 @@ void MainController::handleError(const ClientError& error) { signOut(); loginWindow_->setMessage(message); } else { - if (!lastDisconnectError_) { + logout(); + setReconnectTimer(); + if (lastDisconnectError_) { + std::stringstream ss; + ss << "Reconnect to " << jid_.getDomain() << " failed: " << message << ". Will retry in " << timeBeforeNextReconnect_ << " seconds."; + message = ss.str(); + } else { message = "Disconnected from " + jid_.getDomain() + ": " + message; - lastDisconnectError_ = boost::shared_ptr<ErrorEvent>(new ErrorEvent(JID(jid_.getDomain()), message)); - //std::cout << message << std::endl; - eventController_->handleIncomingEvent(lastDisconnectError_); } + lastDisconnectError_ = boost::shared_ptr<ErrorEvent>(new ErrorEvent(JID(jid_.getDomain()), message)); + eventController_->handleIncomingEvent(lastDisconnectError_); } - logout(); - if (rosterController_) { - reconnectAfterError(); + +} + +void MainController::setReconnectTimer() { + if (timeBeforeNextReconnect_ < 0) { + timeBeforeNextReconnect_ = 1; + } else { + timeBeforeNextReconnect_ = timeBeforeNextReconnect_ >= 150 ? 300 : timeBeforeNextReconnect_ * 2; } + reconnectTimer_ = new BoostTimer(timeBeforeNextReconnect_ * 1000, &MainBoostIOServiceThread::getInstance().getIOService()); + reconnectTimer_->onTick.connect(boost::bind(&MainController::reconnectAfterError, this)); + reconnectTimer_->start(); } void MainController::handleCancelLoginRequest() { @@ -392,6 +413,8 @@ void MainController::signOut() { } void MainController::logout() { + delete reconnectTimer_; + reconnectTimer_ = 0; if (client_ /*&& client_->isAvailable()*/) { client_->disconnect(); } diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index ba96d3a..ad2cac8 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -81,6 +81,7 @@ namespace Swift { void handleInputIdleChanged(bool); void logout(); void signOut(); + void setReconnectTimer(); void performLoginFromCachedCredentials(); void reconnectAfterError(); @@ -130,5 +131,7 @@ namespace Swift { bool useDelayForLatency_; MUCSearchController* mucSearchController_; MUCSearchWindowFactory* mucSearchWindowFactory_; + int timeBeforeNextReconnect_; + BoostTimer* reconnectTimer_; }; } |