From 7ecbae27c242a1d25f23e29f18807ae0bc4baa61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20S=C3=B6lver?= Date: Wed, 23 Dec 2020 23:21:47 +0100 Subject: [PATCH] More types. --- main.go | 20 +++++++++-- packages/ipp/enum.go | 53 +++++++++++++++++++++++++++++ packages/ipp/keyword.go | 4 +-- packages/ipp/messages.go | 18 +++++----- packages/ipp/request.go | 12 +++---- packages/ipp/response.go | 4 +++ packages/ipp/tag_string.go | 6 ++-- packages/ipp/textWithoutLanguage.go | 41 ++++++++++++++++++++++ packages/ipp/urivalue.go | 2 +- packages/mdnsserver/server.go | 1 + 10 files changed, 138 insertions(+), 23 deletions(-) create mode 100644 packages/ipp/enum.go create mode 100644 packages/ipp/textWithoutLanguage.go diff --git a/main.go b/main.go index eadf1cc..e2160ef 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,10 @@ package main import ( + "bytes" "context" "fmt" + "io" "ippserver/packages/ipp" "ippserver/packages/mdnsserver" "net/http" @@ -40,10 +42,24 @@ func handle(w http.ResponseWriter, r *http.Request) { // log.Infof("Body %x", body) request := ipp.NewRequest() - request.UnMarshal(r.Body) + rdata := make([]byte, r.ContentLength) + io.ReadFull(r.Body, rdata) + //log.Printf("Data %x", rdata) + fmt.Printf("data % #0x", rdata) + buf := bytes.NewBuffer(rdata) + request.UnMarshal(buf) fmt.Printf("%v", request) response := ipp.NewResponse(ipp.SuccessfulOk, request.RequestId()) - a := ipp.NewCharSetValue("attributes-charset", "utf-8") + var a ipp.Attribute + a = ipp.NewCharSetValue("attributes-charset", "utf-8") + response.AddOperatonAttribute(a) + a = ipp.NewNaturalLanguage("attributes-natural-language", "en") + response.AddOperatonAttribute(a) + a = ipp.NewUriValue("printer-uri", "ipp://drpork:1234/ipp/print") + response.AddOperatonAttribute(a) + a = ipp.NewtextWithoutLanguage("printer-make-and-model", "ChroBro 001") + response.AddOperatonAttribute(a) + a = ipp.NewEnum("printer-state", uint16(3)) response.AddOperatonAttribute(a) data := response.Marshal() log.Infof("% x", data) diff --git a/packages/ipp/enum.go b/packages/ipp/enum.go new file mode 100644 index 0000000..c1ca650 --- /dev/null +++ b/packages/ipp/enum.go @@ -0,0 +1,53 @@ +package ipp + +import ( + "encoding/binary" + "io" +) + +type enum struct { + name string + value uint16 +} + +func NewEnum(name string, value uint16) *enum { + e := new(enum) + e.name = name + e.value = value + return e +} + +func (e enum) String() string { + return e.name + ":" + string(e.value) +} +func (e *enum) valueTag() tag { + return enumValueTag +} + +func (e *enum) unmarshal(byteStream io.Reader) { + //e.name, e.value = unmarshalSingleValue(byteStream) + +} + +func (e *enum) marshal() []byte { + l := 3 + len(e.name) + 6 + b := make([]byte, l, l) + p := 0 + b[0] = byte(enumValueTag) + p += 1 + binary.BigEndian.PutUint16(b[p:p+2], uint16(len(e.name))) + p += 2 + copy(b[p:], []byte(e.name)) + p += len(e.name) + binary.BigEndian.PutUint16(b[p:p+2], uint16(4)) + p += 2 + binary.BigEndian.PutUint32(b[p:p+4], uint32(e.value)) + return b +} + +func (e *enum) size() int { + l := 1 + 4 // The attribute tag + 2 lengths + l += len(e.name) + l += 4 + return l +} diff --git a/packages/ipp/keyword.go b/packages/ipp/keyword.go index e61d8b9..7c5b0a0 100644 --- a/packages/ipp/keyword.go +++ b/packages/ipp/keyword.go @@ -9,7 +9,7 @@ type keyWord struct { values []string } -func newKeyWord() *keyWord { +func NewKeyWord() *keyWord { k := new(keyWord) k.values = make([]string, 0) return k @@ -69,7 +69,7 @@ func (k *keyWord) marshal() []byte { return []byte{} } -func (k *keyWord) addValue(v string) { +func (k *keyWord) AddValue(v string) { k.values = append(k.values, v) } diff --git a/packages/ipp/messages.go b/packages/ipp/messages.go index 5033df9..243bf01 100644 --- a/packages/ipp/messages.go +++ b/packages/ipp/messages.go @@ -43,15 +43,15 @@ const ( endCollectionValueTag tag = 0x37 // Character string values - textWithoutLanguagageValueTag tag = 0x41 - nameWithoutLanguagageValueTag tag = 0x42 - keyWordValueTag tag = 0x44 - uriValueTag tag = 0x45 - uriSchemeValueTag tag = 0x46 - charsetValueTag tag = 0x47 - naturalLanguagageValueTag tag = 0x48 - mimeMediaTypeValueTag tag = 0x49 - memberAttrNameValueTag tag = 0x4a + textWithoutLanguageValueTag tag = 0x41 + nameWithoutLanguageValueTag tag = 0x42 + keyWordValueTag tag = 0x44 + uriValueTag tag = 0x45 + uriSchemeValueTag tag = 0x46 + charsetValueTag tag = 0x47 + naturalLanguageValueTag tag = 0x48 + mimeMediaTypeValueTag tag = 0x49 + memberAttrNameValueTag tag = 0x4a ) // Operation-id, defined in rfc8011 diff --git a/packages/ipp/request.go b/packages/ipp/request.go index a4d014d..f18f6c9 100644 --- a/packages/ipp/request.go +++ b/packages/ipp/request.go @@ -99,23 +99,23 @@ func (r *Request) UnMarshal(body io.Reader) { r.operationAttributes[c.name] = c log.Infof("%v %v", c.name, c.value) case uriValueTag: - u := newUriValue("", "") + u := NewUriValue("", "") u.unmarshal(body) r.operationAttributes[u.name] = u log.Infof("%v %v", u.name, u.value) - case naturalLanguagageValueTag: - n := newNaturalLanguagage("", "") + case naturalLanguageValueTag: + n := NewNaturalLanguage("", "") n.unmarshal(body) r.operationAttributes[n.name] = n log.Infof("%v %v", n.name, n.value) case keyWordValueTag: name, value := unmarshalSingleValue(body) if name == "" { - lastKeyword.addValue(value) + lastKeyword.AddValue(value) } else { - k := newKeyWord() + k := NewKeyWord() k.name = name - k.addValue(value) + k.AddValue(value) r.operationAttributes[k.name] = k lastKeyword = k } diff --git a/packages/ipp/response.go b/packages/ipp/response.go index e1f36e0..2a86b39 100644 --- a/packages/ipp/response.go +++ b/packages/ipp/response.go @@ -52,6 +52,10 @@ func NewResponse(code statusCode, requestId uint32) *Response { // } +func (r Response) String() string { + return "" +} + func (r *Response) Marshal() []byte { a := make([]byte, 0, 20) a = append(a, r.header.marshal()...) diff --git a/packages/ipp/tag_string.go b/packages/ipp/tag_string.go index 8101cc3..c7c4eb5 100644 --- a/packages/ipp/tag_string.go +++ b/packages/ipp/tag_string.go @@ -28,13 +28,13 @@ func _() { _ = x[textWithLanguageValueTag-53] _ = x[nameWithLanguageValueTag-54] _ = x[endCollectionValueTag-55] - _ = x[textWithoutLanguagageValueTag-65] - _ = x[nameWithoutLanguagageValueTag-66] + _ = x[textWithoutLanguageValueTag-65] + _ = x[nameWithoutLanguageValueTag-66] _ = x[keyWordValueTag-68] _ = x[uriValueTag-69] _ = x[uriSchemeValueTag-70] _ = x[charsetValueTag-71] - _ = x[naturalLanguagageValueTag-72] + _ = x[naturalLanguageValueTag-72] _ = x[mimeMediaTypeValueTag-73] _ = x[memberAttrNameValueTag-74] } diff --git a/packages/ipp/textWithoutLanguage.go b/packages/ipp/textWithoutLanguage.go new file mode 100644 index 0000000..1c53a13 --- /dev/null +++ b/packages/ipp/textWithoutLanguage.go @@ -0,0 +1,41 @@ +package ipp + +import "io" + +type textWithoutLanguage struct { + name string + value string +} + +func NewtextWithoutLanguage(name, value string) *textWithoutLanguage { + c := new(textWithoutLanguage) + c.name = name + c.value = value + return c +} + +func (c textWithoutLanguage) String() string { + return c.name + ":" + c.value +} +func (c *textWithoutLanguage) valueTag() tag { + return textWithoutLanguageValueTag +} + +func (c *textWithoutLanguage) unmarshal(byteStream io.Reader) { + c.name, c.value = unmarshalSingleValue(byteStream) +} + +func (c *textWithoutLanguage) marshal() []byte { + l := 5 + len(c.name) + len(c.value) + b := make([]byte, l, l) + b[0] = byte(textWithoutLanguageValueTag) + marshalNameValue(c.name, c.value, b[1:]) + return b +} + +func (c *textWithoutLanguage) size() int { + l := 1 + 4 // The attribute tag + 2 lengths + l += len(c.name) + l += len(c.value) + return l +} diff --git a/packages/ipp/urivalue.go b/packages/ipp/urivalue.go index b570c56..79c2b63 100644 --- a/packages/ipp/urivalue.go +++ b/packages/ipp/urivalue.go @@ -9,7 +9,7 @@ type uriValue struct { value string } -func newUriValue(name, value string) *uriValue { +func NewUriValue(name, value string) *uriValue { u := new(uriValue) u.name = name u.value = value diff --git a/packages/mdnsserver/server.go b/packages/mdnsserver/server.go index db33db6..92f6ae4 100644 --- a/packages/mdnsserver/server.go +++ b/packages/mdnsserver/server.go @@ -39,6 +39,7 @@ func Run(ctx context.Context) { txt = append(txt, []byte("product=coola-skrivaren")) txt = append(txt, []byte("Color=T")) txt = append(txt, []byte("rp=ipp/print")) + txt = append(txt, []byte("ty=ChroBro 001")) err = eg.AddService(avahi.InterfaceUnspec, avahi.ProtoUnspec, 0, hostname, "_ipp._tcp", "local", fqdn, 1234, txt) if err != nil { log.Fatalf("AddService() failed: %v", err)