diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 2493d6309a9583ec9569e2c8e1086bc0e9dffd9d..85747b23ac71d3e150be9b193eff3d46bcb105e7 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -34,18 +34,24 @@ #include "transport/logging.h" #include "transport/admininterface.h" #include "blockresponder.h" -#include "Swiften/Swiften.h" #include "Swiften/Server/ServerStanzaChannel.h" #include "Swiften/Elements/StreamError.h" #include "Swiften/Network/BoostConnectionServer.h" +#include "Swiften/Network/ConnectionServerFactory.h" #include "Swiften/Elements/AttentionPayload.h" #include "Swiften/Elements/XHTMLIMPayload.h" +#include "Swiften/Elements/Delay.h" +#include "Swiften/Elements/DeliveryReceipt.h" +#include "Swiften/Elements/DeliveryReceiptRequest.h" #include "Swiften/Elements/InvisiblePayload.h" #include "Swiften/Elements/SpectrumErrorPayload.h" #include "transport/protocol.pb.h" #include "transport/util.h" #include "transport/discoitemsresponder.h" +#include "boost/date_time/posix_time/posix_time.hpp" +#include "boost/signal.hpp" + #include "utf8.h" #include @@ -619,7 +625,7 @@ void NetworkPluginServer::handleParticipantChangedPayload(const std::string &dat return; } - conv->handleParticipantChanged(payload.nickname(), payload.flag(), payload.status(), payload.statusmessage(), payload.newname()); + conv->handleParticipantChanged(payload.nickname(), (Conversation::ParticipantFlag) payload.flag(), payload.status(), payload.statusmessage(), payload.newname()); } void NetworkPluginServer::handleRoomChangedPayload(const std::string &data) { @@ -680,7 +686,6 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool msg->addPayload(delay); } - NetworkConversation *conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname()); // We can't create Conversation for payload with nickname, because this means the message is from room, @@ -689,6 +694,19 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool return; } + if (conv && payload.pm()) { + conv = (NetworkConversation *) user->getConversationManager()->getConversation(payload.buddyname() + "/" + payload.nickname()); + if (!conv) { + conv = new NetworkConversation(user->getConversationManager(), payload.nickname()); + std::string name = payload.buddyname(); + conv->setRoom(name); + conv->setNickname(payload.buddyname() + "/" + payload.nickname()); + + user->getConversationManager()->addConversation(conv); + conv->onMessageToSend.connect(boost::bind(&NetworkPluginServer::handleMessageReceived, this, _1, _2)); + } + } + // Create new Conversation if it does not exist if (!conv) { conv = new NetworkConversation(user->getConversationManager(), payload.buddyname()); @@ -1247,6 +1265,9 @@ void NetworkPluginServer::handleUserCreated(User *user) { user->onPresenceChanged.connect(boost::bind(&NetworkPluginServer::handleUserPresenceChanged, this, user, _1)); user->onRoomJoined.connect(boost::bind(&NetworkPluginServer::handleRoomJoined, this, user, _1, _2, _3, _4)); user->onRoomLeft.connect(boost::bind(&NetworkPluginServer::handleRoomLeft, this, user, _1)); + + user->getRosterManager()->onBuddyAdded.connect(boost::bind(&NetworkPluginServer::handleUserBuddyAdded, this, user, _1)); + user->getRosterManager()->onBuddyRemoved.connect(boost::bind(&NetworkPluginServer::handleUserBuddyRemoved, this, user, _1)); } void NetworkPluginServer::handleUserReadyToConnect(User *user) { @@ -1352,6 +1373,9 @@ void NetworkPluginServer::handleUserDestroyed(User *user) { user->onRoomJoined.disconnect(boost::bind(&NetworkPluginServer::handleRoomJoined, this, user, _1, _2, _3, _4)); user->onRoomLeft.disconnect(boost::bind(&NetworkPluginServer::handleRoomLeft, this, user, _1)); + user->getRosterManager()->onBuddyAdded.disconnect(boost::bind(&NetworkPluginServer::handleUserBuddyAdded, this, user, _1)); + user->getRosterManager()->onBuddyRemoved.disconnect(boost::bind(&NetworkPluginServer::handleUserBuddyRemoved, this, user, _1)); + pbnetwork::Logout logout; logout.set_user(user->getJID().toBare()); logout.set_legacyname(userInfo.uin); @@ -1532,6 +1556,32 @@ void NetworkPluginServer::handleBuddyAdded(Buddy *buddy, const Swift::RosterItem handleBuddyUpdated(buddy, item); } +void NetworkPluginServer::handleUserBuddyAdded(User *user, Buddy *b) { + pbnetwork::Buddy buddy; + buddy.set_username(user->getJID().toBare()); + buddy.set_buddyname(b->getName()); + buddy.set_alias(b->getAlias()); + BOOST_FOREACH(const std::string &g, b->getGroups()) { + buddy.add_group(g); + } + buddy.set_status(pbnetwork::STATUS_NONE); + + std::string message; + buddy.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED); + + Backend *c = (Backend *) user->getData(); + if (!c) { + return; + } + send(c->connection, message); +} + +void NetworkPluginServer::handleUserBuddyRemoved(User *user, Buddy *b) { + handleBuddyRemoved(b); +} + void NetworkPluginServer::handleBlockToggled(Buddy *b) { User *user = b->getRosterManager()->getUser();