internal Object RemoveItem(int index)
{
Object ret = null;
switch (m_cElt)
{
case 0:
ret = null;
break;
case 1:
if (index != m_maxIndex)
{
// removing a permission we don't have ignore it
ret = null;
}
else
{
// removing the permission we have at the moment
ret = m_Obj;
Reset();
}
break;
default:
// this is the general case code for when there is really an array
// we are removing an item
if (index < m_Set.Length && m_Set[index] != null)
{
// ok we really deleted something at this point
ret = m_Set[index];
m_Set[index] = null;
m_cElt--;
if (index == m_maxIndex)
ResetMaxIndex(m_Set);
// collapse the array
if (m_cElt == 1)
{
m_Obj = m_Set[m_maxIndex];
m_Set = null;
}
}
break;
}
return ret;
}
internal virtual void MergeDeniedSet(TokenBasedSet denied) { if (denied == null) { return; } int minMaxIndex; if (this.m_maxIndex < denied.m_maxIndex) { minMaxIndex = this.m_maxIndex; for (int i = this.m_maxIndex + 1; i <= denied.m_maxIndex; ++i) { denied.RemoveItem(i); } } else { minMaxIndex = denied.m_maxIndex; } IPermission p1; IPermission p2; for (int i = 0; i <= minMaxIndex; i++) { p1 = (IPermission)this.GetItem(i); p2 = (IPermission)denied.GetItem(i); if (p1 != null) { if (p2 != null && p1.IsSubsetOf(p2)) { // If the permission appears in both sets, we can remove it from both // (i.e. now it's not granted instead of being denied) this.RemoveItem(i); denied.RemoveItem(i); } } else if (p2 != null) { // If we tried to deny it and it wasn't granted, just remove it from the denied set. denied.RemoveItem(i); } } }