GeneralNames
using Org.BouncyCastle.Utilities;
using System;
using System.Text;
namespace Org.BouncyCastle.Asn1.X509
{
    public class GeneralNames : Asn1Encodable
    {
        private readonly GeneralName[] m_names;
        public int Count => m_names.Length;
        public static GeneralNames GetInstance(object obj)
        {
            if (obj == null)
                return null;
            GeneralNames generalNames = obj as GeneralNames;
            if (generalNames != null)
                return generalNames;
            return new GeneralNames(Asn1Sequence.GetInstance(obj));
        }
        public static GeneralNames GetInstance(Asn1TaggedObject obj, bool explicitly)
        {
            return new GeneralNames(Asn1Sequence.GetInstance(obj, explicitly));
        }
        public static GeneralNames GetOptional(Asn1Encodable element)
        {
            if (element == null)
                throw new ArgumentNullException("element");
            GeneralNames generalNames = element as GeneralNames;
            if (generalNames != null)
                return generalNames;
            Asn1Sequence optional = Asn1Sequence.GetOptional(element);
            if (optional != null)
                return new GeneralNames(optional);
            return null;
        }
        public static GeneralNames GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new GeneralNames(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
        }
        public static GeneralNames FromExtensions(X509Extensions extensions, DerObjectIdentifier extOid)
        {
            return GetInstance(X509Extensions.GetExtensionParsedValue(extensions, extOid));
        }
        public GeneralNames(GeneralName name)
        {
            GeneralName[] obj = new GeneralName[1];
            if (name == null)
                throw new ArgumentNullException("name");
            obj[0] = name;
            m_names = obj;
        }
        public GeneralNames(GeneralName[] names)
        {
            if (Arrays.IsNullOrContainsNull(names))
                throw new NullReferenceException("'names' cannot be null, or contain null");
            m_names = Copy(names);
        }
        private GeneralNames(Asn1Sequence seq)
        {
            m_names = seq.MapElements(GeneralName.GetInstance);
        }
        public GeneralName[] GetNames()
        {
            return Copy(m_names);
        }
        public override Asn1Object ToAsn1Object()
        {
            Asn1Encodable[] names = m_names;
            return DerSequence.FromElements(names);
        }
        public override string ToString()
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendLine("GeneralNames:");
            GeneralName[] names = m_names;
            foreach (GeneralName value in names) {
                stringBuilder.Append("    ").Append(value).AppendLine();
            }
            return stringBuilder.ToString();
        }
        private static GeneralName[] Copy(GeneralName[] names)
        {
            return (GeneralName[])names.Clone();
        }
    }
}