core/AdminCache.cpp
changeset 336 3f4073018d76
parent 335 02cc96355b09
child 345 df0b05b4f50d
     1.1 --- a/core/AdminCache.cpp	Wed Jan 24 21:51:49 2007 +0000
     1.2 +++ b/core/AdminCache.cpp	Wed Jan 24 23:43:31 2007 +0000
     1.3 @@ -2,6 +2,7 @@
     1.4  #include <assert.h>
     1.5  #include "AdminCache.h"
     1.6  #include "ShareSys.h"
     1.7 +#include "ForwardSys.h"
     1.8  
     1.9  AdminCache g_Admins;
    1.10  
    1.11 @@ -13,6 +14,7 @@
    1.12  	m_pMemory = m_pStrings->GetMemTable();
    1.13  	m_FreeGroupList = m_FirstGroup = m_LastGroup = INVALID_GROUP_ID;
    1.14  	m_pGroups = sm_trie_create();
    1.15 +	m_pCacheFwd = NULL;
    1.16  }
    1.17  
    1.18  AdminCache::~AdminCache()
    1.19 @@ -39,9 +41,16 @@
    1.20  
    1.21  void AdminCache::OnSourceModAllInitialized()
    1.22  {
    1.23 +	m_pCacheFwd = g_Forwards.CreateForward("OnRebuildAdminCache", ET_Ignore, 1, NULL, Param_Cell);
    1.24  	g_ShareSys.AddInterface(NULL, this);
    1.25  }
    1.26  
    1.27 +void AdminCache::OnSourceModShutdown()
    1.28 +{
    1.29 +	g_Forwards.ReleaseForward(m_pCacheFwd);
    1.30 +	m_pCacheFwd = NULL;
    1.31 +}
    1.32 +
    1.33  void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, AdminFlag flag)
    1.34  {
    1.35  	if (type == Override_Command)
    1.36 @@ -273,7 +282,7 @@
    1.37  	return pGroup->addflags[flag];
    1.38  }
    1.39  
    1.40 -unsigned int AdminCache::GetGroupAddFlags(GroupId id, AdminFlag flags[], unsigned int total)
    1.41 +unsigned int AdminCache::GetGroupAddFlagBits(GroupId id, bool flags[], unsigned int total)
    1.42  {
    1.43  	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
    1.44  	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
    1.45 @@ -281,19 +290,16 @@
    1.46  		return 0;
    1.47  	}
    1.48  
    1.49 -	unsigned int r = 0;
    1.50 +	unsigned int i;
    1.51  
    1.52 -	for (unsigned int i = Admin_None + 1;
    1.53 -		 i < AdminFlags_TOTAL && r < total;
    1.54 +	for (i = Admin_None;
    1.55 +		 i < AdminFlags_TOTAL && i < total;
    1.56  		 i++)
    1.57  	{
    1.58 -		if (pGroup->addflags[i])
    1.59 -		{
    1.60 -			flags[r++] = (AdminFlag)i;
    1.61 -		}
    1.62 +		flags[i] = pGroup->addflags[i];
    1.63  	}
    1.64  
    1.65 -	return r;
    1.66 +	return i;
    1.67  }
    1.68  
    1.69  void AdminCache::SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled)
    1.70 @@ -566,3 +572,46 @@
    1.71  	/* Reset the memory table */
    1.72  	m_pMemory->Reset();
    1.73  }
    1.74 +
    1.75 +void AdminCache::AddAdminListener(IAdminListener *pListener)
    1.76 +{
    1.77 +	m_hooks.push_back(pListener);
    1.78 +}
    1.79 +
    1.80 +void AdminCache::RemoveAdminListener(IAdminListener *pListener)
    1.81 +{
    1.82 +	m_hooks.remove(pListener);
    1.83 +}
    1.84 +
    1.85 +void AdminCache::DumpAdminCache(int cache_flags, bool rebuild)
    1.86 +{
    1.87 +	if (cache_flags & ADMIN_CACHE_OVERRIDES)
    1.88 +	{
    1.89 +		DumpCommandOverrideCache(Override_Command);
    1.90 +		DumpCommandOverrideCache(Override_CommandGroup);
    1.91 +	}
    1.92 +
    1.93 +	if ((cache_flags & ADMIN_CACHE_ADMINS) ||
    1.94 +		(cache_flags & ADMIN_CACHE_GROUPS))
    1.95 +	{
    1.96 +		/* Make sure the flag is set */
    1.97 +		cache_flags |= ADMIN_CACHE_ADMINS;
    1.98 +		/* :TODO: Dump admin cache */
    1.99 +	}
   1.100 +
   1.101 +	if (cache_flags & ADMIN_CACHE_GROUPS)
   1.102 +	{
   1.103 +		InvalidateGroupCache();
   1.104 +	}
   1.105 +
   1.106 +	if (rebuild)
   1.107 +	{
   1.108 +		List<IAdminListener *>::iterator iter;
   1.109 +		IAdminListener *pListener;
   1.110 +		for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
   1.111 +		{
   1.112 +			pListener = (*iter);
   1.113 +			pListener->OnRebuildAdminCache(cache_flags);
   1.114 +		}
   1.115 +	}
   1.116 +}