Convert the Snappy stream supplied in 'in' and write the zStandard stream to 'w'. If any error is detected on the Snappy stream it is returned. The number of bytes written is returned.
(in io.Reader, w io.Writer)
| 80 | // If any error is detected on the Snappy stream it is returned. |
| 81 | // The number of bytes written is returned. |
| 82 | func (r *SnappyConverter) Convert(in io.Reader, w io.Writer) (int64, error) { |
| 83 | initPredefined() |
| 84 | r.err = nil |
| 85 | r.r = in |
| 86 | if r.block == nil { |
| 87 | r.block = &blockEnc{} |
| 88 | r.block.init() |
| 89 | } |
| 90 | r.block.initNewEncode() |
| 91 | if len(r.buf) != snappyMaxEncodedLenOfMaxBlockSize+snappyChecksumSize { |
| 92 | r.buf = make([]byte, snappyMaxEncodedLenOfMaxBlockSize+snappyChecksumSize) |
| 93 | } |
| 94 | r.block.litEnc.Reuse = huff0.ReusePolicyNone |
| 95 | var written int64 |
| 96 | var readHeader bool |
| 97 | { |
| 98 | header := frameHeader{WindowSize: snappyMaxBlockSize}.appendTo(r.buf[:0]) |
| 99 | |
| 100 | var n int |
| 101 | n, r.err = w.Write(header) |
| 102 | if r.err != nil { |
| 103 | return written, r.err |
| 104 | } |
| 105 | written += int64(n) |
| 106 | } |
| 107 | |
| 108 | for { |
| 109 | if !r.readFull(r.buf[:4], true) { |
| 110 | // Add empty last block |
| 111 | r.block.reset(nil) |
| 112 | r.block.last = true |
| 113 | err := r.block.encodeLits(r.block.literals, false) |
| 114 | if err != nil { |
| 115 | return written, err |
| 116 | } |
| 117 | n, err := w.Write(r.block.output) |
| 118 | if err != nil { |
| 119 | return written, err |
| 120 | } |
| 121 | written += int64(n) |
| 122 | |
| 123 | return written, r.err |
| 124 | } |
| 125 | chunkType := r.buf[0] |
| 126 | if !readHeader { |
| 127 | if chunkType != chunkTypeStreamIdentifier { |
| 128 | println("chunkType != chunkTypeStreamIdentifier", chunkType) |
| 129 | r.err = ErrSnappyCorrupt |
| 130 | return written, r.err |
| 131 | } |
| 132 | readHeader = true |
| 133 | } |
| 134 | chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 |
| 135 | if chunkLen > len(r.buf) { |
| 136 | println("chunkLen > len(r.buf)", chunkType) |
| 137 | r.err = ErrSnappyUnsupported |
| 138 | return written, r.err |
| 139 | } |