From 96fb9b61e85ab3a35d0779e557314dd24367961d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sun, 5 Jun 2011 11:35:37 +0200 Subject: [PATCH] Store icon_hask into databa => working avatars --- backends/libpurple/main.cpp | 64 ++++++++++++++++++------------ include/transport/sqlite3backend.h | 1 + src/buddy.cpp | 4 +- src/networkpluginserver.cpp | 2 + src/rostermanager.cpp | 8 ++++ src/rosterstorage.cpp | 2 + src/sqlite3backend.cpp | 32 ++++++++++++++- 7 files changed, 84 insertions(+), 29 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index f90dc2d9..a2f5fdfd 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -238,29 +238,41 @@ 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)); } -static void buddyStatusChanged(PurpleBuddy *buddy, PurpleStatus *status_, PurpleStatus *old_status) { +// static void buddyStatusChanged(PurpleBuddy *buddy, PurpleStatus *status_, PurpleStatus *old_status) { +// PurpleAccount *account = purple_buddy_get_account(buddy); +// +// Swift::StatusShow status; +// std::string message; +// getStatus(buddy, status, message); +// +// np->handleBuddyChanged(np->m_accounts[account], purple_buddy_get_name(buddy), getAlias(buddy), getGroups(buddy)[0], (int) status.getType(), message, getIconHash(buddy)); +// } +// +// static void buddySignedOn(PurpleBuddy *buddy) { +// PurpleAccount *account = purple_buddy_get_account(buddy); +// +// Swift::StatusShow status; +// std::string message; +// getStatus(buddy, status, message); +// +// np->handleBuddyChanged(np->m_accounts[account], purple_buddy_get_name(buddy), getAlias(buddy), getGroups(buddy)[0], (int) status.getType(), message, getIconHash(buddy)); +// } +// +// static void buddySignedOff(PurpleBuddy *buddy) { +// PurpleAccount *account = purple_buddy_get_account(buddy); +// +// Swift::StatusShow status; +// std::string message; +// getStatus(buddy, status, message); +// +// 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) { + if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) + return; + PurpleBuddy *buddy = (PurpleBuddy *) node; PurpleAccount *account = purple_buddy_get_account(buddy); - - Swift::StatusShow status; - std::string message; - getStatus(buddy, status, message); - - np->handleBuddyChanged(np->m_accounts[account], purple_buddy_get_name(buddy), getAlias(buddy), getGroups(buddy)[0], (int) status.getType(), message, getIconHash(buddy)); -} - -static void buddySignedOn(PurpleBuddy *buddy) { - PurpleAccount *account = purple_buddy_get_account(buddy); - - Swift::StatusShow status; - std::string message; - getStatus(buddy, status, message); - - np->handleBuddyChanged(np->m_accounts[account], purple_buddy_get_name(buddy), getAlias(buddy), getGroups(buddy)[0], (int) status.getType(), message, getIconHash(buddy)); -} - -static void buddySignedOff(PurpleBuddy *buddy) { - PurpleAccount *account = purple_buddy_get_account(buddy); - Swift::StatusShow status; std::string message; getStatus(buddy, status, message); @@ -279,7 +291,7 @@ static PurpleBlistUiOps blistUiOps = NULL, buddyListNewNode, NULL, - NULL, // buddyListUpdate, + buddyListUpdate, NULL, //NodeRemoved, NULL, NULL, @@ -543,9 +555,9 @@ static bool initPurple(Config &cfg) { // purple_signal_connect(purple_conversations_get_handle(), "buddy-typing-stopped", &conversation_handle, PURPLE_CALLBACK(buddyTypingStopped), NULL); purple_signal_connect(purple_connections_get_handle(), "signed-on", &blist_handle,PURPLE_CALLBACK(signed_on), NULL); // purple_signal_connect(purple_blist_get_handle(), "buddy-removed", &blist_handle,PURPLE_CALLBACK(buddyRemoved), NULL); - purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL); - purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL); - purple_signal_connect(purple_blist_get_handle(), "buddy-status-changed", &blist_handle,PURPLE_CALLBACK(buddyStatusChanged), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-signed-on", &blist_handle,PURPLE_CALLBACK(buddySignedOn), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-signed-off", &blist_handle,PURPLE_CALLBACK(buddySignedOff), NULL); +// purple_signal_connect(purple_blist_get_handle(), "buddy-status-changed", &blist_handle,PURPLE_CALLBACK(buddyStatusChanged), NULL); purple_signal_connect(purple_blist_get_handle(), "blist-node-removed", &blist_handle,PURPLE_CALLBACK(NodeRemoved), NULL); // purple_signal_connect(purple_conversations_get_handle(), "chat-topic-changed", &conversation_handle, PURPLE_CALLBACK(conv_chat_topic_changed), NULL); // diff --git a/include/transport/sqlite3backend.h b/include/transport/sqlite3backend.h index 3070c343..c34c78ce 100644 --- a/include/transport/sqlite3backend.h +++ b/include/transport/sqlite3backend.h @@ -109,6 +109,7 @@ class SQLite3Backend : public StorageBackend sqlite3_stmt *m_removeUserBuddiesSettings; sqlite3_stmt *m_addBuddy; sqlite3_stmt *m_updateBuddy; + sqlite3_stmt *m_updateBuddySetting; sqlite3_stmt *m_getBuddies; sqlite3_stmt *m_getBuddiesSettings; }; diff --git a/src/buddy.cpp b/src/buddy.cpp index 215a5001..36572514 100644 --- a/src/buddy.cpp +++ b/src/buddy.cpp @@ -109,9 +109,9 @@ Swift::Presence::ref Buddy::generatePresenceStanza(int features, bool only_new) // caps // presence->addPayload(boost::shared_ptr(new Swift::CapsInfo (CONFIG().caps))); - if (features & 0/*TRANSPORT_FEATURE_AVATARS*/) { +// if (features & 0/*TRANSPORT_FEATURE_AVATARS*/) { presence->addPayload(boost::shared_ptr(new Swift::VCardUpdate (getIconHash()))); - } +// } } if (only_new) { diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index b27b817e..8f06dc0d 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -69,6 +69,8 @@ class NetworkFactory : public Factory { buddy->setSubscription(buddyInfo.subscription); buddy->setGroups(buddyInfo.groups); buddy->setFlags((BuddyFlag) buddyInfo.flags); + if (buddyInfo.settings.find("icon_hash") != buddyInfo.settings.end()) + buddy->setIconHash(buddyInfo.settings.find("icon_hash")->second.s); return buddy; } private: diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index d9ac9191..fd3dd35a 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -47,6 +47,14 @@ RosterManager::RosterManager(User *user, Component *component){ 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); + } + m_rosterStorage->storeBuddies(); + } + for (std::map::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) { Buddy *buddy = (*it).second; delete buddy; diff --git a/src/rosterstorage.cpp b/src/rosterstorage.cpp index b76c369c..270e0257 100644 --- a/src/rosterstorage.cpp +++ b/src/rosterstorage.cpp @@ -106,6 +106,8 @@ bool RosterStorage::storeBuddies() { buddyInfo.subscription = buddy->getSubscription(); buddyInfo.id = buddy->getID(); buddyInfo.flags = buddy->getFlags(); + buddyInfo.settings["icon_hash"].s = buddy->getIconHash(); + buddyInfo.settings["icon_hash"].type = TYPE_STRING; // Buddy is in DB if (buddyInfo.id != -1) { diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 398bec2f..128921a7 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -89,6 +89,7 @@ SQLite3Backend::~SQLite3Backend(){ FINALIZE_STMT(m_getUserSetting); FINALIZE_STMT(m_setUserSetting); FINALIZE_STMT(m_updateUserSetting); + FINALIZE_STMT(m_updateBuddySetting); sqlite3_close(m_db); } } @@ -114,6 +115,8 @@ bool SQLite3Backend::connect() { PREP_STMT(m_updateBuddy, "UPDATE " + m_prefix + "buddies SET groups=?, nickname=?, flags=?, subscription=? WHERE user_id=? AND uin=?"); PREP_STMT(m_getBuddies, "SELECT id, uin, subscription, nickname, groups, flags FROM " + m_prefix + "buddies WHERE user_id=? ORDER BY id ASC"); PREP_STMT(m_getBuddiesSettings, "SELECT buddy_id, type, var, value FROM " + m_prefix + "buddies_settings WHERE user_id=? ORDER BY buddy_id ASC"); + PREP_STMT(m_updateBuddySetting, "INSERT OR REPLACE INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?)"); + PREP_STMT(m_getUserSetting, "SELECT type, value FROM " + m_prefix + "users_settings WHERE user_id=? AND var=?"); PREP_STMT(m_setUserSetting, "INSERT INTO " + m_prefix + "users_settings (user_id, var, type, value) VALUES (?,?,?,?)"); PREP_STMT(m_updateUserSetting, "UPDATE " + m_prefix + "users_settings SET value=? WHERE user_id=? AND var=?"); @@ -245,7 +248,19 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { onStorageError("addBuddy query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); return -1; } - return (long) sqlite3_last_insert_rowid(m_db); + + long id = (long) sqlite3_last_insert_rowid(m_db); + +// INSERT OR REPLACE INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?) + BEGIN(m_updateBuddySetting); + BIND_INT(m_updateBuddySetting, userId); + BIND_INT(m_updateBuddySetting, id); + BIND_STR(m_updateBuddySetting, buddyInfo.settings.find("icon_hash")->first); + BIND_INT(m_updateBuddySetting, TYPE_STRING); + BIND_STR(m_updateBuddySetting, buddyInfo.settings.find("icon_hash")->second.s); + + EXECUTE_STATEMENT(m_updateBuddySetting, "updateBuddySetting query"); + return id; } void SQLite3Backend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { @@ -259,6 +274,16 @@ void SQLite3Backend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { BIND_STR(m_updateBuddy, buddyInfo.legacyName); EXECUTE_STATEMENT(m_updateBuddy, "updateBuddy query"); + +// INSERT OR REPLACE INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?) + BEGIN(m_updateBuddySetting); + BIND_INT(m_updateBuddySetting, userId); + BIND_INT(m_updateBuddySetting, buddyInfo.id); + BIND_STR(m_updateBuddySetting, buddyInfo.settings.find("icon_hash")->first); + BIND_INT(m_updateBuddySetting, TYPE_STRING); + BIND_STR(m_updateBuddySetting, buddyInfo.settings.find("icon_hash")->second.s); + + EXECUTE_STATEMENT(m_updateBuddySetting, "updateBuddySetting query"); } bool SQLite3Backend::getBuddies(long id, std::list &roster) { @@ -292,6 +317,7 @@ bool SQLite3Backend::getBuddies(long id, std::list &roster) { } while(buddy_id == -1 && (ret = sqlite3_step(m_getBuddiesSettings)) == SQLITE_ROW) { + RESET_GET_COUNTER(m_getBuddiesSettings); buddy_id = GET_INT(m_getBuddiesSettings); var.type = GET_INT(m_getBuddiesSettings); @@ -306,6 +332,10 @@ bool SQLite3Backend::getBuddies(long id, std::list &roster) { var.s = val; break; default: + if (buddy_id == b.id) { + buddy_id = -1; + } + continue; break; } if (buddy_id == b.id) {