Merge attribute handling from request and response to commen code.
This commit was merged in pull request #7.
This commit is contained in:
@@ -4,6 +4,8 @@ import (
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// References
|
||||
@@ -121,3 +123,130 @@ func marshalNameValue(name, value string, b []byte) {
|
||||
p += 2
|
||||
copy(b[p:], []byte(value))
|
||||
}
|
||||
|
||||
type Attribute interface {
|
||||
Name() string
|
||||
valueTag() tag
|
||||
marshal() []byte
|
||||
//size() int
|
||||
}
|
||||
|
||||
type attributes struct {
|
||||
operation []Attribute
|
||||
printer []Attribute
|
||||
job []Attribute
|
||||
}
|
||||
|
||||
func (a *attributes) String() string{
|
||||
s := " OperationAttributes" + "\n"
|
||||
for _, a := range a.operation {
|
||||
s = s + fmt.Sprintf(" %v (%v)\n", a, a.valueTag())
|
||||
}
|
||||
s = s + " PrinterAttributes" + "\n"
|
||||
for _, a := range a.printer {
|
||||
s = s + fmt.Sprintf(" %v (%v)\n", a, a.valueTag())
|
||||
}
|
||||
s = s + " JobAttributes" + "\n"
|
||||
for _, a := range a.job {
|
||||
s = s + fmt.Sprintf(" %v (%v)\n", a, a.valueTag())
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func (as *attributes) addAttribute(group tag, a Attribute) {
|
||||
switch group {
|
||||
case operationAttributes:
|
||||
as.operation = append(as.operation, a)
|
||||
case jobAttributes:
|
||||
as.job = append(as.job, a)
|
||||
case printerAttributes:
|
||||
as.printer = append(as.printer, a)
|
||||
default:
|
||||
log.Error("Unknown attribute group")
|
||||
}
|
||||
}
|
||||
|
||||
func UnMarshalAttributues(body io.Reader) *attributes {
|
||||
a := new(attributes)
|
||||
|
||||
var t tag
|
||||
err := binary.Read(body, binary.BigEndian, &t)
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
}
|
||||
log.Debugf("got tag - %v", t)
|
||||
if t != operationAttributes && t != jobAttributes && t != printerAttributes {
|
||||
log.Errorf("Unknown attribute group tag %v", t)
|
||||
return nil
|
||||
}
|
||||
currentAttributeGroup := t
|
||||
|
||||
var lastAddValuer AddValuer
|
||||
for {
|
||||
err = binary.Read(body, binary.BigEndian, &t)
|
||||
if err != nil {
|
||||
log.Errorf("End of input before end of attributes tag (%v)", err.Error())
|
||||
}
|
||||
log.Debugf("Value tag - %v", t)
|
||||
switch t {
|
||||
case endOfAttributes:
|
||||
return a
|
||||
case charsetValueTag:
|
||||
c := NewCharSetValue("", "")
|
||||
c.unmarshal(body)
|
||||
a.addAttribute(currentAttributeGroup, c)
|
||||
log.Debugf("%v %v", c.name, c.value)
|
||||
case uriValueTag:
|
||||
u := NewUriValue("", "")
|
||||
u.unmarshal(body)
|
||||
a.addAttribute(currentAttributeGroup, u)
|
||||
log.Debugf("%v %v", u.name, u.value)
|
||||
case naturalLanguageValueTag:
|
||||
n := NewNaturalLanguage("", "")
|
||||
n.unmarshal(body)
|
||||
a.addAttribute(currentAttributeGroup, n)
|
||||
log.Debugf("%v %v", n.name, n.value)
|
||||
case keyWordValueTag:
|
||||
name, value := unmarshalSingleValue(body)
|
||||
if name == "" {
|
||||
lastAddValuer.addValue(value)
|
||||
} else {
|
||||
k := NewKeyWord(name, value)
|
||||
a.addAttribute(currentAttributeGroup, k)
|
||||
lastAddValuer = k
|
||||
}
|
||||
log.Debugf("%v : %v", name, value)
|
||||
case nameWithoutLanguageValueTag:
|
||||
n := NewNameWithoutLanguage("", "")
|
||||
n.unmarshal(body)
|
||||
a.addAttribute(currentAttributeGroup, n)
|
||||
log.Debugf("%v %v", n.name, n.value)
|
||||
case mimeMediaTypeValueTag:
|
||||
name, value := unmarshalSingleValue(body)
|
||||
if name == "" {
|
||||
lastAddValuer.addValue(value)
|
||||
} else {
|
||||
m := NewMimeMediaType(name, value)
|
||||
a.addAttribute(currentAttributeGroup, m)
|
||||
lastAddValuer = m
|
||||
}
|
||||
log.Debugf("%v : %v", name, value)
|
||||
case jobAttributes:
|
||||
log.Debug("Start job attributes")
|
||||
currentAttributeGroup = jobAttributes
|
||||
case printerAttributes:
|
||||
log.Debug("Start printer attributes")
|
||||
currentAttributeGroup = printerAttributes
|
||||
case operationAttributes:
|
||||
log.Debug("Start operation attributes")
|
||||
currentAttributeGroup = operationAttributes
|
||||
case resolutionValueTag:
|
||||
res := NewResolution("", 0, 0)
|
||||
res.unmarshal(body)
|
||||
a.addAttribute(currentAttributeGroup, res)
|
||||
log.Debugf("Resolution %v", res)
|
||||
default:
|
||||
log.Errorf("Unsupported tag %v", t)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user