diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index 9faebccf..56000bf1 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -80,6 +80,7 @@ class NetworkPluginServer { void handleBuddyRemoved(Buddy *buddy); void handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item); + void handleVCardUpdated(User *user, boost::shared_ptr vcard); 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/vcardresponder.h b/include/transport/vcardresponder.h index db6ea319..fc4fb4c7 100644 --- a/include/transport/vcardresponder.h +++ b/include/transport/vcardresponder.h @@ -39,6 +39,7 @@ class VCardResponder : public Swift::Responder { void sendVCard(unsigned int id, boost::shared_ptr vcard); boost::signal onVCardRequired; + boost::signal vcard)> onVCardUpdated; private: struct VCardData { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 49f831ce..71b8fc90 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -125,6 +125,7 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_vcardResponder = new VCardResponder(component->getIQRouter(), userManager); m_vcardResponder->onVCardRequired.connect(boost::bind(&NetworkPluginServer::handleVCardRequired, this, _1, _2, _3)); + m_vcardResponder->onVCardUpdated.connect(boost::bind(&NetworkPluginServer::handleVCardUpdated, this, _1, _2)); m_vcardResponder->start(); m_rosterResponder = new RosterResponder(component->getIQRouter(), userManager); @@ -655,8 +656,23 @@ void NetworkPluginServer::handleBuddyAdded(Buddy *buddy, const Swift::RosterItem handleBuddyUpdated(buddy, item); } +void NetworkPluginServer::handleVCardUpdated(User *user, boost::shared_ptr v) { + pbnetwork::VCard vcard; + vcard.set_username(user->getJID().toBare()); + vcard.set_buddyname(""); + vcard.set_id(0); + vcard.set_photo(&v->getPhoto()[0], v->getPhoto().size()); + + std::string message; + vcard.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_VCARD); + + Client *c = (Client *) user->getData(); + send(c->connection, message); +} + void NetworkPluginServer::handleVCardRequired(User *user, const std::string &name, unsigned int id) { - std::cout << "VCARD REQUIRED " << name << " " << id << "\n"; pbnetwork::VCard vcard; vcard.set_username(user->getJID().toBare()); vcard.set_buddyname(name); diff --git a/src/vcardresponder.cpp b/src/vcardresponder.cpp index 72e820c4..315f71ba 100644 --- a/src/vcardresponder.cpp +++ b/src/vcardresponder.cpp @@ -73,6 +73,17 @@ bool VCardResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& } bool VCardResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { + if (!to.getNode().empty()) { + return false; + } + + User *user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + return false; + } + + onVCardUpdated(user, payload); + sendResponse(from, id, boost::shared_ptr(new VCard())); return true; }