github.com/GeniusesGroup/libgo@v0.0.0-20220929090155-5ff932cb408e/compress/gzip/decompressor.go (about) 1 /* For license and copyright information please see LEGAL file in repository */ 2 3 package gzip 4 5 import ( 6 "bytes" 7 egzip "compress/gzip" 8 "io" 9 10 "../../protocol" 11 ) 12 13 type Decompressor struct { 14 sourceMT protocol.MediaType 15 comBuf bytes.Buffer 16 comLen int 17 zr egzip.Reader 18 decompressedData []byte 19 } 20 21 func (c *Decompressor) initByCodec(compressed protocol.Codec) { 22 c.sourceMT = compressed.MediaType() 23 c.comLen = compressed.Len() 24 c.comBuf = *bytes.NewBuffer(compressed.Marshal()) 25 if err := c.zr.Reset(&c.comBuf); err != nil { 26 return 27 } 28 } 29 30 func (c *Decompressor) decompressAll() { 31 // TODO::: which solution? 32 // c.decompressedData, _ = io.ReadAll(gz) 33 var decomBuf bytes.Buffer 34 if c.comLen < 1 { 35 decomBuf.Grow(512) // TODO::: 512 came from io.ReadAll, any suggestion?? 36 } else { 37 decomBuf.Grow(c.comLen) 38 } 39 decomBuf.ReadFrom(&c.zr) 40 c.decompressedData = decomBuf.Bytes() 41 } 42 43 /* 44 ********** protocol.Codec interface ********** 45 */ 46 47 func (c *Decompressor) MediaType() protocol.MediaType { return c.sourceMT } 48 func (c *Decompressor) CompressType() protocol.CompressType { return nil } 49 50 func (c *Decompressor) Decode(reader protocol.Reader) (err protocol.Error) { 51 var goErr = c.zr.Reset(reader) 52 if goErr != nil { 53 // err = 54 } 55 return 56 } 57 func (c *Decompressor) Encode(writer protocol.Writer) (err protocol.Error) { 58 var _, goErr = c.WriteTo(writer) 59 if goErr != nil { 60 // err = 61 } 62 return 63 } 64 func (c *Decompressor) Marshal() (data []byte) { 65 if c.decompressedData == nil { 66 c.decompressAll() 67 } 68 return c.decompressedData 69 } 70 func (c *Decompressor) MarshalTo(data []byte) []byte { 71 if c.decompressedData == nil { 72 c.decompressAll() 73 } 74 return append(data, c.decompressedData...) 75 } 76 func (c *Decompressor) Unmarshal(data []byte) (err protocol.Error) { 77 c.comLen = len(data) 78 c.comBuf = *bytes.NewBuffer(data) 79 var goErr = c.zr.Reset(&c.comBuf) 80 if goErr != nil { 81 // err = 82 } 83 return 84 } 85 func (c *Decompressor) UnmarshalFrom(data []byte) (remaining []byte, err protocol.Error) { 86 err = c.Unmarshal(data) 87 // TODO::: can return any remaining data? 88 return 89 } 90 91 // Len return length of decompressed data 92 func (c *Decompressor) Len() (ln int) { 93 if c.decompressedData == nil { 94 c.decompressAll() 95 } 96 return len(c.decompressedData) 97 } 98 99 func (c *Decompressor) Discard() (err protocol.Error) { 100 // io.Copy(io.Discard, b) 101 return 102 } 103 104 /* 105 ********** io package interfaces ********** 106 */ 107 108 func (c *Decompressor) ReadFrom(reader io.Reader) (n int64, err error) { 109 err = c.zr.Reset(reader) 110 return 111 } 112 func (c *Decompressor) WriteTo(w io.Writer) (totalWrite int64, err error) { 113 return io.Copy(w, &c.zr) 114 }