1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file.
4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_registry.h"
6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_impl.h"
9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_connector.h"
10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo {
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace internal {
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry::ServiceRegistry(ApplicationImpl* application_impl,
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 const std::string& url,
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 ServiceProviderPtr service_provider)
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : application_impl_(application_impl),
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      url_(url),
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      remote_service_provider_(service_provider.Pass()) {
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  remote_service_provider_.set_client(this);
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
23116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceRegistry::ServiceRegistry() : application_impl_(NULL) {}
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ServiceRegistry::~ServiceRegistry() {
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  for (NameToServiceConnectorMap::iterator i =
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)           name_to_service_connector_.begin();
28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       i != name_to_service_connector_.end(); ++i) {
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    delete i->second;
30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  name_to_service_connector_.clear();
32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ServiceRegistry::AddServiceConnector(
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ServiceConnectorBase* service_connector) {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RemoveServiceConnectorInternal(service_connector);
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  name_to_service_connector_[service_connector->name()] = service_connector;
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_connector->set_application_connection(this);
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ServiceRegistry::RemoveServiceConnector(
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ServiceConnectorBase* service_connector) {
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  RemoveServiceConnectorInternal(service_connector);
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (name_to_service_connector_.empty())
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    remote_service_provider_.reset();
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ServiceRegistry::RemoveServiceConnectorInternal(
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ServiceConnectorBase* service_connector) {
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  NameToServiceConnectorMap::iterator it =
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      name_to_service_connector_.find(service_connector->name());
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (it == name_to_service_connector_.end())
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  delete it->second;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  name_to_service_connector_.erase(it);
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst std::string& ServiceRegistry::GetRemoteApplicationURL() {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return url_;
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben MurdochServiceProvider* ServiceRegistry::GetServiceProvider() {
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return remote_service_provider_.get();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben MurdochApplicationConnection* ServiceRegistry::ConnectToApplication(
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const std::string& url) {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return application_impl_->ConnectToApplication(url);
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ServiceRegistry::ConnectToService(const mojo::String& service_name,
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       ScopedMessagePipeHandle client_handle) {
746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (name_to_service_connector_.find(service_name) ==
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      name_to_service_connector_.end()) {
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    client_handle.reset();
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  internal::ServiceConnectorBase* service_connector =
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      name_to_service_connector_[service_name];
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return service_connector->ConnectToService(service_name,
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             client_handle.Pass());
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace internal
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}  // namespace mojo
87