Preparation for Subscriptions handling

This commit is contained in:
Jan Kaluza 2011-04-06 14:05:52 +02:00
parent 6a4fffdfe8
commit 5797b554ea
8 changed files with 73 additions and 69 deletions

View file

@ -68,6 +68,8 @@ class RosterManager {
/// \param buddy removed Buddy
boost::signal<void (Buddy *buddy)> onBuddyUnset;
void handleSubscription(Swift::Presence::ref presence);
private:
void setBuddyCallback(Buddy *buddy);

View file

@ -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);

View file

@ -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"; }

View file

@ -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<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
void addUser(User *user);

View file

@ -119,4 +119,8 @@ void RosterManager::sendRIE() {
request->send();
}
void RosterManager::handleSubscription(Swift::Presence::ref presence) {
}
}

View file

@ -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<MUCPayload>() != 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";

View file

@ -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;

View file

@ -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");
// }
}
}