forked from Deuxfleurs/bottin
94 lines
2.4 KiB
Go
94 lines
2.4 KiB
Go
package message
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
//
|
|
// Control ::= SEQUENCE {
|
|
// controlType LDAPOID,
|
|
// criticality BOOLEAN DEFAULT FALSE,
|
|
// controlValue OCTET STRING OPTIONAL }
|
|
|
|
func (control *Control) ControlType() LDAPOID {
|
|
return control.controlType
|
|
}
|
|
|
|
func (control *Control) Criticality() BOOLEAN {
|
|
return control.criticality
|
|
}
|
|
|
|
func (control *Control) ControlValue() *OCTETSTRING {
|
|
return control.controlValue
|
|
}
|
|
|
|
func readControl(bytes *Bytes) (control Control, err error) {
|
|
err = bytes.ReadSubBytes(classUniversal, tagSequence, control.readComponents)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readControl:\n%s", err.Error())}
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (control *Control) readComponents(bytes *Bytes) (err error) {
|
|
control.controlType, err = readLDAPOID(bytes)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
if bytes.HasMoreData() {
|
|
var tag TagAndLength
|
|
tag, err = bytes.PreviewTagAndLength()
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
if tag.Tag == tagBoolean {
|
|
control.criticality, err = readBOOLEAN(bytes)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
if control.criticality == false {
|
|
err = errors.New(fmt.Sprintf("readComponents: criticality default value FALSE should not be specified"))
|
|
return
|
|
}
|
|
}
|
|
}
|
|
if bytes.HasMoreData() {
|
|
var octetstring OCTETSTRING
|
|
octetstring, err = readOCTETSTRING(bytes)
|
|
if err != nil {
|
|
err = LdapError{fmt.Sprintf("readComponents:\n%s", err.Error())}
|
|
return
|
|
}
|
|
control.controlValue = octetstring.Pointer()
|
|
}
|
|
return
|
|
}
|
|
|
|
func (control Control) write(bytes *Bytes) (size int) {
|
|
if control.controlValue != nil {
|
|
size += control.controlValue.write(bytes)
|
|
}
|
|
if control.criticality != BOOLEAN(false) {
|
|
size += control.criticality.write(bytes)
|
|
}
|
|
size += control.controlType.write(bytes)
|
|
size += bytes.WriteTagAndLength(classUniversal, isCompound, tagSequence, size)
|
|
return
|
|
}
|
|
|
|
func (control Control) size() (size int) {
|
|
if control.controlValue != nil {
|
|
size += control.controlValue.size()
|
|
}
|
|
if control.criticality != BOOLEAN(false) {
|
|
size += control.criticality.size()
|
|
}
|
|
size += control.controlType.size()
|
|
size += sizeTagAndLength(tagSequence, size)
|
|
return
|
|
}
|