Files
ippserver/packages/ipp/keyword.go
2020-12-23 23:21:47 +01:00

88 lines
1.8 KiB
Go

package ipp
import (
"encoding/binary"
)
type keyWord struct {
name string
values []string
}
func NewKeyWord() *keyWord {
k := new(keyWord)
k.values = make([]string, 0)
return k
}
func (k keyWord) String() string {
r := k.name + " :"
for _, v := range k.values {
r = r + " " + v
}
return r
}
func (k *keyWord) valueTag() tag {
return keyWordValueTag
}
// func (k *keyWord) unmarshal(byteStream io.Reader) {
// if len(k.values) == 0 {
// var v string
// k.name, v = unmarshalSingleValue(byteStream)
// k.values = append(k.values, v)
// } else {
// var v string
// _, v = unmarshalSingleValue(byteStream)
// k.values = append(k.values, v)
// }
// }
func (k *keyWord) marshal() []byte {
l := 5 + len(k.name) + len(k.values[0])
for i := range k.values[1:] {
l += 5 + len(k.values[i+1])
}
res := make([]byte, 0, l)
p := 0
res[p] = byte(keyWordValueTag)
p += 1
binary.BigEndian.PutUint16(res[p:p+2], uint16(len(k.name)))
p += 2
copy(res[p:], []byte(k.name))
p += len(k.name)
binary.BigEndian.PutUint16(res[p:p+2], uint16(len(k.values[0])))
p += 2
copy(res[p:], []byte(k.values[0]))
p += len(k.values[0])
for i := range k.values[1:] {
res[p] = byte(keyWordValueTag)
p += 1
binary.BigEndian.PutUint16(res[p:p+2], uint16(0))
p = p + 2
binary.BigEndian.PutUint16(res[p:p+2], uint16(len(k.values[i+1])))
p = p + 2
copy(res[p:], []byte(k.values[i+1]))
p += len(k.values[i+1])
}
return []byte{}
}
func (k *keyWord) AddValue(v string) {
k.values = append(k.values, v)
}
func (k *keyWord) size() int {
l := 1 + 2 // The value tag (0x44) + name-length field (2 bytes)
l += len(k.name)
l += 2 // value-length field (2 bytes)
l += len(k.values[0])
// Add all additional values
for _, v := range k.values[1:] {
l += 1 + 4 // The value tag (0x44) + 2 length fields (2 bytes)
l += len(v)
}
return l
}