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) + 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() } func unmarshalSingleInteger(byteStream io.Reader) (string, int32) { name, data := unmarshalSingleAttribute(byteStream) return name, int32(binary.BigEndian.Uint32(data)) }