void LLPanelGroupGeneral::updateMembers()
{
    mPendingMemberUpdate = FALSE;

    LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);

    if (!mListVisibleMembers
            || !gdatap
            || !gdatap->isMemberDataComplete()
            || gdatap->mMembers.empty())
    {
        return;
    }

    LLTimer update_time;
    update_time.setTimerExpirySec(UPDATE_MEMBERS_SECONDS_PER_FRAME);

    LLAvatarName av_name;

    for( ; mMemberProgress != gdatap->mMembers.end() && !update_time.hasExpired();
            ++mMemberProgress)
    {
        LLGroupMemberData* member = mMemberProgress->second;
        if (!member)
        {
            continue;
        }

        if (LLAvatarNameCache::get(mMemberProgress->first, &av_name))
        {
            addMember(mMemberProgress->second);
        }
        else
        {
            // If name is not cached, onNameCache() should be called when it is cached and add this member to list.
            LLAvatarNameCache::get(mMemberProgress->first,
                                   boost::bind(&LLPanelGroupGeneral::onNameCache,
                                               this, gdatap->getMemberVersion(), member, _2));
        }
    }

    if (mMemberProgress == gdatap->mMembers.end())
    {
        lldebugs << "   member list completed." << llendl;
        mListVisibleMembers->setEnabled(TRUE);
    }
    else
    {
        mPendingMemberUpdate = TRUE;
        mListVisibleMembers->setEnabled(FALSE);
    }
}
void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name)
{
    LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);

    if (!gdatap
            || !gdatap->isMemberDataComplete()
            || gdatap->getMemberVersion() != update_id)
    {
        // Stale data
        return;
    }

    addMember(member);
}
void LLPanelGroupGeneral::onNameCache(const LLUUID& update_id, LLGroupMemberData* member, const LLAvatarName& av_name, const LLUUID& av_id)
{
	avatar_name_cache_connection_map_t::iterator it = mAvatarNameCacheConnections.find(av_id);
	if (it != mAvatarNameCacheConnections.end())
	{
		if (it->second.connected())
		{
			it->second.disconnect();
		}
		mAvatarNameCacheConnections.erase(it);
	}

	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);

	if (!gdatap
		|| !gdatap->isMemberDataComplete()
		|| gdatap->getMemberVersion() != update_id)
	{
		// Stale data
		return;
	}

	addMember(member);
}