diff --git a/include/transport/transport.h b/include/transport/transport.h index 50478f87..88b1b3b1 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -48,7 +48,6 @@ namespace Transport { class StorageBackend; class DiscoInfoResponder; class DiscoItemsResponder; - class RosterResponder; class Factory; /// Represents one transport instance. @@ -155,7 +154,6 @@ namespace Transport { StorageBackend *m_storageBackend; DiscoInfoResponder *m_discoInfoResponder; DiscoItemsResponder *m_discoItemsResponder; - RosterResponder *m_rosterResponder; int m_reconnectCount; Config* m_config; std::string m_protocol; diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 5971e68b..e3731378 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -30,6 +30,7 @@ class User; class Component; class StorageBackend; class StorageResponder; +class RosterResponder; /// Manages online XMPP Users. @@ -82,6 +83,7 @@ class UserManager { Component *m_component; StorageBackend *m_storageBackend; StorageResponder *m_storageResponder; + RosterResponder *m_rosterResponder; }; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 0542d589..26cc0b13 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -62,7 +62,13 @@ class NetworkFactory : public Factory { } Buddy *createBuddy(RosterManager *rosterManager, const BuddyInfo &buddyInfo) { - return new LocalBuddy(rosterManager, -1); + LocalBuddy *buddy = new LocalBuddy(rosterManager, buddyInfo.id); + buddy->setAlias(buddyInfo.alias); + buddy->setName(buddyInfo.legacyName); + buddy->setSubscription(buddyInfo.subscription); + buddy->setGroups(buddyInfo.groups); + buddy->setFlags((BuddyFlag) buddyInfo.flags); + return buddy; } private: NetworkPluginServer *m_nps; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 665be1b6..6e715e7b 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -39,6 +39,9 @@ RosterManager::RosterManager(User *user, Component *component){ m_setBuddyTimer = m_component->getFactories()->getTimerFactory()->createTimer(1000); m_RIETimer = m_component->getFactories()->getTimerFactory()->createTimer(5000); m_RIETimer->onTick.connect(boost::bind(&RosterManager::sendRIE, this)); + + + } RosterManager::~RosterManager() { @@ -144,6 +147,16 @@ void RosterManager::setStorageBackend(StorageBackend *storageBackend) { delete m_rosterStorage; } m_rosterStorage = new RosterStorage(m_user, storageBackend); + + std::list roster; + storageBackend->getBuddies(m_user->getUserInfo().id, roster); + + for (std::list::const_iterator it = roster.begin(); it != roster.end(); it++) { + Buddy *buddy = m_component->getFactory()->createBuddy(this, *it); + std::cout << "CREATING BUDDY FROM DATABASE CACHE " << buddy->getName() << "\n"; + m_buddies[buddy->getName()] = buddy; + onBuddySet(buddy); + } } } diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index 45d6615a..f93312ca 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -30,7 +30,9 @@ using namespace boost; namespace Transport { -RosterResponder::RosterResponder(Swift::IQRouter *router) : Swift::GetResponder(router) { +RosterResponder::RosterResponder(Swift::IQRouter *router, StorageBackend *storageBackend, UserManager *userManager) : Swift::Responder(router) { + m_storageBackend = storageBackend; + m_userManager = userManager; } RosterResponder::~RosterResponder() { @@ -43,4 +45,9 @@ bool RosterResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& return true; } +bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { + sendResponse(from, id, boost::shared_ptr(new RosterPayload())); + return true; +} + } diff --git a/src/rosterresponder.h b/src/rosterresponder.h index 269bf670..c4208fea 100644 --- a/src/rosterresponder.h +++ b/src/rosterresponder.h @@ -22,18 +22,24 @@ #include #include "Swiften/Swiften.h" -#include "Swiften/Queries/GetResponder.h" +#include "Swiften/Queries/Responder.h" #include "Swiften/Elements/RosterPayload.h" namespace Transport { -class RosterResponder : public Swift::GetResponder { +class StorageBackend; +class UserManager; + +class RosterResponder : public Swift::Responder { public: - RosterResponder(Swift::IQRouter *router); + RosterResponder(Swift::IQRouter *router, StorageBackend *storageBackend, UserManager *userManager); ~RosterResponder(); private: virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); + virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); + StorageBackend *m_storageBackend; + UserManager *m_userManager; }; } \ No newline at end of file diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 140cb330..398bec2f 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -48,6 +48,7 @@ #define BIND_INT(STATEMENT, VARIABLE) sqlite3_bind_int(STATEMENT, STATEMENT##_id++, VARIABLE) #define BIND_STR(STATEMENT, VARIABLE) sqlite3_bind_text(STATEMENT, STATEMENT##_id++, VARIABLE.c_str(), -1, SQLITE_STATIC) +#define RESET_GET_COUNTER(STATEMENT) STATEMENT##_id_get = 0; #define GET_INT(STATEMENT) sqlite3_column_int(STATEMENT, STATEMENT##_id_get++) #define GET_STR(STATEMENT) (const char *) sqlite3_column_text(STATEMENT, STATEMENT##_id_get++) #define EXECUTE_STATEMENT(STATEMENT, NAME) if(sqlite3_step(STATEMENT) != SQLITE_DONE) {\ @@ -111,7 +112,7 @@ bool SQLite3Backend::connect() { 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_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_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 (?,?,?,?)"); @@ -261,7 +262,7 @@ void SQLite3Backend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { } bool SQLite3Backend::getBuddies(long id, std::list &roster) { -// "SELECT id, user_id, uin, subscription, nickname, groups, flags FROM " + m_prefix + "buddies WHERE user_id=? ORDER BY id ASC" +// SELECT id, uin, subscription, nickname, groups, flags FROM " + m_prefix + "buddies WHERE user_id=? ORDER BY id ASC BEGIN(m_getBuddies); BIND_INT(m_getBuddies, id); @@ -276,6 +277,7 @@ bool SQLite3Backend::getBuddies(long id, std::list &roster) { int ret; while((ret = sqlite3_step(m_getBuddies)) == SQLITE_ROW) { BuddyInfo b; + RESET_GET_COUNTER(m_getBuddies); b.id = GET_INT(m_getBuddies); b.legacyName = GET_STR(m_getBuddies); b.subscription = GET_STR(m_getBuddies); @@ -313,10 +315,10 @@ bool SQLite3Backend::getBuddies(long id, std::list &roster) { } } - if (ret != SQLITE_DONE) { - onStorageError("getBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); - return false; - } +// if (ret != SQLITE_DONE) { +// onStorageError("getBuddiesSettings query", (sqlite3_errmsg(m_db) == NULL ? "" : sqlite3_errmsg(m_db))); +// return false; +// } roster.push_back(b); } diff --git a/src/transport.cpp b/src/transport.cpp index 9fbd9a5c..00b972d0 100644 --- a/src/transport.cpp +++ b/src/transport.cpp @@ -24,7 +24,6 @@ #include "transport/factory.h" #include "discoinforesponder.h" #include "discoitemsresponder.h" -#include "rosterresponder.h" #include "storageparser.h" using namespace Swift; @@ -96,9 +95,6 @@ Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) { m_discoItemsResponder = new DiscoItemsResponder(m_iqRouter); m_discoItemsResponder->start(); - m_rosterResponder = new RosterResponder(m_iqRouter); - m_rosterResponder->start(); - // // m_registerHandler = new SpectrumRegisterHandler(m_component); // m_registerHandler->start(); @@ -109,7 +105,6 @@ Component::~Component() { delete m_entityCapsManager; delete m_capsManager; delete m_capsMemoryStorage; - delete m_rosterResponder; delete m_discoInfoResponder; if (m_component) delete m_component; diff --git a/src/usermanager.cpp b/src/usermanager.cpp index cfafb8f0..4dd66e8f 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -25,6 +25,7 @@ #include "transport/conversationmanager.h" #include "transport/rostermanager.h" #include "storageresponder.h" +#include "rosterresponder.h" namespace Transport { @@ -37,6 +38,9 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { m_storageResponder = new StorageResponder(component->getIQRouter(), m_storageBackend, this); m_storageResponder->start(); + m_rosterResponder = new RosterResponder(component->getIQRouter(), m_storageBackend, this); + m_rosterResponder->start(); + component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1)); m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1)); m_component->getStanzaChannel()->onPresenceReceived.connect(bind(&UserManager::handleGeneralPresenceReceived, this, _1)); @@ -46,6 +50,7 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { UserManager::~UserManager(){ m_storageResponder->stop(); delete m_storageResponder; + delete m_rosterResponder; } void UserManager::addUser(User *user) {