88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
// 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))
|
|
}
|