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

Unified 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698