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

Side by Side Diff: services/service_manager/service_manager.cc

Issue 2795883002: Eliminate OnConnect usage (Closed)
Patch Set: . Created 3 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/service_manager.h" 5 #include "services/service_manager/service_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 return false; 100 return false;
101 return it->second.find(capability) != it->second.end(); 101 return it->second.find(capability) != it->second.end();
102 } 102 }
103 103
104 // Encapsulates a connection to an instance of a service, tracked by the 104 // Encapsulates a connection to an instance of a service, tracked by the
105 // Service Manager. 105 // Service Manager.
106 class ServiceManager::Instance 106 class ServiceManager::Instance
107 : public mojom::Connector, 107 : public mojom::Connector,
108 public mojom::PIDReceiver, 108 public mojom::PIDReceiver,
109 public Service, 109 public Service,
110 public InterfaceFactory<mojom::ServiceManager>,
111 public mojom::ServiceManager, 110 public mojom::ServiceManager,
112 public mojom::ServiceControl { 111 public mojom::ServiceControl {
113 public: 112 public:
114 Instance(service_manager::ServiceManager* service_manager, 113 Instance(service_manager::ServiceManager* service_manager,
115 const Identity& identity, 114 const Identity& identity,
116 const InterfaceProviderSpecMap& interface_provider_specs) 115 const InterfaceProviderSpecMap& interface_provider_specs)
117 : service_manager_(service_manager), 116 : service_manager_(service_manager),
118 id_(GenerateUniqueID()), 117 id_(GenerateUniqueID()),
119 identity_(identity), 118 identity_(identity),
120 interface_provider_specs_(interface_provider_specs), 119 interface_provider_specs_(interface_provider_specs),
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 const InterfaceProviderSpec& GetConnectionSpec() const { 271 const InterfaceProviderSpec& GetConnectionSpec() const {
273 auto it = interface_provider_specs_.find( 272 auto it = interface_provider_specs_.find(
274 mojom::kServiceManager_ConnectorSpec); 273 mojom::kServiceManager_ConnectorSpec);
275 return it != interface_provider_specs_.end() ? it->second : empty_spec_; 274 return it != interface_provider_specs_.end() ? it->second : empty_spec_;
276 } 275 }
277 const Identity& identity() const { return identity_; } 276 const Identity& identity() const { return identity_; }
278 void set_identity(const Identity& identity) { identity_ = identity; } 277 void set_identity(const Identity& identity) { identity_ = identity; }
279 uint32_t id() const { return id_; } 278 uint32_t id() const { return id_; }
280 279
281 // Service: 280 // Service:
282 bool OnConnect(const ServiceInfo& remote_info, 281 void OnBindInterface(const ServiceInfo& source_info,
283 InterfaceRegistry* registry) override { 282 const std::string& interface_name,
283 mojo::ScopedMessagePipeHandle interface_pipe) override {
284 Instance* source = 284 Instance* source =
285 service_manager_->GetExistingInstance(remote_info.identity); 285 service_manager_->GetExistingInstance(source_info.identity);
286 DCHECK(source); 286 DCHECK(source);
287 if (HasCapability(source->GetConnectionSpec(), 287 if (interface_name == mojom::ServiceManager::Name_ &&
288 HasCapability(source->GetConnectionSpec(),
288 kCapability_ServiceManager)) { 289 kCapability_ServiceManager)) {
289 registry->AddInterface<mojom::ServiceManager>(this); 290 mojom::ServiceManagerRequest request =
290 return true; 291 mojo::MakeRequest<mojom::ServiceManager>(std::move(interface_pipe));
292 service_manager_bindings_.AddBinding(this, std::move(request));
291 } 293 }
292 return false;
293 } 294 }
294 295
295 private: 296 private:
296 enum class State { 297 enum class State {
297 // The service was not started yet. 298 // The service was not started yet.
298 IDLE, 299 IDLE,
299 300
300 // The service was started but the service manager hasn't received the 301 // The service was started but the service manager hasn't received the
301 // initial response from it yet. 302 // initial response from it yet.
302 STARTING, 303 STARTING,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 370
370 void Clone(mojom::ConnectorRequest request) override { 371 void Clone(mojom::ConnectorRequest request) override {
371 connectors_.AddBinding(this, std::move(request)); 372 connectors_.AddBinding(this, std::move(request));
372 } 373 }
373 374
374 // mojom::PIDReceiver: 375 // mojom::PIDReceiver:
375 void SetPID(uint32_t pid) override { 376 void SetPID(uint32_t pid) override {
376 PIDAvailable(pid); 377 PIDAvailable(pid);
377 } 378 }
378 379
379 // InterfaceFactory<mojom::ServiceManager>:
380 void Create(const Identity& remote_identity,
381 mojom::ServiceManagerRequest request) override {
382 service_manager_bindings_.AddBinding(this, std::move(request));
383 }
384
385 // mojom::ServiceManager implementation: 380 // mojom::ServiceManager implementation:
386 void AddListener(mojom::ServiceManagerListenerPtr listener) override { 381 void AddListener(mojom::ServiceManagerListenerPtr listener) override {
387 // TODO(beng): this should only track the instances matching this user, and 382 // TODO(beng): this should only track the instances matching this user, and
388 // root. 383 // root.
389 service_manager_->AddListener(std::move(listener)); 384 service_manager_->AddListener(std::move(listener));
390 } 385 }
391 386
392 mojom::ConnectResult ValidateConnectParams( 387 mojom::ConnectResult ValidateConnectParams(
393 Identity* target, 388 Identity* target,
394 mojom::ServicePtr* service, 389 mojom::ServicePtr* service,
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
573 DISALLOW_COPY_AND_ASSIGN(Instance); 568 DISALLOW_COPY_AND_ASSIGN(Instance);
574 }; 569 };
575 570
576 class ServiceManager::ServiceImpl : public Service { 571 class ServiceManager::ServiceImpl : public Service {
577 public: 572 public:
578 explicit ServiceImpl(ServiceManager* service_manager) 573 explicit ServiceImpl(ServiceManager* service_manager)
579 : service_manager_(service_manager) {} 574 : service_manager_(service_manager) {}
580 ~ServiceImpl() override {} 575 ~ServiceImpl() override {}
581 576
582 // Service: 577 // Service:
583 bool OnConnect(const ServiceInfo& remote_info, 578 void OnBindInterface(const ServiceInfo& source_info,
584 InterfaceRegistry* registry) override { 579 const std::string& interface_name,
580 mojo::ScopedMessagePipeHandle interface_pipe) override {
585 // The only interface ServiceManager exposes is mojom::ServiceManager, and 581 // The only interface ServiceManager exposes is mojom::ServiceManager, and
586 // access to this interface is brokered by a policy specific to each caller, 582 // access to this interface is brokered by a policy specific to each caller,
587 // managed by the caller's instance. Here we look to see who's calling, 583 // managed by the caller's instance. Here we look to see who's calling,
588 // and forward to the caller's instance to continue. 584 // and forward to the caller's instance to continue.
589 Instance* instance = nullptr; 585 Instance* instance = nullptr;
590 for (const auto& entry : service_manager_->identity_to_instance_) { 586 for (const auto& entry : service_manager_->identity_to_instance_) {
591 if (entry.first == remote_info.identity) { 587 if (entry.first == source_info.identity) {
592 instance = entry.second; 588 instance = entry.second;
593 break; 589 break;
594 } 590 }
595 } 591 }
596 592
597 DCHECK(instance); 593 DCHECK(instance);
598 return instance->OnConnect(remote_info, registry); 594 instance->OnBindInterface(source_info, interface_name,
595 std::move(interface_pipe));
599 } 596 }
600 597
601 private: 598 private:
602 ServiceManager* const service_manager_; 599 ServiceManager* const service_manager_;
603 600
604 DISALLOW_COPY_AND_ASSIGN(ServiceImpl); 601 DISALLOW_COPY_AND_ASSIGN(ServiceImpl);
605 }; 602 };
606 603
607 // static 604 // static
608 ServiceManager::TestAPI::TestAPI(ServiceManager* service_manager) 605 ServiceManager::TestAPI::TestAPI(ServiceManager* service_manager)
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
1065 bool connected = instance->CallOnConnect(&params); 1062 bool connected = instance->CallOnConnect(&params);
1066 DCHECK(connected); 1063 DCHECK(connected);
1067 } 1064 }
1068 } 1065 }
1069 1066
1070 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() { 1067 base::WeakPtr<ServiceManager> ServiceManager::GetWeakPtr() {
1071 return weak_ptr_factory_.GetWeakPtr(); 1068 return weak_ptr_factory_.GetWeakPtr();
1072 } 1069 }
1073 1070
1074 } // namespace service_manager 1071 } // namespace service_manager
OLDNEW
« no previous file with comments | « services/service_manager/service_manager.h ('k') | services/service_manager/tests/connect/connect_test_exe.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698