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 +}