Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: services/service_manager/public/cpp/lib/connector_impl.cc

Issue 2610173003: Add RegisterService, split out of Connect(). (Closed)
Patch Set: . Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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(&params); 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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698