1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/common/mojo/service_registry_impl.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/common/common_type_converters.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace content { 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ServiceRegistryImpl::ServiceRegistryImpl() 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : bound_(false), weak_factory_(this) { 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistryImpl::ServiceRegistryImpl(mojo::ScopedMessagePipeHandle handle) 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : bound_(false), weak_factory_(this) { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BindRemoteServiceProvider(handle.Pass()); 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistryImpl::~ServiceRegistryImpl() { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (!pending_connects_.empty()) { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::CloseRaw(pending_connects_.front().second); 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_connects_.pop(); 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::BindRemoteServiceProvider( 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ScopedMessagePipeHandle handle) { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!bound_); 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bound_ = true; 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) mojo::WeakBindToPipe(this, handle.Pass()); 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch while (!pending_connects_.empty()) { 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client()->ConnectToService( 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::String::From(pending_connects_.front().first), 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ScopedMessagePipeHandle(pending_connects_.front().second)); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_connects_.pop(); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::OnConnectionError() { 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // TODO(sammc): Support reporting this to our owner. 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::AddService( 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& service_name, 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::Callback<void(mojo::ScopedMessagePipeHandle)> service_factory) { 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool inserted = service_factories_.insert( 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::make_pair(service_name, service_factory)).second; 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(inserted); 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::RemoveService(const std::string& service_name) { 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_factories_.erase(service_name); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::ConnectToRemoteService( 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::StringPiece& service_name, 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ScopedMessagePipeHandle handle) { 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!bound_) { 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pending_connects_.push( 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::make_pair(service_name.as_string(), handle.release())); 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client()->ConnectToService(mojo::String::From(service_name), handle.Pass()); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::WeakPtr<ServiceRegistry> ServiceRegistryImpl::GetWeakPtr() { 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return weak_factory_.GetWeakPtr(); 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistryImpl::ConnectToService( 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const mojo::String& name, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mojo::ScopedMessagePipeHandle client_handle) { 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::map<std::string, 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Callback<void(mojo::ScopedMessagePipeHandle)> >::iterator it = 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_factories_.find(name); 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (it == service_factories_.end()) 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch it->second.Run(client_handle.Pass()); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace content 84