forked from quickfixgo/quickfix
-
Notifications
You must be signed in to change notification settings - Fork 1
/
resend_state.go
67 lines (53 loc) · 1.58 KB
/
resend_state.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
package quickfix
import "github.com/quickfixgo/quickfix/internal"
type resendState struct {
loggedOn
messageStash map[int]*Message
currentResendRangeEnd int
resendRangeEnd int
}
func (s resendState) String() string { return "Resend" }
func (s resendState) Timeout(session *session, event internal.Event) (nextState sessionState) {
nextState = inSession{}.Timeout(session, event)
switch nextState.(type) {
case inSession:
nextState = s
case pendingTimeout:
//wrap pendingTimeout in resend. prevents us falling back to inSession if recovering
//from pendingTimeout
nextState = pendingTimeout{s}
}
return
}
func (s resendState) FixMsgIn(session *session, msg *Message) (nextState sessionState) {
nextState = inSession{}.FixMsgIn(session, msg)
if !nextState.IsLoggedOn() {
return
}
if s.currentResendRangeEnd != 0 && s.currentResendRangeEnd < session.store.NextTargetMsgSeqNum() {
nextResendState, err := session.sendResendRequest(session.store.NextTargetMsgSeqNum(), s.resendRangeEnd)
if err != nil {
return handleStateError(session, err)
}
nextResendState.messageStash = s.messageStash
return nextResendState
}
if s.resendRangeEnd >= session.store.NextTargetMsgSeqNum() {
return s
}
for len(s.messageStash) > 0 {
targetSeqNum := session.store.NextTargetMsgSeqNum()
msg, ok := s.messageStash[targetSeqNum]
if !ok {
break
}
delete(s.messageStash, targetSeqNum)
//return stashed message to pool
session.returnToPool(msg)
nextState = inSession{}.FixMsgIn(session, msg)
if !nextState.IsLoggedOn() {
return
}
}
return
}