Index: mojo/public/dart/src/message.dart |
diff --git a/mojo/public/dart/src/message.dart b/mojo/public/dart/src/message.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2cdda8adb1f8ee29011baf173192d66bc309f593 |
--- /dev/null |
+++ b/mojo/public/dart/src/message.dart |
@@ -0,0 +1,97 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+part of bindings; |
+ |
+class MessageHeader { |
+ static const int kSimpleMessageSize = 16; |
+ static const int kSimpleMessageNumFields = 2; |
+ static const int kMessageWithRequestIdSize = 24; |
+ static const int kMessageWithRequestIdNumFields = 3; |
+ static const int kMessageTypeOffset = DataHeader.kHeaderSize; |
+ static const int kMessageFlagsOffset = kMessageTypeOffset + 4; |
+ static const int kMessageRequestIdOffset = kMessageFlagsOffset + 4; |
+ static const int kMessageExpectsResponse = 1 << 0; |
+ static const int kMessageIsResponse = 1 << 1; |
+ |
+ DataHeader _header; |
+ int type; |
+ int flags; |
+ int requestId; |
+ |
+ static bool mustHaveRequestId(int flags) => |
+ (flags & (kMessageExpectsResponse | kMessageIsResponse)) != 0; |
+ |
+ MessageHeader(this.type) : |
+ _header = new DataHeader(kSimpleMessageSize, kSimpleMessageNumFields), |
+ flags = 0, |
+ requestId = 0; |
+ |
+ MessageHeader.withRequestId(this.type, this.flags, this.requestId) : |
+ _header = new DataHeader( |
+ kMessageWithRequestIdSize, kMessageWithRequestIdNumFields); |
+ |
+ MessageHeader.fromMessage(Message message) { |
+ var decoder = new Decoder(message); |
+ _header = decoder.decodeDataHeader(); |
+ type = decoder.decodeUint32(kMessageTypeOffset); |
+ flags = decoder.decodeUint32(kMessageFlagsOffset); |
+ if (mustHaveRequestId(flags)) { |
+ if (_header.size < kMessageWithRequestIdSize) { |
+ throw 'Incorrect message size. Got: ${_header.size} ' + |
+ 'wanted $kMessageWithRequestIdSize'; |
+ } |
+ requestId = decoder.decodeUint64(kMessageRequestIdOffset); |
+ } else { |
+ requestId = 0; |
+ } |
+ } |
+ |
+ int get size => _header.size; |
+ bool get hasRequestId => mustHaveRequestId(flags); |
+ |
+ void encode(Encoder encoder) { |
+ encoder.encodeDataHeader(_header); |
+ encoder.encodeUint32(type, kMessageTypeOffset); |
+ encoder.encodeUint32(flags, kMessageFlagsOffset); |
+ if (hasRequestId) { |
+ encoder.encodeUint64(requestId, kMessageRequestIdOffset); |
+ } |
+ } |
+ |
+ ServiceMessage get serviceMessage => new ServiceMessage(this); |
+ |
+ String toString() => "MessageHeader($_header, $type, $flags, $requestId)"; |
+} |
+ |
+ |
+class Message { |
+ final ByteData buffer; |
+ final List<core.MojoHandle> handles; |
+ Message(this.buffer, this.handles); |
+ String toString() => |
+ "Message(numBytes=${buffer.lengthInBytes}, numHandles=${handles.length})"; |
+} |
+ |
+ |
+class ServiceMessage extends Message { |
+ final MessageHeader header; |
+ Message _payload; |
+ |
+ ServiceMessage(Message message, this.header) |
+ : super(message.buffer, message.handles); |
+ |
+ ServiceMessage.fromMessage(Message message) |
+ : this(message, new MessageHeader.fromMessage(message)); |
+ |
+ Message get payload { |
+ if (_payload == null) { |
+ var truncatedBuffer = new ByteData.view(buffer.buffer, header.size); |
+ _payload = new Message(truncatedBuffer, handles); |
+ } |
+ return _payload; |
+ } |
+ |
+ String toString() => "ServiceMessage($header, $_payload)"; |
+} |