Index: mojo/edk/system/ports/message.cc |
diff --git a/mojo/edk/system/ports/message.cc b/mojo/edk/system/ports/message.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..20f6d8811cd451ee80fa4a73847f6990ffa1f373 |
--- /dev/null |
+++ b/mojo/edk/system/ports/message.cc |
@@ -0,0 +1,87 @@ |
+// Copyright 2016 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. |
+ |
+#include <stdlib.h> |
+ |
+#include <limits> |
+ |
+#include "base/logging.h" |
+#include "mojo/edk/system/ports/event.h" |
+ |
+namespace mojo { |
+namespace edk { |
+namespace ports { |
+ |
+// static |
+void Message::Parse(const void* bytes, |
+ size_t num_bytes, |
+ size_t* num_header_bytes, |
+ size_t* num_payload_bytes, |
+ size_t* num_ports_bytes) { |
+ const EventHeader* header = static_cast<const EventHeader*>(bytes); |
+ switch (header->type) { |
+ case EventType::kUser: |
+ // See below. |
+ break; |
+ case EventType::kPortAccepted: |
+ *num_header_bytes = sizeof(EventHeader); |
+ break; |
+ case EventType::kObserveProxy: |
+ *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveProxyEventData); |
+ break; |
+ case EventType::kObserveProxyAck: |
+ *num_header_bytes = |
+ sizeof(EventHeader) + sizeof(ObserveProxyAckEventData); |
+ break; |
+ case EventType::kObserveClosure: |
+ *num_header_bytes = sizeof(EventHeader) + sizeof(ObserveClosureEventData); |
+ break; |
+ default: |
+ CHECK(false) << "Bad event type"; |
+ return; |
+ } |
+ |
+ if (header->type == EventType::kUser) { |
+ const UserEventData* event_data = |
+ reinterpret_cast<const UserEventData*>( |
+ reinterpret_cast<const char*>(header + 1)); |
+ *num_header_bytes = sizeof(EventHeader) + |
+ sizeof(UserEventData) + |
+ event_data->num_ports * sizeof(PortDescriptor); |
+ *num_ports_bytes = event_data->num_ports * sizeof(PortName); |
+ *num_payload_bytes = num_bytes - *num_header_bytes - *num_ports_bytes; |
+ } else { |
+ *num_payload_bytes = 0; |
+ *num_ports_bytes = 0; |
+ DCHECK_EQ(num_bytes, *num_header_bytes); |
+ } |
+} |
+ |
+Message::Message(size_t num_payload_bytes, size_t num_ports) |
+ : Message(sizeof(EventHeader) + sizeof(UserEventData) + |
+ num_ports * sizeof(PortDescriptor), |
+ num_payload_bytes, num_ports * sizeof(PortName)) { |
+ num_ports_ = num_ports; |
+} |
+ |
+Message::Message(size_t num_header_bytes, |
+ size_t num_payload_bytes, |
+ size_t num_ports_bytes) |
+ : start_(nullptr), |
+ num_header_bytes_(num_header_bytes), |
+ num_ports_bytes_(num_ports_bytes), |
+ num_payload_bytes_(num_payload_bytes) { |
+} |
+ |
+void Message::InitializeUserMessageHeader(void* start) { |
+ start_ = static_cast<char*>(start); |
+ memset(start_, 0, num_header_bytes_); |
+ GetMutableEventHeader(this)->type = EventType::kUser; |
+ GetMutableEventData<UserEventData>(this)->num_ports = |
+ static_cast<uint32_t>(num_ports_); |
+} |
+ |
+} // namespace ports |
+} // namespace edk |
+} // namespace mojo |