using System; namespace Unosquare.Swan.Networking.Ldap { /// /// Represents a LDAP Modification Request Message. /// /// public sealed class LdapModifyRequest : LdapMessage { /// /// Initializes a new instance of the class. /// /// The dn. /// The modifications. /// The control. public LdapModifyRequest(String dn, LdapModification[] modifications, LdapControl[] control) : base(LdapOperation.ModifyRequest, new RfcModifyRequest(dn, EncodeModifications(modifications)), control) { } /// /// Gets the dn. /// /// /// The dn. /// public String DN => this.Asn1Object.RequestDn; /// public override String ToString() => this.Asn1Object.ToString(); private static Asn1SequenceOf EncodeModifications(LdapModification[] mods) { Asn1SequenceOf rfcMods = new Asn1SequenceOf(mods.Length); foreach(LdapModification t in mods) { LdapAttribute attr = t.Attribute; Asn1SetOf vals = new Asn1SetOf(attr.Size()); if(attr.Size() > 0) { foreach(SByte[] val in attr.ByteValueArray) { vals.Add(new Asn1OctetString(val)); } } Asn1Sequence rfcMod = new Asn1Sequence(2); rfcMod.Add(new Asn1Enumerated((Int32)t.Op)); rfcMod.Add(new RfcAttributeTypeAndValues(attr.Name, vals)); rfcMods.Add(rfcMod); } return rfcMods; } internal class RfcAttributeTypeAndValues : Asn1Sequence { public RfcAttributeTypeAndValues(String type, Asn1Object vals) : base(2) { this.Add(type); this.Add(vals); } } } }