package ipp import ( "bytes" "encoding/binary" "fmt" "io" ) 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) size() int { return 9 + len(i.name) // The attribute tag + 2 lengths } 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 marshalInteger(t tag, name string, values []int32) []byte { l := 9 + len(name) b := make([]byte, 0, l) buf := bytes.NewBuffer(b) buf.WriteByte(byte(integerValueTag)) 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(integerValueTag)) binary.Write(buf, binary.BigEndian, uint16(0)) binary.Write(buf, binary.BigEndian, uint16(4)) binary.Write(buf, binary.BigEndian, v) } return buf.Bytes() } func unmarshalSingleInteger(byteStream io.Reader) (string, int32) { name, data := unmarshalSingleAttribute(byteStream) return name, int32(binary.BigEndian.Uint32(data)) }