diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 4be4e3a9..b1cfa9da 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -118,7 +118,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } - virtual void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) { + void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) { PurpleAccount *account = m_sessions[user]; if (account) { serv_get_info(purple_account_get_connection(account), legacyName.c_str()); @@ -126,6 +126,18 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::string &groups) { + PurpleAccount *account = m_sessions[user]; + if (account) { + PurpleBuddy *buddy = purple_find_buddy(account, buddyName.c_str()); + if (buddy) { + purple_blist_alias_buddy(buddy, alias.c_str()); + purple_blist_server_alias_buddy(buddy, alias.c_str()); + serv_alias_buddy(buddy); + } + } + } + std::map m_sessions; std::map m_accounts; std::map m_vcards; diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index c6125be8..2dd7e29e 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -64,6 +64,7 @@ class NetworkPlugin { virtual void handleVCardRequest(const std::string &/*user*/, const std::string &/*legacyName*/, unsigned int /*id*/) {} virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {} virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {} + virtual void handleBuddyUpdatedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*alias*/, const std::string &/*groups*/) {} private: @@ -74,6 +75,7 @@ class NetworkPlugin { void handleJoinRoomPayload(const std::string &payload); void handleLeaveRoomPayload(const std::string &payload); void handleVCardPayload(const std::string &payload); + void handleBuddyChangedPayload(const std::string &payload); void handleDataRead(const Swift::SafeByteArray&); void _handleConnected(bool error); void handleDisconnected(); diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index c1edda8f..1d1bff73 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -74,6 +74,10 @@ class NetworkPluginServer { void handleUserReadyToConnect(User *user); void handleUserDestroyed(User *user); + void handleBuddyUpdated(Buddy *buddy, const Swift::RosterItemPayload &item); + void handleBuddyRemoved(Buddy *buddy); + void handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item); + void handleVCardRequired(User *user, const std::string &name, unsigned int id); void send(boost::shared_ptr &, const std::string &data); diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 8ff033b5..4bd8ae4b 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -60,6 +60,8 @@ class RosterManager { void setStorageBackend(StorageBackend *storageBackend); + void storeBuddy(Buddy *buddy); + Swift::RosterPayload::ref generateRosterPayload(); /// Returns user associated with this roster. diff --git a/include/transport/rosterresponder.h b/include/transport/rosterresponder.h index 4fd3aebc..80e61b6b 100644 --- a/include/transport/rosterresponder.h +++ b/include/transport/rosterresponder.h @@ -28,12 +28,19 @@ namespace Transport { class UserManager; +class Buddy; class RosterResponder : public Swift::Responder { public: RosterResponder(Swift::IQRouter *router, UserManager *userManager); ~RosterResponder(); + boost::signal onBuddyUpdated; + + boost::signal onBuddyRemoved; + + boost::signal onBuddyAdded; + private: virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 9f35885f..3b4fa4f1 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -265,6 +265,16 @@ void NetworkPlugin::handleVCardPayload(const std::string &data) { handleVCardRequest(payload.username(), payload.buddyname(), payload.id()); } +void NetworkPlugin::handleBuddyChangedPayload(const std::string &data) { + pbnetwork::Buddy payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleBuddyUpdatedRequest(payload.username(), payload.buddyname(), payload.alias(), payload.groups()); +} + void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { m_data.insert(m_data.end(), data.begin(), data.end()); @@ -310,6 +320,9 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { case pbnetwork::WrapperMessage_Type_TYPE_VCARD: handleVCardPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED: + handleBuddyChangedPayload(wrapper.payload()); + break; default: return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 0ccd6167..4126d404 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -128,6 +128,9 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_vcardResponder->start(); m_rosterResponder = new RosterResponder(component->getIQRouter(), userManager); + m_rosterResponder->onBuddyAdded.connect(boost::bind(&NetworkPluginServer::handleBuddyAdded, this, _1, _2)); + m_rosterResponder->onBuddyRemoved.connect(boost::bind(&NetworkPluginServer::handleBuddyRemoved, this, _1)); + m_rosterResponder->onBuddyUpdated.connect(boost::bind(&NetworkPluginServer::handleBuddyUpdated, this, _1, _2)); m_rosterResponder->start(); m_server = component->getFactories()->getConnectionFactory()->createConnectionServer(10000); @@ -226,7 +229,7 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { // TODO: ERROR return; } - std::cout << payload.buddyname() << "\n"; + User *user = m_userManager->getUser(payload.username()); if (!user) return; @@ -323,7 +326,6 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray &data) { c->data.insert(c->data.end(), data.begin(), data.end()); - std::cout << "READ\n"; while (c->data.size() != 0) { unsigned int expected_size; @@ -344,7 +346,7 @@ void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray & continue; } c->data.erase(c->data.begin(), c->data.begin() + 4 + expected_size); - std::cout << "TYPE " << wrapper.type() << " " << (int) pbnetwork::WrapperMessage_Type_TYPE_CONNECTED << " " << c->data.size() << "\n"; + switch(wrapper.type()) { case pbnetwork::WrapperMessage_Type_TYPE_CONNECTED: handleConnectedPayload(wrapper.payload()); @@ -518,6 +520,36 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost send(c->connection, message); } +void NetworkPluginServer::handleBuddyRemoved(Buddy *buddy) { + +} + +void NetworkPluginServer::handleBuddyUpdated(Buddy *b, const Swift::RosterItemPayload &item) { + User *user = b->getRosterManager()->getUser(); + + dynamic_cast(b)->setAlias(item.getName()); + user->getRosterManager()->storeBuddy(b); + + pbnetwork::Buddy buddy; + buddy.set_username(user->getJID().toBare()); + buddy.set_buddyname(b->getName()); + buddy.set_alias(b->getAlias()); + buddy.set_groups(b->getGroups().size() == 0 ? "" : b->getGroups()[0]); + buddy.set_status(Swift::StatusShow::None); + + std::string message; + buddy.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED); + + Client *c = (Client *) user->getData(); + send(c->connection, message); +} + +void NetworkPluginServer::handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item) { + handleBuddyUpdated(buddy, item); +} + void NetworkPluginServer::handleVCardRequired(User *user, const std::string &name, unsigned int id) { std::cout << "VCARD REQUIRED " << name << " " << id << "\n"; pbnetwork::VCard vcard; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 261b7b0c..0b04f49e 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -119,6 +119,12 @@ void RosterManager::unsetBuddy(Buddy *buddy) { onBuddyUnset(buddy); } +void RosterManager::storeBuddy(Buddy *buddy) { + if (m_rosterStorage) { + m_rosterStorage->storeBuddy(buddy); + } +} + void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key) { if (m_buddies[key] != NULL) { m_buddies[key]->buddyChanged(); diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index d99e84fd..bb544673 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -83,10 +83,10 @@ bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& Buddy *buddy = user->getRosterManager()->getBuddy(Buddy::JIDToLegacyName(item.getJID())); if (buddy) { if (item.getSubscription() == Swift::RosterItemPayload::Remove) { - std::cout << "BUDDY REMOVED\n"; + onBuddyRemoved(buddy); } else { - std::cout << "BUDDY UPDATED\n"; + onBuddyUpdated(buddy, item); } } else if (item.getSubscription() != Swift::RosterItemPayload::Remove) { @@ -100,7 +100,7 @@ bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& buddy = user->getComponent()->getFactory()->createBuddy(user->getRosterManager(), buddyInfo); user->getRosterManager()->setBuddy(buddy); - std::cout << "BUDDY ADDED\n"; + onBuddyAdded(buddy, item); } return true;