void XmppClient::handleRegistrationResult(const glooxwrapper::JID&, gloox::RegistrationResult result) { if (result == gloox::RegistrationSuccess) { CreateSimpleMessage("system", "registered"); } else { std::string msg; #define CASE(X, Y) case gloox::X: msg = Y; break switch(result) { CASE(RegistrationNotAcceptable, "Registration not acceptable"); CASE(RegistrationConflict, "Registration conflict"); CASE(RegistrationNotAuthorized, "Registration not authorized"); CASE(RegistrationBadRequest, "Registration bad request"); CASE(RegistrationForbidden, "Registration forbidden"); CASE(RegistrationRequired, "Registration required"); CASE(RegistrationUnexpectedRequest, "Registration unexpected request"); CASE(RegistrationNotAllowed, "Registration not allowed"); default: msg = "Registration unknown error"; } #undef CASE CreateSimpleMessage("system", msg, "error"); } disconnect(); }
/** * Update local data when a user changes presence. */ void XmppClient::handleMUCParticipantPresence(glooxwrapper::MUCRoom*, const glooxwrapper::MUCRoomParticipant participant, const glooxwrapper::Presence& presence) { //std::string jid = participant.jid->full(); std::string nick = participant.nick->resource().to_string(); gloox::Presence::PresenceType presenceType = presence.presence(); if (presenceType == gloox::Presence::Unavailable) { if (!participant.newNick.empty() && (participant.flags & (gloox::UserNickChanged | gloox::UserSelf))) { // we have a nick change m_PlayerMap[participant.newNick.to_string()] = gloox::Presence::Unavailable; CreateSimpleMessage("muc", nick, "nick", participant.newNick.to_string()); } else CreateSimpleMessage("muc", nick, "leave"); DbgXMPP(nick << " left the room"); m_PlayerMap.erase(nick); } else { if (m_PlayerMap.find(nick) == m_PlayerMap.end()) CreateSimpleMessage("muc", nick, "join"); else CreateSimpleMessage("muc", nick, "presence"); DbgXMPP(nick << " is in the room, presence : " << (int)presenceType); m_PlayerMap[nick] = presenceType; } }
/** * Handle portions of messages containing custom stanza extensions. */ bool XmppClient::handleIq(const glooxwrapper::IQ& iq) { DbgXMPP("handleIq [" << tag_xml(iq) << "]"); if(iq.subtype() == gloox::IQ::Result) { const GameListQuery* gq = iq.findExtension<GameListQuery>( ExtGameListQuery ); const BoardListQuery* bq = iq.findExtension<BoardListQuery>( ExtBoardListQuery ); if(gq) { for(std::vector<const glooxwrapper::Tag*>::const_iterator it = m_GameList.begin(); it != m_GameList.end(); ++it ) glooxwrapper::Tag::free(*it); m_GameList.clear(); for(std::vector<const glooxwrapper::Tag*>::const_iterator it = gq->m_GameList.begin(); it != gq->m_GameList.end(); ++it) m_GameList.push_back( (*it)->clone() ); CreateSimpleMessage("system", "gamelist updated", "internal"); } if(bq) { if (bq->m_Command == "boardlist") { for(std::vector<const glooxwrapper::Tag*>::const_iterator it = m_BoardList.begin(); it != m_BoardList.end(); ++it ) glooxwrapper::Tag::free(*it); m_BoardList.clear(); for(std::vector<const glooxwrapper::Tag*>::const_iterator it = bq->m_StanzaBoardList.begin(); it != bq->m_StanzaBoardList.end(); ++it) m_BoardList.push_back((*it)->clone()); CreateSimpleMessage("system", "boardlist updated", "internal"); } else if (bq->m_Command == "ratinglist") { for(std::vector<const glooxwrapper::Tag*>::const_iterator it = bq->m_StanzaBoardList.begin(); it != bq->m_StanzaBoardList.end(); ++it) { std::string name = (*it)->findAttribute("name").to_string(); if (m_PlayerMap.find(name) != m_PlayerMap.end()) m_PlayerMap[name][1] = (*it)->findAttribute("rating").to_string(); } CreateSimpleMessage("system", "ratinglist updated", "internal"); } } } else if(iq.subtype() == gloox::IQ::Error) { gloox::StanzaError err = iq.error_error(); std::string msg = StanzaErrorToString(err); CreateSimpleMessage("system", msg, "error"); } else { CreateSimpleMessage("system", std::string("unknown subtype : ") + tag_name(iq), "error"); } return true; }
/** * Handle connection */ void XmppClient::onConnect() { if (m_mucRoom) { CreateSimpleMessage("system", "connected"); m_mucRoom->join(); } if (m_registration) m_registration->fetchRegistrationFields(); }
/** * Handle disconnection */ void XmppClient::onDisconnect(gloox::ConnectionError error) { // Make sure we properly leave the room so that // everything works if we decide to come back later if (m_mucRoom) m_mucRoom->leave(); // Clear game, board and player lists. for (std::vector<const glooxwrapper::Tag*>::const_iterator it = m_GameList.begin(); it != m_GameList.end(); ++it) glooxwrapper::Tag::free(*it); for (std::vector<const glooxwrapper::Tag*>::const_iterator it = m_BoardList.begin(); it != m_BoardList.end(); ++it) glooxwrapper::Tag::free(*it); m_BoardList.clear(); m_GameList.clear(); m_PlayerMap.clear(); if(error == gloox::ConnAuthenticationFailed) CreateSimpleMessage("system", "authentication failed", "error"); else CreateSimpleMessage("system", "disconnected"); }
/** * Handle MUC room errors */ void XmppClient::handleMUCError(glooxwrapper::MUCRoom*, gloox::StanzaError err) { std::string msg = StanzaErrorToString(err); CreateSimpleMessage("system", msg, "error"); }
/** * Update local cache when subject changes. */ void XmppClient::handleMUCSubject(glooxwrapper::MUCRoom*, const glooxwrapper::string& UNUSED(nick), const glooxwrapper::string& subject) { m_Subject = subject.c_str(); CreateSimpleMessage("muc", m_Subject, "subject"); }