| // 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. |
| |
| #ifndef MOJO_EDK_SYSTEM_PORTS_EVENT_H_ |
| #define MOJO_EDK_SYSTEM_PORTS_EVENT_H_ |
| |
| #include <stdint.h> |
| |
| #include "mojo/edk/system/ports/message.h" |
| #include "mojo/edk/system/ports/name.h" |
| |
| namespace mojo { |
| namespace edk { |
| namespace ports { |
| |
| #pragma pack(push, 1) |
| |
| // TODO: Add static assertions of alignment. |
| |
| struct PortDescriptor { |
| PortDescriptor(); |
| |
| NodeName peer_node_name; |
| PortName peer_port_name; |
| NodeName referring_node_name; |
| PortName referring_port_name; |
| uint64_t next_sequence_num_to_send; |
| uint64_t next_sequence_num_to_receive; |
| uint64_t last_sequence_num_to_receive; |
| bool peer_closed; |
| char padding[7]; |
| }; |
| |
| enum struct EventType : uint32_t { |
| kUser, |
| kPortAccepted, |
| kObserveProxy, |
| kObserveProxyAck, |
| kObserveClosure, |
| kMergePort, |
| }; |
| |
| struct EventHeader { |
| EventType type; |
| uint32_t padding; |
| PortName port_name; |
| }; |
| |
| struct UserEventData { |
| uint64_t sequence_num; |
| uint32_t num_ports; |
| uint32_t padding; |
| }; |
| |
| struct ObserveProxyEventData { |
| NodeName proxy_node_name; |
| PortName proxy_port_name; |
| NodeName proxy_to_node_name; |
| PortName proxy_to_port_name; |
| }; |
| |
| struct ObserveProxyAckEventData { |
| uint64_t last_sequence_num; |
| }; |
| |
| struct ObserveClosureEventData { |
| uint64_t last_sequence_num; |
| }; |
| |
| struct MergePortEventData { |
| PortName new_port_name; |
| PortDescriptor new_port_descriptor; |
| }; |
| |
| #pragma pack(pop) |
| |
| inline const EventHeader* GetEventHeader(const Message& message) { |
| return static_cast<const EventHeader*>(message.header_bytes()); |
| } |
| |
| inline EventHeader* GetMutableEventHeader(Message* message) { |
| return static_cast<EventHeader*>(message->mutable_header_bytes()); |
| } |
| |
| template <typename EventData> |
| inline const EventData* GetEventData(const Message& message) { |
| return reinterpret_cast<const EventData*>( |
| reinterpret_cast<const char*>(GetEventHeader(message) + 1)); |
| } |
| |
| template <typename EventData> |
| inline EventData* GetMutableEventData(Message* message) { |
| return reinterpret_cast<EventData*>( |
| reinterpret_cast<char*>(GetMutableEventHeader(message) + 1)); |
| } |
| |
| inline const PortDescriptor* GetPortDescriptors(const UserEventData* event) { |
| return reinterpret_cast<const PortDescriptor*>( |
| reinterpret_cast<const char*>(event + 1)); |
| } |
| |
| inline PortDescriptor* GetMutablePortDescriptors(UserEventData* event) { |
| return reinterpret_cast<PortDescriptor*>(reinterpret_cast<char*>(event + 1)); |
| } |
| |
| } // namespace ports |
| } // namespace edk |
| } // namespace mojo |
| |
| #endif // MOJO_EDK_SYSTEM_PORTS_EVENT_H_ |