github.com/spotify/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/pkg/archive/zip/register.go (about) 1 // Copyright 2010 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package zip 6 7 import ( 8 "compress/flate" 9 "io" 10 "io/ioutil" 11 "sync" 12 ) 13 14 // A Compressor returns a compressing writer, writing to the 15 // provided writer. On Close, any pending data should be flushed. 16 type Compressor func(io.Writer) (io.WriteCloser, error) 17 18 // Decompressor is a function that wraps a Reader with a decompressing Reader. 19 // The decompressed ReadCloser is returned to callers who open files from 20 // within the archive. These callers are responsible for closing this reader 21 // when they're finished reading. 22 type Decompressor func(io.Reader) io.ReadCloser 23 24 var ( 25 mu sync.RWMutex // guards compressor and decompressor maps 26 27 compressors = map[uint16]Compressor{ 28 Store: func(w io.Writer) (io.WriteCloser, error) { return &nopCloser{w}, nil }, 29 Deflate: func(w io.Writer) (io.WriteCloser, error) { return flate.NewWriter(w, 5) }, 30 } 31 32 decompressors = map[uint16]Decompressor{ 33 Store: ioutil.NopCloser, 34 Deflate: flate.NewReader, 35 } 36 ) 37 38 // RegisterDecompressor allows custom decompressors for a specified method ID. 39 func RegisterDecompressor(method uint16, d Decompressor) { 40 mu.Lock() 41 defer mu.Unlock() 42 43 if _, ok := decompressors[method]; ok { 44 panic("decompressor already registered") 45 } 46 decompressors[method] = d 47 } 48 49 // RegisterCompressor registers custom compressors for a specified method ID. 50 // The common methods Store and Deflate are built in. 51 func RegisterCompressor(method uint16, comp Compressor) { 52 mu.Lock() 53 defer mu.Unlock() 54 55 if _, ok := compressors[method]; ok { 56 panic("compressor already registered") 57 } 58 compressors[method] = comp 59 } 60 61 func compressor(method uint16) Compressor { 62 mu.RLock() 63 defer mu.RUnlock() 64 return compressors[method] 65 } 66 67 func decompressor(method uint16) Decompressor { 68 mu.RLock() 69 defer mu.RUnlock() 70 return decompressors[method] 71 }