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 11namespace mojo { 12 13ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) { 14} 15 16ServiceProviderImpl::~ServiceProviderImpl() { 17} 18 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 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 40void ServiceProviderImpl::OnConnectionError() { 41 ClearRemote(); 42} 43 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 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 62void ServiceProviderImpl::ClearRemote() { 63 if (remote_) { 64 remote_->Clear(); 65 remote_ = NULL; 66 } 67} 68 69} // namespace mojo 70