diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index e06fdb2bb159769b40d46ca58f46947e7cce2785..fc2a304928e8bfef013229172998334ad3eea7eb 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -390,8 +390,6 @@ class SpectrumNetworkPlugin : public NetworkPlugin { purple_account_disconnect(account); purple_account_set_enabled(account, "spectrum", FALSE); - g_free(account->ui_data); - account->ui_data = NULL; m_accounts.erase(account); purple_accounts_delete(account); diff --git a/backends/libyahoo2/main.cpp b/backends/libyahoo2/main.cpp index c6e2c6b4d1eab4edede3195c907891f4a4f24f68..eda158b017a00af7cce98fee2af3b31c136685ef 100644 --- a/backends/libyahoo2/main.cpp +++ b/backends/libyahoo2/main.cpp @@ -16,6 +16,7 @@ // Swiften #include "Swiften/Swiften.h" +#include "Swiften/Network/TLSConnectionFactory.h" #include "Swiften/TLS/OpenSSL/OpenSSLContextFactory.h" // for signal handler diff --git a/include/transport/mysqlbackend.h b/include/transport/mysqlbackend.h index 47c8757bf085be8b55f55071eebabcde30937105..7b1de13bff1f498df635c9ca212141c46f32d751 100644 --- a/include/transport/mysqlbackend.h +++ b/include/transport/mysqlbackend.h @@ -89,6 +89,9 @@ class MySQLBackend : public StorageBackend void updateBuddy(long userId, const BuddyInfo &buddyInfo); void removeBuddy(long id) {} + void getBuddySetting(long userId, long buddyId, const std::string &variable, int &type, std::string &value) {} + void updateBuddySetting(long userId, long buddyId, const std::string &variable, int type, const std::string &value) {} + void getUserSetting(long userId, const std::string &variable, int &type, std::string &value); void updateUserSetting(long userId, const std::string &variable, const std::string &value); diff --git a/include/transport/pqxxbackend.h b/include/transport/pqxxbackend.h index f571433b340f931bef990b7d5be5a1b0b0d8e3d6..bf5abf25d9b9fd8ea8e5fbfa38a1c0c1a83cdd15 100644 --- a/include/transport/pqxxbackend.h +++ b/include/transport/pqxxbackend.h @@ -89,6 +89,9 @@ class PQXXBackend : public StorageBackend void updateBuddy(long userId, const BuddyInfo &buddyInfo); void removeBuddy(long id) {} + void getBuddySetting(long userId, long buddyId, const std::string &variable, int &type, std::string &value) {} + void updateBuddySetting(long userId, long buddyId, const std::string &variable, int type, const std::string &value) {} + void getUserSetting(long userId, const std::string &variable, int &type, std::string &value); void updateUserSetting(long userId, const std::string &variable, const std::string &value); diff --git a/include/transport/rosterstorage.h b/include/transport/rosterstorage.h index bd5cc7dbe76930bdaf682c4e6862e3df481d4627..726425c4b9df6b0f156392dcf8d82f02b81e7041 100644 --- a/include/transport/rosterstorage.h +++ b/include/transport/rosterstorage.h @@ -40,6 +40,8 @@ class RosterStorage { // will happen if buddy is already added. void storeBuddy(Buddy *buddy); + void removeBuddy(Buddy *buddy); + // Store all buddies from queue immediately. Returns true // if some buddies were stored. bool storeBuddies(); diff --git a/include/transport/sqlite3backend.h b/include/transport/sqlite3backend.h index 5d7372bf5753e68af63d70f4dd77b00d8d815bdd..d654ffa6b58528de3f0d696da1f2e3ee0cf90c78 100644 --- a/include/transport/sqlite3backend.h +++ b/include/transport/sqlite3backend.h @@ -86,7 +86,10 @@ class SQLite3Backend : public StorageBackend long addBuddy(long userId, const BuddyInfo &buddyInfo); void updateBuddy(long userId, const BuddyInfo &buddyInfo); - void removeBuddy(long id) {} + void removeBuddy(long id); + + void getBuddySetting(long userId, long buddyId, const std::string &variable, int &type, std::string &value); + void updateBuddySetting(long userId, long buddyId, const std::string &variable, int type, const std::string &value); void getUserSetting(long userId, const std::string &variable, int &type, std::string &value); void updateUserSetting(long userId, const std::string &variable, const std::string &value); @@ -111,9 +114,12 @@ class SQLite3Backend : public StorageBackend sqlite3_stmt *m_removeUserBuddies; sqlite3_stmt *m_removeUserSettings; sqlite3_stmt *m_removeUserBuddiesSettings; + sqlite3_stmt *m_removeBuddy; + sqlite3_stmt *m_removeBuddySettings; sqlite3_stmt *m_addBuddy; sqlite3_stmt *m_updateBuddy; sqlite3_stmt *m_updateBuddySetting; + sqlite3_stmt *m_getBuddySetting; sqlite3_stmt *m_getBuddies; sqlite3_stmt *m_getBuddiesSettings; sqlite3_stmt *m_setUserOnline; diff --git a/include/transport/storagebackend.h b/include/transport/storagebackend.h index f0a13df5b0f9a7dbade28d1b004a7dc84381c4da..5289010447dea048ab47ae4fb6b00abc1f934bc6 100644 --- a/include/transport/storagebackend.h +++ b/include/transport/storagebackend.h @@ -119,6 +119,9 @@ class StorageBackend virtual void updateBuddy(long userId, const BuddyInfo &buddyInfo) = 0; virtual void removeBuddy(long id) = 0; + virtual void getBuddySetting(long userId, long buddyId, const std::string &variable, int &type, std::string &value) = 0; + virtual void updateBuddySetting(long userId, long buddyId, const std::string &variable, int type, const std::string &value) = 0; + virtual void getUserSetting(long userId, const std::string &variable, int &type, std::string &value) = 0; virtual void updateUserSetting(long userId, const std::string &variable, const std::string &value) = 0; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index e2b3d01e1b60696085ade911b640d865552b4f72..0f89cfb12347265cf9057bca640c2f32f8540898 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -113,6 +113,9 @@ void RosterManager::removeBuddy(const std::string &name) { sendBuddyUnsubscribePresence(buddy); } + if (m_rosterStorage) + m_rosterStorage->removeBuddy(buddy); + unsetBuddy(buddy); delete buddy; } diff --git a/src/rosterstorage.cpp b/src/rosterstorage.cpp index 8716245b4e069e1632b8a68c8a9149a503790f24..0d04f15875d0aa0c73f9038379a754f4a24f11bb 100644 --- a/src/rosterstorage.cpp +++ b/src/rosterstorage.cpp @@ -85,6 +85,12 @@ RosterStorage::~RosterStorage() { m_storageTimer->stop(); } +void RosterStorage::removeBuddy(Buddy *buddy) { + if (buddy->getID() != -1) { + m_storageBackend->removeBuddy(buddy->getID()); + } +} + void RosterStorage::storeBuddy(Buddy *buddy) { if (!buddy) { return; diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index a079c90b8cce8f576605a668621be52c1a7098da..3de7371b0bddf798f3d93a765af1adecdd86ed23 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -88,6 +88,8 @@ SQLite3Backend::~SQLite3Backend(){ FINALIZE_STMT(m_removeUserBuddies); FINALIZE_STMT(m_removeUserSettings); FINALIZE_STMT(m_removeUserBuddiesSettings); + FINALIZE_STMT(m_removeBuddy); + FINALIZE_STMT(m_removeBuddySettings); FINALIZE_STMT(m_addBuddy); FINALIZE_STMT(m_updateBuddy); FINALIZE_STMT(m_getBuddies); @@ -96,6 +98,7 @@ SQLite3Backend::~SQLite3Backend(){ FINALIZE_STMT(m_setUserSetting); FINALIZE_STMT(m_updateUserSetting); FINALIZE_STMT(m_updateBuddySetting); + FINALIZE_STMT(m_getBuddySetting); FINALIZE_STMT(m_setUserOnline); FINALIZE_STMT(m_getOnlineUsers); sqlite3_close(m_db); @@ -122,11 +125,15 @@ bool SQLite3Backend::connect() { PREP_STMT(m_removeUserSettings, "DELETE FROM " + m_prefix + "users_settings WHERE user_id=?"); PREP_STMT(m_removeUserBuddiesSettings, "DELETE FROM " + m_prefix + "buddies_settings WHERE user_id=?"); + PREP_STMT(m_removeBuddy, "DELETE FROM " + m_prefix + "buddies WHERE id=?"); + PREP_STMT(m_removeBuddySettings, "DELETE FROM " + m_prefix + "buddies_settings WHERE buddy_id=?"); + PREP_STMT(m_addBuddy, "INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)"); 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_getBuddySetting, "SELECT type, value FROM " + m_prefix + "buddies_settings WHERE user_id=? AND buddy_id=? AND var=?"); 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 (?,?,?,?)"); @@ -405,6 +412,22 @@ bool SQLite3Backend::getBuddies(long id, std::list &roster) { return true; } +void SQLite3Backend::removeBuddy(long id) { + sqlite3_reset(m_removeBuddy); + sqlite3_bind_int(m_removeBuddy, 1, id); + if(sqlite3_step(m_removeBuddy) != SQLITE_DONE) { + LOG4CXX_ERROR(logger, "removeBuddy query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); + return; + } + + sqlite3_reset(m_removeBuddySettings); + sqlite3_bind_int(m_removeBuddySettings, 1, id); + if(sqlite3_step(m_removeBuddySettings) != SQLITE_DONE) { + LOG4CXX_ERROR(logger, "removeBuddySettings query"<< (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); + return; + } +} + bool SQLite3Backend::removeUser(long id) { sqlite3_reset(m_removeUser); sqlite3_bind_int(m_removeUser, 1, id); @@ -467,6 +490,31 @@ void SQLite3Backend::updateUserSetting(long id, const std::string &variable, con EXECUTE_STATEMENT(m_updateUserSetting, "m_updateUserSetting"); } +void SQLite3Backend::getBuddySetting(long userId, long buddyId, const std::string &variable, int &type, std::string &value) { + BEGIN(m_getBuddySetting); + BIND_INT(m_getBuddySetting, userId); + BIND_INT(m_getBuddySetting, buddyId); + BIND_STR(m_getBuddySetting, variable); + if(sqlite3_step(m_getBuddySetting) == SQLITE_ROW) { + type = GET_INT(m_getBuddySetting); + value = GET_STR(m_getBuddySetting); + } + + int ret; + while((ret = sqlite3_step(m_getBuddySetting)) == SQLITE_ROW) { + } +} + +void SQLite3Backend::updateBuddySetting(long userId, long buddyId, const std::string &variable, int type, const std::string &value) { + BEGIN(m_updateBuddySetting); + BIND_INT(m_updateBuddySetting, userId); + BIND_INT(m_updateBuddySetting, buddyId); + BIND_STR(m_updateBuddySetting, variable); + BIND_INT(m_updateBuddySetting, type); + BIND_STR(m_updateBuddySetting, value); + EXECUTE_STATEMENT(m_updateBuddySetting, "m_updateBuddySetting"); +} + void SQLite3Backend::beginTransaction() { exec("BEGIN TRANSACTION;"); }