diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a2f5fdfd..026d8844 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -268,7 +268,7 @@ static void buddyListNewNode(PurpleBlistNode *node) { // np->handleBuddyChanged(np->m_accounts[account], purple_buddy_get_name(buddy), getAlias(buddy), getGroups(buddy)[0], (int) status.getType(), message, getIconHash(buddy)); // } -void buddyListUpdate(PurpleBuddyList *list, PurpleBlistNode *node) { +static void buddyListUpdate(PurpleBuddyList *list, PurpleBlistNode *node) { if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) return; PurpleBuddy *buddy = (PurpleBuddy *) node; diff --git a/include/transport/buddy.h b/include/transport/buddy.h index 47a3baf7..2d4d4008 100644 --- a/include/transport/buddy.h +++ b/include/transport/buddy.h @@ -107,6 +107,8 @@ class Buddy { void handleVCardReceived(const std::string &id, const Swift::JID &to, Swift::VCard::ref vcard); + boost::signal onBuddyChanged; + virtual void getVCard(const std::string &id, const Swift::JID &to) = 0; /// Returns legacy network username of this buddy. (for example UIN for ICQ, diff --git a/src/buddy.cpp b/src/buddy.cpp index 36572514..2edda8eb 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -151,6 +151,7 @@ void Buddy::buddyChanged() { if (presence) { m_rosterManager->getUser()->getComponent()->getStanzaChannel()->sendPresence(presence); } + onBuddyChanged(); } void Buddy::handleVCardReceived(const std::string &id, const Swift::JID &to, Swift::VCard::ref vcard) { diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index fd3dd35a..261b7b0c 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -48,10 +48,10 @@ RosterManager::~RosterManager() { m_setBuddyTimer->stop(); m_RIETimer->stop(); if (m_rosterStorage) { - for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { - Buddy *buddy = (*it).second; - m_rosterStorage->storeBuddy(buddy); - } +// for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { +// Buddy *buddy = (*it).second; +// m_rosterStorage->storeBuddy(buddy); +// } m_rosterStorage->storeBuddies(); } @@ -86,6 +86,10 @@ void RosterManager::sendBuddyRosterPush(Buddy *buddy) { void RosterManager::setBuddyCallback(Buddy *buddy) { m_setBuddyTimer->onTick.disconnect(boost::bind(&RosterManager::setBuddyCallback, this, buddy)); + if (m_rosterStorage) { + buddy->onBuddyChanged.connect(boost::bind(&RosterStorage::storeBuddy, m_rosterStorage, buddy)); + } + std::cout << "ADDING " << buddy->getName() << "\n"; m_buddies[buddy->getName()] = buddy; onBuddySet(buddy); @@ -151,8 +155,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { void RosterManager::setStorageBackend(StorageBackend *storageBackend) { if (m_rosterStorage) { - m_rosterStorage->storeBuddies(); - delete m_rosterStorage; + return; } m_rosterStorage = new RosterStorage(m_user, storageBackend); @@ -163,6 +166,7 @@ void RosterManager::setStorageBackend(StorageBackend *storageBackend) { Buddy *buddy = m_component->getFactory()->createBuddy(this, *it); std::cout << "CREATING BUDDY FROM DATABASE CACHE " << buddy->getName() << "\n"; m_buddies[buddy->getName()] = buddy; + buddy->onBuddyChanged.connect(boost::bind(&RosterStorage::storeBuddy, m_rosterStorage, buddy)); onBuddySet(buddy); } }