xref: /aosp_15_r20/external/libchrome/ipc/ipc_mojo_message_helper.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_message_helper.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <utility>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include "ipc/ipc_mojo_handle_attachment.h"
10*635a8641SAndroid Build Coastguard Worker 
11*635a8641SAndroid Build Coastguard Worker namespace IPC {
12*635a8641SAndroid Build Coastguard Worker 
13*635a8641SAndroid Build Coastguard Worker // static
WriteMessagePipeTo(base::Pickle * message,mojo::ScopedMessagePipeHandle handle)14*635a8641SAndroid Build Coastguard Worker bool MojoMessageHelper::WriteMessagePipeTo(
15*635a8641SAndroid Build Coastguard Worker     base::Pickle* message,
16*635a8641SAndroid Build Coastguard Worker     mojo::ScopedMessagePipeHandle handle) {
17*635a8641SAndroid Build Coastguard Worker   message->WriteAttachment(new internal::MojoHandleAttachment(
18*635a8641SAndroid Build Coastguard Worker       mojo::ScopedHandle::From(std::move(handle))));
19*635a8641SAndroid Build Coastguard Worker   return true;
20*635a8641SAndroid Build Coastguard Worker }
21*635a8641SAndroid Build Coastguard Worker 
22*635a8641SAndroid Build Coastguard Worker // static
ReadMessagePipeFrom(const base::Pickle * message,base::PickleIterator * iter,mojo::ScopedMessagePipeHandle * handle)23*635a8641SAndroid Build Coastguard Worker bool MojoMessageHelper::ReadMessagePipeFrom(
24*635a8641SAndroid Build Coastguard Worker     const base::Pickle* message,
25*635a8641SAndroid Build Coastguard Worker     base::PickleIterator* iter,
26*635a8641SAndroid Build Coastguard Worker     mojo::ScopedMessagePipeHandle* handle) {
27*635a8641SAndroid Build Coastguard Worker   scoped_refptr<base::Pickle::Attachment> attachment;
28*635a8641SAndroid Build Coastguard Worker   if (!message->ReadAttachment(iter, &attachment)) {
29*635a8641SAndroid Build Coastguard Worker     LOG(ERROR) << "Failed to read attachment for message pipe.";
30*635a8641SAndroid Build Coastguard Worker     return false;
31*635a8641SAndroid Build Coastguard Worker   }
32*635a8641SAndroid Build Coastguard Worker 
33*635a8641SAndroid Build Coastguard Worker   MessageAttachment::Type type =
34*635a8641SAndroid Build Coastguard Worker       static_cast<MessageAttachment*>(attachment.get())->GetType();
35*635a8641SAndroid Build Coastguard Worker   if (type != MessageAttachment::Type::MOJO_HANDLE) {
36*635a8641SAndroid Build Coastguard Worker     LOG(ERROR) << "Unxpected attachment type:" << static_cast<int>(type);
37*635a8641SAndroid Build Coastguard Worker     return false;
38*635a8641SAndroid Build Coastguard Worker   }
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   handle->reset(mojo::MessagePipeHandle(
41*635a8641SAndroid Build Coastguard Worker       static_cast<internal::MojoHandleAttachment*>(attachment.get())
42*635a8641SAndroid Build Coastguard Worker           ->TakeHandle()
43*635a8641SAndroid Build Coastguard Worker           .release()
44*635a8641SAndroid Build Coastguard Worker           .value()));
45*635a8641SAndroid Build Coastguard Worker   return true;
46*635a8641SAndroid Build Coastguard Worker }
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker MojoMessageHelper::MojoMessageHelper() = default;
49*635a8641SAndroid Build Coastguard Worker 
50*635a8641SAndroid Build Coastguard Worker }  // namespace IPC
51