Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / mojo / public / cpp / application / lib / service_registry.cc
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/lib/service_registry.h"
6
7 #include "mojo/public/cpp/application/application_connection.h"
8 #include "mojo/public/cpp/application/application_impl.h"
9 #include "mojo/public/cpp/application/lib/service_connector.h"
10
11 namespace mojo {
12 namespace internal {
13
14 ServiceRegistry::ServiceRegistry(ApplicationImpl* application_impl,
15                                  const std::string& url,
16                                  ServiceProviderPtr service_provider)
17     : application_impl_(application_impl),
18       url_(url),
19       remote_service_provider_(service_provider.Pass()) {
20   remote_service_provider_.set_client(this);
21 }
22
23 ServiceRegistry::ServiceRegistry() : application_impl_(nullptr) {
24 }
25
26 ServiceRegistry::~ServiceRegistry() {
27   for (NameToServiceConnectorMap::iterator i =
28            name_to_service_connector_.begin();
29        i != name_to_service_connector_.end();
30        ++i) {
31     delete i->second;
32   }
33   name_to_service_connector_.clear();
34 }
35
36 void ServiceRegistry::AddServiceConnector(
37     ServiceConnectorBase* service_connector) {
38   RemoveServiceConnectorInternal(service_connector);
39   name_to_service_connector_[service_connector->name()] = service_connector;
40   service_connector->set_application_connection(this);
41 }
42
43 void ServiceRegistry::RemoveServiceConnector(
44     ServiceConnectorBase* service_connector) {
45   RemoveServiceConnectorInternal(service_connector);
46   if (name_to_service_connector_.empty())
47     remote_service_provider_.reset();
48 }
49
50 bool ServiceRegistry::RemoveServiceConnectorInternal(
51     ServiceConnectorBase* service_connector) {
52   NameToServiceConnectorMap::iterator it =
53       name_to_service_connector_.find(service_connector->name());
54   if (it == name_to_service_connector_.end())
55     return false;
56   delete it->second;
57   name_to_service_connector_.erase(it);
58   return true;
59 }
60
61 const std::string& ServiceRegistry::GetRemoteApplicationURL() {
62   return url_;
63 }
64
65 ServiceProvider* ServiceRegistry::GetServiceProvider() {
66   return remote_service_provider_.get();
67 }
68
69 ApplicationConnection* ServiceRegistry::ConnectToApplication(
70     const std::string& url) {
71   return application_impl_->ConnectToApplication(url);
72 }
73
74 void ServiceRegistry::ConnectToService(const mojo::String& service_name,
75                                        ScopedMessagePipeHandle client_handle) {
76   if (name_to_service_connector_.find(service_name) ==
77       name_to_service_connector_.end()) {
78     client_handle.reset();
79     return;
80   }
81   internal::ServiceConnectorBase* service_connector =
82       name_to_service_connector_[service_name];
83   return service_connector->ConnectToService(service_name,
84                                              client_handle.Pass());
85 }
86
87 }  // namespace internal
88 }  // namespace mojo