• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018 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/core/invitation_dispatcher.h"
6 
7 #include "mojo/core/core.h"
8 
9 namespace mojo {
10 namespace core {
11 
12 InvitationDispatcher::InvitationDispatcher() = default;
13 
GetType() const14 Dispatcher::Type InvitationDispatcher::GetType() const {
15   return Type::INVITATION;
16 }
17 
Close()18 MojoResult InvitationDispatcher::Close() {
19   PortMapping attached_ports;
20   {
21     base::AutoLock lock(lock_);
22     if (is_closed_)
23       return MOJO_RESULT_INVALID_ARGUMENT;
24     is_closed_ = true;
25     std::swap(attached_ports, attached_ports_);
26   }
27   for (auto& entry : attached_ports)
28     Core::Get()->GetNodeController()->ClosePort(entry.second);
29   return MOJO_RESULT_OK;
30 }
31 
AttachMessagePipe(base::StringPiece name,ports::PortRef remote_peer_port)32 MojoResult InvitationDispatcher::AttachMessagePipe(
33     base::StringPiece name,
34     ports::PortRef remote_peer_port) {
35   base::AutoLock lock(lock_);
36   auto result = attached_ports_.emplace(name.as_string(), remote_peer_port);
37   if (!result.second) {
38     Core::Get()->GetNodeController()->ClosePort(remote_peer_port);
39     return MOJO_RESULT_ALREADY_EXISTS;
40   }
41   return MOJO_RESULT_OK;
42 }
43 
ExtractMessagePipe(base::StringPiece name,MojoHandle * message_pipe_handle)44 MojoResult InvitationDispatcher::ExtractMessagePipe(
45     base::StringPiece name,
46     MojoHandle* message_pipe_handle) {
47   ports::PortRef remote_peer_port;
48   {
49     base::AutoLock lock(lock_);
50     auto it = attached_ports_.find(name.as_string());
51     if (it == attached_ports_.end())
52       return MOJO_RESULT_NOT_FOUND;
53     remote_peer_port = std::move(it->second);
54     attached_ports_.erase(it);
55   }
56 
57   *message_pipe_handle =
58       Core::Get()->CreatePartialMessagePipe(remote_peer_port);
59   if (*message_pipe_handle == MOJO_HANDLE_INVALID)
60     return MOJO_RESULT_RESOURCE_EXHAUSTED;
61   return MOJO_RESULT_OK;
62 }
63 
TakeAttachedPorts()64 InvitationDispatcher::PortMapping InvitationDispatcher::TakeAttachedPorts() {
65   PortMapping attached_ports;
66   {
67     base::AutoLock lock(lock_);
68     std::swap(attached_ports, attached_ports_);
69   }
70   return attached_ports;
71 }
72 
~InvitationDispatcher()73 InvitationDispatcher::~InvitationDispatcher() {
74   DCHECK(is_closed_);
75 }
76 
77 }  // namespace core
78 }  // namespace mojo
79