Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Security / Principal / IRCollection.cs / 1305376 / IRCollection.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //[....] namespace System.Security.Principal { using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Security.Permissions; [System.Runtime.InteropServices.ComVisible(false)] public class IdentityReferenceCollection : ICollection{ #region Private members // // Container enumerated by this collection // private List _Identities; #endregion #region Constructors // // Creates an empty collection of default size // public IdentityReferenceCollection() : this( 0 ) { } // // Creates an empty collection of given initial size // public IdentityReferenceCollection( int capacity ) { _Identities = new List ( capacity ); } #endregion #region ICollection implementation public void CopyTo( IdentityReference[] array, int offset ) { _Identities.CopyTo( 0, array, offset, Count ); } public int Count { get { return _Identities.Count; } } public bool IsReadOnly { get { return false; } } public void Add( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); _Identities.Add( identity ); } public bool Remove( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); if ( Contains( identity )) { _Identities.Remove( identity ); return true; } return false; } public void Clear() { _Identities.Clear(); } public bool Contains( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); return _Identities.Contains( identity ); } #endregion #region IEnumerable implementation IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator GetEnumerator() { return new IdentityReferenceEnumerator( this ); } #endregion #region Public methods public IdentityReference this[int index] { get { return _Identities[index]; } set { if ( value == null ) { throw new ArgumentNullException( "value" ); } Contract.EndContractBlock(); _Identities[index] = value; } } internal List Identities { get { return _Identities; } } public IdentityReferenceCollection Translate( Type targetType ) { return Translate( targetType, false ); } [SecuritySafeCritical] [SecurityPermission(SecurityAction.Demand, ControlPrincipal = true)] public IdentityReferenceCollection Translate( Type targetType, bool forceSuccess ) { if ( targetType == null ) { throw new ArgumentNullException( "targetType" ); } // // Target type must be a subclass of IdentityReference // if ( !targetType.IsSubclassOf( typeof( IdentityReference ))) { throw new ArgumentException( Environment.GetResourceString( "IdentityReference_MustBeIdentityReference" ), "targetType" ); } Contract.EndContractBlock(); // // if the source collection is empty, just return an empty collection // if (Identities.Count == 0) { return new IdentityReferenceCollection(); } int SourceSidsCount = 0; int SourceNTAccountsCount = 0; // // First, see how many of each of the source types we have. // The cases where source type == target type require no conversion. // for ( int i = 0; i < Identities.Count; i++ ) { Type type = Identities[i].GetType(); if ( type == targetType ) { continue; } else if ( type == typeof( SecurityIdentifier )) { SourceSidsCount += 1; } else if ( type == typeof( NTAccount )) { SourceNTAccountsCount += 1; } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } bool Homogeneous = false; IdentityReferenceCollection SourceSids = null; IdentityReferenceCollection SourceNTAccounts = null; if ( SourceSidsCount == Count ) { Homogeneous = true; SourceSids = this; } else if ( SourceSidsCount > 0 ) { SourceSids = new IdentityReferenceCollection( SourceSidsCount ); } if ( SourceNTAccountsCount == Count ) { Homogeneous = true; SourceNTAccounts = this; } else if ( SourceNTAccountsCount > 0 ) { SourceNTAccounts = new IdentityReferenceCollection( SourceNTAccountsCount ); } // // Repackage only if the source is not homogeneous (contains different source types) // IdentityReferenceCollection Result = null; if ( !Homogeneous ) { Result = new IdentityReferenceCollection( Identities.Count ); for ( int i = 0; i < Identities.Count; i++ ) { IdentityReference id = this[i]; Type type = id.GetType(); if ( type == targetType ) { continue; } else if ( type == typeof( SecurityIdentifier )) { SourceSids.Add( id ); } else if ( type == typeof( NTAccount )) { SourceNTAccounts.Add( id ); } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } } bool someFailed = false; IdentityReferenceCollection TargetSids = null, TargetNTAccounts = null; if ( SourceSidsCount > 0 ) { TargetSids = SecurityIdentifier.Translate( SourceSids, targetType, out someFailed ); if ( Homogeneous && !(forceSuccess && someFailed)) { Result = TargetSids; } } if ( SourceNTAccountsCount > 0 ) { TargetNTAccounts = NTAccount.Translate( SourceNTAccounts, targetType, out someFailed ); if ( Homogeneous && !(forceSuccess && someFailed)) { Result = TargetNTAccounts; } } if (forceSuccess && someFailed) { // // Need to throw an exception here and provide information regarding // which identity references could not be translated to the target type // Result = new IdentityReferenceCollection(); if (TargetSids != null) { foreach (IdentityReference id in TargetSids) { if ( id.GetType() != targetType ) { Result.Add(id); } } } if (TargetNTAccounts != null) { foreach (IdentityReference id in TargetNTAccounts) { if ( id.GetType() != targetType ) { Result.Add(id); } } } throw new IdentityNotMappedException( Environment.GetResourceString("IdentityReference_IdentityNotMapped"), Result); } else if ( !Homogeneous ) { SourceSidsCount = 0; SourceNTAccountsCount = 0; Result = new IdentityReferenceCollection( Identities.Count ); for ( int i = 0; i < Identities.Count; i++ ) { IdentityReference id = this[i]; Type type = id.GetType(); if ( type == targetType ) { Result.Add( id ); } else if ( type == typeof( SecurityIdentifier )) { Result.Add( TargetSids[SourceSidsCount++] ); } else if ( type == typeof( NTAccount )) { Result.Add( TargetNTAccounts[SourceNTAccountsCount++] ); } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } } return Result; } #endregion } [System.Runtime.InteropServices.ComVisible(false)] internal class IdentityReferenceEnumerator : IEnumerator , IDisposable { #region Private members // // Current enumeration index // private int _Current; // // Parent collection // private readonly IdentityReferenceCollection _Collection; #endregion #region Constructors internal IdentityReferenceEnumerator( IdentityReferenceCollection collection ) { if ( collection == null ) { throw new ArgumentNullException( "collection" ); } Contract.EndContractBlock(); _Collection = collection; _Current = -1; } #endregion #region IEnumerator implementation /// object IEnumerator.Current { get { return _Collection.Identities[_Current]; } } public IdentityReference Current { get { return (( IEnumerator )this).Current as IdentityReference; } } public bool MoveNext() { _Current++; return ( _Current < _Collection.Count ); } public void Reset() { _Current = -1; } public void Dispose() { } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== // [....] namespace System.Security.Principal { using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Security.Permissions; [System.Runtime.InteropServices.ComVisible(false)] public class IdentityReferenceCollection : ICollection{ #region Private members // // Container enumerated by this collection // private List _Identities; #endregion #region Constructors // // Creates an empty collection of default size // public IdentityReferenceCollection() : this( 0 ) { } // // Creates an empty collection of given initial size // public IdentityReferenceCollection( int capacity ) { _Identities = new List ( capacity ); } #endregion #region ICollection implementation public void CopyTo( IdentityReference[] array, int offset ) { _Identities.CopyTo( 0, array, offset, Count ); } public int Count { get { return _Identities.Count; } } public bool IsReadOnly { get { return false; } } public void Add( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); _Identities.Add( identity ); } public bool Remove( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); if ( Contains( identity )) { _Identities.Remove( identity ); return true; } return false; } public void Clear() { _Identities.Clear(); } public bool Contains( IdentityReference identity ) { if ( identity == null ) { throw new ArgumentNullException( "identity" ); } Contract.EndContractBlock(); return _Identities.Contains( identity ); } #endregion #region IEnumerable implementation IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator GetEnumerator() { return new IdentityReferenceEnumerator( this ); } #endregion #region Public methods public IdentityReference this[int index] { get { return _Identities[index]; } set { if ( value == null ) { throw new ArgumentNullException( "value" ); } Contract.EndContractBlock(); _Identities[index] = value; } } internal List Identities { get { return _Identities; } } public IdentityReferenceCollection Translate( Type targetType ) { return Translate( targetType, false ); } [SecuritySafeCritical] [SecurityPermission(SecurityAction.Demand, ControlPrincipal = true)] public IdentityReferenceCollection Translate( Type targetType, bool forceSuccess ) { if ( targetType == null ) { throw new ArgumentNullException( "targetType" ); } // // Target type must be a subclass of IdentityReference // if ( !targetType.IsSubclassOf( typeof( IdentityReference ))) { throw new ArgumentException( Environment.GetResourceString( "IdentityReference_MustBeIdentityReference" ), "targetType" ); } Contract.EndContractBlock(); // // if the source collection is empty, just return an empty collection // if (Identities.Count == 0) { return new IdentityReferenceCollection(); } int SourceSidsCount = 0; int SourceNTAccountsCount = 0; // // First, see how many of each of the source types we have. // The cases where source type == target type require no conversion. // for ( int i = 0; i < Identities.Count; i++ ) { Type type = Identities[i].GetType(); if ( type == targetType ) { continue; } else if ( type == typeof( SecurityIdentifier )) { SourceSidsCount += 1; } else if ( type == typeof( NTAccount )) { SourceNTAccountsCount += 1; } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } bool Homogeneous = false; IdentityReferenceCollection SourceSids = null; IdentityReferenceCollection SourceNTAccounts = null; if ( SourceSidsCount == Count ) { Homogeneous = true; SourceSids = this; } else if ( SourceSidsCount > 0 ) { SourceSids = new IdentityReferenceCollection( SourceSidsCount ); } if ( SourceNTAccountsCount == Count ) { Homogeneous = true; SourceNTAccounts = this; } else if ( SourceNTAccountsCount > 0 ) { SourceNTAccounts = new IdentityReferenceCollection( SourceNTAccountsCount ); } // // Repackage only if the source is not homogeneous (contains different source types) // IdentityReferenceCollection Result = null; if ( !Homogeneous ) { Result = new IdentityReferenceCollection( Identities.Count ); for ( int i = 0; i < Identities.Count; i++ ) { IdentityReference id = this[i]; Type type = id.GetType(); if ( type == targetType ) { continue; } else if ( type == typeof( SecurityIdentifier )) { SourceSids.Add( id ); } else if ( type == typeof( NTAccount )) { SourceNTAccounts.Add( id ); } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } } bool someFailed = false; IdentityReferenceCollection TargetSids = null, TargetNTAccounts = null; if ( SourceSidsCount > 0 ) { TargetSids = SecurityIdentifier.Translate( SourceSids, targetType, out someFailed ); if ( Homogeneous && !(forceSuccess && someFailed)) { Result = TargetSids; } } if ( SourceNTAccountsCount > 0 ) { TargetNTAccounts = NTAccount.Translate( SourceNTAccounts, targetType, out someFailed ); if ( Homogeneous && !(forceSuccess && someFailed)) { Result = TargetNTAccounts; } } if (forceSuccess && someFailed) { // // Need to throw an exception here and provide information regarding // which identity references could not be translated to the target type // Result = new IdentityReferenceCollection(); if (TargetSids != null) { foreach (IdentityReference id in TargetSids) { if ( id.GetType() != targetType ) { Result.Add(id); } } } if (TargetNTAccounts != null) { foreach (IdentityReference id in TargetNTAccounts) { if ( id.GetType() != targetType ) { Result.Add(id); } } } throw new IdentityNotMappedException( Environment.GetResourceString("IdentityReference_IdentityNotMapped"), Result); } else if ( !Homogeneous ) { SourceSidsCount = 0; SourceNTAccountsCount = 0; Result = new IdentityReferenceCollection( Identities.Count ); for ( int i = 0; i < Identities.Count; i++ ) { IdentityReference id = this[i]; Type type = id.GetType(); if ( type == targetType ) { Result.Add( id ); } else if ( type == typeof( SecurityIdentifier )) { Result.Add( TargetSids[SourceSidsCount++] ); } else if ( type == typeof( NTAccount )) { Result.Add( TargetNTAccounts[SourceNTAccountsCount++] ); } else { // // Rare case that we have defined a type of identity reference and // not included it in the code logic above (this is more like a bug in the implementation // but only as long as we do not allow IdentityReference to be subclassed outside of the BCL) // Contract.Assert( false, "Source type is an IdentityReference type which has not been included in translation logic."); throw new SystemException(); } } } return Result; } #endregion } [System.Runtime.InteropServices.ComVisible(false)] internal class IdentityReferenceEnumerator : IEnumerator , IDisposable { #region Private members // // Current enumeration index // private int _Current; // // Parent collection // private readonly IdentityReferenceCollection _Collection; #endregion #region Constructors internal IdentityReferenceEnumerator( IdentityReferenceCollection collection ) { if ( collection == null ) { throw new ArgumentNullException( "collection" ); } Contract.EndContractBlock(); _Collection = collection; _Current = -1; } #endregion #region IEnumerator implementation /// object IEnumerator.Current { get { return _Collection.Identities[_Current]; } } public IdentityReference Current { get { return (( IEnumerator )this).Current as IdentityReference; } } public bool MoveNext() { _Current++; return ( _Current < _Collection.Count ); } public void Reset() { _Current = -1; } public void Dispose() { } #endregion } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- backend.cs
- AttributeQuery.cs
- TimeEnumHelper.cs
- PanelDesigner.cs
- ComboBoxHelper.cs
- Parameter.cs
- EventData.cs
- MemberDomainMap.cs
- XPathNodeInfoAtom.cs
- ThemeDictionaryExtension.cs
- KnownTypeDataContractResolver.cs
- RangeContentEnumerator.cs
- ClientRolePrincipal.cs
- StoreItemCollection.cs
- InfoCardRSAOAEPKeyExchangeFormatter.cs
- CodeAssignStatement.cs
- Screen.cs
- ListSortDescription.cs
- documentation.cs
- RegisteredExpandoAttribute.cs
- ListenerSingletonConnectionReader.cs
- WaitForChangedResult.cs
- SafeEventLogWriteHandle.cs
- WebReferenceOptions.cs
- SpellerInterop.cs
- XamlInt32CollectionSerializer.cs
- UnsafeNativeMethods.cs
- RIPEMD160.cs
- RuntimeWrappedException.cs
- TypeDescriptor.cs
- PropertyValueUIItem.cs
- NavigatorOutput.cs
- ZipIOExtraFieldZip64Element.cs
- TokenBasedSet.cs
- ReservationCollection.cs
- BatchServiceHost.cs
- ScrollItemPattern.cs
- UnmanagedMemoryStreamWrapper.cs
- Label.cs
- XmlSchemaExporter.cs
- Column.cs
- oledbconnectionstring.cs
- Thread.cs
- Timer.cs
- WorkflowOperationBehavior.cs
- RTLAwareMessageBox.cs
- ServicePoint.cs
- IisTraceListener.cs
- DeferredReference.cs
- HTMLTextWriter.cs
- Path.cs
- HttpProfileBase.cs
- StateItem.cs
- COM2PropertyPageUITypeConverter.cs
- MdiWindowListStrip.cs
- CookieProtection.cs
- DataGridColumnFloatingHeader.cs
- BidOverLoads.cs
- BamlResourceDeserializer.cs
- RadioButtonFlatAdapter.cs
- CustomErrorsSection.cs
- DebugView.cs
- OledbConnectionStringbuilder.cs
- HtmlInputButton.cs
- ReadOnlyTernaryTree.cs
- PropertyIDSet.cs
- TypeUsage.cs
- EntryIndex.cs
- CharEnumerator.cs
- AsymmetricAlgorithm.cs
- ComPlusContractBehavior.cs
- ChangeTracker.cs
- HtmlInputText.cs
- ProcessInputEventArgs.cs
- TextViewBase.cs
- AppearanceEditorPart.cs
- KnownTypeDataContractResolver.cs
- MsmqAppDomainProtocolHandler.cs
- SqlInternalConnection.cs
- UInt64Storage.cs
- AutomationAttributeInfo.cs
- CachedFontFamily.cs
- _ScatterGatherBuffers.cs
- FontConverter.cs
- ReliableOutputConnection.cs
- TrustManagerMoreInformation.cs
- FieldMetadata.cs
- ZipFileInfoCollection.cs
- CapabilitiesAssignment.cs
- ObjectSerializerFactory.cs
- TextAnchor.cs
- XmlSerializationReader.cs
- AdapterUtil.cs
- HttpModuleCollection.cs
- XhtmlBasicSelectionListAdapter.cs
- ThumbAutomationPeer.cs
- Bitmap.cs
- SubordinateTransaction.cs
- ConstructorNeedsTagAttribute.cs
- DrawListViewSubItemEventArgs.cs