Initial documenting for the profile manager and profiles and some FIXME's fixed
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13692 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
parent
c775662e4a
commit
a855752f0c
@ -576,8 +576,9 @@ namespace Online{
|
|||||||
{
|
{
|
||||||
if (now_online)
|
if (now_online)
|
||||||
{
|
{
|
||||||
|
//User came online
|
||||||
relation_info->setOnline(true);
|
relation_info->setOnline(true);
|
||||||
profile->setFriend();
|
profile->setFriend(); //Do this because a user might have accepted a pending friend request.
|
||||||
to_notify.push_back(profile->getUserName());
|
to_notify.push_back(profile->getUserName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,9 @@ namespace Online{
|
|||||||
void Profile::addFriend( const uint32_t id)
|
void Profile::addFriend( const uint32_t id)
|
||||||
{
|
{
|
||||||
assert (m_has_fetched_friends);
|
assert (m_has_fetched_friends);
|
||||||
//FIXME check if it's not already in there
|
for(int i=0; i< m_friends.size(); i++)
|
||||||
|
if(m_friends[i] == id)
|
||||||
|
return;
|
||||||
m_friends.push_back(id);
|
m_friends.push_back(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,4 +262,20 @@ namespace Online{
|
|||||||
return m_achievements;
|
return m_achievements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=============================================================================
|
||||||
|
void Profile::merge(Profile * profile)
|
||||||
|
{
|
||||||
|
assert (profile != NULL);
|
||||||
|
if(!this->m_has_fetched_friends && profile->m_has_fetched_friends)
|
||||||
|
this->m_friends = profile->m_friends;
|
||||||
|
if(!this->m_has_fetched_achievements && profile->m_has_fetched_friends)
|
||||||
|
this->m_achievements = profile->m_achievements;
|
||||||
|
if(this->m_relation_info == NULL && profile->m_relation_info != NULL)
|
||||||
|
{
|
||||||
|
this->m_relation_info = profile->m_relation_info;
|
||||||
|
profile->m_relation_info = NULL; //We don't want the destructor of the profile instance to destroy the relation info
|
||||||
|
}
|
||||||
|
delete profile;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Online
|
} // namespace Online
|
||||||
|
@ -86,10 +86,16 @@ namespace Online{
|
|||||||
bool m_is_current_user;
|
bool m_is_current_user;
|
||||||
uint32_t m_id;
|
uint32_t m_id;
|
||||||
irr::core::stringw m_username;
|
irr::core::stringw m_username;
|
||||||
|
/** information about the relation with the current user */
|
||||||
RelationInfo * m_relation_info;
|
RelationInfo * m_relation_info;
|
||||||
|
/** Whether or not the user of this profile, is a friend of the current user */
|
||||||
bool m_is_friend;
|
bool m_is_friend;
|
||||||
|
|
||||||
bool m_has_fetched_friends;
|
bool m_has_fetched_friends;
|
||||||
|
/**
|
||||||
|
* List of user id's that are friends with the user of this profile.
|
||||||
|
* In case this profile is of the current user, this list also contains any id's of users that still have a friend request pending.
|
||||||
|
* */
|
||||||
std::vector<uint32_t> m_friends;
|
std::vector<uint32_t> m_friends;
|
||||||
|
|
||||||
bool m_has_fetched_achievements;
|
bool m_has_fetched_achievements;
|
||||||
@ -130,15 +136,16 @@ namespace Online{
|
|||||||
RelationInfo * getRelationInfo() { return m_relation_info; }
|
RelationInfo * getRelationInfo() { return m_relation_info; }
|
||||||
void setRelationInfo(RelationInfo * r){ delete m_relation_info; m_relation_info = r;}
|
void setRelationInfo(RelationInfo * r){ delete m_relation_info; m_relation_info = r;}
|
||||||
|
|
||||||
void setCacheBit() { m_cache_bit = true; }
|
void setCacheBit(bool cache_bit) { m_cache_bit = cache_bit; }
|
||||||
void unsetCacheBit() { m_cache_bit = false; }
|
|
||||||
bool getCacheBit() const { return m_cache_bit; }
|
bool getCacheBit() const { return m_cache_bit; }
|
||||||
|
|
||||||
uint32_t getID() const { return m_id; }
|
uint32_t getID() const { return m_id; }
|
||||||
const irr::core::stringw & getUserName() const { return m_username; }
|
const irr::core::stringw & getUserName() const { return m_username; }
|
||||||
|
|
||||||
|
void merge(Profile * profile);
|
||||||
|
|
||||||
}; // class CurrentUser
|
|
||||||
|
}; // class Profile
|
||||||
|
|
||||||
} // namespace Online
|
} // namespace Online
|
||||||
|
|
||||||
|
@ -55,10 +55,8 @@ namespace Online{
|
|||||||
// ============================================================================
|
// ============================================================================
|
||||||
ProfileManager::~ProfileManager()
|
ProfileManager::~ProfileManager()
|
||||||
{
|
{
|
||||||
|
clearPersistent();
|
||||||
ProfilesMap::iterator it;
|
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_cache.end(); ++it ) {
|
for ( it = m_profiles_cache.begin(); it != m_profiles_cache.end(); ++it ) {
|
||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
@ -70,25 +68,31 @@ namespace Online{
|
|||||||
{
|
{
|
||||||
if(m_profiles_cache.size() == m_max_cache_size)
|
if(m_profiles_cache.size() == m_max_cache_size)
|
||||||
{
|
{
|
||||||
profile->setCacheBit();
|
profile->setCacheBit(true);
|
||||||
ProfilesMap::iterator iter;
|
ProfilesMap::iterator iter;
|
||||||
for (iter = m_profiles_cache.begin(); iter != m_profiles_cache.end(); ++iter)
|
for (iter = m_profiles_cache.begin(); iter != m_profiles_cache.end(); ++iter)
|
||||||
{
|
{
|
||||||
if (!iter->second->getCacheBit())
|
if (!iter->second->getCacheBit())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//All cache bits are one! Set then all to zero except the one currently being visited
|
//All cache bits are one! Set them all to zero except the one currently being visited
|
||||||
for (iter = m_profiles_cache.begin(); iter != m_profiles_cache.end(); ++iter)
|
for (iter = m_profiles_cache.begin(); iter != m_profiles_cache.end(); ++iter)
|
||||||
{
|
{
|
||||||
iter->second->unsetCacheBit();
|
iter->second->setCacheBit(false);
|
||||||
}
|
}
|
||||||
profile->setCacheBit();
|
profile->setCacheBit(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
/** Initialisation before the object is displayed. If necessary this function
|
||||||
|
* will pause the race if it is running (i.e. world exists). While only some
|
||||||
|
* of the screen can be shown during the race (via the in-game menu you
|
||||||
|
* can get the options screen and the help screens only). This is used by
|
||||||
|
* the RaceResultGUI to leave the race running (for the end animation) while
|
||||||
|
* the results are being shown.
|
||||||
|
*/
|
||||||
void ProfileManager::directToCache(Profile * profile)
|
void ProfileManager::directToCache(Profile * profile)
|
||||||
{
|
{
|
||||||
assert(profile != NULL);
|
assert(profile != NULL);
|
||||||
@ -99,10 +103,8 @@ namespace Online{
|
|||||||
{
|
{
|
||||||
if (!iter->second->getCacheBit())
|
if (!iter->second->getCacheBit())
|
||||||
{
|
{
|
||||||
ProfilesMap::iterator toErase = iter;
|
delete iter->second;
|
||||||
++iter;
|
m_profiles_cache.erase(iter);
|
||||||
delete toErase->second;
|
|
||||||
m_profiles_cache.erase(toErase);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -115,13 +117,16 @@ namespace Online{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
/**
|
||||||
|
* Adds a profile to the persistent map.
|
||||||
|
* If a profile with the same id is already in there, the profiles are "merged" with as goal saving as much information.
|
||||||
|
* (i.e. one profile instance could have already fetched the friends, while the other could have fetched the achievements.)
|
||||||
|
*/
|
||||||
void ProfileManager::addPersistent(Profile * profile)
|
void ProfileManager::addPersistent(Profile * profile)
|
||||||
{
|
{
|
||||||
if(inPersistent(profile->getID()))
|
if(inPersistent(profile->getID()))
|
||||||
{
|
{
|
||||||
delete m_profiles_persistent[profile->getID()];
|
m_profiles_persistent[profile->getID()]->merge(profile);
|
||||||
m_profiles_persistent[profile->getID()] = profile;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -129,7 +134,9 @@ namespace Online{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
/**
|
||||||
|
* Removes and deletes an entry from the persistent map.
|
||||||
|
*/
|
||||||
void ProfileManager::deleteFromPersistent(const uint32_t id)
|
void ProfileManager::deleteFromPersistent(const uint32_t id)
|
||||||
{
|
{
|
||||||
if (inPersistent(id))
|
if (inPersistent(id))
|
||||||
@ -163,7 +170,7 @@ namespace Online{
|
|||||||
addToCache(profile);
|
addToCache(profile);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Log::warn("ProfileManager::removePersistent", "Tried to move profile with id %d from persistent to cache while not present", id);
|
Log::warn("ProfileManager::moveToCache", "Tried to move profile with id %d from persistent to cache while not present", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@ -171,20 +178,11 @@ namespace Online{
|
|||||||
void ProfileManager::addToCache(Profile * profile)
|
void ProfileManager::addToCache(Profile * profile)
|
||||||
{
|
{
|
||||||
if(inPersistent(profile->getID()))
|
if(inPersistent(profile->getID()))
|
||||||
{
|
m_profiles_persistent[profile->getID()]->merge(profile);
|
||||||
//FIXME should do updating of values
|
|
||||||
}
|
|
||||||
else if(cacheHit(profile->getID()))
|
else if(cacheHit(profile->getID()))
|
||||||
{
|
m_profiles_cache[profile->getID()]->merge(profile);
|
||||||
//FIXME should do updating of values
|
|
||||||
delete profile;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
|
||||||
directToCache(profile);
|
directToCache(profile);
|
||||||
}
|
|
||||||
Log::info("persistent size","%d", m_profiles_persistent.size());
|
|
||||||
Log::info("cache size","%d", m_profiles_cache.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
@ -192,9 +190,7 @@ namespace Online{
|
|||||||
bool ProfileManager::inPersistent(const uint32_t id)
|
bool ProfileManager::inPersistent(const uint32_t id)
|
||||||
{
|
{
|
||||||
if (m_profiles_persistent.find(id) != m_profiles_persistent.end())
|
if (m_profiles_persistent.find(id) != m_profiles_persistent.end())
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,9 +44,15 @@ namespace Online{
|
|||||||
|
|
||||||
typedef std::map<uint32_t, Profile*> ProfilesMap;
|
typedef std::map<uint32_t, Profile*> ProfilesMap;
|
||||||
|
|
||||||
|
/** A map of profiles that is persistent. (i.e. no automatic removing happens) Normally used for the current user's profile and friends. */
|
||||||
|
ProfilesMap m_profiles_persistent;
|
||||||
|
/**
|
||||||
|
* Any profiles that don't go into the persistent map, go here.
|
||||||
|
* Using a Least Recent Used caching algorithm with age bits to remove entries when the max size is reached.
|
||||||
|
**/
|
||||||
ProfilesMap m_profiles_cache;
|
ProfilesMap m_profiles_cache;
|
||||||
ProfilesMap m_profiles_persistent; // current user and friends
|
|
||||||
Profile * m_currently_visiting;
|
Profile * m_currently_visiting;
|
||||||
|
/** The max size of the m_profiles cache. */
|
||||||
static const unsigned int m_max_cache_size = 20;
|
static const unsigned int m_max_cache_size = 20;
|
||||||
|
|
||||||
void iterateCache(Profile * profile);
|
void iterateCache(Profile * profile);
|
||||||
@ -65,6 +71,7 @@ namespace Online{
|
|||||||
void setVisiting(const uint32_t id);
|
void setVisiting(const uint32_t id);
|
||||||
bool cacheHit(const uint32_t id);
|
bool cacheHit(const uint32_t id);
|
||||||
bool inPersistent(const uint32_t id);
|
bool inPersistent(const uint32_t id);
|
||||||
|
/** \return the instance of the profile that's currently being visited */
|
||||||
Profile * getVisitingProfile() {return m_currently_visiting;}
|
Profile * getVisitingProfile() {return m_currently_visiting;}
|
||||||
Profile * getProfileByID(const uint32_t id);
|
Profile * getProfileByID(const uint32_t id);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user