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#ifndef MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_REGISTRY_H_
6#define MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_REGISTRY_H_
7
8#include "mojo/public/cpp/application/application_connection.h"
9#include "mojo/public/interfaces/application/service_provider.mojom.h"
10
11namespace mojo {
12
13class Application;
14class ApplicationImpl;
15
16namespace internal {
17
18class ServiceConnectorBase;
19
20// A ServiceRegistry represents each half of a connection between two
21// applications, allowing customization of which services are published to the
22// other.
23class ServiceRegistry : public ServiceProvider, public ApplicationConnection {
24 public:
25  ServiceRegistry();
26  ServiceRegistry(ApplicationImpl* application_impl,
27                  const std::string& url,
28                  ServiceProviderPtr service_provider);
29  virtual ~ServiceRegistry();
30
31  // ApplicationConnection overrides.
32  virtual void AddServiceConnector(ServiceConnectorBase* service_connector)
33      MOJO_OVERRIDE;
34  virtual const std::string& GetRemoteApplicationURL() MOJO_OVERRIDE;
35  virtual ApplicationConnection* ConnectToApplication(
36      const std::string& url) MOJO_OVERRIDE;
37  virtual ServiceProvider* GetServiceProvider() MOJO_OVERRIDE;
38
39  virtual void RemoveServiceConnector(ServiceConnectorBase* service_connector);
40
41 private:
42  // ServiceProvider method.
43  virtual void ConnectToService(const mojo::String& service_name,
44                                ScopedMessagePipeHandle client_handle)
45      MOJO_OVERRIDE;
46
47  ApplicationImpl* application_impl_;
48  const std::string url_;
49
50 private:
51  bool RemoveServiceConnectorInternal(
52      ServiceConnectorBase* service_connector);
53
54  Application* application_;
55  typedef std::map<std::string, ServiceConnectorBase*>
56      NameToServiceConnectorMap;
57  NameToServiceConnectorMap name_to_service_connector_;
58  ServiceProviderPtr remote_service_provider_;
59
60  MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceRegistry);
61};
62
63}  // namespace internal
64}  // namespace mojo
65
66#endif  // MOJO_PUBLIC_CPP_APPLICATION_LIB_SERVICE_REGISTRY_H_
67