From d293fcac9cbeb2a93aa6b4873dd537942f1adb90 Mon Sep 17 00:00:00 2001 From: Dustin Oprea Date: Sun, 5 Jan 2020 16:53:55 -0500 Subject: [PATCH] undefined/exif_8828_oecf.go: Add Encode() --- v2/undefined/exif_8828_oecf.go | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/v2/undefined/exif_8828_oecf.go b/v2/undefined/exif_8828_oecf.go index c054938..1ac9e7a 100644 --- a/v2/undefined/exif_8828_oecf.go +++ b/v2/undefined/exif_8828_oecf.go @@ -1,8 +1,11 @@ package exifundefined import ( + "bytes" "fmt" + "encoding/binary" + "github.com/dsoprea/go-logging" "github.com/dsoprea/go-exif/v2/common" @@ -26,6 +29,47 @@ func (oecf Tag8828Oecf) EncoderName() string { type Codec8828Oecf struct { } +func (Codec8828Oecf) Encode(value interface{}, byteOrder binary.ByteOrder) (encoded []byte, unitCount uint32, err error) { + defer func() { + if state := recover(); state != nil { + err = log.Wrap(state.(error)) + } + }() + + // TODO(dustin): Add test + + oecf, ok := value.(Tag8828Oecf) + if ok == false { + log.Panicf("can only encode a Tag8828Oecf") + } + + b := new(bytes.Buffer) + + err = binary.Write(b, byteOrder, oecf.Columns) + log.PanicIf(err) + + err = binary.Write(b, byteOrder, oecf.Rows) + log.PanicIf(err) + + for _, name := range oecf.ColumnNames { + _, err := b.Write([]byte(name)) + log.PanicIf(err) + + _, err = b.Write([]byte{0}) + log.PanicIf(err) + } + + ve := exifcommon.NewValueEncoder(byteOrder) + + ed, err := ve.Encode(oecf.Values) + log.PanicIf(err) + + _, err = b.Write(ed.Encoded) + log.PanicIf(err) + + return b.Bytes(), uint32(b.Len()), nil +} + func (Codec8828Oecf) Decode(valueContext *exifcommon.ValueContext) (value EncodeableValue, err error) { defer func() { if state := recover(); state != nil {