Files
ippserver/packages/ipp/rangeofinteger.go
2021-11-27 15:47:03 +00:00

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))
}