OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package bindings | 5 package bindings |
6 | 6 |
7 import ( | 7 import ( |
8 "fmt" | 8 "fmt" |
9 | 9 |
10 "mojo/public/go/system" | 10 "mojo/public/go/system" |
(...skipping 10 matching lines...) Expand all Loading... |
21 MessageIsResponseFlag = 1 << 1 | 21 MessageIsResponseFlag = 1 << 1 |
22 | 22 |
23 dataHeaderSize = 8 | 23 dataHeaderSize = 8 |
24 defaultAlignment = 8 | 24 defaultAlignment = 8 |
25 pointerBitSize = 64 | 25 pointerBitSize = 64 |
26 ) | 26 ) |
27 | 27 |
28 var mapHeader DataHeader | 28 var mapHeader DataHeader |
29 | 29 |
30 func init() { | 30 func init() { |
31 » mapHeader = DataHeader{24, 2} | 31 » mapHeader = DataHeader{24, 0} |
32 } | 32 } |
33 | 33 |
34 const ( | 34 const ( |
35 DifferentSizedArraysInMap = "VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS
_IN_MAP" | 35 DifferentSizedArraysInMap = "VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS
_IN_MAP" |
36 IllegalHandle = "VALIDATION_ERROR_ILLEGAL_HANDLE" | 36 IllegalHandle = "VALIDATION_ERROR_ILLEGAL_HANDLE" |
37 IllegalMemoryRange = "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE" | 37 IllegalMemoryRange = "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE" |
38 IllegalPointer = "VALIDATION_ERROR_ILLEGAL_POINTER" | 38 IllegalPointer = "VALIDATION_ERROR_ILLEGAL_POINTER" |
39 MessageHeaderInvalidFlags = "VALIDATION_ERROR_MESSAGE_HEADER_INVALID
_FLAGS" | 39 MessageHeaderInvalidFlags = "VALIDATION_ERROR_MESSAGE_HEADER_INVALID
_FLAGS" |
40 MessageHeaderMissingRequestId = "VALIDATION_ERROR_MESSAGE_HEADER_MISSING
_REQUEST_ID" | 40 MessageHeaderMissingRequestId = "VALIDATION_ERROR_MESSAGE_HEADER_MISSING
_REQUEST_ID" |
41 MessageHeaderUnknownMethod = "VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN
_METHOD" | 41 MessageHeaderUnknownMethod = "VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN
_METHOD" |
(...skipping 28 matching lines...) Expand all Loading... |
70 } | 70 } |
71 | 71 |
72 // MessageHeader is a header information for a message. | 72 // MessageHeader is a header information for a message. |
73 type MessageHeader struct { | 73 type MessageHeader struct { |
74 Type uint32 | 74 Type uint32 |
75 Flags uint32 | 75 Flags uint32 |
76 RequestId uint64 | 76 RequestId uint64 |
77 } | 77 } |
78 | 78 |
79 func (h *MessageHeader) Encode(encoder *Encoder) error { | 79 func (h *MessageHeader) Encode(encoder *Encoder) error { |
80 » encoder.StartStruct(h.dataSize(), h.numFields()) | 80 » encoder.StartStruct(h.dataSize(), h.version()) |
81 if err := encoder.WriteUint32(h.Type); err != nil { | 81 if err := encoder.WriteUint32(h.Type); err != nil { |
82 return err | 82 return err |
83 } | 83 } |
84 if err := encoder.WriteUint32(h.Flags); err != nil { | 84 if err := encoder.WriteUint32(h.Flags); err != nil { |
85 return err | 85 return err |
86 } | 86 } |
87 if h.RequestId != 0 { | 87 if h.RequestId != 0 { |
88 if err := encoder.WriteUint64(h.RequestId); err != nil { | 88 if err := encoder.WriteUint64(h.RequestId); err != nil { |
89 return err | 89 return err |
90 } | 90 } |
91 } | 91 } |
92 return encoder.Finish() | 92 return encoder.Finish() |
93 } | 93 } |
94 | 94 |
95 func (h *MessageHeader) Decode(decoder *Decoder) error { | 95 func (h *MessageHeader) Decode(decoder *Decoder) error { |
96 header, err := decoder.StartStruct() | 96 header, err := decoder.StartStruct() |
97 if err != nil { | 97 if err != nil { |
98 return err | 98 return err |
99 } | 99 } |
100 » numFields := header.ElementsOrVersion | 100 » version := header.ElementsOrVersion |
101 » if numFields < 2 || numFields > 3 { | 101 » if version > 1 { |
102 return &ValidationError{UnexpectedStructHeader, | 102 return &ValidationError{UnexpectedStructHeader, |
103 » » » fmt.Sprintf("invalid message header: it should have 2 or
3 fileds, but has %d", numFields), | 103 » » » fmt.Sprintf("invalid message header: it should be of ver
sion 0 or 1, but has %d", version), |
104 } | 104 } |
105 } | 105 } |
106 expectedSize := uint32(dataHeaderSize + 2*4) | 106 expectedSize := uint32(dataHeaderSize + 2*4) |
107 » if numFields == 3 { | 107 » if version == 1 { |
108 expectedSize += 8 | 108 expectedSize += 8 |
109 } | 109 } |
110 if expectedSize != header.Size { | 110 if expectedSize != header.Size { |
111 return &ValidationError{UnexpectedStructHeader, | 111 return &ValidationError{UnexpectedStructHeader, |
112 fmt.Sprintf("unexpected struct header size: expected %d,
but got %d", expectedSize, header.Size), | 112 fmt.Sprintf("unexpected struct header size: expected %d,
but got %d", expectedSize, header.Size), |
113 } | 113 } |
114 } | 114 } |
115 | 115 |
116 if h.Type, err = decoder.ReadUint32(); err != nil { | 116 if h.Type, err = decoder.ReadUint32(); err != nil { |
117 return err | 117 return err |
118 } | 118 } |
119 if h.Flags, err = decoder.ReadUint32(); err != nil { | 119 if h.Flags, err = decoder.ReadUint32(); err != nil { |
120 return err | 120 return err |
121 } | 121 } |
122 » if numFields == 3 { | 122 » if version == 1 { |
123 if h.Flags != MessageExpectsResponseFlag && h.Flags != MessageIs
ResponseFlag { | 123 if h.Flags != MessageExpectsResponseFlag && h.Flags != MessageIs
ResponseFlag { |
124 return &ValidationError{MessageHeaderInvalidFlags, | 124 return &ValidationError{MessageHeaderInvalidFlags, |
125 fmt.Sprintf("message header flags(%v) should be
MessageExpectsResponseFlag or MessageIsResponseFlag", h.Flags), | 125 fmt.Sprintf("message header flags(%v) should be
MessageExpectsResponseFlag or MessageIsResponseFlag", h.Flags), |
126 } | 126 } |
127 } | 127 } |
128 if h.RequestId, err = decoder.ReadUint64(); err != nil { | 128 if h.RequestId, err = decoder.ReadUint64(); err != nil { |
129 return err | 129 return err |
130 } | 130 } |
131 } else { | 131 } else { |
132 if h.Flags != MessageNoFlag { | 132 if h.Flags != MessageNoFlag { |
133 return &ValidationError{MessageHeaderMissingRequestId, "
missing request ID in message header"} | 133 return &ValidationError{MessageHeaderMissingRequestId, "
missing request ID in message header"} |
134 } | 134 } |
135 } | 135 } |
136 return decoder.Finish() | 136 return decoder.Finish() |
137 } | 137 } |
138 | 138 |
139 func (h *MessageHeader) dataSize() uint32 { | 139 func (h *MessageHeader) dataSize() uint32 { |
140 var size uint32 | 140 var size uint32 |
141 size = 2 * 4 | 141 size = 2 * 4 |
142 if h.RequestId != 0 { | 142 if h.RequestId != 0 { |
143 size += 8 | 143 size += 8 |
144 } | 144 } |
145 return size | 145 return size |
146 } | 146 } |
147 | 147 |
148 func (h *MessageHeader) numFields() uint32 { | 148 func (h *MessageHeader) version() uint32 { |
149 if h.RequestId != 0 { | 149 if h.RequestId != 0 { |
150 » » return 3 | 150 » » return 1 |
151 } else { | 151 } else { |
152 » » return 2 | 152 » » return 0 |
153 } | 153 } |
154 } | 154 } |
155 | 155 |
156 // Message is a a raw message to be sent/received from a message pipe handle | 156 // Message is a a raw message to be sent/received from a message pipe handle |
157 // which contains a message header. | 157 // which contains a message header. |
158 type Message struct { | 158 type Message struct { |
159 Header MessageHeader | 159 Header MessageHeader |
160 Bytes []byte | 160 Bytes []byte |
161 Handles []system.UntypedHandle | 161 Handles []system.UntypedHandle |
162 Payload []byte | 162 Payload []byte |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 // ParseMessage parses message header from byte buffer with attached handles | 195 // ParseMessage parses message header from byte buffer with attached handles |
196 // and returnes parsed message. | 196 // and returnes parsed message. |
197 func ParseMessage(bytes []byte, handles []system.UntypedHandle) (*Message, error
) { | 197 func ParseMessage(bytes []byte, handles []system.UntypedHandle) (*Message, error
) { |
198 decoder := NewDecoder(bytes, []system.UntypedHandle{}) | 198 decoder := NewDecoder(bytes, []system.UntypedHandle{}) |
199 var header MessageHeader | 199 var header MessageHeader |
200 if err := header.Decode(decoder); err != nil { | 200 if err := header.Decode(decoder); err != nil { |
201 return nil, err | 201 return nil, err |
202 } | 202 } |
203 return newMessage(header, bytes, handles), nil | 203 return newMessage(header, bytes, handles), nil |
204 } | 204 } |
OLD | NEW |