1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2016 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/edk/system/ports_message.h" 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/memory/ptr_util.h" 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/edk/system/node_channel.h" 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace edk { 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// static 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstd::unique_ptr<PortsMessage> PortsMessage::NewUserMessage( 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_payload_bytes, 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_ports, 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_handles) { 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return base::WrapUnique( 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez new PortsMessage(num_payload_bytes, num_ports, num_handles)); 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPortsMessage::~PortsMessage() {} 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPortsMessage::PortsMessage(size_t num_payload_bytes, 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_ports, 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_handles) 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : ports::Message(num_payload_bytes, num_ports) { 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t size = num_header_bytes_ + num_ports_bytes_ + num_payload_bytes; 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void* ptr; 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez channel_message_ = NodeChannel::CreatePortsMessage(size, &ptr, num_handles); 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez InitializeUserMessageHeader(ptr); 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPortsMessage::PortsMessage(size_t num_header_bytes, 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_payload_bytes, 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_ports_bytes, 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Channel::MessagePtr channel_message) 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : ports::Message(num_header_bytes, 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez num_payload_bytes, 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez num_ports_bytes) { 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (channel_message) { 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez channel_message_ = std::move(channel_message); 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void* data; 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_data_bytes; 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NodeChannel::GetPortsMessageData(channel_message_.get(), &data, 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &num_data_bytes); 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez start_ = static_cast<char*>(data); 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } else { 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // TODO: Clean this up. In practice this branch of the constructor should 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // only be reached from Node-internal calls to AllocMessage, which never 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // carry ports or non-header bytes. 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez CHECK_EQ(num_payload_bytes, 0u); 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez CHECK_EQ(num_ports_bytes, 0u); 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void* ptr; 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez channel_message_ = 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NodeChannel::CreatePortsMessage(num_header_bytes, &ptr, 0); 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez start_ = static_cast<char*>(ptr); 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace edk 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 63