diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index a2f5fdfd33861e70264e09cf8ada1073a1fb7985..026d88447e563c908d9792597c0e9df7a7876910 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 47a3baf702816c117acdcadb4ccd566a474fae7f..2d4d4008e04a96b4df7fe8ecaa85189b8ab09b3a 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 365725143aea0143202ad9d4441b866d0bd4f59d..2edda8ebb5168894fb5c5be1d61ddd3af5fa5e1c 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 fd3dd35a8f6e1c2af163ac77dad327591234b16d..261b7b0cd439e37aa82eb0f43e2e37600c3f3963 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); } }