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