IssuingDistributionPoint
using System;
using System.Text;
namespace Org.BouncyCastle.Asn1.X509
{
    public class IssuingDistributionPoint : Asn1Encodable
    {
        private readonly DistributionPointName m_distributionPoint;
        private readonly DerBoolean m_onlyContainsUserCerts;
        private readonly DerBoolean m_onlyContainsCACerts;
        private readonly ReasonFlags m_onlySomeReasons;
        private readonly DerBoolean m_indirectCRL;
        private readonly DerBoolean m_onlyContainsAttributeCerts;
        private readonly Asn1Sequence m_seq;
        public bool OnlyContainsUserCerts => m_onlyContainsUserCerts.IsTrue;
        public bool OnlyContainsCACerts => m_onlyContainsCACerts.IsTrue;
        public bool IsIndirectCrl => m_indirectCRL.IsTrue;
        public bool OnlyContainsAttributeCerts => m_onlyContainsAttributeCerts.IsTrue;
        public DistributionPointName DistributionPoint => m_distributionPoint;
        public ReasonFlags OnlySomeReasons => m_onlySomeReasons;
        public static IssuingDistributionPoint GetInstance(object obj)
        {
            if (obj == null)
                return null;
            IssuingDistributionPoint issuingDistributionPoint = obj as IssuingDistributionPoint;
            if (issuingDistributionPoint != null)
                return issuingDistributionPoint;
            return new IssuingDistributionPoint(Asn1Sequence.GetInstance(obj));
        }
        public static IssuingDistributionPoint GetInstance(Asn1TaggedObject obj, bool explicitly)
        {
            return new IssuingDistributionPoint(Asn1Sequence.GetInstance(obj, explicitly));
        }
        public static IssuingDistributionPoint GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new IssuingDistributionPoint(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
        }
        public IssuingDistributionPoint(DistributionPointName distributionPoint, bool onlyContainsUserCerts, bool onlyContainsCACerts, ReasonFlags onlySomeReasons, bool indirectCRL, bool onlyContainsAttributeCerts)
        {
            m_distributionPoint = distributionPoint;
            m_onlyContainsUserCerts = DerBoolean.GetInstance(onlyContainsUserCerts);
            m_onlyContainsCACerts = DerBoolean.GetInstance(onlyContainsCACerts);
            m_onlySomeReasons = onlySomeReasons;
            m_indirectCRL = DerBoolean.GetInstance(indirectCRL);
            m_onlyContainsAttributeCerts = DerBoolean.GetInstance(onlyContainsAttributeCerts);
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(6);
            if (distributionPoint != null)
                asn1EncodableVector.Add(new DerTaggedObject(true, 0, distributionPoint));
            if (onlyContainsUserCerts)
                asn1EncodableVector.Add(new DerTaggedObject(false, 1, DerBoolean.True));
            if (onlyContainsCACerts)
                asn1EncodableVector.Add(new DerTaggedObject(false, 2, DerBoolean.True));
            if (onlySomeReasons != null)
                asn1EncodableVector.Add(new DerTaggedObject(false, 3, onlySomeReasons));
            if (indirectCRL)
                asn1EncodableVector.Add(new DerTaggedObject(false, 4, DerBoolean.True));
            if (onlyContainsAttributeCerts)
                asn1EncodableVector.Add(new DerTaggedObject(false, 5, DerBoolean.True));
            m_seq = new DerSequence(asn1EncodableVector);
        }
        private IssuingDistributionPoint(Asn1Sequence seq)
        {
            int count = seq.Count;
            int sequencePosition = 0;
            if (count < 0 || count > 6)
                throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
            m_distributionPoint = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 0, true, DistributionPointName.GetTagged);
            m_onlyContainsUserCerts = (Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 1, false, DerBoolean.GetTagged) ?? DerBoolean.False);
            m_onlyContainsCACerts = (Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 2, false, DerBoolean.GetTagged) ?? DerBoolean.False);
            m_onlySomeReasons = Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 3, false, (Asn1TaggedObject t, bool e) => new ReasonFlags(DerBitString.GetInstance(t, e)));
            m_indirectCRL = (Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 4, false, DerBoolean.GetTagged) ?? DerBoolean.False);
            m_onlyContainsAttributeCerts = (Asn1Utilities.ReadOptionalContextTagged(seq, ref sequencePosition, 5, false, DerBoolean.GetTagged) ?? DerBoolean.False);
            if (sequencePosition != count)
                throw new ArgumentException("Unexpected elements in sequence", "seq");
            m_seq = seq;
        }
        public override Asn1Object ToAsn1Object()
        {
            return m_seq;
        }
        public override string ToString()
        {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.AppendLine("IssuingDistributionPoint: [");
            if (m_distributionPoint != null)
                AppendObject(stringBuilder, "distributionPoint", m_distributionPoint.ToString());
            if (m_onlyContainsUserCerts.IsTrue)
                AppendObject(stringBuilder, "onlyContainsUserCerts", m_onlyContainsUserCerts.ToString());
            if (m_onlyContainsCACerts.IsTrue)
                AppendObject(stringBuilder, "onlyContainsCACerts", m_onlyContainsCACerts.ToString());
            if (m_onlySomeReasons != null)
                AppendObject(stringBuilder, "onlySomeReasons", m_onlySomeReasons.ToString());
            if (m_onlyContainsAttributeCerts.IsTrue)
                AppendObject(stringBuilder, "onlyContainsAttributeCerts", m_onlyContainsAttributeCerts.ToString());
            if (m_indirectCRL.IsTrue)
                AppendObject(stringBuilder, "indirectCRL", m_indirectCRL.ToString());
            stringBuilder.AppendLine("]");
            return stringBuilder.ToString();
        }
        private void AppendObject(StringBuilder buf, string name, string val)
        {
            string value = "    ";
            buf.Append(value);
            buf.Append(name);
            buf.AppendLine(":");
            buf.Append(value);
            buf.Append(value);
            buf.Append(val);
            buf.AppendLine();
        }
    }
}