| 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 |