From d40dd67e961314df53eab3509552a4b9211647ac Mon Sep 17 00:00:00 2001 From: unitraxx Date: Mon, 19 Aug 2013 19:31:50 +0000 Subject: [PATCH] Some additions to some stuff. Mostly the profile manager, where I've added a separate queue for persistent profiles. (I.e. the current user and his friends.) We should definitely put a max on the number of friends. (Pretty low, and remove the limit for premium ;) ) git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13515 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- src/guiengine/dialog_queue.hpp | 2 +- src/guiengine/modaldialog.cpp | 2 + src/online/current_user.cpp | 4 +- src/online/profile.cpp | 28 ++++++--- src/online/profile.hpp | 17 ++--- src/online/profile_manager.cpp | 63 ++++++++++++++++--- src/online/profile_manager.hpp | 5 ++ .../dialogs/user_info_dialog.cpp | 14 ++++- .../dialogs/user_info_dialog.hpp | 6 +- 9 files changed, 102 insertions(+), 39 deletions(-) diff --git a/src/guiengine/dialog_queue.hpp b/src/guiengine/dialog_queue.hpp index 08c3c87f4..8f4071693 100644 --- a/src/guiengine/dialog_queue.hpp +++ b/src/guiengine/dialog_queue.hpp @@ -46,7 +46,7 @@ namespace GUIEngine /**Singleton */ static DialogQueue * get(); static void deallocate(); - void pushDialog(ModalDialog * dialog, bool closes_any_dialog); + void pushDialog(ModalDialog * dialog, bool closes_any_dialog = false); void update(); }; diff --git a/src/guiengine/modaldialog.cpp b/src/guiengine/modaldialog.cpp index 8f9b98b04..e2a065258 100644 --- a/src/guiengine/modaldialog.cpp +++ b/src/guiengine/modaldialog.cpp @@ -51,6 +51,8 @@ ModalDialog::ModalDialog(const float percentWidth, const float percentHeight, bo { m_dialog_location = location; m_init = false; + m_percent_width = percentWidth; + m_percent_height = percentHeight; if(do_init) doInit(); } diff --git a/src/online/current_user.cpp b/src/online/current_user.cpp index 5e479db44..2e159d52b 100644 --- a/src/online/current_user.cpp +++ b/src/online/current_user.cpp @@ -138,7 +138,7 @@ namespace Online{ int username_fetched = input->get("username", &username); uint32_t userid(0); int userid_fetched = input->get("userid", &userid); - m_profile = new Profile(userid, username, false, true); + m_profile = new Profile(userid, username, true); assert(token_fetched && username_fetched && userid_fetched); m_state = US_SIGNED_IN; if(getSaveSession()) @@ -147,7 +147,7 @@ namespace Online{ UserConfigParams::m_saved_token = getToken(); UserConfigParams::m_saved_session = true; } - ProfileManager::get()->addToCache(m_profile); + ProfileManager::get()->addPersistent(m_profile); m_profile->fetchFriends(); HTTPManager::get()->startPolling(); } diff --git a/src/online/profile.cpp b/src/online/profile.cpp index 71d74fe03..8cafc64e9 100644 --- a/src/online/profile.cpp +++ b/src/online/profile.cpp @@ -48,23 +48,22 @@ namespace Online{ // ============================================================================ Profile::Profile( const uint32_t & userid, const irr::core::stringw & username, - bool auto_delete, bool is_current_user) { - setState (S_READY); - m_auto_delete = auto_delete; + m_state = S_READY; m_cache_bit = true; m_id = userid; m_is_current_user = is_current_user; m_username = username; m_has_fetched_friends = false; m_relation_info = NULL; + m_is_friend = false; } - Profile::Profile(const XMLNode * xml, ConstructorType type, bool auto_delete) + Profile::Profile(const XMLNode * xml, ConstructorType type) { m_relation_info = NULL; - m_auto_delete = auto_delete; + m_is_friend = false; if(type == C_RELATION_INFO){ std::string is_online_string(""); xml->get("online", &is_online_string); @@ -81,6 +80,10 @@ namespace Online{ xml->get("is_asker", &is_asker_string); is_asker = is_asker_string == "yes"; } + else + { + m_is_friend = true; + } m_relation_info = new RelationInfo(date, is_online, is_pending, is_asker); xml = xml->getNode("user"); } @@ -90,7 +93,7 @@ namespace Online{ m_cache_bit = true; m_has_fetched_friends = false; m_is_current_user = (m_id == CurrentUser::get()->getID()); - setState (S_READY); + m_state = S_READY; } // ============================================================================ Profile::~Profile() @@ -104,7 +107,7 @@ namespace Online{ assert(CurrentUser::get()->isRegisteredUser()); if(m_has_fetched_friends) return; - setState (S_FETCHING); + m_state = S_FETCHING; requestFriendsList(); } // ============================================================================ @@ -118,14 +121,19 @@ namespace Online{ { Profile * profile; if(m_is_current_user) + { profile = new Profile(friends_xml->getNode(i) , C_RELATION_INFO); + ProfileManager::get()->addPersistent(profile); + } else + { profile = new Profile(friends_xml->getNode(i)->getNode("user"), C_DEFAULT); + ProfileManager::get()->addToCache(profile); + } m_friends.push_back(profile->getID()); - ProfileManager::get()->addToCache(profile); } m_has_fetched_friends = true; - Profile::setState (Profile::S_READY); + m_state = S_READY; } @@ -154,7 +162,7 @@ namespace Online{ const std::vector & Profile::getFriends() { - assert (m_has_fetched_friends && getState() == S_READY); + assert (m_has_fetched_friends && m_state == S_READY); return m_friends; } // ============================================================================ diff --git a/src/online/profile.hpp b/src/online/profile.hpp index fefe8dcd4..ab2de728b 100644 --- a/src/online/profile.hpp +++ b/src/online/profile.hpp @@ -76,20 +76,17 @@ namespace Online{ S_READY }; - Synchronised m_state; + State m_state; bool m_is_current_user; uint32_t m_id; irr::core::stringw m_username; RelationInfo * m_relation_info; + bool m_is_friend; bool m_has_fetched_friends; std::vector m_friends; bool m_cache_bit; - bool m_auto_delete; - - void setState(State state) { m_state.setAtomic(state); } - const State getState() const { return m_state.getAtomic(); } void requestFriendsList(); void friendsListCallback(const XMLNode * input); @@ -97,25 +94,23 @@ namespace Online{ public: Profile( const uint32_t & userid, const irr::core::stringw & username, - bool auto_delete = true, bool is_current_user = false); Profile( const XMLNode * xml, - ConstructorType type = C_DEFAULT, - bool auto_delete = true); + ConstructorType type = C_DEFAULT); ~Profile(); void fetchFriends(); const std::vector & getFriends(); - bool isFetching() const { return getState() == S_FETCHING; } - bool isReady() const { return getState() == S_READY; } + bool isFetching() const { return m_state == S_FETCHING; } + bool isReady() const { return m_state == S_READY; } bool isCurrentUser() const { return m_is_current_user; } + bool isFriend() const { return m_is_friend; } RelationInfo * getRelationInfo() { return m_relation_info; } void setCacheBit() { m_cache_bit = true; } void unsetCacheBit() { m_cache_bit = false; } bool getCacheBit() const { return m_cache_bit; } - bool canAutoDelete() const { return m_auto_delete; } uint32_t getID() const { return m_id; } const irr::core::stringw & getUserName() const { return m_username; } diff --git a/src/online/profile_manager.cpp b/src/online/profile_manager.cpp index 72388a59d..023caa518 100644 --- a/src/online/profile_manager.cpp +++ b/src/online/profile_manager.cpp @@ -51,6 +51,18 @@ namespace Online{ assert(m_max_cache_size > 1); } + // ============================================================================ + ProfileManager::~ProfileManager() + { + ProfilesMap::iterator it; + for ( it = m_profiles_persistent.begin(); it != m_profiles_persistent.end(); ++it ) { + delete it->second; + } + for ( it = m_profiles_cache.begin(); it != m_profiles_persistent.end(); ++it ) { + delete it->second; + } + } + // ============================================================================ void ProfileManager::iterateCache(Profile * profile) @@ -84,10 +96,13 @@ namespace Online{ ProfilesMap::iterator iter; for (iter = m_profiles_cache.begin(); iter != m_profiles_cache.end();) { - if (!iter->second->getCacheBit() && iter->second->canAutoDelete()) + if (!iter->second->getCacheBit()) { - m_profiles_cache.erase(iter++); - continue; + ProfilesMap::iterator toErase = iter; + ++iter; + delete toErase->second; + m_profiles_cache.erase(toErase); + break; } else ++iter; @@ -100,9 +115,30 @@ namespace Online{ // ============================================================================ + void ProfileManager::addPersistent(Profile * profile) + { + assert (!inPersistent(profile->getID())); + m_profiles_persistent[profile->getID()] = profile; + } + // ============================================================================ + + void ProfileManager::removePersistent(const uint32_t id) + { + assert (inPersistent(id)); + delete m_profiles_persistent[id]; + m_profiles_persistent.erase(id); + } + + // ============================================================================ + void ProfileManager::addToCache(Profile * profile) { - if(cacheHit(profile->getID())) + + if(inPersistent(profile->getID())) + { + //FIXME should do updating of values + } + else if(cacheHit(profile->getID())) { //FIXME should do updating of values delete profile; @@ -115,6 +151,16 @@ namespace Online{ // ============================================================================ + bool ProfileManager::inPersistent(const uint32_t id) + { + if (m_profiles_persistent.find(id) != m_profiles_persistent.end()) + { + return true; + } + return false; + } + + // ============================================================================ bool ProfileManager::cacheHit(const uint32_t id) { @@ -129,18 +175,15 @@ namespace Online{ // ============================================================================ void ProfileManager::setVisiting(const uint32_t id) { - if(cacheHit(id)) - { - m_currently_visiting = m_profiles_cache[id]; - } - else - m_currently_visiting = NULL; + m_currently_visiting = getProfileByID(id); } // ============================================================================ Profile * ProfileManager::getProfileByID(const uint32_t id) { + if(inPersistent(id)) + return m_profiles_persistent[id]; if(cacheHit(id)) return m_profiles_cache[id]; return NULL; diff --git a/src/online/profile_manager.hpp b/src/online/profile_manager.hpp index cb07a2992..13bedb77a 100644 --- a/src/online/profile_manager.hpp +++ b/src/online/profile_manager.hpp @@ -40,10 +40,12 @@ namespace Online{ private: ProfileManager (); + ~ProfileManager (); typedef std::map ProfilesMap; ProfilesMap m_profiles_cache; + ProfilesMap m_profiles_persistent; // current user and friends Profile * m_currently_visiting; static const unsigned int m_max_cache_size = 20; @@ -56,8 +58,11 @@ namespace Online{ static void deallocate(); void addToCache(Profile * profile); + void addPersistent(Profile * profile); + void removePersistent(const uint32_t id); void setVisiting(const uint32_t id); bool cacheHit(const uint32_t id); + bool inPersistent(const uint32_t id); Profile * getVisitingProfile() {return m_currently_visiting;} Profile * getProfileByID(const uint32_t id); diff --git a/src/states_screens/dialogs/user_info_dialog.cpp b/src/states_screens/dialogs/user_info_dialog.cpp index 549d7818c..777db3cd7 100644 --- a/src/states_screens/dialogs/user_info_dialog.cpp +++ b/src/states_screens/dialogs/user_info_dialog.cpp @@ -41,14 +41,14 @@ using namespace Online; // ----------------------------------------------------------------------------- -UserInfoDialog::UserInfoDialog(uint32_t visiting_id) - : ModalDialog(0.8f,0.8f), m_visiting_id(visiting_id) +UserInfoDialog::UserInfoDialog(uint32_t showing_id) + : ModalDialog(0.8f,0.8f), m_showing_id(showing_id) { m_self_destroy = false; m_enter_profile = false; loadFromFile("online/user_info_dialog.stkgui"); - m_profile = ProfileManager::get()->getProfileByID(visiting_id); + m_profile = ProfileManager::get()->getProfileByID(showing_id); m_name_widget = getWidget("name"); assert(m_name_widget != NULL); m_name_widget->setText(m_profile->getUserName(),false); @@ -70,6 +70,14 @@ UserInfoDialog::UserInfoDialog(uint32_t visiting_id) } +void UserInfoDialog::beforeAddingWidgets() +{ + /*m_accept_widget->setVisible(false); + m_decline_widget->setVisible(false);*/ +} + + + // ----------------------------------------------------------------------------- UserInfoDialog::~UserInfoDialog() { diff --git a/src/states_screens/dialogs/user_info_dialog.hpp b/src/states_screens/dialogs/user_info_dialog.hpp index af370f322..9ca8397ce 100644 --- a/src/states_screens/dialogs/user_info_dialog.hpp +++ b/src/states_screens/dialogs/user_info_dialog.hpp @@ -40,7 +40,7 @@ private: bool m_self_destroy; bool m_enter_profile; - const uint32_t m_visiting_id; + const uint32_t m_showing_id; Online::Profile * m_profile; GUIEngine::LabelWidget * m_name_widget; @@ -56,9 +56,11 @@ private: void requestJoin(); public: - UserInfoDialog(uint32_t visiting_id); + UserInfoDialog(uint32_t showing_id); ~UserInfoDialog(); + virtual void beforeAddingWidgets(); + void onEnterPressedInternal(); GUIEngine::EventPropagation processEvent(const std::string& eventSource);