diff options
Diffstat (limited to 'Swift/Controllers/MainController.cpp')
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index f05d42d..f54e0a2 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -7,13 +7,12 @@ #include "Swiften/Application/Application.h" #include "Swiften/Application/ApplicationMessageDisplay.h" #include "Swift/Controllers/ChatController.h" #include "Swift/Controllers/ChatWindowFactory.h" #include "Swift/Controllers/EventController.h" -#include "Swift/Controllers/IdleDetector.h" #include "Swift/Controllers/LoginWindow.h" #include "Swift/Controllers/LoginWindowFactory.h" #include "Swift/Controllers/MainWindow.h" #include "Swift/Controllers/MainWindowFactory.h" #include "Swift/Controllers/MUCController.h" #include "Swift/Controllers/NickResolver.h" @@ -57,16 +56,14 @@ static const String CLIENT_NAME = "Swift"; static const String CLIENT_VERSION = "0.3"; static const String CLIENT_NODE = "http://swift.im"; typedef std::pair<JID, ChatController*> JIDChatControllerPair; typedef std::pair<JID, MUCController*> JIDMUCControllerPair; -MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer, IdleDetector* idleDetector) - : client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), - xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL) { - idleDetector_ = idleDetector; +MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer) + : timerFactory_(&boostIOServiceThread_.getIOService()), idleDetector_(&idleQuerier_, &timerFactory_, 100), client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL) { application_ = application; presenceOracle_ = NULL; avatarManager_ = NULL; avatarStorage_ = new AvatarFileStorage(application_->getAvatarDir()); @@ -79,12 +76,15 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(profile, settings); loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate")); delete profileSettings; } loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4)); loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this)); + + idleDetector_.setIdleTimeSeconds(600); + idleDetector_.onIdleChanged.connect(boost::bind(&MainController::handleInputIdleChanged, this, _1)); } MainController::~MainController() { foreach (JIDChatControllerPair controllerPair, chatControllers_) { delete controllerPair.second; } @@ -162,15 +162,12 @@ void MainController::handleConnected() { discoInfoRequest->send(); boost::shared_ptr<GetVCardRequest> vCardRequest(new GetVCardRequest(JID(), client_)); vCardRequest->onResponse.connect(boost::bind(&MainController::handleOwnVCardReceived, this, _1, _2)); vCardRequest->send(); - idleDetector_->onInputIdle.connect(boost::bind(&MainController::handleInputIdle, this)); - idleDetector_->onInputNotIdle.connect(boost::bind(&MainController::handleInputNotIdle, this)); - //Send presence last to catch all the incoming presences. boost::shared_ptr<Presence> initialPresence; if (queuedPresence_.get() != NULL) { initialPresence = queuedPresence_; } else { initialPresence = boost::shared_ptr<Presence>(new Presence()); @@ -216,25 +213,29 @@ void MainController::sendPresence(boost::shared_ptr<Presence> presence) { client_->sendPresence(presence); if (presence->getType() == Presence::Unavailable) { logout(); } } -void MainController::handleInputIdle() { - preIdlePresence_ = lastSentPresence_; - boost::shared_ptr<Presence> presence(new Presence()); - presence->setShow(StatusShow::Away); - presence->setStatus("Auto-away"); - sendPresence(presence); -} - -void MainController::handleInputNotIdle() { - if (client_) { - sendPresence(preIdlePresence_); - } else { - queuedPresence_ = preIdlePresence_; +void MainController::handleInputIdleChanged(bool idle) { + if (!client_ || !client_->isAvailable()) { + return; + } + if (idle) { + preIdlePresence_ = lastSentPresence_; + boost::shared_ptr<Presence> presence(new Presence()); + presence->setShow(StatusShow::Away); + presence->setStatus("Auto-away"); + sendPresence(presence); + } + else { + if (client_) { + sendPresence(preIdlePresence_); + } else { + queuedPresence_ = preIdlePresence_; + } } } void MainController::handleIncomingPresence(boost::shared_ptr<Presence> presence) { //FIXME: subscribe, subscribed rosterController_->handleIncomingPresence(presence); @@ -301,14 +302,12 @@ void MainController::handleError(const ClientError& error) { void MainController::handleCancelLoginRequest() { signOut(); } void MainController::signOut() { logout(); - idleDetector_->onInputIdle.connect(boost::bind(&MainController::handleInputIdle, this)); - idleDetector_->onInputNotIdle.connect(boost::bind(&MainController::handleInputNotIdle, this)); loginWindow_->loggedOut(); foreach (JIDChatControllerPair controllerPair, chatControllers_) { delete controllerPair.second; } chatControllers_.clear(); foreach (JIDMUCControllerPair controllerPair, mucControllers_) { |
Swift