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 "encoding/binary" | 8 "encoding/binary" |
9 "fmt" | 9 "fmt" |
10 "math" | 10 "math" |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 return DataHeader{}, &ValidationError{UnexpectedStructHeader, | 142 return DataHeader{}, &ValidationError{UnexpectedStructHeader, |
143 fmt.Sprintf("data header size(%d) should be at least %d"
, header.Size, dataHeaderSize), | 143 fmt.Sprintf("data header size(%d) should be at least %d"
, header.Size, dataHeaderSize), |
144 } | 144 } |
145 } | 145 } |
146 if err := d.pushState(header, 0); err != nil { | 146 if err := d.pushState(header, 0); err != nil { |
147 return DataHeader{}, err | 147 return DataHeader{}, err |
148 } | 148 } |
149 return header, nil | 149 return header, nil |
150 } | 150 } |
151 | 151 |
| 152 // StartUnion starts decoding a union and reads its header. |
| 153 // Returns the read data header. The caller should check if it is valid. |
| 154 // Note: it doesn't read the data field. |
| 155 func (d *Decoder) StartUnion() (DataHeader, error) { |
| 156 header, err := d.readDataHeader() |
| 157 if err != nil { |
| 158 return DataHeader{}, err |
| 159 } |
| 160 |
| 161 if err := d.pushState(header, 0); err != nil { |
| 162 return DataHeader{}, err |
| 163 } |
| 164 return header, nil |
| 165 } |
| 166 |
152 func (d *Decoder) readDataHeader() (DataHeader, error) { | 167 func (d *Decoder) readDataHeader() (DataHeader, error) { |
153 if err := d.claimData(dataHeaderSize); err != nil { | 168 if err := d.claimData(dataHeaderSize); err != nil { |
154 return DataHeader{}, err | 169 return DataHeader{}, err |
155 } | 170 } |
156 oldEnd := d.end - dataHeaderSize | 171 oldEnd := d.end - dataHeaderSize |
157 header := DataHeader{ | 172 header := DataHeader{ |
158 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), | 173 Size: binary.LittleEndian.Uint32(d.buf[oldEnd:]), |
159 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), | 174 ElementsOrVersion: binary.LittleEndian.Uint32(d.buf[oldEnd+4:]), |
160 } | 175 } |
161 return header, nil | 176 return header, nil |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 handle, err := d.ReadMessagePipeHandle() | 394 handle, err := d.ReadMessagePipeHandle() |
380 if err != nil { | 395 if err != nil { |
381 return nil, err | 396 return nil, err |
382 } | 397 } |
383 d.state().elementsProcessed-- | 398 d.state().elementsProcessed-- |
384 if _, err := d.ReadUint32(); err != nil { | 399 if _, err := d.ReadUint32(); err != nil { |
385 return nil, err | 400 return nil, err |
386 } | 401 } |
387 return handle, nil | 402 return handle, nil |
388 } | 403 } |
OLD | NEW |