// Copyright 2021, Henrik Sölver henrik.solver@gmail.com // SPDX-License-Identifier: BSD-3-Clause package ipp import ( "bufio" "encoding/binary" "fmt" log "github.com/sirupsen/logrus" ) type IRange struct { lower int32 upper int32 } type RangeOfInteger struct { name string values []IRange } func NewRangeOfInteger(name string, values ...IRange) *RangeOfInteger { r := new(RangeOfInteger) r.name = name r.values = values return r } func (r *RangeOfInteger) Name() string { return r.name } func (r RangeOfInteger) String() string { return r.name + ":" + fmt.Sprint(r.values) } func (r *RangeOfInteger) valueTag() tag { return rangeOfIntegerValueTag } func (r *RangeOfInteger) marshal() []byte { log.Error("marshal rangeOfInteger is not implemented yet") return []byte{} } func (r *RangeOfInteger) unmarshal(byteStream *bufio.Reader) error { var length uint16 r.values = make([]IRange, 0, 1) binary.Read(byteStream, binary.BigEndian, &length) name := make([]byte, length) if length > 0 { binary.Read(byteStream, binary.BigEndian, name) } r.name = string(name) binary.Read(byteStream, binary.BigEndian, &length) if length != 8 { return fmt.Errorf("wrong value-length of range-of-integer attribute %v", length) } for length > 0 { var i IRange err := binary.Read(byteStream, binary.BigEndian, &i.lower) if err != nil { return err } err = binary.Read(byteStream, binary.BigEndian, &i.upper) if err != nil { return err } r.values = append(r.values, i) next, err := byteStream.Peek(3) if err != nil { break } if next[0] != byte(rangeOfIntegerValueTag) || next[1] != 0x00 || next[2] != 0x00 { break } // Remove the value tag with the zero length from the stream byteStream.Discard(3) binary.Read(byteStream, binary.BigEndian, &length) } return nil } func (r *RangeOfInteger) addValue(v interface{}) { r.values = append(r.values, v.(IRange)) }