16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/service_provider_impl.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_connector.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/lib/weak_service_provider.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/environment/logging.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace mojo { 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ServiceProviderImpl::ServiceProviderImpl() : remote_(NULL) { 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ServiceProviderImpl::~ServiceProviderImpl() { 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)ServiceProvider* ServiceProviderImpl::CreateRemoteServiceProvider() { 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO(beng): it sure would be nice if this method could return a scoped_ptr. 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOJO_DCHECK(!remote_); 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remote_ = new internal::WeakServiceProvider(this, client()); 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return remote_; 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceProviderImpl::ConnectToService( 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const String& service_name, 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ScopedMessagePipeHandle client_handle) { 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (service_connectors_.find(service_name) == service_connectors_.end()) { 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) client_handle.reset(); 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) internal::ServiceConnectorBase* service_connector = 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_connectors_[service_name]; 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return service_connector->ConnectToService(service_name, 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) client_handle.Pass()); 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceProviderImpl::OnConnectionError() { 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ClearRemote(); 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceProviderImpl::AddServiceConnector( 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) internal::ServiceConnectorBase* service_connector) { 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) RemoveServiceConnector(service_connector); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_connectors_[service_connector->name()] = service_connector; 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO(beng): perhaps take app connection thru ctor?? 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_connector->set_application_connection(NULL); 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceProviderImpl::RemoveServiceConnector( 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) internal::ServiceConnectorBase* service_connector) { 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NameToServiceConnectorMap::iterator it = 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_connectors_.find(service_connector->name()); 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (it == service_connectors_.end()) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return; 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delete it->second; 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_connectors_.erase(it); 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ServiceProviderImpl::ClearRemote() { 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (remote_) { 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remote_->Clear(); 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) remote_ = NULL; 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace mojo 70