service_registry.cc revision 116680a4aac90f2aa7413d9095a592090648e557
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_registry.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_connector.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo { 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace internal { 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 14116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry::ServiceRegistry(ApplicationImpl* application_impl, 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& url, 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceProviderPtr service_provider) 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : application_impl_(application_impl), 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_(url), 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch remote_service_provider_(service_provider.Pass()) { 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) remote_service_provider_.set_client(this); 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry::ServiceRegistry() : application_impl_(NULL) {} 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ServiceRegistry::~ServiceRegistry() { 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (NameToServiceConnectorMap::iterator i = 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_.begin(); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) i != name_to_service_connector_.end(); ++i) { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete i->second; 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_.clear(); 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ServiceRegistry::AddServiceConnector( 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ServiceConnectorBase* service_connector) { 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RemoveServiceConnectorInternal(service_connector); 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_[service_connector->name()] = service_connector; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_connector->set_application_connection(this); 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ServiceRegistry::RemoveServiceConnector( 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ServiceConnectorBase* service_connector) { 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RemoveServiceConnectorInternal(service_connector); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (name_to_service_connector_.empty()) 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch remote_service_provider_.reset(); 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ServiceRegistry::RemoveServiceConnectorInternal( 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceConnectorBase* service_connector) { 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NameToServiceConnectorMap::iterator it = 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_.find(service_connector->name()); 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (it == name_to_service_connector_.end()) 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete it->second; 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_.erase(it); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst std::string& ServiceRegistry::GetRemoteApplicationURL() { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return url_; 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceProvider* ServiceRegistry::GetServiceProvider() { 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return remote_service_provider_.get(); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 67116680a4aac90f2aa7413d9095a592090648e557Ben MurdochApplicationConnection* ServiceRegistry::ConnectToApplication( 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& url) { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return application_impl_->ConnectToApplication(url); 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistry::ConnectToService(const mojo::String& service_name, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedMessagePipeHandle client_handle) { 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (name_to_service_connector_.find(service_name) == 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch name_to_service_connector_.end()) { 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) client_handle.reset(); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) internal::ServiceConnectorBase* service_connector = 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) name_to_service_connector_[service_name]; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return service_connector->ConnectToService(service_name, 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client_handle.Pass()); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace internal 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace mojo 87