/* * Copyright (c) 2012 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include "ShowProfileController.h" #include #include #include #include #include #include namespace Swift { ShowProfileController::ShowProfileController(VCardManager* vcardManager, ProfileWindowFactory* profileWindowFactory, UIEventStream* uiEventStream) : vcardManager(vcardManager), profileWindowFactory(profileWindowFactory), uiEventStream(uiEventStream) { uiEventStream->onUIEvent.connect(boost::bind(&ShowProfileController::handleUIEvent, this, _1)); vcardManager->onVCardChanged.connect(boost::bind(&ShowProfileController::handleVCardChanged, this, _1, _2)); } ShowProfileController::~ShowProfileController() { typedef std::pair JIDProfileWindowPair; foreach(const JIDProfileWindowPair& jidWndPair, openedProfileWindows) { jidWndPair.second->onWindowAboutToBeClosed.disconnect(boost::bind(&ShowProfileController::handleProfileWindowAboutToBeClosed, this, _1)); delete jidWndPair.second; } vcardManager->onVCardChanged.disconnect(boost::bind(&ShowProfileController::handleVCardChanged, this, _1, _2)); uiEventStream->onUIEvent.disconnect(boost::bind(&ShowProfileController::handleUIEvent, this, _1)); } void ShowProfileController::handleUIEvent(UIEvent::ref event) { ShowProfileForRosterItemUIEvent::ref showProfileEvent = boost::dynamic_pointer_cast(event); if (!showProfileEvent) { return; } if (openedProfileWindows.find(showProfileEvent->getJID()) == openedProfileWindows.end()) { ProfileWindow* newProfileWindow = profileWindowFactory->createProfileWindow(); newProfileWindow->setJID(showProfileEvent->getJID()); newProfileWindow->onWindowAboutToBeClosed.connect(boost::bind(&ShowProfileController::handleProfileWindowAboutToBeClosed, this, _1)); openedProfileWindows[showProfileEvent->getJID()] = newProfileWindow; VCard::ref vcard = vcardManager->getVCardAndRequestWhenNeeded(showProfileEvent->getJID()); if (vcard) { newProfileWindow->setVCard(vcard); } else { newProfileWindow->setProcessing(true); } newProfileWindow->show(); } else { openedProfileWindows[showProfileEvent->getJID()]->show(); } } void ShowProfileController::handleVCardChanged(const JID& jid, VCard::ref vcard) { if (openedProfileWindows.find(jid) == openedProfileWindows.end()) { return; } ProfileWindow* profileWindow = openedProfileWindows[jid]; profileWindow->setVCard(vcard); profileWindow->setProcessing(false); profileWindow->show(); } void ShowProfileController::handleProfileWindowAboutToBeClosed(const JID& profileJid) { openedProfileWindows.erase(profileJid); } }