diff options
-rw-r--r-- | Swift/Controllers/ChatControllerBase.cpp | 7 | ||||
-rw-r--r-- | Swift/Controllers/ChatControllerBase.h | 2 | ||||
-rw-r--r-- | Swift/Controllers/MainController.cpp | 109 | ||||
-rw-r--r-- | Swift/Controllers/MainController.h | 9 | ||||
-rw-r--r-- | Swift/Controllers/RosterController.cpp | 33 | ||||
-rw-r--r-- | Swift/Controllers/RosterController.h | 4 |
6 files changed, 128 insertions, 36 deletions
diff --git a/Swift/Controllers/ChatControllerBase.cpp b/Swift/Controllers/ChatControllerBase.cpp index 92b77b5..519b019 100644 --- a/Swift/Controllers/ChatControllerBase.cpp +++ b/Swift/Controllers/ChatControllerBase.cpp @@ -21,7 +21,12 @@ ChatControllerBase::ChatControllerBase(const JID& self, StanzaChannel* stanzaCha ChatControllerBase::~ChatControllerBase() { delete chatWindow_; } - + +void ChatControllerBase::setEnabled(bool enabled) { + //FIXME: implement + h +} + void ChatControllerBase::setAvailableServerFeatures(boost::shared_ptr<DiscoInfo> info) { if (info->hasFeature(DiscoInfo::SecurityLabels)) { chatWindow_->setSecurityLabelsEnabled(true); diff --git a/Swift/Controllers/ChatControllerBase.h b/Swift/Controllers/ChatControllerBase.h index 3eadcc5..a977f8c 100644 --- a/Swift/Controllers/ChatControllerBase.h +++ b/Swift/Controllers/ChatControllerBase.h @@ -29,7 +29,7 @@ namespace Swift { void activateChatWindow(); void setAvailableServerFeatures(boost::shared_ptr<DiscoInfo> info); void handleIncomingMessage(boost::shared_ptr<MessageEvent> message); - + void setEnabled(bool enabled); protected: ChatControllerBase(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle, AvatarManager* avatarManager); diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 1de4011..cf85c18 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -28,7 +28,6 @@ #include "Swiften/Client/Client.h" #include "Swiften/Elements/Presence.h" #include "Swiften/Elements/VCardUpdate.h" -#include "Swiften/Roster/XMPPRoster.h" #include "Swiften/Queries/Responders/SoftwareVersionResponder.h" #include "Swiften/Roster/TreeWidgetFactory.h" #include "Swiften/Settings/SettingsProvider.h" @@ -63,8 +62,10 @@ typedef std::pair<JID, MUCController*> JIDMUCControllerPair; MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray, SoundPlayer* soundPlayer) : client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL), - serverDiscoInfo_(new DiscoInfo()), presenceOracle_(NULL), avatarManager_(NULL) { + serverDiscoInfo_(new DiscoInfo()), xmppRoster_(new XMPPRoster()) { application_ = application; + presenceOracle_ = NULL; + avatarManager_ = NULL; avatarStorage_ = new AvatarFileStorage(application_->getAvatarDir()); @@ -102,8 +103,12 @@ void MainController::resetClient() { nickResolver_ = NULL; delete avatarManager_; avatarManager_ = NULL; - delete rosterController_; - rosterController_ = NULL; + //delete rosterController_; + //rosterController_ = NULL; + if (rosterController_) { + rosterController_->setAvatarManager(NULL); + rosterController_->setNickResolver(NULL); + } delete xmppRosterController_; xmppRosterController_ = NULL; delete clientVersionResponder_; @@ -115,28 +120,36 @@ void MainController::resetClient() { } void MainController::handleConnected() { + //FIXME: this freshLogin thing is temporary so I can see what's what before I split into a seperate method. + bool freshLogin = rosterController_ == NULL; + presenceOracle_ = new PresenceOracle(client_); - - lastSentPresence_ = boost::shared_ptr<Presence>(); + if (freshLogin) { + lastSentPresence_ = boost::shared_ptr<Presence>(); + } client_->onPresenceReceived.connect(boost::bind(&MainController::handleIncomingPresence, this, _1)); - boost::shared_ptr<XMPPRoster> xmppRoster(new XMPPRoster()); - - nickResolver_ = new NickResolver(xmppRoster); + nickResolver_ = new NickResolver(xmppRoster_); avatarManager_ = new AvatarManager(client_, client_, avatarStorage_, this); - - rosterController_ = new RosterController(jid_, xmppRoster, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_); - rosterController_->onStartChatRequest.connect(boost::bind(&MainController::handleChatRequest, this, _1)); - rosterController_->onJoinMUCRequest.connect(boost::bind(&MainController::handleJoinMUCRequest, this, _1, _2)); - rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2)); + if (freshLogin) { + rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_); + rosterController_->onStartChatRequest.connect(boost::bind(&MainController::handleChatRequest, this, _1)); + rosterController_->onJoinMUCRequest.connect(boost::bind(&MainController::handleJoinMUCRequest, this, _1, _2)); + rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2)); + } else { + rosterController_->setAvatarManager(avatarManager_); + rosterController_->setNickResolver(nickResolver_); + } - xmppRosterController_ = new XMPPRosterController(client_, xmppRoster); + xmppRosterController_ = new XMPPRosterController(client_, xmppRoster_); xmppRosterController_->requestRoster(); clientVersionResponder_ = new SoftwareVersionResponder(CLIENT_NAME, CLIENT_VERSION, client_); - loginWindow_->morphInto(rosterController_->getWindow()); + if (freshLogin) { + loginWindow_->morphInto(rosterController_->getWindow()); + } DiscoInfo discoInfo; discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc")); @@ -156,9 +169,15 @@ void MainController::handleConnected() { vCardRequest->send(); //Send presence last to catch all the incoming presences. - boost::shared_ptr<Presence> initialPresence(new Presence()); + boost::shared_ptr<Presence> initialPresence; + if (queuedPresence_.get() != NULL) { + initialPresence = queuedPresence_; + } else { + initialPresence = boost::shared_ptr<Presence>(new Presence()); + } initialPresence->addPayload(capsInfo_); sendPresence(initialPresence); + enableManagers(); } void MainController::handleEventQueueLengthChange(int count) { @@ -176,7 +195,12 @@ void MainController::handleChangeStatusRequest(StatusShow::Type show, const Stri presence->setShow(show); } presence->setStatus(statusText); - sendPresence(presence); + if (presence->getType() != Presence::Unavailable && !client_) { + performLoginFromCachedCredentials(); + queuedPresence_ = presence; + } else { + sendPresence(presence); + } } void MainController::sendPresence(boost::shared_ptr<Presence> presence) { @@ -191,6 +215,7 @@ void MainController::sendPresence(boost::shared_ptr<Presence> presence) { } void MainController::handleIncomingPresence(boost::shared_ptr<Presence> presence) { + //FIXME: subscribe, subscribed rosterController_->handleIncomingPresence(presence); } @@ -202,15 +227,20 @@ void MainController::handleLoginRequest(const String &username, const String &pa profileSettings->storeString("pass", remember ? password : ""); loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate")); delete profileSettings; + jid_ = JID(username); + password_ = password; + certificateFile_ = certificateFile; + performLoginFromCachedCredentials(); +} +void MainController::performLoginFromCachedCredentials() { resetClient(); - jid_ = JID(username); - client_ = new Swift::Client(jid_, password); + client_ = new Swift::Client(jid_, password_); //client_->onDataRead.connect(&printIncomingData); //client_->onDataWritten.connect(&printOutgoingData); - if (!certificateFile.isEmpty()) { - client_->setCertificate(certificateFile); + if (!certificateFile_.isEmpty()) { + client_->setCertificate(certificateFile_); } client_->onError.connect(boost::bind(&MainController::handleError, this, _1)); client_->onConnected.connect(boost::bind(&MainController::handleConnected, this)); @@ -240,22 +270,45 @@ void MainController::handleError(const ClientError& error) { logout(); } -void MainController::logout() { +void MainController::signout() { loginWindow_->loggedOut(); + foreach (JIDChatControllerPair controllerPair, chatControllers_) { + delete controllerPair.second; + } + chatControllers_.clear(); + foreach (JIDMUCControllerPair controllerPair, mucControllers_) { + delete controllerPair.second; + } + mucControllers_.clear(); +} +void MainController::logout() { delete discoResponder_; discoResponder_ = NULL; delete clientVersionResponder_; clientVersionResponder_ = NULL; + disableManagers(); + resetClient(); +} + +void MainController::disableManagers() { foreach (JIDChatControllerPair controllerPair, chatControllers_) { - delete controllerPair.second; + controllerPair.second->setEnabled(false); } - client_->disconnect(); - chatControllers_.clear(); foreach (JIDMUCControllerPair controllerPair, mucControllers_) { - delete controllerPair.second; + controllerPair.second->setEnabled(false); } - mucControllers_.clear(); + rosterController_->setEnabled(false); +} + +void MainController::enableManagers() { + foreach (JIDChatControllerPair controllerPair, chatControllers_) { + controllerPair.second->setEnabled(true); + } + foreach (JIDMUCControllerPair controllerPair, mucControllers_) { + controllerPair.second->setEnabled(true); + } + rosterController_->setEnabled(true); } diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index a36351e..3fbe9b4 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -16,6 +16,7 @@ #include "Swiften/Settings/SettingsProvider.h" #include "Swiften/Elements/CapsInfo.h" #include "Swiften/MUC/MUCRegistry.h" +#include "Swiften/Roster/XMPPRoster.h" namespace Swift { class AvatarStorage; @@ -67,10 +68,14 @@ namespace Swift { ChatController* getChatController(const JID &contact); void sendPresence(boost::shared_ptr<Presence> presence); void logout(); + void signout(); virtual bool isMUC(const JID& muc) const; private: + void performLoginFromCachedCredentials(); + void enableManagers(); + void disableManagers(); Client* client_; ChatWindowFactory* chatWindowFactory_; MainWindowFactory* mainWindowFactory_; @@ -91,6 +96,7 @@ namespace Swift { std::map<JID, MUCController*> mucControllers_; std::map<JID, ChatController*> chatControllers_; boost::shared_ptr<DiscoInfo> serverDiscoInfo_; + boost::shared_ptr<XMPPRoster> xmppRoster_;; JID jid_; PresenceOracle* presenceOracle_; SystemTrayController* systemTrayController_; @@ -98,6 +104,9 @@ namespace Swift { AvatarManager* avatarManager_; boost::shared_ptr<Presence> lastSentPresence_; String vCardPhotoHash_; + boost::shared_ptr<Presence> queuedPresence_; + String password_; + String certificateFile_; }; } #endif diff --git a/Swift/Controllers/RosterController.cpp b/Swift/Controllers/RosterController.cpp index 322d704..e27335b 100644 --- a/Swift/Controllers/RosterController.cpp +++ b/Swift/Controllers/RosterController.cpp @@ -24,19 +24,19 @@ namespace Swift { */ RosterController::RosterController(const JID& jid, boost::shared_ptr<XMPPRoster> xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, TreeWidgetFactory* treeWidgetFactory, NickResolver* nickResolver) : myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), treeWidgetFactory_(treeWidgetFactory), mainWindow_(mainWindowFactory_->createMainWindow()), roster_(new Roster(mainWindow_->getTreeWidget(), treeWidgetFactory_)), offlineFilter_(new OfflineRosterFilter()) { - nickResolver_ = nickResolver; + roster_->addFilter(offlineFilter_); - avatarManager_ = avatarManager; - avatarManager_->onAvatarChanged.connect(boost::bind(&RosterController::handleAvatarChanged, this, _1, _2)); + mainWindow_->onStartChatRequest.connect(boost::bind(&RosterController::handleStartChatRequest, this, _1)); mainWindow_->onJoinMUCRequest.connect(boost::bind(&RosterController::handleJoinMUCRequest, this, _1, _2)); mainWindow_->onChangeStatusRequest.connect(boost::bind(&RosterController::handleChangeStatusRequest, this, _1, _2)); mainWindow_->onShowOfflineToggled.connect(boost::bind(&RosterController::handleShowOfflineToggled, this, _1)); roster_->onUserAction.connect(boost::bind(&RosterController::handleUserAction, this, _1)); xmppRoster_->onJIDAdded.connect(boost::bind(&RosterController::handleOnJIDAdded, this, _1)); + avatarManager_ = NULL; + setAvatarManager(avatarManager); + setNickResolver(nickResolver); - mainWindow_->setMyAvatarPath(avatarManager_->getAvatarPath(myJID_).string()); - mainWindow_->setMyName(nickResolver_->jidToNick(myJID_)); } RosterController::~RosterController() { @@ -44,6 +44,29 @@ RosterController::~RosterController() { } +void RosterController::setNickResolver(NickResolver* nickResolver) { + nickResolver_ = nickResolver; + if (nickResolver_ != NULL) { + mainWindow_->setMyName(nickResolver_->jidToNick(myJID_)); + } +} + +void RosterController::setAvatarManager(AvatarManager* avatarManager) { + if (avatarManager_ != NULL) { + //FIXME: disconnect old signal; + } + avatarManager_ = avatarManager; + if (avatarManager != NULL) { + avatarManager_->onAvatarChanged.connect(boost::bind(&RosterController::handleAvatarChanged, this, _1, _2)); + mainWindow_->setMyAvatarPath(avatarManager_->getAvatarPath(myJID_).string()); + } +} + +void RosterController::setEnabled(bool enabled) { + //FIXME: implement; + h +} + void RosterController::handleShowOfflineToggled(bool state) { if (state) { roster_->removeFilter(offlineFilter_); diff --git a/Swift/Controllers/RosterController.h b/Swift/Controllers/RosterController.h index 2eddaf6..50aff49 100644 --- a/Swift/Controllers/RosterController.h +++ b/Swift/Controllers/RosterController.h @@ -26,12 +26,14 @@ namespace Swift { ~RosterController(); void showRosterWindow(); MainWindow* getWindow() {return mainWindow_;}; + void setAvatarManager(AvatarManager* avatarManager); + void setNickResolver(NickResolver* nickResolver); boost::signal<void (const JID&)> onStartChatRequest; boost::signal<void (const JID&, const String&)> onJoinMUCRequest; boost::signal<void (StatusShow::Type, const String&)> onChangeStatusRequest; void handleIncomingPresence(boost::shared_ptr<Presence> presence); void handleAvatarChanged(const JID& jid, const String& hash); - + void setEnabled(bool enabled); private: void handleOnJIDAdded(const JID &jid); void handleStartChatRequest(const JID& contact); |