OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "services/service_manager/public/cpp/lib/connector_impl.h" | 5 #include "services/service_manager/public/cpp/lib/connector_impl.h" |
6 | 6 |
7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
8 #include "services/service_manager/public/cpp/identity.h" | 8 #include "services/service_manager/public/cpp/identity.h" |
9 #include "services/service_manager/public/cpp/lib/connection_impl.h" | 9 #include "services/service_manager/public/cpp/lib/connection_impl.h" |
10 | 10 |
11 namespace service_manager { | 11 namespace service_manager { |
12 | 12 |
13 Connector::ConnectParams::ConnectParams(const Identity& target) | |
14 : target_(target) {} | |
15 | |
16 Connector::ConnectParams::ConnectParams(const std::string& name) | |
17 : target_(name, mojom::kInheritUserID) {} | |
18 | |
19 Connector::ConnectParams::~ConnectParams() {} | |
20 | |
21 ConnectorImpl::ConnectorImpl(mojom::ConnectorPtrInfo unbound_state) | 13 ConnectorImpl::ConnectorImpl(mojom::ConnectorPtrInfo unbound_state) |
22 : unbound_state_(std::move(unbound_state)) { | 14 : unbound_state_(std::move(unbound_state)) { |
23 thread_checker_.DetachFromThread(); | 15 thread_checker_.DetachFromThread(); |
24 } | 16 } |
25 | 17 |
26 ConnectorImpl::ConnectorImpl(mojom::ConnectorPtr connector) | 18 ConnectorImpl::ConnectorImpl(mojom::ConnectorPtr connector) |
27 : connector_(std::move(connector)) { | 19 : connector_(std::move(connector)) { |
28 connector_.set_connection_error_handler( | 20 connector_.set_connection_error_handler( |
29 base::Bind(&ConnectorImpl::OnConnectionError, base::Unretained(this))); | 21 base::Bind(&ConnectorImpl::OnConnectionError, base::Unretained(this))); |
30 } | 22 } |
31 | 23 |
32 ConnectorImpl::~ConnectorImpl() {} | 24 ConnectorImpl::~ConnectorImpl() {} |
33 | 25 |
34 void ConnectorImpl::OnConnectionError() { | 26 void ConnectorImpl::OnConnectionError() { |
35 DCHECK(thread_checker_.CalledOnValidThread()); | 27 DCHECK(thread_checker_.CalledOnValidThread()); |
36 connector_.reset(); | 28 connector_.reset(); |
37 } | 29 } |
38 | 30 |
39 std::unique_ptr<Connection> ConnectorImpl::Connect(const std::string& name) { | 31 void ConnectorImpl::RegisterService( |
40 ConnectParams params(name); | 32 const Identity& identity, |
41 return Connect(¶ms); | 33 mojom::ServicePtr service, |
| 34 mojom::PIDReceiverRequest pid_receiver_request) { |
| 35 DCHECK(service.is_bound() && pid_receiver_request.is_pending()); |
| 36 mojom::ClientProcessConnectionPtr client_process_connection = |
| 37 mojom::ClientProcessConnection::New(); |
| 38 client_process_connection->service = service.PassInterface().PassHandle(); |
| 39 client_process_connection->pid_receiver_request = |
| 40 pid_receiver_request.PassMessagePipe(); |
| 41 connector_->RegisterService(identity, std::move(client_process_connection)); |
42 } | 42 } |
43 | 43 |
44 std::unique_ptr<Connection> ConnectorImpl::Connect(ConnectParams* params) { | 44 std::unique_ptr<Connection> ConnectorImpl::Connect(const std::string& name) { |
| 45 return Connect(Identity(name, mojom::kInheritUserID)); |
| 46 } |
| 47 |
| 48 std::unique_ptr<Connection> ConnectorImpl::Connect(const Identity& target) { |
45 if (!BindIfNecessary()) | 49 if (!BindIfNecessary()) |
46 return nullptr; | 50 return nullptr; |
47 | 51 |
48 DCHECK(thread_checker_.CalledOnValidThread()); | 52 DCHECK(thread_checker_.CalledOnValidThread()); |
49 DCHECK(params); | |
50 | 53 |
51 mojom::InterfaceProviderPtr remote_interfaces; | 54 mojom::InterfaceProviderPtr remote_interfaces; |
52 mojom::InterfaceProviderRequest remote_request(&remote_interfaces); | 55 mojom::InterfaceProviderRequest remote_request(&remote_interfaces); |
53 std::unique_ptr<internal::ConnectionImpl> connection( | 56 std::unique_ptr<internal::ConnectionImpl> connection( |
54 new internal::ConnectionImpl(params->target(), | 57 new internal::ConnectionImpl(target, Connection::State::PENDING)); |
55 Connection::State::PENDING)); | 58 std::unique_ptr<InterfaceProvider> remote_interface_provider( |
56 if (params->remote_interfaces()) { | 59 new InterfaceProvider); |
57 params->remote_interfaces()->Bind(std::move(remote_interfaces)); | 60 remote_interface_provider->Bind(std::move(remote_interfaces)); |
58 connection->set_remote_interfaces(params->remote_interfaces()); | 61 connection->SetRemoteInterfaces(std::move(remote_interface_provider)); |
59 } else { | |
60 std::unique_ptr<InterfaceProvider> remote_interface_provider( | |
61 new InterfaceProvider); | |
62 remote_interface_provider->Bind(std::move(remote_interfaces)); | |
63 connection->SetRemoteInterfaces(std::move(remote_interface_provider)); | |
64 } | |
65 | 62 |
66 mojom::ServicePtr service; | 63 connector_->Connect(target, std::move(remote_request), |
67 mojom::PIDReceiverRequest pid_receiver_request; | 64 nullptr, connection->GetConnectCallback()); |
68 params->TakeClientProcessConnection(&service, &pid_receiver_request); | |
69 mojom::ClientProcessConnectionPtr client_process_connection; | |
70 if (service.is_bound() && pid_receiver_request.is_pending()) { | |
71 client_process_connection = mojom::ClientProcessConnection::New(); | |
72 client_process_connection->service = | |
73 service.PassInterface().PassHandle(); | |
74 client_process_connection->pid_receiver_request = | |
75 pid_receiver_request.PassMessagePipe(); | |
76 } else if (service.is_bound() || pid_receiver_request.is_pending()) { | |
77 NOTREACHED() << "If one of service or pid_receiver_request is valid, " | |
78 << "both must be valid."; | |
79 return std::move(connection); | |
80 } | |
81 connector_->Connect(params->target(), std::move(remote_request), | |
82 std::move(client_process_connection), | |
83 connection->GetConnectCallback()); | |
84 return std::move(connection); | 65 return std::move(connection); |
85 } | 66 } |
86 | 67 |
87 std::unique_ptr<Connector> ConnectorImpl::Clone() { | 68 std::unique_ptr<Connector> ConnectorImpl::Clone() { |
88 if (!BindIfNecessary()) | 69 if (!BindIfNecessary()) |
89 return nullptr; | 70 return nullptr; |
90 | 71 |
91 mojom::ConnectorPtr connector; | 72 mojom::ConnectorPtr connector; |
92 mojom::ConnectorRequest request(&connector); | 73 mojom::ConnectorRequest request(&connector); |
93 connector_->Clone(std::move(request)); | 74 connector_->Clone(std::move(request)); |
(...skipping 29 matching lines...) Expand all Loading... |
123 return true; | 104 return true; |
124 } | 105 } |
125 | 106 |
126 std::unique_ptr<Connector> Connector::Create(mojom::ConnectorRequest* request) { | 107 std::unique_ptr<Connector> Connector::Create(mojom::ConnectorRequest* request) { |
127 mojom::ConnectorPtr proxy; | 108 mojom::ConnectorPtr proxy; |
128 *request = mojo::MakeRequest(&proxy); | 109 *request = mojo::MakeRequest(&proxy); |
129 return base::MakeUnique<ConnectorImpl>(proxy.PassInterface()); | 110 return base::MakeUnique<ConnectorImpl>(proxy.PassInterface()); |
130 } | 111 } |
131 | 112 |
132 } // namespace service_manager | 113 } // namespace service_manager |
OLD | NEW |