1 // Copyright 2014 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.
5 #ifndef MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
6 #define MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_
10 #include "mojo/public/c/system/message_pipe.h"
11 #include "mojo/public/cpp/system/handle.h"
12 #include "mojo/public/cpp/system/macros.h"
16 // MessagePipeHandle -----------------------------------------------------------
18 class MessagePipeHandle : public Handle {
20 MessagePipeHandle() {}
21 explicit MessagePipeHandle(MojoHandle value) : Handle(value) {}
23 // Copying and assignment allowed.
26 MOJO_COMPILE_ASSERT(sizeof(MessagePipeHandle) == sizeof(Handle),
27 bad_size_for_cpp_MessagePipeHandle);
29 typedef ScopedHandleBase<MessagePipeHandle> ScopedMessagePipeHandle;
30 MOJO_COMPILE_ASSERT(sizeof(ScopedMessagePipeHandle) ==
31 sizeof(MessagePipeHandle),
32 bad_size_for_cpp_ScopedMessagePipeHandle);
34 inline MojoResult CreateMessagePipe(const MojoCreateMessagePipeOptions* options,
35 ScopedMessagePipeHandle* message_pipe0,
36 ScopedMessagePipeHandle* message_pipe1) {
37 assert(message_pipe0);
38 assert(message_pipe1);
39 MessagePipeHandle handle0;
40 MessagePipeHandle handle1;
41 MojoResult rv = MojoCreateMessagePipe(options,
42 handle0.mutable_value(),
43 handle1.mutable_value());
44 // Reset even on failure (reduces the chances that a "stale"/incorrect handle
46 message_pipe0->reset(handle0);
47 message_pipe1->reset(handle1);
51 // These "raw" versions fully expose the underlying API, but don't help with
52 // ownership of handles (especially when writing messages).
53 // TODO(vtl): Write "baked" versions.
54 inline MojoResult WriteMessageRaw(MessagePipeHandle message_pipe,
57 const MojoHandle* handles,
59 MojoWriteMessageFlags flags) {
60 return MojoWriteMessage(message_pipe.value(), bytes, num_bytes, handles,
64 inline MojoResult ReadMessageRaw(MessagePipeHandle message_pipe,
68 uint32_t* num_handles,
69 MojoReadMessageFlags flags) {
70 return MojoReadMessage(message_pipe.value(), bytes, num_bytes, handles,
74 // A wrapper class that automatically creates a message pipe and owns both
79 explicit MessagePipe(const MojoCreateMessagePipeOptions& options);
82 ScopedMessagePipeHandle handle0;
83 ScopedMessagePipeHandle handle1;
86 inline MessagePipe::MessagePipe() {
87 MojoResult result MOJO_ALLOW_UNUSED =
88 CreateMessagePipe(NULL, &handle0, &handle1);
89 assert(result == MOJO_RESULT_OK);
92 inline MessagePipe::MessagePipe(const MojoCreateMessagePipeOptions& options) {
93 MojoResult result MOJO_ALLOW_UNUSED =
94 CreateMessagePipe(&options, &handle0, &handle1);
95 assert(result == MOJO_RESULT_OK);
98 inline MessagePipe::~MessagePipe() {
103 #endif // MOJO_PUBLIC_CPP_SYSTEM_MESSAGE_PIPE_H_