Home | History | Annotate | Download | only in lib
      1 // Copyright 2015 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "mojo/public/cpp/bindings/pipe_control_message_proxy.h"
      6 
      7 #include <stddef.h>
      8 #include <utility>
      9 
     10 #include "base/compiler_specific.h"
     11 #include "base/logging.h"
     12 #include "mojo/public/cpp/bindings/lib/message_builder.h"
     13 #include "mojo/public/cpp/bindings/lib/serialization.h"
     14 #include "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h"
     15 
     16 namespace mojo {
     17 namespace {
     18 
     19 Message ConstructRunOrClosePipeMessage(
     20     pipe_control::RunOrClosePipeInputPtr input_ptr) {
     21   internal::SerializationContext context;
     22 
     23   auto params_ptr = pipe_control::RunOrClosePipeMessageParams::New();
     24   params_ptr->input = std::move(input_ptr);
     25 
     26   size_t size = internal::PrepareToSerialize<
     27       pipe_control::RunOrClosePipeMessageParamsDataView>(params_ptr, &context);
     28   internal::MessageBuilder builder(pipe_control::kRunOrClosePipeMessageId, 0,
     29                                    size, 0);
     30 
     31   pipe_control::internal::RunOrClosePipeMessageParams_Data* params = nullptr;
     32   internal::Serialize<pipe_control::RunOrClosePipeMessageParamsDataView>(
     33       params_ptr, builder.buffer(), &params, &context);
     34   builder.message()->set_interface_id(kInvalidInterfaceId);
     35   return std::move(*builder.message());
     36 }
     37 
     38 }  // namespace
     39 
     40 PipeControlMessageProxy::PipeControlMessageProxy(MessageReceiver* receiver)
     41     : receiver_(receiver) {}
     42 
     43 void PipeControlMessageProxy::NotifyPeerEndpointClosed(
     44     InterfaceId id,
     45     const base::Optional<DisconnectReason>& reason) {
     46   Message message(ConstructPeerEndpointClosedMessage(id, reason));
     47   bool ok = receiver_->Accept(&message);
     48   ALLOW_UNUSED_LOCAL(ok);
     49 }
     50 
     51 // static
     52 Message PipeControlMessageProxy::ConstructPeerEndpointClosedMessage(
     53     InterfaceId id,
     54     const base::Optional<DisconnectReason>& reason) {
     55   auto event = pipe_control::PeerAssociatedEndpointClosedEvent::New();
     56   event->id = id;
     57   if (reason) {
     58     event->disconnect_reason = pipe_control::DisconnectReason::New();
     59     event->disconnect_reason->custom_reason = reason->custom_reason;
     60     event->disconnect_reason->description = reason->description;
     61   }
     62 
     63   auto input = pipe_control::RunOrClosePipeInput::New();
     64   input->set_peer_associated_endpoint_closed_event(std::move(event));
     65 
     66   return ConstructRunOrClosePipeMessage(std::move(input));
     67 }
     68 
     69 }  // namespace mojo
     70