core/AdminCache.cpp
author David Anderson <dvander@alliedmods.net>
Thu Jan 25 04:37:23 2007 +0000 (2007-01-25)
changeset 345 df0b05b4f50d
parent 336 3f4073018d76
child 370 d3a484f98f6d
permissions -rw-r--r--
Added more path building stuff
Addeed text parsing API
dvander@335
     1
#include <string.h>
dvander@335
     2
#include <assert.h>
dvander@335
     3
#include "AdminCache.h"
dvander@335
     4
#include "ShareSys.h"
dvander@336
     5
#include "ForwardSys.h"
dvander@335
     6
dvander@335
     7
AdminCache g_Admins;
dvander@335
     8
dvander@335
     9
AdminCache::AdminCache()
dvander@335
    10
{
dvander@335
    11
	m_pCmdOverrides = NULL;
dvander@335
    12
	m_pCmdGrpOverrides = NULL;
dvander@335
    13
	m_pStrings = new BaseStringTable(1024);
dvander@335
    14
	m_pMemory = m_pStrings->GetMemTable();
dvander@335
    15
	m_FreeGroupList = m_FirstGroup = m_LastGroup = INVALID_GROUP_ID;
dvander@335
    16
	m_pGroups = sm_trie_create();
dvander@336
    17
	m_pCacheFwd = NULL;
dvander@335
    18
}
dvander@335
    19
dvander@335
    20
AdminCache::~AdminCache()
dvander@335
    21
{
dvander@335
    22
	if (m_pCmdGrpOverrides)
dvander@335
    23
	{
dvander@335
    24
		sm_trie_destroy(m_pCmdGrpOverrides);
dvander@335
    25
	}
dvander@335
    26
dvander@335
    27
	if (m_pCmdOverrides)
dvander@335
    28
	{
dvander@335
    29
		sm_trie_destroy(m_pCmdOverrides);
dvander@335
    30
	}
dvander@335
    31
dvander@335
    32
	InvalidateGroupCache();
dvander@335
    33
dvander@335
    34
	if (m_pGroups)
dvander@335
    35
	{
dvander@335
    36
		sm_trie_destroy(m_pGroups);
dvander@335
    37
	}
dvander@335
    38
dvander@335
    39
	delete m_pStrings;
dvander@335
    40
}
dvander@335
    41
dvander@335
    42
void AdminCache::OnSourceModAllInitialized()
dvander@335
    43
{
dvander@336
    44
	m_pCacheFwd = g_Forwards.CreateForward("OnRebuildAdminCache", ET_Ignore, 1, NULL, Param_Cell);
dvander@335
    45
	g_ShareSys.AddInterface(NULL, this);
dvander@335
    46
}
dvander@335
    47
dvander@336
    48
void AdminCache::OnSourceModShutdown()
dvander@336
    49
{
dvander@336
    50
	g_Forwards.ReleaseForward(m_pCacheFwd);
dvander@336
    51
	m_pCacheFwd = NULL;
dvander@336
    52
}
dvander@336
    53
dvander@335
    54
void AdminCache::AddCommandOverride(const char *cmd, OverrideType type, AdminFlag flag)
dvander@335
    55
{
dvander@335
    56
	if (type == Override_Command)
dvander@335
    57
	{
dvander@335
    58
		_AddCommandOverride(cmd, flag);
dvander@335
    59
	} else if (type == Override_CommandGroup) {
dvander@335
    60
		_AddCommandGroupOverride(cmd, flag);
dvander@335
    61
	}
dvander@335
    62
}
dvander@335
    63
dvander@335
    64
bool AdminCache::GetCommandOverride(const char *cmd, OverrideType type, AdminFlag *pFlag)
dvander@335
    65
{
dvander@335
    66
	if (type == Override_Command)
dvander@335
    67
	{
dvander@335
    68
		return _GetCommandOverride(cmd, pFlag);
dvander@335
    69
	} else if (type == Override_CommandGroup) {
dvander@335
    70
		return _GetCommandGroupOverride(cmd, pFlag);
dvander@335
    71
	}
dvander@335
    72
dvander@335
    73
	return false;
dvander@335
    74
}
dvander@335
    75
dvander@335
    76
void AdminCache::UnsetCommandOverride(const char *cmd, OverrideType type)
dvander@335
    77
{
dvander@335
    78
	if (type == Override_Command)
dvander@335
    79
	{
dvander@335
    80
		return _UnsetCommandOverride(cmd);
dvander@335
    81
	} else if (type == Override_CommandGroup) {
dvander@335
    82
		return _UnsetCommandGroupOverride(cmd);
dvander@335
    83
	}
dvander@335
    84
}
dvander@335
    85
dvander@335
    86
void AdminCache::_AddCommandGroupOverride(const char *group, AdminFlag flag)
dvander@335
    87
{
dvander@335
    88
	if (!m_pCmdGrpOverrides)
dvander@335
    89
	{
dvander@335
    90
		m_pCmdGrpOverrides = sm_trie_create();
dvander@335
    91
	}
dvander@335
    92
dvander@335
    93
	/* :TODO: Notify command system */
dvander@335
    94
dvander@335
    95
	sm_trie_insert(m_pCmdGrpOverrides, group, (void *)flag);
dvander@335
    96
}
dvander@335
    97
dvander@335
    98
void AdminCache::_AddCommandOverride(const char *cmd, AdminFlag flag)
dvander@335
    99
{
dvander@335
   100
	if (!m_pCmdOverrides)
dvander@335
   101
	{
dvander@335
   102
		m_pCmdOverrides = sm_trie_create();
dvander@335
   103
	}
dvander@335
   104
dvander@335
   105
	/* :TODO: Notify command system */
dvander@335
   106
dvander@335
   107
	sm_trie_insert(m_pCmdOverrides, cmd, (void *)flag);
dvander@335
   108
}
dvander@335
   109
dvander@335
   110
bool AdminCache::_GetCommandGroupOverride(const char *cmd, AdminFlag *pFlag)
dvander@335
   111
{
dvander@335
   112
	if (!m_pCmdGrpOverrides)
dvander@335
   113
	{
dvander@335
   114
		return false;
dvander@335
   115
	}
dvander@335
   116
dvander@335
   117
	if (!pFlag)
dvander@335
   118
	{
dvander@335
   119
		return sm_trie_retrieve(m_pCmdGrpOverrides, cmd, NULL);
dvander@335
   120
	} else {
dvander@335
   121
		void *object;
dvander@335
   122
		bool ret;
dvander@335
   123
		if (ret=sm_trie_retrieve(m_pCmdGrpOverrides, cmd, &object))
dvander@335
   124
		{
dvander@335
   125
			*pFlag = (AdminFlag)(int)object;
dvander@335
   126
		}
dvander@335
   127
		return ret;
dvander@335
   128
	}
dvander@335
   129
}
dvander@335
   130
dvander@335
   131
bool AdminCache::_GetCommandOverride(const char *cmd, AdminFlag *pFlag)
dvander@335
   132
{
dvander@335
   133
	if (!m_pCmdOverrides)
dvander@335
   134
	{
dvander@335
   135
		return false;
dvander@335
   136
	}
dvander@335
   137
dvander@335
   138
	if (!pFlag)
dvander@335
   139
	{
dvander@335
   140
		return sm_trie_retrieve(m_pCmdOverrides, cmd, NULL);
dvander@335
   141
	} else {
dvander@335
   142
		void *object;
dvander@335
   143
		bool ret;
dvander@335
   144
		if (ret=sm_trie_retrieve(m_pCmdOverrides, cmd, &object))
dvander@335
   145
		{
dvander@335
   146
			*pFlag = (AdminFlag)(int)object;
dvander@335
   147
		}
dvander@335
   148
		return ret;
dvander@335
   149
	}
dvander@335
   150
}
dvander@335
   151
dvander@335
   152
void AdminCache::_UnsetCommandGroupOverride(const char *group)
dvander@335
   153
{
dvander@335
   154
	if (!m_pCmdGrpOverrides)
dvander@335
   155
	{
dvander@335
   156
		return;
dvander@335
   157
	}
dvander@335
   158
dvander@335
   159
	/* :TODO: Notify command system */
dvander@335
   160
dvander@335
   161
	sm_trie_delete(m_pCmdGrpOverrides, group);
dvander@335
   162
}
dvander@335
   163
dvander@335
   164
void AdminCache::_UnsetCommandOverride(const char *cmd)
dvander@335
   165
{
dvander@335
   166
	if (!m_pCmdOverrides)
dvander@335
   167
	{
dvander@335
   168
		return;
dvander@335
   169
	}
dvander@335
   170
dvander@335
   171
	/* :TODO: Notify command system */
dvander@335
   172
dvander@335
   173
	sm_trie_delete(m_pCmdOverrides, cmd);
dvander@335
   174
}
dvander@335
   175
dvander@335
   176
void AdminCache::DumpCommandOverrideCache(OverrideType type)
dvander@335
   177
{
dvander@335
   178
	if (type == Override_Command && m_pCmdOverrides)
dvander@335
   179
	{
dvander@335
   180
		sm_trie_clear(m_pCmdOverrides);
dvander@335
   181
	} else if (type == Override_CommandGroup && m_pCmdGrpOverrides) {
dvander@335
   182
		sm_trie_clear(m_pCmdGrpOverrides);
dvander@335
   183
	}
dvander@335
   184
}
dvander@335
   185
dvander@335
   186
GroupId AdminCache::AddGroup(const char *group_name)
dvander@335
   187
{
dvander@335
   188
	if (sm_trie_retrieve(m_pGroups, group_name, NULL))
dvander@335
   189
	{
dvander@335
   190
		return INVALID_GROUP_ID;
dvander@335
   191
	}
dvander@335
   192
dvander@335
   193
	GroupId id;
dvander@335
   194
	AdminGroup *pGroup;
dvander@335
   195
	if (m_FreeGroupList != INVALID_GROUP_ID)
dvander@335
   196
	{
dvander@335
   197
		pGroup = (AdminGroup *)m_pMemory->GetAddress(m_FreeGroupList);
dvander@335
   198
		assert(pGroup->magic == GRP_MAGIC_UNSET);
dvander@335
   199
		id = m_FreeGroupList;
dvander@335
   200
		m_FreeGroupList = pGroup->next_grp;
dvander@335
   201
	} else {
dvander@335
   202
		id = m_pMemory->CreateMem(sizeof(AdminGroup), (void **)&pGroup);
dvander@335
   203
	}
dvander@335
   204
dvander@335
   205
	pGroup->immune_default = false;
dvander@335
   206
	pGroup->immune_global = false;
dvander@335
   207
	pGroup->immune_table = -1;
dvander@335
   208
	pGroup->magic = GRP_MAGIC_SET;
dvander@335
   209
	pGroup->next_grp = INVALID_GROUP_ID;
dvander@335
   210
	pGroup->pCmdGrpTable = NULL;
dvander@335
   211
	pGroup->pCmdTable = NULL;
dvander@335
   212
	pGroup->nameidx = m_pStrings->AddString(group_name);
dvander@335
   213
	memset(pGroup->addflags, 0, sizeof(AdminFlag) * AdminFlags_TOTAL);
dvander@335
   214
dvander@335
   215
	if (m_FirstGroup == INVALID_GROUP_ID)
dvander@335
   216
	{
dvander@335
   217
		m_FirstGroup = id;
dvander@335
   218
		m_LastGroup = id;
dvander@335
   219
		pGroup->prev_grp = INVALID_GROUP_ID;
dvander@335
   220
	} else {
dvander@335
   221
		AdminGroup *pPrev = (AdminGroup *)m_pMemory->GetAddress(m_LastGroup);
dvander@335
   222
		assert(pPrev->magic == GRP_MAGIC_SET);
dvander@335
   223
		pPrev->next_grp = id;
dvander@335
   224
		pGroup->prev_grp = m_LastGroup;
dvander@335
   225
		m_LastGroup = id;
dvander@335
   226
	}
dvander@335
   227
dvander@335
   228
	sm_trie_insert(m_pGroups, group_name, (void *)id);
dvander@335
   229
dvander@335
   230
	return id;
dvander@335
   231
}
dvander@335
   232
dvander@335
   233
GroupId AdminCache::FindGroupByName(const char *group_name)
dvander@335
   234
{
dvander@335
   235
	void *object;
dvander@335
   236
dvander@335
   237
	if (!sm_trie_retrieve(m_pGroups, group_name, &object))
dvander@335
   238
	{
dvander@335
   239
		return INVALID_GROUP_ID;
dvander@335
   240
	}
dvander@335
   241
dvander@335
   242
	GroupId id = (GroupId)object;
dvander@335
   243
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   244
dvander@335
   245
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   246
	{
dvander@335
   247
		return INVALID_GROUP_ID;
dvander@335
   248
	}
dvander@335
   249
dvander@335
   250
	return id;
dvander@335
   251
}
dvander@335
   252
dvander@335
   253
void AdminCache::SetGroupAddFlag(GroupId id, AdminFlag flag, bool enabled)
dvander@335
   254
{
dvander@335
   255
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   256
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   257
	{
dvander@335
   258
		return;
dvander@335
   259
	}
dvander@335
   260
dvander@335
   261
	if (flag < Admin_None || flag >= AdminFlags_TOTAL)
dvander@335
   262
	{
dvander@335
   263
		return;
dvander@335
   264
	}
dvander@335
   265
dvander@335
   266
	pGroup->addflags[flag] = enabled;
dvander@335
   267
}
dvander@335
   268
dvander@335
   269
bool AdminCache::GetGroupAddFlag(GroupId id, AdminFlag flag)
dvander@335
   270
{
dvander@335
   271
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   272
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   273
	{
dvander@335
   274
		return false;
dvander@335
   275
	}
dvander@335
   276
dvander@335
   277
	if (flag < Admin_None || flag >= AdminFlags_TOTAL)
dvander@335
   278
	{
dvander@335
   279
		return false;
dvander@335
   280
	}
dvander@335
   281
dvander@335
   282
	return pGroup->addflags[flag];
dvander@335
   283
}
dvander@335
   284
dvander@336
   285
unsigned int AdminCache::GetGroupAddFlagBits(GroupId id, bool flags[], unsigned int total)
dvander@335
   286
{
dvander@335
   287
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   288
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   289
	{
dvander@335
   290
		return 0;
dvander@335
   291
	}
dvander@335
   292
dvander@336
   293
	unsigned int i;
dvander@335
   294
dvander@336
   295
	for (i = Admin_None;
dvander@336
   296
		 i < AdminFlags_TOTAL && i < total;
dvander@335
   297
		 i++)
dvander@335
   298
	{
dvander@336
   299
		flags[i] = pGroup->addflags[i];
dvander@335
   300
	}
dvander@335
   301
dvander@336
   302
	return i;
dvander@335
   303
}
dvander@335
   304
dvander@335
   305
void AdminCache::SetGroupGenericImmunity(GroupId id, ImmunityType type, bool enabled)
dvander@335
   306
{
dvander@335
   307
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   308
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   309
	{
dvander@335
   310
		return;
dvander@335
   311
	}
dvander@335
   312
dvander@335
   313
	if (type == Immunity_Default)
dvander@335
   314
	{
dvander@335
   315
		pGroup->immune_default = enabled;
dvander@335
   316
	} else if (type == Immunity_Global) {
dvander@335
   317
		pGroup->immune_global = enabled;
dvander@335
   318
	} 
dvander@335
   319
}
dvander@335
   320
dvander@335
   321
bool AdminCache::GetGroupGenericImmunity(GroupId id, ImmunityType type)
dvander@335
   322
{
dvander@335
   323
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   324
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   325
	{
dvander@335
   326
		return false;
dvander@335
   327
	}
dvander@335
   328
dvander@335
   329
	if (type == Immunity_Default)
dvander@335
   330
	{
dvander@335
   331
		return pGroup->immune_default;
dvander@335
   332
	} else if (type == Immunity_Global) {
dvander@335
   333
		return pGroup->immune_global;
dvander@335
   334
	}
dvander@335
   335
dvander@335
   336
	return false;
dvander@335
   337
}
dvander@335
   338
dvander@335
   339
void AdminCache::AddGroupImmunity(GroupId id, GroupId other_id)
dvander@335
   340
{
dvander@335
   341
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   342
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   343
	{
dvander@335
   344
		return;
dvander@335
   345
	}
dvander@335
   346
dvander@335
   347
	AdminGroup *pOther = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   348
	if (!pOther || pOther->magic != GRP_MAGIC_SET)
dvander@335
   349
	{
dvander@335
   350
		return;
dvander@335
   351
	}
dvander@335
   352
dvander@335
   353
	/* We always need to resize the immunity table */
dvander@335
   354
	int *table, tblidx;
dvander@335
   355
	if (pOther->immune_table == -1)
dvander@335
   356
	{
dvander@335
   357
		tblidx = m_pMemory->CreateMem(sizeof(int) * 2, (void **)&table);
dvander@335
   358
		table[0] = 0;
dvander@335
   359
	} else {
dvander@335
   360
		int *old_table = (int *)m_pMemory->GetAddress(pOther->immune_table);
dvander@335
   361
		tblidx = m_pMemory->CreateMem(sizeof(int) * (old_table[0] + 2), (void **)&table);
dvander@335
   362
		/* Get the old address again in caes of resize */
dvander@335
   363
		old_table = (int *)m_pMemory->GetAddress(pOther->immune_table);
dvander@335
   364
		table[0] = old_table[0];
dvander@335
   365
		for (unsigned int i=1; i<=(unsigned int)old_table[0]; i++)
dvander@335
   366
		{
dvander@335
   367
			table[i] = old_table[i];
dvander@335
   368
		}
dvander@335
   369
	}
dvander@335
   370
dvander@335
   371
	/* Assign */
dvander@335
   372
	pOther->immune_table = tblidx;
dvander@335
   373
dvander@335
   374
	/* Add to the array */
dvander@335
   375
	table[0]++;
dvander@335
   376
	table[table[0]] = other_id;
dvander@335
   377
}
dvander@335
   378
dvander@335
   379
unsigned int AdminCache::GetGroupImmunityCount(GroupId id)
dvander@335
   380
{
dvander@335
   381
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   382
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   383
	{
dvander@335
   384
		return 0;
dvander@335
   385
	}
dvander@335
   386
dvander@335
   387
	if (pGroup->immune_table == -1)
dvander@335
   388
	{
dvander@335
   389
		return 0;
dvander@335
   390
	}
dvander@335
   391
dvander@335
   392
	int *table = (int *)m_pMemory->GetAddress(pGroup->immune_table);
dvander@335
   393
dvander@335
   394
	return table[0];
dvander@335
   395
}
dvander@335
   396
dvander@335
   397
GroupId AdminCache::GetGroupImmunity(GroupId id, unsigned int number)
dvander@335
   398
{
dvander@335
   399
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   400
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   401
	{
dvander@335
   402
		return INVALID_GROUP_ID;
dvander@335
   403
	}
dvander@335
   404
dvander@335
   405
	if (pGroup->immune_table == -1)
dvander@335
   406
	{
dvander@335
   407
		return INVALID_GROUP_ID;
dvander@335
   408
	}
dvander@335
   409
dvander@335
   410
	int *table = (int *)m_pMemory->GetAddress(pGroup->immune_table);
dvander@335
   411
	if (number >= (unsigned int)table[0])
dvander@335
   412
	{
dvander@335
   413
		return INVALID_GROUP_ID;
dvander@335
   414
	}
dvander@335
   415
dvander@335
   416
	return table[1 + number];
dvander@335
   417
}
dvander@335
   418
dvander@335
   419
void AdminCache::AddGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule rule)
dvander@335
   420
{
dvander@335
   421
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   422
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   423
	{
dvander@335
   424
		return;
dvander@335
   425
	}
dvander@335
   426
dvander@335
   427
	Trie *pTrie = NULL;
dvander@335
   428
	if (type == Override_Command)
dvander@335
   429
	{
dvander@335
   430
		if (pGroup->pCmdTable == NULL)
dvander@335
   431
		{
dvander@335
   432
			pGroup->pCmdTable = sm_trie_create();
dvander@335
   433
		}
dvander@335
   434
		pTrie = pGroup->pCmdTable;
dvander@335
   435
	} else if (type == Override_CommandGroup) {
dvander@335
   436
		if (pGroup->pCmdGrpTable == NULL)
dvander@335
   437
		{
dvander@335
   438
			pGroup->pCmdGrpTable = sm_trie_create();
dvander@335
   439
		}
dvander@335
   440
		pTrie = pGroup->pCmdGrpTable;
dvander@335
   441
	} else {
dvander@335
   442
		return;
dvander@335
   443
	}
dvander@335
   444
dvander@335
   445
	sm_trie_insert(pTrie, name, (void *)(int)rule);
dvander@335
   446
}
dvander@335
   447
dvander@335
   448
bool AdminCache::GetGroupCommandOverride(GroupId id, const char *name, OverrideType type, OverrideRule *pRule)
dvander@335
   449
{
dvander@335
   450
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   451
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   452
	{
dvander@335
   453
		return false;
dvander@335
   454
	}
dvander@335
   455
dvander@335
   456
	Trie *pTrie = NULL;
dvander@335
   457
	if (type == Override_Command)
dvander@335
   458
	{
dvander@335
   459
		if (pGroup->pCmdTable == NULL)
dvander@335
   460
		{
dvander@335
   461
			return false;
dvander@335
   462
		}
dvander@335
   463
		pTrie = pGroup->pCmdTable;
dvander@335
   464
	} else if (type == Override_CommandGroup) {
dvander@335
   465
		if (pGroup->pCmdGrpTable == NULL)
dvander@335
   466
		{
dvander@335
   467
			return false;
dvander@335
   468
		}
dvander@335
   469
		pTrie = pGroup->pCmdGrpTable;
dvander@335
   470
	} else {
dvander@335
   471
		return false;
dvander@335
   472
	}
dvander@335
   473
dvander@335
   474
	void *object;
dvander@335
   475
	if (!sm_trie_retrieve(pTrie, name, &object))
dvander@335
   476
	{
dvander@335
   477
		return false;
dvander@335
   478
	}
dvander@335
   479
dvander@335
   480
	if (pRule)
dvander@335
   481
	{
dvander@335
   482
		*pRule = (OverrideRule)(int)object;
dvander@335
   483
	}
dvander@335
   484
	
dvander@335
   485
	return true;
dvander@335
   486
}
dvander@335
   487
dvander@335
   488
void AdminCache::InvalidateGroup(GroupId id)
dvander@335
   489
{
dvander@335
   490
	AdminGroup *pGroup = (AdminGroup *)m_pMemory->GetAddress(id);
dvander@335
   491
	AdminGroup *pOther;
dvander@335
   492
dvander@335
   493
	if (!pGroup || pGroup->magic != GRP_MAGIC_SET)
dvander@335
   494
	{
dvander@335
   495
		return;
dvander@335
   496
	}
dvander@335
   497
dvander@335
   498
	const char *str = m_pStrings->GetString(pGroup->nameidx);
dvander@335
   499
	sm_trie_delete(m_pGroups, str);
dvander@335
   500
dvander@335
   501
	/* Unlink from the live dbllink list */
dvander@335
   502
	if (id == m_FirstGroup && id == m_LastGroup)
dvander@335
   503
	{
dvander@335
   504
		m_LastGroup = INVALID_GROUP_ID;
dvander@335
   505
		m_FirstGroup = INVALID_GROUP_ID;
dvander@335
   506
	} else if (id == m_FirstGroup) {
dvander@335
   507
		m_FirstGroup = pGroup->next_grp;
dvander@335
   508
		pOther = (AdminGroup *)m_pMemory->GetAddress(m_FirstGroup);
dvander@335
   509
		pOther->prev_grp = INVALID_GROUP_ID;
dvander@335
   510
	} else if (id == m_LastGroup) {
dvander@335
   511
		m_LastGroup = pGroup->prev_grp;
dvander@335
   512
		pOther = (AdminGroup *)m_pMemory->GetAddress(m_LastGroup);
dvander@335
   513
		pOther->next_grp = INVALID_GROUP_ID;
dvander@335
   514
	} else {
dvander@335
   515
		pOther = (AdminGroup *)m_pMemory->GetAddress(pGroup->prev_grp);
dvander@335
   516
		pOther->next_grp = pGroup->next_grp;
dvander@335
   517
		pOther = (AdminGroup *)m_pMemory->GetAddress(pGroup->next_grp);
dvander@335
   518
		pOther->prev_grp = pGroup->prev_grp;
dvander@335
   519
	}
dvander@335
   520
dvander@335
   521
	/* Free any used memory to be safe */
dvander@335
   522
	if (pGroup->pCmdGrpTable)
dvander@335
   523
	{
dvander@335
   524
		sm_trie_destroy(pGroup->pCmdGrpTable);
dvander@335
   525
		pGroup->pCmdGrpTable = NULL;
dvander@335
   526
	}
dvander@335
   527
	if (pGroup->pCmdTable)
dvander@335
   528
	{
dvander@335
   529
		sm_trie_destroy(pGroup->pCmdTable);
dvander@335
   530
		pGroup->pCmdTable = NULL;
dvander@335
   531
	}
dvander@335
   532
dvander@335
   533
	/* Link into the free list */
dvander@335
   534
	pGroup->magic = GRP_MAGIC_UNSET;
dvander@335
   535
	pGroup->next_grp = m_FreeGroupList;
dvander@335
   536
	m_FreeGroupList = id;
dvander@335
   537
dvander@335
   538
	/* :TODO: remove this group from any users */
dvander@335
   539
}
dvander@335
   540
dvander@335
   541
void AdminCache::InvalidateGroupCache()
dvander@335
   542
{
dvander@335
   543
	/* Nuke the free list */
dvander@335
   544
	m_FreeGroupList = -1;
dvander@335
   545
dvander@335
   546
	/* Nuke reverse lookups */
dvander@335
   547
	sm_trie_clear(m_pGroups);
dvander@335
   548
dvander@335
   549
	/* Free memory on groups */
dvander@335
   550
	GroupId cur = m_FirstGroup;
dvander@335
   551
	AdminGroup *pGroup;
dvander@335
   552
	while (cur != INVALID_GROUP_ID)
dvander@335
   553
	{
dvander@335
   554
		pGroup = (AdminGroup *)m_pMemory->GetAddress(cur);
dvander@335
   555
		assert(pGroup->magic == GRP_MAGIC_SET);
dvander@335
   556
		if (pGroup->pCmdGrpTable)
dvander@335
   557
		{
dvander@335
   558
			sm_trie_destroy(pGroup->pCmdGrpTable);
dvander@335
   559
		}
dvander@335
   560
		if (pGroup->pCmdTable)
dvander@335
   561
		{
dvander@335
   562
			sm_trie_destroy(pGroup->pCmdTable);
dvander@335
   563
		}
dvander@335
   564
		cur = pGroup->next_grp;
dvander@335
   565
	}
dvander@335
   566
dvander@335
   567
	m_FirstGroup = INVALID_GROUP_ID;
dvander@335
   568
	m_LastGroup = INVALID_GROUP_ID;
dvander@335
   569
dvander@335
   570
	/* :TODO: dump the admin cache */
dvander@335
   571
dvander@335
   572
	/* Reset the memory table */
dvander@335
   573
	m_pMemory->Reset();
dvander@335
   574
}
dvander@336
   575
dvander@336
   576
void AdminCache::AddAdminListener(IAdminListener *pListener)
dvander@336
   577
{
dvander@336
   578
	m_hooks.push_back(pListener);
dvander@336
   579
}
dvander@336
   580
dvander@336
   581
void AdminCache::RemoveAdminListener(IAdminListener *pListener)
dvander@336
   582
{
dvander@336
   583
	m_hooks.remove(pListener);
dvander@336
   584
}
dvander@336
   585
dvander@336
   586
void AdminCache::DumpAdminCache(int cache_flags, bool rebuild)
dvander@336
   587
{
dvander@336
   588
	if (cache_flags & ADMIN_CACHE_OVERRIDES)
dvander@336
   589
	{
dvander@336
   590
		DumpCommandOverrideCache(Override_Command);
dvander@336
   591
		DumpCommandOverrideCache(Override_CommandGroup);
dvander@336
   592
	}
dvander@336
   593
dvander@336
   594
	if ((cache_flags & ADMIN_CACHE_ADMINS) ||
dvander@336
   595
		(cache_flags & ADMIN_CACHE_GROUPS))
dvander@336
   596
	{
dvander@336
   597
		/* Make sure the flag is set */
dvander@336
   598
		cache_flags |= ADMIN_CACHE_ADMINS;
dvander@336
   599
		/* :TODO: Dump admin cache */
dvander@336
   600
	}
dvander@336
   601
dvander@336
   602
	if (cache_flags & ADMIN_CACHE_GROUPS)
dvander@336
   603
	{
dvander@336
   604
		InvalidateGroupCache();
dvander@336
   605
	}
dvander@336
   606
dvander@336
   607
	if (rebuild)
dvander@336
   608
	{
dvander@336
   609
		List<IAdminListener *>::iterator iter;
dvander@336
   610
		IAdminListener *pListener;
dvander@345
   611
		cell_t result;
dvander@336
   612
		for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
dvander@336
   613
		{
dvander@336
   614
			pListener = (*iter);
dvander@336
   615
			pListener->OnRebuildAdminCache(cache_flags);
dvander@336
   616
		}
dvander@345
   617
		m_pCacheFwd->PushCell(cache_flags);
dvander@345
   618
		m_pCacheFwd->Execute(&result);
dvander@336
   619
	}
dvander@336
   620
}