OLD | NEW |
(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 |
OLD | NEW |