Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: mojo/public/dart/src/message.dart

Issue 1132063007: Rationalize Dart mojo and sky package structure (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/public/dart/src/handle_watcher.dart ('k') | mojo/public/dart/src/message_pipe.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 kSimpleMessageVersion = 0;
10 static const int kMessageWithRequestIdSize = 24;
11 static const int kMessageWithRequestIdVersion = 1;
12 static const int kMessageTypeOffset = StructDataHeader.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 StructDataHeader _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 StructDataHeader(
28 kSimpleMessageSize, kSimpleMessageVersion),
29 flags = 0,
30 requestId = 0;
31
32 MessageHeader.withRequestId(this.type, this.flags, this.requestId)
33 : _header = new StructDataHeader(
34 kMessageWithRequestIdSize, kMessageWithRequestIdVersion);
35
36 MessageHeader.fromMessage(Message message) {
37 var decoder = new Decoder(message);
38 _header = decoder.decodeStructDataHeader();
39 if (_header.size < kSimpleMessageSize) {
40 throw new MojoCodecError('Incorrect message size. Got: ${_header.size} '
41 'wanted $kSimpleMessageSize');
42 }
43 type = decoder.decodeUint32(kMessageTypeOffset);
44 flags = decoder.decodeUint32(kMessageFlagsOffset);
45 if (mustHaveRequestId(flags)) {
46 if (_header.size < kMessageWithRequestIdSize) {
47 throw new MojoCodecError('Incorrect message size. Got: ${_header.size} '
48 'wanted $kMessageWithRequestIdSize');
49 }
50 requestId = decoder.decodeUint64(kMessageRequestIdOffset);
51 } else {
52 requestId = 0;
53 }
54 }
55
56 int get size => _header.size;
57 bool get hasRequestId => mustHaveRequestId(flags);
58
59 void encode(Encoder encoder) {
60 encoder.encodeStructDataHeader(_header);
61 encoder.encodeUint32(type, kMessageTypeOffset);
62 encoder.encodeUint32(flags, kMessageFlagsOffset);
63 if (hasRequestId) {
64 encoder.encodeUint64(requestId, kMessageRequestIdOffset);
65 }
66 }
67
68 String toString() => "MessageHeader($_header, $type, $flags, $requestId)";
69
70 bool validateHeaderFlags(expectedFlags) =>
71 (flags & (kMessageExpectsResponse | kMessageIsResponse)) == expectedFlags;
72
73 bool validateHeader(int expectedType, int expectedFlags) =>
74 (type == expectedType) && validateHeaderFlags(expectedFlags);
75
76 static void _validateDataHeader(StructDataHeader dataHeader) {
77 if (dataHeader.version < kSimpleMessageVersion) {
78 throw 'Incorrect version, expecting at least '
79 '$kSimpleMessageVersion, but got: ${dataHeader.version}.';
80 }
81 if (dataHeader.size < kSimpleMessageSize) {
82 throw 'Incorrect message size, expecting at least $kSimpleMessageSize, '
83 'but got: ${dataHeader.size}';
84 }
85 if ((dataHeader.version == kSimpleMessageVersion) &&
86 (dataHeader.size != kSimpleMessageSize)) {
87 throw 'Incorrect message size for a message of version '
88 '$kSimpleMessageVersion, expecting $kSimpleMessageSize, '
89 'but got ${dataHeader.size}';
90 }
91 if ((dataHeader.version == kMessageWithRequestIdVersion) &&
92 (dataHeader.size != kMessageWithRequestIdSize)) {
93 throw 'Incorrect message size for a message of version '
94 '$kMessageWithRequestIdVersion, expecting '
95 '$kMessageWithRequestIdSize, but got ${dataHeader.size}';
96 }
97 }
98 }
99
100 class Message {
101 final ByteData buffer;
102 final List<core.MojoHandle> handles;
103 Message(this.buffer, this.handles);
104 String toString() =>
105 "Message(numBytes=${buffer.lengthInBytes}, numHandles=${handles.length})";
106 }
107
108 class ServiceMessage extends Message {
109 final MessageHeader header;
110 Message _payload;
111
112 ServiceMessage(Message message, this.header)
113 : super(message.buffer, message.handles);
114
115 ServiceMessage.fromMessage(Message message)
116 : this(message, new MessageHeader.fromMessage(message));
117
118 Message get payload {
119 if (_payload == null) {
120 var truncatedBuffer = new ByteData.view(buffer.buffer, header.size);
121 _payload = new Message(truncatedBuffer, handles);
122 }
123 return _payload;
124 }
125
126 String toString() => "ServiceMessage($header, $_payload)";
127 }
OLDNEW
« no previous file with comments | « mojo/public/dart/src/handle_watcher.dart ('k') | mojo/public/dart/src/message_pipe.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698