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. 4 5 #include "mojo/public/cpp/application/service_provider_impl.h" 6 7 #include "mojo/public/cpp/application/lib/service_connector.h" 8 #include "mojo/public/cpp/application/lib/weak_service_provider.h" 9 #include "mojo/public/cpp/environment/logging.h" 10 11 namespace mojo { 12 ServiceProviderImpl()13ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) { 14 } 15 ~ServiceProviderImpl()16ServiceProviderImpl::~ServiceProviderImpl() { 17 } 18 CreateRemoteServiceProvider()19ServiceProvider* ServiceProviderImpl::CreateRemoteServiceProvider() { 20 // TODO(beng): it sure would be nice if this method could return a scoped_ptr. 21 MOJO_DCHECK(!remote_); 22 remote_ = new internal::WeakServiceProvider(this, client()); 23 return remote_; 24 } 25 ConnectToService(const String & service_name,ScopedMessagePipeHandle client_handle)26void ServiceProviderImpl::ConnectToService( 27 const String& service_name, 28 ScopedMessagePipeHandle client_handle) { 29 if (service_connectors_.find(service_name) == service_connectors_.end()) { 30 client_handle.reset(); 31 return; 32 } 33 34 internal::ServiceConnectorBase* service_connector = 35 service_connectors_[service_name]; 36 return service_connector->ConnectToService(service_name, 37 client_handle.Pass()); 38 } 39 OnConnectionError()40void ServiceProviderImpl::OnConnectionError() { 41 ClearRemote(); 42 } 43 AddServiceConnector(internal::ServiceConnectorBase * service_connector)44void ServiceProviderImpl::AddServiceConnector( 45 internal::ServiceConnectorBase* service_connector) { 46 RemoveServiceConnector(service_connector); 47 service_connectors_[service_connector->name()] = service_connector; 48 // TODO(beng): perhaps take app connection thru ctor?? 49 service_connector->set_application_connection(NULL); 50 } 51 RemoveServiceConnector(internal::ServiceConnectorBase * service_connector)52void ServiceProviderImpl::RemoveServiceConnector( 53 internal::ServiceConnectorBase* service_connector) { 54 NameToServiceConnectorMap::iterator it = 55 service_connectors_.find(service_connector->name()); 56 if (it == service_connectors_.end()) 57 return; 58 delete it->second; 59 service_connectors_.erase(it); 60 } 61 ClearRemote()62void ServiceProviderImpl::ClearRemote() { 63 if (remote_) { 64 remote_->Clear(); 65 remote_ = NULL; 66 } 67 } 68 69 } // namespace mojo 70