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