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

Side by Side Diff: mojo/edk/system/ports/message.cc

Issue 1585493002: [mojo] Ports EDK (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
OLDNEW
(Empty)
1 // Copyright 2016 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 #include <stdlib.h>
6
7 #include <limits>
8
9 #include "base/logging.h"
10 #include "mojo/edk/system/ports/event.h"
11
12 namespace mojo {
13 namespace edk {
14 namespace ports {
15
16 // static
17 void Message::Parse(const void* bytes,
18 size_t num_bytes,
19 size_t* num_header_bytes,
20 size_t* num_payload_bytes,
21 size_t* num_ports_bytes) {
22 const EventHeader* header = static_cast<const EventHeader*>(bytes);
23 switch (header->type) {
24 case EventType::kUser:
25 // See below.
26 break;
27 case EventType::kPortAccepted:
28 *num_header_bytes = sizeof(EventHeader);
29 break;
30 case EventType::kObserveProxy:
31 *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveProxyEventData);
32 break;
33 case EventType::kObserveProxyAck:
34 *num_header_bytes =
35 sizeof(EventHeader) + sizeof(ObserveProxyAckEventData);
36 break;
37 case EventType::kObserveClosure:
38 *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveClosureEventData);
39 break;
40 default:
41 CHECK(false) << "Bad event type";
42 return;
43 }
44
45 if (header->type == EventType::kUser) {
46 const UserEventData* event_data =
47 reinterpret_cast<const UserEventData*>(
48 reinterpret_cast<const char*>(header + 1));
49 *num_header_bytes = sizeof(EventHeader) +
50 sizeof(UserEventData) +
51 event_data->num_ports * sizeof(PortDescriptor);
52 *num_ports_bytes = event_data->num_ports * sizeof(PortName);
53 *num_payload_bytes = num_bytes - *num_header_bytes - *num_ports_bytes;
54 } else {
55 *num_payload_bytes = 0;
56 *num_ports_bytes = 0;
57 DCHECK_EQ(num_bytes, *num_header_bytes);
58 }
59 }
60
61 Message::Message(size_t num_payload_bytes, size_t num_ports)
62 : Message(sizeof(EventHeader) + sizeof(UserEventData) +
63 num_ports * sizeof(PortDescriptor),
64 num_payload_bytes, num_ports * sizeof(PortName)) {
65 num_ports_ = num_ports;
66 }
67
68 Message::Message(size_t num_header_bytes,
69 size_t num_payload_bytes,
70 size_t num_ports_bytes)
71 : start_(nullptr),
72 num_header_bytes_(num_header_bytes),
73 num_ports_bytes_(num_ports_bytes),
74 num_payload_bytes_(num_payload_bytes) {
75 }
76
77 void Message::InitializeUserMessageHeader(void* start) {
78 start_ = static_cast<char*>(start);
79 memset(start_, 0, num_header_bytes_);
80 GetMutableEventHeader(this)->type = EventType::kUser;
81 GetMutableEventData<UserEventData>(this)->num_ports =
82 static_cast<uint32_t>(num_ports_);
83 }
84
85 } // namespace ports
86 } // namespace edk
87 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698