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
3 // found in the LICENSE file.
5 #include "mojo/public/cpp/application/lib/service_registry.h"
7 #include "mojo/public/cpp/application/application_connection.h"
8 #include "mojo/public/cpp/application/application_impl.h"
9 #include "mojo/public/cpp/application/lib/service_connector.h"
14 ServiceRegistry::ServiceRegistry(ApplicationImpl* application_impl,
15 const std::string& url,
16 ServiceProviderPtr service_provider)
17 : application_impl_(application_impl),
19 remote_service_provider_(service_provider.Pass()) {
20 remote_service_provider_.set_client(this);
23 ServiceRegistry::ServiceRegistry() : application_impl_(nullptr) {
26 ServiceRegistry::~ServiceRegistry() {
27 for (NameToServiceConnectorMap::iterator i =
28 name_to_service_connector_.begin();
29 i != name_to_service_connector_.end();
33 name_to_service_connector_.clear();
36 void ServiceRegistry::AddServiceConnector(
37 ServiceConnectorBase* service_connector) {
38 RemoveServiceConnectorInternal(service_connector);
39 name_to_service_connector_[service_connector->name()] = service_connector;
40 service_connector->set_application_connection(this);
43 void ServiceRegistry::RemoveServiceConnector(
44 ServiceConnectorBase* service_connector) {
45 RemoveServiceConnectorInternal(service_connector);
46 if (name_to_service_connector_.empty())
47 remote_service_provider_.reset();
50 bool ServiceRegistry::RemoveServiceConnectorInternal(
51 ServiceConnectorBase* service_connector) {
52 NameToServiceConnectorMap::iterator it =
53 name_to_service_connector_.find(service_connector->name());
54 if (it == name_to_service_connector_.end())
57 name_to_service_connector_.erase(it);
61 const std::string& ServiceRegistry::GetRemoteApplicationURL() {
65 ServiceProvider* ServiceRegistry::GetServiceProvider() {
66 return remote_service_provider_.get();
69 ApplicationConnection* ServiceRegistry::ConnectToApplication(
70 const std::string& url) {
71 return application_impl_->ConnectToApplication(url);
74 void ServiceRegistry::ConnectToService(const mojo::String& service_name,
75 ScopedMessagePipeHandle client_handle) {
76 if (name_to_service_connector_.find(service_name) ==
77 name_to_service_connector_.end()) {
78 client_handle.reset();
81 internal::ServiceConnectorBase* service_connector =
82 name_to_service_connector_[service_name];
83 return service_connector->ConnectToService(service_name,
84 client_handle.Pass());
87 } // namespace internal