diff options
Diffstat (limited to 'Swift/Controllers/Chat/MUCController.cpp')
-rw-r--r-- | Swift/Controllers/Chat/MUCController.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/Swift/Controllers/Chat/MUCController.cpp b/Swift/Controllers/Chat/MUCController.cpp index 7e9a9ea..a8a6747 100644 --- a/Swift/Controllers/Chat/MUCController.cpp +++ b/Swift/Controllers/Chat/MUCController.cpp @@ -8,6 +8,8 @@ #include <boost/bind.hpp> +#include "Swiften/Network/Timer.h" +#include "Swiften/Network/TimerFactory.h" #include "Swiften/Base/foreach.h" #include "Swift/Controllers/UIInterfaces/ChatWindow.h" #include "Swift/Controllers/UIInterfaces/ChatWindowFactory.h" @@ -20,6 +22,8 @@ #include "Swiften/Roster/SetAvatar.h" #include "Swiften/Roster/SetPresence.h" +#define MUC_JOIN_WARNING_TIMEOUT_MILLISECONDS 60000 + namespace Swift { /** @@ -36,20 +40,29 @@ MUCController::MUCController ( PresenceOracle* presenceOracle, AvatarManager* avatarManager, UIEventStream* uiEventStream, - bool useDelayForLatency) : + bool useDelayForLatency, + TimerFactory* timerFactory) : ChatControllerBase(self, stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle, avatarManager, useDelayForLatency, uiEventStream), muc_(new MUC(stanzaChannel, presenceSender, muc)), - nick_(nick) { + nick_(nick) { + loginCheckTimer_ = boost::shared_ptr<Timer>(timerFactory->createTimer(MUC_JOIN_WARNING_TIMEOUT_MILLISECONDS)); parting_ = false; events_ = uiEventStream; + roster_ = new Roster(); chatWindow_->setRosterModel(roster_); chatWindow_->onClosed.connect(boost::bind(&MUCController::handleWindowClosed, this)); - muc_->joinAs(nick); + muc_->onJoinComplete.connect(boost::bind(&MUCController::handleJoinComplete, this, _1)); muc_->onOccupantJoined.connect(boost::bind(&MUCController::handleOccupantJoined, this, _1)); muc_->onOccupantPresenceChange.connect(boost::bind(&MUCController::handleOccupantPresenceChange, this, _1)); muc_->onOccupantLeft.connect(boost::bind(&MUCController::handleOccupantLeft, this, _1, _2, _3)); + loginCheckTimer_->onTick.connect(boost::bind(&MUCController::handleJoinTimeoutTick, this)); + loginCheckTimer_->start(); + + muc_->joinAs(nick); chatWindow_->convertToMUC(); + chatWindow_->addSystemMessage("Trying to join room " + toJID_.toString()); + joined_ = false; if (avatarManager_ != NULL) { avatarChangedConnection_ = (avatarManager_->onAvatarChanged.connect(boost::bind(&MUCController::handleAvatarChanged, this, _1, _2))); } @@ -59,6 +72,22 @@ MUCController::~MUCController() { delete muc_; chatWindow_->setRosterModel(NULL); delete roster_; + loginCheckTimer_->stop(); +} + +void MUCController::handleJoinTimeoutTick() { + loginCheckTimer_->stop(); + chatWindow_->addSystemMessage("Room " + toJID_.toString() + " is not responding. This operation may never complete"); +} + +void MUCController::handleJoinComplete(MUC::JoinResult result) { + loginCheckTimer_->stop(); + if (result == MUC::JoinFailed) { + chatWindow_->addErrorMessage("Unable to join this room"); + } + joined_ = true; + String joinMessage = "You have joined room " + toJID_.toString() + " as " + nick_; + chatWindow_->addSystemMessage(joinMessage); } void MUCController::handleAvatarChanged(const JID& jid, const String&) { |