summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/Controllers/Chat/MUCController.cpp')
-rw-r--r--Swift/Controllers/Chat/MUCController.cpp35
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&) {