Working buddy rename

This commit is contained in:
Jan Kaluza 2011-06-09 13:54:09 +02:00
parent ac7bbb6ccc
commit a6781df77f
9 changed files with 85 additions and 7 deletions

View file

@ -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<std::string, PurpleAccount *> m_sessions;
std::map<PurpleAccount *, std::string> m_accounts;
std::map<std::string, unsigned int> m_vcards;

View file

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

View file

@ -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<Swift::Connection> &, const std::string &data);

View file

@ -60,6 +60,8 @@ class RosterManager {
void setStorageBackend(StorageBackend *storageBackend);
void storeBuddy(Buddy *buddy);
Swift::RosterPayload::ref generateRosterPayload();
/// Returns user associated with this roster.

View file

@ -28,12 +28,19 @@
namespace Transport {
class UserManager;
class Buddy;
class RosterResponder : public Swift::Responder<Swift::RosterPayload> {
public:
RosterResponder(Swift::IQRouter *router, UserManager *userManager);
~RosterResponder();
boost::signal<void (Buddy *, const Swift::RosterItemPayload &item)> onBuddyUpdated;
boost::signal<void (Buddy *)> onBuddyRemoved;
boost::signal<void (Buddy *, const Swift::RosterItemPayload &item)> onBuddyAdded;
private:
virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::RosterPayload> payload);
virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::RosterPayload> payload);

View file

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

View file

@ -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<LocalBuddy *>(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;

View file

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

View file

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