/// <summary> /// Enumerates parent role IDs recursively. /// </summary> protected IEnumerable <int> EnumerateParentRoleIDs(ITableIndex roleRef_childRoleIndex, int childRoleID, HashSet <int> protectionSet = null) { if (protectionSet == null) { protectionSet = new HashSet <int> { childRoleID } } ; foreach (int parentRoleID in roleRef_childRoleIndex.SelectItems(childRoleID)) { if (protectionSet.Add(parentRoleID)) { yield return(parentRoleID); foreach (int grandparentRoleID in EnumerateParentRoleIDs(roleRef_childRoleIndex, parentRoleID, protectionSet)) { yield return(grandparentRoleID); } } } }
/// <summary> /// Add rights for the specified role. /// </summary> protected void AddRoleRight(ITableIndex objRight_roleIndex, ITableIndex obj_parentObjIndex, RightByObj rightByObj, int roleID) { // explicitly defined rights have higher priority foreach (ObjRight objRight in objRight_roleIndex.SelectItems(roleID)) { AddObjRight(rightByObj, objRight.ObjNum, new Right(objRight)); } // add rights on child objects foreach (ObjRight objRight in objRight_roleIndex.SelectItems(roleID)) { Right right = new Right(objRight); foreach (Obj childObj in EnumerateChildObjects(obj_parentObjIndex, objRight.ObjNum)) { AddObjRight(rightByObj, childObj.ObjNum, right); } } }
/// <summary> /// Adds the child objects of the specified object recursively. /// </summary> private void AddChildObjects(ITableIndex parentObjIndex, UserRights userRights, int parentObjNum, int parentLevel) { foreach (Obj childObj in parentObjIndex.SelectItems(parentObjNum)) { if (userRights.GetRightByObj(childObj.ObjNum).View) { Add(new ObjectItem(childObj, parentLevel + 1)); AddChildObjects(parentObjIndex, userRights, childObj.ObjNum, parentLevel + 1); } } }
/// <summary> /// Enumerates child objects recursively. /// </summary> protected IEnumerable <Obj> EnumerateChildObjects(ITableIndex obj_parentObjIndex, int parentObjNum, HashSet <int> protectionSet = null) { if (protectionSet == null) { protectionSet = new HashSet <int> { parentObjNum } } ; foreach (Obj childObj in obj_parentObjIndex.SelectItems(parentObjNum)) { if (protectionSet.Add(childObj.ObjNum)) { yield return(childObj); foreach (Obj grandchildObj in EnumerateChildObjects(obj_parentObjIndex, childObj.ObjNum)) { yield return(grandchildObj); } } } }