...
1 package main
2
3 import (
4 "fmt"
5 "log"
6 "unicode"
7 )
8
9
10
11 type Request struct {
12 srcName string
13 xmlName string
14 Opcode int
15 Combine bool
16 Fields []Field
17 Reply *Reply
18 }
19
20 type Requests []*Request
21
22 func (rs Requests) Len() int { return len(rs) }
23 func (rs Requests) Swap(i, j int) { rs[i], rs[j] = rs[j], rs[i] }
24 func (rs Requests) Less(i, j int) bool { return rs[i].xmlName < rs[j].xmlName }
25
26
27
28 func (r *Request) Initialize(p *Protocol) {
29 r.srcName = SrcName(p, r.xmlName)
30 if p.isExt() {
31 r.srcName = r.srcName
32 }
33
34 if r.Reply != nil {
35 r.Reply.Initialize(p)
36 }
37 for _, field := range r.Fields {
38 field.Initialize(p)
39 }
40 }
41
42 func (r *Request) SrcName() string {
43 return r.srcName
44 }
45
46 func (r *Request) XmlName() string {
47 return r.xmlName
48 }
49
50
51
52
53 func (r *Request) ReplyName() string {
54 if r.Reply == nil {
55 log.Panicf("Cannot call 'ReplyName' on request %s, which has no reply.",
56 r.SrcName())
57 }
58 name := r.SrcName()
59 lower := string(unicode.ToLower(rune(name[0]))) + name[1:]
60 return fmt.Sprintf("%sReply", lower)
61 }
62
63
64
65 func (r *Request) ReplyTypeName() string {
66 if r.Reply == nil {
67 log.Panicf("Cannot call 'ReplyName' on request %s, which has no reply.",
68 r.SrcName())
69 }
70 return fmt.Sprintf("%sReply", r.SrcName())
71 }
72
73
74
75
76 func (r *Request) ReqName() string {
77 name := r.SrcName()
78 lower := string(unicode.ToLower(rune(name[0]))) + name[1:]
79 return fmt.Sprintf("%sRequest", lower)
80 }
81
82
83
84 func (r *Request) CookieName() string {
85 return fmt.Sprintf("%sCookie", r.SrcName())
86 }
87
88
89
90
91
92
93 func (r *Request) Size(c *Context) Size {
94 size := newFixedSize(0, true)
95
96
97
98
99
100
101 if !c.protocol.isExt() {
102 size = size.Add(newFixedSize(3, true))
103 } else {
104 size = size.Add(newFixedSize(4, true))
105 }
106
107 for _, field := range r.Fields {
108 switch field.(type) {
109 case *LocalField:
110 continue
111 case *SingleField:
112
113 if r.SrcName() == "ConfigureWindow" &&
114 field.SrcName() == "ValueMask" {
115
116 continue
117 }
118 size = size.Add(field.Size())
119 default:
120 size = size.Add(field.Size())
121 }
122 }
123 return newExpressionSize(&Padding{
124 Expr: size.Expression,
125 }, size.exact)
126 }
127
128
129 type Reply struct {
130 Fields []Field
131 }
132
133
134
135
136
137
138 func (r *Reply) Size() Size {
139 size := newFixedSize(0, true)
140
141
142 size = size.Add(newFixedSize(7, true))
143
144 for _, field := range r.Fields {
145 size = size.Add(field.Size())
146 }
147 return size
148 }
149
150 func (r *Reply) Initialize(p *Protocol) {
151 for _, field := range r.Fields {
152 field.Initialize(p)
153 }
154 }
155
View as plain text