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 #include "ipc/mojo/ipc_channel_mojo_readers.h"
7 #include "ipc/mojo/ipc_channel_mojo.h"
12 //------------------------------------------------------------------------------
14 MessageReader::MessageReader(mojo::ScopedMessagePipeHandle pipe
,
16 : internal::MessagePipeReader(pipe
.Pass()), owner_(owner
) {
19 void MessageReader::OnMessageReceived() {
20 Message
message(data_buffer().empty() ? "" : &data_buffer()[0],
21 static_cast<uint32
>(data_buffer().size()));
23 std::vector
<MojoHandle
> handle_buffer
;
24 TakeHandleBuffer(&handle_buffer
);
25 #if defined(OS_POSIX) && !defined(OS_NACL)
26 MojoResult write_result
=
27 ChannelMojo::WriteToFileDescriptorSet(handle_buffer
, &message
);
28 if (write_result
!= MOJO_RESULT_OK
) {
29 CloseWithError(write_result
);
33 DCHECK(handle_buffer
.empty());
36 message
.TraceMessageEnd();
37 owner_
->OnMessageReceived(message
);
40 void MessageReader::OnPipeClosed() {
43 owner_
->OnPipeClosed(this);
47 void MessageReader::OnPipeError(MojoResult error
) {
50 owner_
->OnPipeError(this);
53 bool MessageReader::Send(scoped_ptr
<Message
> message
) {
56 message
->TraceMessageBegin();
57 std::vector
<MojoHandle
> handles
;
58 #if defined(OS_POSIX) && !defined(OS_NACL)
59 MojoResult read_result
=
60 ChannelMojo::ReadFromFileDescriptorSet(message
.get(), &handles
);
61 if (read_result
!= MOJO_RESULT_OK
) {
62 std::for_each(handles
.begin(), handles
.end(), &MojoClose
);
63 CloseWithError(read_result
);
67 MojoResult write_result
=
68 MojoWriteMessage(handle(),
70 static_cast<uint32
>(message
->size()),
71 handles
.empty() ? NULL
: &handles
[0],
72 static_cast<uint32
>(handles
.size()),
73 MOJO_WRITE_MESSAGE_FLAG_NONE
);
74 if (MOJO_RESULT_OK
!= write_result
) {
75 std::for_each(handles
.begin(), handles
.end(), &MojoClose
);
76 CloseWithError(write_result
);
83 } // namespace internal