// Copyright 2015 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. #include "ipc/attachment_broker_unprivileged_win.h" #include "base/process/process.h" #include "ipc/attachment_broker_messages.h" #include "ipc/brokerable_attachment.h" #include "ipc/handle_attachment_win.h" #include "ipc/ipc_sender.h" namespace IPC { AttachmentBrokerUnprivilegedWin::AttachmentBrokerUnprivilegedWin() {} AttachmentBrokerUnprivilegedWin::~AttachmentBrokerUnprivilegedWin() {} bool AttachmentBrokerUnprivilegedWin::SendAttachmentToProcess( const scoped_refptr& attachment, base::ProcessId destination_process) { switch (attachment->GetBrokerableType()) { case BrokerableAttachment::WIN_HANDLE: { internal::HandleAttachmentWin* handle_attachment = static_cast(attachment.get()); internal::HandleAttachmentWin::WireFormat format = handle_attachment->GetWireFormat(destination_process); bool success = get_sender()->Send( new AttachmentBrokerMsg_DuplicateWinHandle(format)); if (success) handle_attachment->reset_handle_ownership(); return success; } case BrokerableAttachment::MACH_PORT: case BrokerableAttachment::PLACEHOLDER: NOTREACHED(); return false; } return false; } bool AttachmentBrokerUnprivilegedWin::OnMessageReceived(const Message& msg) { bool handled = true; IPC_BEGIN_MESSAGE_MAP(AttachmentBrokerUnprivilegedWin, msg) IPC_MESSAGE_HANDLER(AttachmentBrokerMsg_WinHandleHasBeenDuplicated, OnWinHandleHasBeenDuplicated) IPC_MESSAGE_UNHANDLED(handled = false) IPC_END_MESSAGE_MAP() return handled; } void AttachmentBrokerUnprivilegedWin::OnWinHandleHasBeenDuplicated( const IPC::internal::HandleAttachmentWin::WireFormat& wire_format) { // The IPC message was intended for a different process. Ignore it. if (wire_format.destination_process != base::Process::Current().Pid()) { LogError(WRONG_DESTINATION); return; } scoped_refptr attachment( new IPC::internal::HandleAttachmentWin(wire_format)); HandleReceivedAttachment(attachment); LogError(SUCCESS); } } // namespace IPC