-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcontrol_event.go
93 lines (85 loc) · 2.03 KB
/
control_event.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package rain
import (
"sync/atomic"
"time"
)
// ProgressEvent 进度事件
type ProgressEvent interface {
Change(stat *Stat)
}
// Stat 下载进行中的信息
type Stat struct {
// Status 状态
Status Status
// TotalLength 文件总大小
TotalLength int64
// CompletedLength 已下载的文件大小
CompletedLength int64
// Progress 进度
Progress int
// Outpath 文件输出路径
Outpath string
// Error 下载错误信息
Error error
}
// loadEvent 加载事件
func (ctl *control) loadEvent() {
// 发送事件
if len(ctl.eventExend) > 0 {
ctl.addEvent(NewEventExtend(ctl.eventExend...))
ctl.eventExend = make([]ProgressEventExtend, 0)
}
if len(ctl.event) > 0 {
ctl.sendEvent = ctl.sendEventFunc()
}
}
// addEvent 新增事件
func (ctl *control) addEvent(e ...ProgressEvent) {
ctl.event = append(ctl.event, e...)
}
// addEvent 新增事件
func (ctl *control) addEventExtend(e ...ProgressEventExtend) {
ctl.eventExend = append(ctl.eventExend, e...)
}
// autoSendEvent 自动发送事件
func (ctl *control) autoSendEvent() {
for {
select {
case <-time.After(time.Millisecond * 200):
ctl.sendEvent()
case <-ctl.ctx.Done():
return
}
}
}
// sendEventFunc 发送事件信息
func (ctl *control) sendEventFunc() func() {
var (
stat = &Stat{
Status: ctl.status,
TotalLength: ctl.totalSize,
CompletedLength: atomic.LoadInt64(ctl.completedSize),
Progress: 0,
Outpath: ctl.outpath,
Error: ctl.getError(),
}
nowCompletedLength = int64(0)
remainingLength = int64(0)
)
return func() {
nowCompletedLength = atomic.LoadInt64(ctl.completedSize)
remainingLength = ctl.totalSize - nowCompletedLength
if remainingLength < 0 {
remainingLength = 0
}
stat.Status = ctl.status
stat.CompletedLength = nowCompletedLength
if nowCompletedLength > 0 && ctl.totalSize > 0 {
stat.Progress = int(float64(nowCompletedLength) / float64(ctl.totalSize) * float64(100))
}
stat.Error = ctl.getError()
for _, e := range ctl.event {
e.Change(stat)
}
}
}