-
Notifications
You must be signed in to change notification settings - Fork 17
/
rwevents.go
74 lines (59 loc) · 1.38 KB
/
rwevents.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
package iorw
import (
"github.com/jmigpin/editor/v2/util/evreg"
)
// Runs callbacks on operations.
type RWEvents struct {
ReadWriterAt
EvReg evreg.Register
}
func NewRWEvents(rw ReadWriterAt) *RWEvents {
return &RWEvents{ReadWriterAt: rw}
}
func (rw *RWEvents) OverwriteAt(i, n int, p []byte) error {
// pre write event
ev := &RWEvPreWrite{i, n, p, nil}
rw.EvReg.RunCallbacks(RWEvIdPreWrite, ev)
if ev.ReplyErr != nil {
return ev.ReplyErr
}
// write event 2 data (contains content changed flag)
changed := true
if rw.EvReg.NCallbacks(RWEvIdWrite2) > 0 {
if eq, err := REqual(rw, i, n, p); err == nil && eq {
changed = false
}
}
if err := rw.ReadWriterAt.OverwriteAt(i, n, p); err != nil {
return err
}
// write event
u := &RWEvWrite{i, n, len(p)}
rw.EvReg.RunCallbacks(RWEvIdWrite, u)
// write event 2 (contains content changed flag)
w := &RWEvWrite2{*u, changed}
rw.EvReg.RunCallbacks(RWEvIdWrite2, w)
return nil
}
//----------
const (
RWEvIdWrite = iota // ev=RWEvWrite
RWEvIdWrite2 // ev=RWEvWrite2
RWEvIdPreWrite // ev=RWEvPreWrite
)
//----------
type RWEvWrite struct {
Index int
Dn int // n deleted bytes
In int // n inserted bytes
}
type RWEvWrite2 struct {
RWEvWrite
Changed bool
}
type RWEvPreWrite struct {
Index int
N int
P []byte
ReplyErr error // can be set by any caller to cancel the write
}