Add collection type, use buffered bytestream.
Fixed some more attribute types.
This commit is contained in:
74
packages/ipp/collection.go
Normal file
74
packages/ipp/collection.go
Normal file
@@ -0,0 +1,74 @@
|
||||
package ipp
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/binary"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
// Currently the collection data is just consumed and dropped from the bytestream
|
||||
func consumeCollection(byteStream *bufio.Reader) {
|
||||
// RFC8010 Section 3.1.6
|
||||
var length uint16
|
||||
|
||||
binary.Read(byteStream, binary.BigEndian, &length)
|
||||
collectionName := make([]byte, length)
|
||||
if length > 0 {
|
||||
binary.Read(byteStream, binary.BigEndian, collectionName)
|
||||
}
|
||||
log.Info("collection name " + string(collectionName))
|
||||
err := binary.Read(byteStream, binary.BigEndian, &length) //Always zero ??
|
||||
if err != nil {
|
||||
log.Fatal("error ", err.Error())
|
||||
}
|
||||
if length != 0 {
|
||||
log.Fatal("Should be zero")
|
||||
}
|
||||
// Member attributes
|
||||
done:
|
||||
for {
|
||||
var t tag
|
||||
binary.Read(byteStream, binary.BigEndian, &t)
|
||||
log.Debug("Collection tag ", t)
|
||||
switch t {
|
||||
case endCollectionValueTag:
|
||||
binary.Read(byteStream, binary.BigEndian, &length)
|
||||
if length != 0 {
|
||||
log.Fatal("Should be zero")
|
||||
}
|
||||
binary.Read(byteStream, binary.BigEndian, &length)
|
||||
if length != 0 {
|
||||
log.Fatal("Should be zero")
|
||||
}
|
||||
case memberAttrNameValueTag:
|
||||
// RFC8010 Section 3.7.1
|
||||
binary.Read(byteStream, binary.BigEndian, &length) //Always zero ??
|
||||
if length != 0 {
|
||||
log.Fatal("Should be zero")
|
||||
}
|
||||
binary.Read(byteStream, binary.BigEndian, &length) // Value length
|
||||
memberName := make([]byte, length)
|
||||
binary.Read(byteStream, binary.BigEndian, memberName)
|
||||
log.Debugf("Member name: %v", string(memberName))
|
||||
var memberValueTag tag
|
||||
binary.Read(byteStream, binary.BigEndian, &memberValueTag)
|
||||
log.Debug("Member value tag: ", memberValueTag)
|
||||
binary.Read(byteStream, binary.BigEndian, &length) //Always zero ??
|
||||
if length != 0 {
|
||||
log.Fatal("Should be zero")
|
||||
}
|
||||
var memberValueLength uint16
|
||||
binary.Read(byteStream, binary.BigEndian, &memberValueLength)
|
||||
memberValue := make([]byte, memberValueLength)
|
||||
binary.Read(byteStream, binary.BigEndian, memberValue)
|
||||
log.Debugf("Member Value: % x", memberValue)
|
||||
default:
|
||||
// Next tag is one that can not be handled in the collection
|
||||
// Put it back in the byte stream and return to main loop
|
||||
byteStream.UnreadByte()
|
||||
break done
|
||||
}
|
||||
}
|
||||
log.Debug("Collection done")
|
||||
}
|
||||
Reference in New Issue
Block a user