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);
}
}
}
}