70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
// Copyright 2021, Henrik Sölver henrik.solver@gmail.com
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
package ipp
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
type Integer struct {
|
|
name string
|
|
values []int32
|
|
}
|
|
|
|
func NewInteger(name string, values ...int32) *Integer {
|
|
e := new(Integer)
|
|
e.name = name
|
|
e.values = values
|
|
return e
|
|
}
|
|
|
|
func (i Integer) Name() string {
|
|
return i.name
|
|
}
|
|
|
|
func (i Integer) String() string {
|
|
return i.name + ":" + fmt.Sprint(i.values)
|
|
}
|
|
|
|
func (i *Integer) valueTag() tag {
|
|
return integerValueTag
|
|
}
|
|
|
|
func (i *Integer) addValue(v interface{}) {
|
|
i.values = append(i.values, v.(int32))
|
|
}
|
|
|
|
func (i *Integer) marshal() []byte {
|
|
return marshalInteger(integerValueTag, i.name, i.values)
|
|
}
|
|
|
|
func (i *Integer) unmarshal(byteStream *bufio.Reader) {
|
|
soi, err := unmarshalIntegers(byteStream, integerValueTag)
|
|
if err != nil {
|
|
return
|
|
}
|
|
i.name = soi.name
|
|
i.values = soi.values
|
|
}
|
|
|
|
func marshalInteger(t tag, name string, values []int32) []byte {
|
|
l := 9 + len(name) + 9*(len(values)-1)
|
|
b := make([]byte, 0, l)
|
|
buf := bytes.NewBuffer(b)
|
|
buf.WriteByte(byte(t))
|
|
binary.Write(buf, binary.BigEndian, uint16(len(name)))
|
|
buf.WriteString(name)
|
|
binary.Write(buf, binary.BigEndian, uint16(4))
|
|
binary.Write(buf, binary.BigEndian, values[0])
|
|
for _, v := range values[1:] {
|
|
buf.WriteByte(byte(t))
|
|
binary.Write(buf, binary.BigEndian, uint16(0))
|
|
binary.Write(buf, binary.BigEndian, uint16(4))
|
|
binary.Write(buf, binary.BigEndian, v)
|
|
}
|
|
return buf.Bytes()
|
|
}
|