OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 part of bindings; |
| 6 |
| 7 class MessageHeader { |
| 8 static const int kSimpleMessageSize = 16; |
| 9 static const int kSimpleMessageNumFields = 2; |
| 10 static const int kMessageWithRequestIdSize = 24; |
| 11 static const int kMessageWithRequestIdNumFields = 3; |
| 12 static const int kMessageTypeOffset = DataHeader.kHeaderSize; |
| 13 static const int kMessageFlagsOffset = kMessageTypeOffset + 4; |
| 14 static const int kMessageRequestIdOffset = kMessageFlagsOffset + 4; |
| 15 static const int kMessageExpectsResponse = 1 << 0; |
| 16 static const int kMessageIsResponse = 1 << 1; |
| 17 |
| 18 DataHeader _header; |
| 19 int type; |
| 20 int flags; |
| 21 int requestId; |
| 22 |
| 23 static bool mustHaveRequestId(int flags) => |
| 24 (flags & (kMessageExpectsResponse | kMessageIsResponse)) != 0; |
| 25 |
| 26 MessageHeader(this.type) : |
| 27 _header = new DataHeader(kSimpleMessageSize, kSimpleMessageNumFields), |
| 28 flags = 0, |
| 29 requestId = 0; |
| 30 |
| 31 MessageHeader.withRequestId(this.type, this.flags, this.requestId) : |
| 32 _header = new DataHeader( |
| 33 kMessageWithRequestIdSize, kMessageWithRequestIdNumFields); |
| 34 |
| 35 MessageHeader.fromMessage(Message message) { |
| 36 var decoder = new Decoder(message); |
| 37 _header = decoder.decodeDataHeader(); |
| 38 type = decoder.decodeUint32(kMessageTypeOffset); |
| 39 flags = decoder.decodeUint32(kMessageFlagsOffset); |
| 40 if (mustHaveRequestId(flags)) { |
| 41 if (_header.size < kMessageWithRequestIdSize) { |
| 42 throw 'Incorrect message size. Got: ${_header.size} ' + |
| 43 'wanted $kMessageWithRequestIdSize'; |
| 44 } |
| 45 requestId = decoder.decodeUint64(kMessageRequestIdOffset); |
| 46 } else { |
| 47 requestId = 0; |
| 48 } |
| 49 } |
| 50 |
| 51 int get size => _header.size; |
| 52 bool get hasRequestId => mustHaveRequestId(flags); |
| 53 |
| 54 void encode(Encoder encoder) { |
| 55 encoder.encodeDataHeader(_header); |
| 56 encoder.encodeUint32(type, kMessageTypeOffset); |
| 57 encoder.encodeUint32(flags, kMessageFlagsOffset); |
| 58 if (hasRequestId) { |
| 59 encoder.encodeUint64(requestId, kMessageRequestIdOffset); |
| 60 } |
| 61 } |
| 62 |
| 63 ServiceMessage get serviceMessage => new ServiceMessage(this); |
| 64 |
| 65 String toString() => "MessageHeader($_header, $type, $flags, $requestId)"; |
| 66 } |
| 67 |
| 68 |
| 69 class Message { |
| 70 final ByteData buffer; |
| 71 final List<core.MojoHandle> handles; |
| 72 Message(this.buffer, this.handles); |
| 73 String toString() => |
| 74 "Message(numBytes=${buffer.lengthInBytes}, numHandles=${handles.length})"; |
| 75 } |
| 76 |
| 77 |
| 78 class ServiceMessage extends Message { |
| 79 final MessageHeader header; |
| 80 Message _payload; |
| 81 |
| 82 ServiceMessage(Message message, this.header) |
| 83 : super(message.buffer, message.handles); |
| 84 |
| 85 ServiceMessage.fromMessage(Message message) |
| 86 : this(message, new MessageHeader.fromMessage(message)); |
| 87 |
| 88 Message get payload { |
| 89 if (_payload == null) { |
| 90 var truncatedBuffer = new ByteData.view(buffer.buffer, header.size); |
| 91 _payload = new Message(truncatedBuffer, handles); |
| 92 } |
| 93 return _payload; |
| 94 } |
| 95 |
| 96 String toString() => "ServiceMessage($header, $_payload)"; |
| 97 } |
OLD | NEW |