void TelepathyAccountHandler::handleMessage(DTubeBuddyPtr pBuddy, const std::string& packet_str) { UT_DEBUGMSG(("TelepathyAccountHandler::handleMessage()\n")); UT_return_if_fail(pBuddy); AbiCollabSessionManager* pManager = AbiCollabSessionManager::getManager(); UT_return_if_fail(pManager); TelepathyChatroomPtr pChatroom = pBuddy->getChatRoom(); UT_return_if_fail(pChatroom); // construct the packet Packet* pPacket = _createPacket(packet_str, pBuddy); UT_return_if_fail(pPacket); switch (pPacket->getClassType()) { case PCT_GetSessionsEvent: { if (pChatroom->isLocallyControlled()) { // return only the session that belongs to the chatroom that the buddy is in GetSessionsResponseEvent gsre; gsre.m_Sessions[pChatroom->getSessionId()] = pChatroom->getDocName(); send(&gsre, pBuddy); } else UT_DEBUGMSG(("Ignoring GetSessionsEvent, we are not controlling session '%s'\n", pChatroom->getSessionId().utf8_str())); break; } case PCT_GetSessionsResponseEvent: { // check if we received 1 (and only 1) session, and join it // immediately if that is the case GetSessionsResponseEvent* gsre = static_cast<GetSessionsResponseEvent*>( pPacket ); UT_return_if_fail(gsre->m_Sessions.size() == 1); std::map<UT_UTF8String,UT_UTF8String>::iterator it=gsre->m_Sessions.begin(); DocHandle* pDocHandle = new DocHandle((*it).first, (*it).second); // store the session id pChatroom->setSessionId(pDocHandle->getSessionId()); // join the session UT_DEBUGMSG(("Got a running session (%s - %s), let's join it immediately\n", pDocHandle->getSessionId().utf8_str(), pDocHandle->getName().utf8_str())); pManager->joinSessionInitiate(pBuddy, pDocHandle); DELETEP(pDocHandle); break; } default: // let the default handler handle it AccountHandler::handleMessage(pPacket, pBuddy); break; } }
bool s_abicollab_join(AV_View* /*v*/, EV_EditMethodCallData* /*d*/) { AbiCollabSessionManager* pManager = AbiCollabSessionManager::getManager(); UT_return_val_if_fail(pManager, false); // Get the current view that the user is in. XAP_Frame *pFrame = XAP_App::getApp()->getLastFocussedFrame(); // Get an Accounts dialog instance XAP_DialogFactory* pFactory = static_cast<XAP_DialogFactory *>(XAP_App::getApp()->getDialogFactory()); UT_return_val_if_fail(pFactory, false); AP_Dialog_CollaborationJoin* pDialog = static_cast<AP_Dialog_CollaborationJoin*>( pFactory->requestDialog(AbiCollabSessionManager::getManager()->getDialogJoinId()) ); // Run the dialog pDialog->runModal(pFrame); // Handle the dialog outcome AP_Dialog_CollaborationJoin::tAnswer answer = pDialog->getAnswer(); BuddyPtr pBuddy = pDialog->getBuddy(); DocHandle* pDocHandle = pDialog->getDocHandle(); pFactory->releaseDialog(pDialog); switch (answer) { case AP_Dialog_CollaborationJoin::a_OPEN: { UT_return_val_if_fail(pBuddy && pDocHandle, false); // Check if we have already joined this session. If so, then just // ignore the request. Otherwise actually join the session. AbiCollab* pSession = pManager->getSessionFromSessionId(pDocHandle->getSessionId()); if (pSession) { UT_DEBUGMSG(("Already connected to session, just raising the associated frame\n")); // Just raise a frame that contains this session, instead of // opening the document again XAP_Frame* pFrameForSession = pManager->findFrameForSession(pSession); UT_return_val_if_fail(pFrameForSession, false); pFrameForSession->raise(); } else pManager->joinSessionInitiate(pBuddy, pDocHandle); } break; case AP_Dialog_CollaborationJoin::a_CANCEL: break; } return true; }