/* * Copyright (c) 2012 Mateusz Piękos * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include #include #include #include #include #include #include #include #include namespace Swift { typedef std::pair JIDWhiteboardWindowPair; WhiteboardManager::WhiteboardManager(WhiteboardWindowFactory* whiteboardWindowFactory, UIEventStream* uiEventStream, WhiteboardSessionManager* whiteboardSessionManager) : whiteboardWindowFactory_(whiteboardWindowFactory), uiEventStream_(uiEventStream), whiteboardSessionManager_(whiteboardSessionManager) { uiEventConnection_ = uiEventStream_->onUIEvent.connect(boost::bind(&WhiteboardManager::handleUIEvent, this, _1)); } WhiteboardManager::~WhiteboardManager() { foreach (JIDWhiteboardWindowPair whiteboardWindowPair, whiteboardWindows_) { delete whiteboardWindowPair.second; } } WhiteboardWindow* WhiteboardManager::createNewWhiteboardWindow(const JID& contact, WhiteboardSession::ref session) { WhiteboardWindow *window = whiteboardWindowFactory_->createWhiteboardWindow(session); whiteboardWindows_[contact.toBare()] = window; return window; } WhiteboardWindow* WhiteboardManager::findWhiteboardWindow(const JID& contact) { if (whiteboardWindows_.find(contact.toBare()) == whiteboardWindows_.end()) { return NULL; } return whiteboardWindows_[contact.toBare()]; } void WhiteboardManager::handleUIEvent(boost::shared_ptr event) { boost::shared_ptr requestWhiteboardEvent = boost::dynamic_pointer_cast(event); if (requestWhiteboardEvent) { JID contact = requestWhiteboardEvent->getContact(); WhiteboardSession::ref session = whiteboardSessionManager_->requestSession(contact); WhiteboardWindow* window = findWhiteboardWindow(contact); if (window == NULL) { createNewWhiteboardWindow(contact, session); } else { window->setSession(session); } } boost::shared_ptr sessionAcceptEvent = boost::dynamic_pointer_cast(event); if (sessionAcceptEvent) { acceptSession(sessionAcceptEvent->getContact()); } boost::shared_ptr sessionCancelEvent = boost::dynamic_pointer_cast(event); if (sessionCancelEvent) { cancelSession(sessionCancelEvent->getContact()); } boost::shared_ptr showWindowEvent = boost::dynamic_pointer_cast(event); if (showWindowEvent) { WhiteboardWindow* window = findWhiteboardWindow(showWindowEvent->getContact()); if (window != NULL) { window->activateWindow(); } } } void WhiteboardManager::acceptSession(const JID& from) { IncomingWhiteboardSession::ref session = boost::dynamic_pointer_cast(whiteboardSessionManager_->getSession(from)); if (session) { session->accept(); WhiteboardWindow* window = findWhiteboardWindow(from); if (window == NULL) { window = createNewWhiteboardWindow(from, session); } else { window->setSession(session); } window->show(); } } void WhiteboardManager::cancelSession(const JID& from) { IncomingWhiteboardSession::ref session = boost::dynamic_pointer_cast(whiteboardSessionManager_->getSession(from)); if (session) { session->cancel(); } } }