| File: System\DirectoryServices\AccountManagement\AD\ADDNConstraintLinkedAttrSet.cs | Web Access |
| Project: src\runtime\src\libraries\System.DirectoryServices.AccountManagement\src\System.DirectoryServices.AccountManagement.csproj (System.DirectoryServices.AccountManagement) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.DirectoryServices; namespace System.DirectoryServices.AccountManagement { internal sealed class ADDNConstraintLinkedAttrSet : ADDNLinkedAttrSet { /// /// <summary> /// Result validator - Delegate function signature. /// /// The result validator should return true if the result is valid /// and false if the result is invalid and needs to be skipped. /// </summary> /// <param name="resultPropCollection"> /// Directory entry object of the result. /// NOTE: ADDNLinkedAttrSet class is responsible for disposing this DirectoryEntry object. /// </param> /// <returns> /// True - if the result is valid (further processing with the result will happen in this case) /// False - If the result is invalid. In this case the result will skipped. /// </returns> /// internal delegate bool ResultValidator(dSPropertyCollection resultPropCollection); internal enum ConstraintType { ContainerStringMatch = 0, // match = the objects distinguishedName begins with the string supplied as constraintData, i.e. the object is under that container. ResultValidatorDelegateMatch = 1, //match = the result object will be passed as an argument to the //function supplied as constraintData and it should return true. } internal ADDNConstraintLinkedAttrSet( ConstraintType constraint, object constraintData, string groupDN, IEnumerable[] members, string primaryGroupDN, DirectorySearcher queryMembersSearcher, bool recursive, ADStoreCtx storeCtx) : base(groupDN, members, primaryGroupDN, queryMembersSearcher, recursive, storeCtx) { Debug.Assert(constraintData != null); _constraint = constraint; _constraintData = constraintData; } internal ADDNConstraintLinkedAttrSet( ConstraintType constraint, object constraintData, string groupDN, DirectorySearcher[] membersSearcher, string primaryGroupDN, DirectorySearcher primaryGroupMembersSearcher, bool recursive, ADStoreCtx storeCtx) : base(groupDN, membersSearcher, primaryGroupDN, primaryGroupMembersSearcher, recursive, storeCtx) { Debug.Assert(constraintData != null); _constraint = constraint; _constraintData = constraintData; } private readonly ConstraintType _constraint; private readonly object _constraintData; internal override bool MoveNext() { GlobalDebug.WriteLineIf(GlobalDebug.Info, "ADDNConstraintLinkedAttrSet", "Entering MoveNext"); GlobalDebug.WriteLineIf(GlobalDebug.Info, "ADDNConstraintLinkedAttrSet", "Filter {0}", _constraintData); bool match = false; string dn = "NotSet"; if (!base.MoveNext()) return false; else { while (!match) { if (null == this.current) return false; switch (_constraint) { case ConstraintType.ContainerStringMatch: if (this.current is SearchResult) dn = ((SearchResult)this.current).Properties["distinguishedName"][0].ToString(); else dn = ((DirectoryEntry)this.current).Properties["distinguishedName"].Value.ToString(); if (dn.EndsWith((string)_constraintData, StringComparison.Ordinal)) match = true; break; case ConstraintType.ResultValidatorDelegateMatch: { ResultValidator resultValidator = _constraintData as ResultValidator; if (resultValidator != null) { dSPropertyCollection resultPropCollection = null; if (this.current is SearchResult) { resultPropCollection = new dSPropertyCollection(((SearchResult)this.current).Properties); } else { resultPropCollection = new dSPropertyCollection(((DirectoryEntry)this.current).Properties); } match = resultValidator.Invoke(resultPropCollection); } else { Debug.Fail("ADStoreCtx.ADDNConstraintLinkedAttrSet: Invalid constraint data. Expected: object of type ResultValidator"); } break; } default: Debug.Fail("ADStoreCtx.ADDNConstraintLinkedAttrSet: fell off end looking for " + _constraint.ToString()); break; } GlobalDebug.WriteLineIf(GlobalDebug.Info, "ADDNConstraintLinkedAttrSet", "Found {0} Match {1}", dn, match.ToString()); if (!match) if (!this.MoveNext()) return false; } return match; } } } }