File: System\DirectoryServices\ActiveDirectory\ActiveDirectorySiteCollection.cs
Web Access
Project: src\src\runtime\src\libraries\System.DirectoryServices\src\System.DirectoryServices.csproj (System.DirectoryServices)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections;
using System.Runtime.InteropServices;

namespace System.DirectoryServices.ActiveDirectory
{
    public class ActiveDirectorySiteCollection : CollectionBase
    {
        internal DirectoryEntry? de;
        internal bool initialized;
        internal DirectoryContext? context;

        internal ActiveDirectorySiteCollection() { }

        internal ActiveDirectorySiteCollection(ArrayList sites)
        {
            for (int i = 0; i < sites.Count; i++)
                Add((ActiveDirectorySite)sites[i]!);
        }

        public ActiveDirectorySite this[int index]
        {
            get => (ActiveDirectorySite)InnerList[index]!;
            set
            {
                ActiveDirectorySite site = (ActiveDirectorySite)value;

                if (site == null)
                    throw new ArgumentNullException(nameof(value));

                if (!site.existing)
                    throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

                if (!Contains(site))
                    List[index] = site;
                else
                    throw new ArgumentException(SR.Format(SR.AlreadyExistingInCollection, site), nameof(value));
            }
        }

        public int Add(ActiveDirectorySite site)
        {
            ArgumentNullException.ThrowIfNull(site);

            if (!site.existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

            if (!Contains(site))
                return List.Add(site);
            else
                throw new ArgumentException(SR.Format(SR.AlreadyExistingInCollection, site), nameof(site));
        }

        public void AddRange(ActiveDirectorySite[] sites)
        {
            ArgumentNullException.ThrowIfNull(sites);

            for (int i = 0; ((i) < (sites.Length)); i = ((i) + (1)))
                this.Add(sites[i]);
        }

        public void AddRange(ActiveDirectorySiteCollection sites)
        {
            ArgumentNullException.ThrowIfNull(sites);

            int count = sites.Count;
            for (int i = 0; i < count; i++)
                this.Add(sites[i]);
        }

        public bool Contains(ActiveDirectorySite site)
        {
            ArgumentNullException.ThrowIfNull(site);

            if (!site.existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

            string dn = (string)PropertyManager.GetPropertyValue(site.context, site.cachedEntry, PropertyManager.DistinguishedName)!;

            for (int i = 0; i < InnerList.Count; i++)
            {
                ActiveDirectorySite tmp = (ActiveDirectorySite)InnerList[i]!;
                string tmpDn = (string)PropertyManager.GetPropertyValue(tmp.context, tmp.cachedEntry, PropertyManager.DistinguishedName)!;

                if (Utils.Compare(tmpDn, dn) == 0)
                {
                    return true;
                }
            }
            return false;
        }

        public void CopyTo(ActiveDirectorySite[] array, int index)
        {
            List.CopyTo(array, index);
        }

        public int IndexOf(ActiveDirectorySite site)
        {
            ArgumentNullException.ThrowIfNull(site);

            if (!site.existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

            string dn = (string)PropertyManager.GetPropertyValue(site.context, site.cachedEntry, PropertyManager.DistinguishedName)!;

            for (int i = 0; i < InnerList.Count; i++)
            {
                ActiveDirectorySite tmp = (ActiveDirectorySite)InnerList[i]!;
                string tmpDn = (string)PropertyManager.GetPropertyValue(tmp.context, tmp.cachedEntry, PropertyManager.DistinguishedName)!;

                if (Utils.Compare(tmpDn, dn) == 0)
                {
                    return i;
                }
            }
            return -1;
        }

        public void Insert(int index, ActiveDirectorySite site)
        {
            ArgumentNullException.ThrowIfNull(site);

            if (!site.existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

            if (!Contains(site))
                List.Insert(index, site);
            else
                throw new ArgumentException(SR.Format(SR.AlreadyExistingInCollection, site), nameof(site));
        }

        public void Remove(ActiveDirectorySite site)
        {
            ArgumentNullException.ThrowIfNull(site);

            if (!site.existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, site.Name));

            string dn = (string)PropertyManager.GetPropertyValue(site.context, site.cachedEntry, PropertyManager.DistinguishedName)!;

            for (int i = 0; i < InnerList.Count; i++)
            {
                ActiveDirectorySite tmp = (ActiveDirectorySite)InnerList[i]!;
                string tmpDn = (string)PropertyManager.GetPropertyValue(tmp.context, tmp.cachedEntry, PropertyManager.DistinguishedName)!;

                if (Utils.Compare(tmpDn, dn) == 0)
                {
                    List.Remove(tmp);
                    return;
                }
            }

            // something that does not exist in the collectio
            throw new ArgumentException(SR.Format(SR.NotFoundInCollection, site), nameof(site));
        }

        protected override void OnClearComplete()
        {
            // if the property exists, clear it out
            if (initialized)
            {
                try
                {
                    if (de!.Properties.Contains("siteList"))
                        de.Properties["siteList"].Clear();
                }
                catch (COMException e)
                {
                    throw ExceptionHelper.GetExceptionFromCOMException(context, e);
                }
            }
        }

#pragma warning disable CS8765 // Nullability doesn't match overridden member
        protected override void OnInsertComplete(int index, object value)
#pragma warning restore CS8765
        {
            if (initialized)
            {
                ActiveDirectorySite site = (ActiveDirectorySite)value;
                string dn = (string)PropertyManager.GetPropertyValue(site.context, site.cachedEntry, PropertyManager.DistinguishedName)!;
                try
                {
                    de!.Properties["siteList"].Add(dn);
                }
                catch (COMException e)
                {
                    throw ExceptionHelper.GetExceptionFromCOMException(context, e);
                }
            }
        }

#pragma warning disable CS8765 // Nullability doesn't match overridden member
        protected override void OnRemoveComplete(int index, object value)
#pragma warning restore CS8765
        {
            ActiveDirectorySite site = (ActiveDirectorySite)value;
            string dn = (string)PropertyManager.GetPropertyValue(site.context, site.cachedEntry, PropertyManager.DistinguishedName)!;
            try
            {
                de!.Properties["siteList"].Remove(dn);
            }
            catch (COMException e)
            {
                throw ExceptionHelper.GetExceptionFromCOMException(context, e);
            }
        }

#pragma warning disable CS8765 // Nullability doesn't match overridden member
        protected override void OnSetComplete(int index, object oldValue, object newValue)
#pragma warning restore CS8765
        {
            ActiveDirectorySite newsite = (ActiveDirectorySite)newValue;
            string newdn = (string)PropertyManager.GetPropertyValue(newsite.context, newsite.cachedEntry, PropertyManager.DistinguishedName)!;
            try
            {
                de!.Properties["siteList"][index] = newdn;
            }
            catch (COMException e)
            {
                throw ExceptionHelper.GetExceptionFromCOMException(context, e);
            }
        }

        protected override void OnValidate(object value)
        {
            ArgumentNullException.ThrowIfNull(value);

            if (!(value is ActiveDirectorySite))
                throw new ArgumentException(null, nameof(value));

            if (!((ActiveDirectorySite)value).existing)
                throw new InvalidOperationException(SR.Format(SR.SiteNotCommitted, ((ActiveDirectorySite)value).Name));
        }
    }
}