#include "Swiften/MUC/MUC.h" #include #include #include "Swiften/Presence/PresenceSender.h" #include "Swiften/Client/StanzaChannel.h" #include "Swiften/Elements/IQ.h" #include "Swiften/Elements/MUCPayload.h" namespace Swift { typedef std::pair StringMUCOccupantPair; MUC::MUC(StanzaChannel* stanzaChannel, PresenceSender* presenceSender, const JID &muc) : ownMUCJID(muc), stanzaChannel(stanzaChannel), presenceSender(presenceSender) { scopedConnection_ = stanzaChannel->onPresenceReceived.connect(boost::bind(&MUC::handleIncomingPresence, this, _1)); } void MUC::joinAs(const String &nick) { firstPresenceSeen = false; ownMUCJID = JID(ownMUCJID.getNode(), ownMUCJID.getDomain(), nick); boost::shared_ptr joinPresence(new Presence()); joinPresence->setTo(ownMUCJID); joinPresence->addPayload(boost::shared_ptr(new MUCPayload())); presenceSender->sendPresence(joinPresence); } void MUC::part() { presenceSender->removeDirectedPresenceReceiver(ownMUCJID); } void MUC::handleIncomingPresence(boost::shared_ptr presence) { if (!isFromMUC(presence->getFrom())) { return; } if (!firstPresenceSeen) { if (presence->getType() == Presence::Error) { onJoinComplete(JoinFailed); return; } firstPresenceSeen = true; onJoinComplete(JoinSucceeded); presenceSender->addDirectedPresenceReceiver(ownMUCJID); } String nick = presence->getFrom().getResource(); if (nick.isEmpty()) { return; } if (presence->getType() == Presence::Unavailable) { std::map::iterator i = occupants.find(nick); if (i != occupants.end()) { onOccupantLeft(i->second, Part, ""); occupants.erase(i); } } else if (presence->getType() == Presence::Available) { std::pair::iterator, bool> result = occupants.insert(std::make_pair(nick, MUCOccupant(nick))); if (result.second) { onOccupantJoined(result.first->second); } onOccupantPresenceChange(presence); } } }