service_registry_impl.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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