diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index a856c899..d31d2fca 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -68,6 +68,8 @@ class RosterManager { /// \param buddy removed Buddy boost::signal onBuddyUnset; + void handleSubscription(Swift::Presence::ref presence); + private: void setBuddyCallback(Buddy *buddy); diff --git a/include/transport/transport.h b/include/transport/transport.h index 4eb24ada..46c37ab5 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -133,11 +133,7 @@ namespace Transport { private: void handleConnected(); void handleConnectionError(const Swift::ComponentError &error); - void handlePresenceReceived(Swift::Presence::ref presence); -// void handleMessageReceived(Swift::Message::ref message); void handlePresence(Swift::Presence::ref presence); - void handleSubscription(Swift::Presence::ref presence); - void handleProbePresence(Swift::Presence::ref presence); void handleDataRead(const std::string &data); void handleDataWritten(const std::string &data); diff --git a/include/transport/user.h b/include/transport/user.h index 766dc9f0..126e5a92 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -69,6 +69,8 @@ class User { /// \param presence Swift::Presence. void handlePresence(Swift::Presence::ref presence); + void handleSubscription(Swift::Presence::ref presence); + /// Returns language. /// \return language const char *getLang() { return "en"; } diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index ce7dcc0e..3a9f8496 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -69,6 +69,9 @@ class UserManager { private: void handlePresence(Swift::Presence::ref presence); void handleMessageReceived(Swift::Message::ref message); + void handleGeneralPresenceReceived(Swift::Presence::ref presence); + void handleProbePresence(Swift::Presence::ref presence); + void handleSubscription(Swift::Presence::ref presence); // void handleDiscoInfoResponse(boost::shared_ptr info, Swift::ErrorPayload::ref error, const Swift::JID& jid); void addUser(User *user); diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 16a73247..808ec5ba 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -119,4 +119,8 @@ void RosterManager::sendRIE() { request->send(); } +void RosterManager::handleSubscription(Swift::Presence::ref presence) { + +} + } \ No newline at end of file diff --git a/src/transport.cpp b/src/transport.cpp index 450f30c0..7a403a0b 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -75,8 +75,6 @@ Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) { m_component->onError.connect(bind(&Component::handleConnectionError, this, _1)); m_component->onDataRead.connect(bind(&Component::handleDataRead, this, _1)); m_component->onDataWritten.connect(bind(&Component::handleDataWritten, this, _1)); - m_component->onPresenceReceived.connect(bind(&Component::handlePresenceReceived, this, _1)); -// m_component->onMessageReceived.connect(bind(&Component::handleMessageReceived, this, _1)); m_stanzaChannel = m_component->getStanzaChannel(); m_iqRouter = m_component->getIQRouter(); } @@ -170,25 +168,6 @@ void Component::handleDataWritten(const std::string &data) { onXMLOut(data); } -void Component::handlePresenceReceived(Swift::Presence::ref presence) { - switch(presence->getType()) { - case Swift::Presence::Subscribe: - case Swift::Presence::Subscribed: - case Swift::Presence::Unsubscribe: - case Swift::Presence::Unsubscribed: - handleSubscription(presence); - break; - case Swift::Presence::Available: - case Swift::Presence::Unavailable: - break; - case Swift::Presence::Probe: - handleProbePresence(presence); - break; - default: - break; - }; -} - void Component::handlePresence(Swift::Presence::ref presence) { bool isMUC = presence->getPayload() != NULL; @@ -227,50 +206,6 @@ void Component::handlePresence(Swift::Presence::ref presence) { onUserPresenceReceived(presence); } -void Component::handleProbePresence(Swift::Presence::ref presence) { - -} - -void Component::handleSubscription(Swift::Presence::ref presence) { - // answer to subscibe - if (presence->getType() == Swift::Presence::Subscribe && presence->getTo().getNode().empty()) { -// Log(presence->getFrom().toString().getUTF8String(), "Subscribe presence received => sending subscribed"); - Swift::Presence::ref response = Swift::Presence::create(); - response->setFrom(presence->getTo()); - response->setTo(presence->getFrom()); - response->setType(Swift::Presence::Subscribed); - m_component->sendPresence(response); - return; - } - - if (m_protocol == "irc") { - return; - } - -// User *user; -// std::string barejid = presence->getTo().toBare().toString().getUTF8String(); -// std::string userkey = presence->getFrom().toBare().toString().getUTF8String(); -// if (Transport::instance()->protocol()->tempAccountsAllowed()) { -// std::string server = barejid.substr(barejid.find("%") + 1, barejid.length() - barejid.find("%")); -// userkey += server; -// } - -// user = (User *) Transport::instance()->userManager()->getUserByJID(userkey); -// if (user) { -// user->handleSubscription(presence); -// } -// else if (presence->getType() == Swift::Presence::Unsubscribe) { -// Swift::Presence::ref response = Swift::Presence::create(); -// response->setFrom(presence->getTo()); -// response->setTo(presence->getFrom()); -// response->setType(Swift::Presence::Unsubscribed); -// m_component->sendPresence(response); -// } -// else { -// // Log(presence->getFrom().toString().getUTF8String(), "Subscribe presence received, but this user is not logged in"); -// } -} - void Component::handleCapsChanged(const Swift::JID& jid) { bool haveFeatures = m_entityCapsManager->getCaps(jid) != DiscoInfo::ref(); std::cout << "has capsInfo " << haveFeatures << "\n"; diff --git a/src/user.cpp b/src/user.cpp index 33feb3ac..c2c8630c 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -97,6 +97,10 @@ void User::handlePresence(Swift::Presence::ref presence) { } } +void User::handleSubscription(Swift::Presence::ref presence) { + m_rosterManager->handleSubscription(presence); +} + void User::onConnectingTimeout() { if (m_connected || m_readyForConnect) return; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 64656099..1e02d89f 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -34,6 +34,7 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1)); m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1)); + m_component->getStanzaChannel()->onPresenceReceived.connect(bind(&UserManager::handleGeneralPresenceReceived, this, _1)); // component->onDiscoInfoResponse.connect(bind(&UserManager::handleDiscoInfoResponse, this, _1, _2, _3)); } @@ -158,4 +159,61 @@ void UserManager::handleMessageReceived(Swift::Message::ref message) { user->getConversationManager()->handleMessageReceived(message); } +void UserManager::handleGeneralPresenceReceived(Swift::Presence::ref presence) { + switch(presence->getType()) { + case Swift::Presence::Subscribe: + case Swift::Presence::Subscribed: + case Swift::Presence::Unsubscribe: + case Swift::Presence::Unsubscribed: + handleSubscription(presence); + break; + case Swift::Presence::Available: + case Swift::Presence::Unavailable: + break; + case Swift::Presence::Probe: + handleProbePresence(presence); + break; + default: + break; + }; +} + +void UserManager::handleProbePresence(Swift::Presence::ref presence) { + +} + +void UserManager::handleSubscription(Swift::Presence::ref presence) { + // answer to subscibe for transport itself + if (presence->getType() == Swift::Presence::Subscribe && presence->getTo().getNode().empty()) { + Swift::Presence::ref response = Swift::Presence::create(); + response->setFrom(presence->getTo()); + response->setTo(presence->getFrom()); + response->setType(Swift::Presence::Subscribed); + m_component->getStanzaChannel()->sendPresence(response); + + response = Swift::Presence::create(); + response->setFrom(presence->getTo()); + response->setTo(presence->getFrom()); + response->setType(Swift::Presence::Subscribe); + m_component->getStanzaChannel()->sendPresence(response); + return; + } + + User *user = getUser(presence->getFrom().toBare().toString()); + + if (user) { + user->handleSubscription(presence); + } + else if (presence->getType() == Swift::Presence::Unsubscribe) { + Swift::Presence::ref response = Swift::Presence::create(); + response->setFrom(presence->getTo()); + response->setTo(presence->getFrom()); + response->setType(Swift::Presence::Unsubscribed); + m_component->getStanzaChannel()->sendPresence(response); + } +// else { +// // Log(presence->getFrom().toString().getUTF8String(), "Subscribe presence received, but this user is not logged in"); +// } +} + }