Exemple #1
0
// Step 1: compresses buffer to buffer
// Step 2: send writer to channel
// Step 3: Close result channel to indicate we are done
func compressBlock(p, prevTail []byte, z Writer, r result) {
	defer close(r.result)
	buf := make([]byte, 0, len(p))
	dest := bytes.NewBuffer(buf)

	var compressor *flate.Writer
	var err error
	if len(prevTail) > 0 {
		compressor, err = flate.NewWriterDict(dest, z.level, prevTail)
	} else {
		compressor, err = flate.NewWriter(dest, z.level)
	}
	if err != nil {
		z.pushError(err)
		return
	}
	compressor.Write(p)

	err = compressor.Flush()
	if err != nil {
		z.pushError(err)
		return
	}
	if z.closed {
		err = compressor.Close()
		if err != nil {
			z.pushError(err)
			return
		}
	}
	// Read back buffer
	buf = dest.Bytes()
	r.result <- buf
}