Store icon_hask into databa => working avatars

This commit is contained in:
HanzZ 2011-06-05 11:35:37 +02:00
parent 877d783276
commit 96fb9b61e8
7 changed files with 84 additions and 29 deletions

View file

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

View file

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

View file

@ -109,9 +109,9 @@ Swift::Presence::ref Buddy::generatePresenceStanza(int features, bool only_new)
// caps
// presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::CapsInfo (CONFIG().caps)));
if (features & 0/*TRANSPORT_FEATURE_AVATARS*/) {
// if (features & 0/*TRANSPORT_FEATURE_AVATARS*/) {
presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::VCardUpdate (getIconHash())));
}
// }
}
if (only_new) {

View file

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

View file

@ -47,6 +47,14 @@ RosterManager::RosterManager(User *user, Component *component){
RosterManager::~RosterManager() {
m_setBuddyTimer->stop();
m_RIETimer->stop();
if (m_rosterStorage) {
for (std::map<std::string, Buddy *>::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<std::string, Buddy *>::const_iterator it = m_buddies.begin(); it != m_buddies.end(); it++) {
Buddy *buddy = (*it).second;
delete buddy;

View file

@ -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) {

View file

@ -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<BuddyInfo> &roster) {
@ -292,6 +317,7 @@ bool SQLite3Backend::getBuddies(long id, std::list<BuddyInfo> &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<BuddyInfo> &roster) {
var.s = val;
break;
default:
if (buddy_id == b.id) {
buddy_id = -1;
}
continue;
break;
}
if (buddy_id == b.id) {