forked from odeke-em/drive
/
read_closer.go
48 lines (41 loc) · 847 Bytes
/
read_closer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package statos
import (
"io"
"syscall"
)
// ReadCloserStatos implements the Read() interface
type ReadCloserStatos struct {
commChan chan int
commClosed bool
iterator io.ReadCloser
}
func NewReadCloser(rd io.ReadCloser) *ReadCloserStatos {
return &ReadCloserStatos{
commChan: make(chan int),
commClosed: false,
iterator: rd,
}
}
func (r *ReadCloserStatos) Read(p []byte) (n int, err error) {
n, err = r.iterator.Read(p)
if err != nil && err != syscall.EINTR {
if !r.commClosed {
close(r.commChan)
r.commClosed = true
}
} else if n >= 0 {
r.commChan <- n
}
return
}
func (r *ReadCloserStatos) ProgressChan() chan int {
return r.commChan
}
func (r *ReadCloserStatos) Close() error {
err := r.iterator.Close()
if err == nil && !r.commClosed {
close(r.commChan)
r.commClosed = true
}
return err
}