application_connection.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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_APPLICATION_APPLICATION_CONNECTION_H_
6#define MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_
7
8#include <string>
9
10#include "mojo/public/cpp/application/lib/service_connector.h"
11#include "mojo/public/interfaces/application/service_provider.mojom.h"
12
13namespace mojo {
14
15// An instance of this class is passed to
16// ApplicationDelegate's ConfigureIncomingConnection() method each time a
17// connection is made to this app, and to ApplicationDelegate's
18// ConfigureOutgoingConnection() method when the app connects to
19// another.
20//
21// To use define a class that implements your specific service api, e.g. FooImpl
22// to implement a service named Foo.
23// That class must subclass an InterfaceImpl specialization.
24//
25// Then implement an InterfaceFactory<Foo> that binds instances of FooImpl to
26// InterfaceRequest<Foo>s and register that on the connection.
27//
28// connection->AddService(&factory);
29//
30// Or if you have multiple factories implemented by the same type, explicitly
31// specify the interface to register the factory for:
32//
33// connection->AddService<Foo>(&my_foo_and_bar_factory_);
34// connection->AddService<Bar>(&my_foo_and_bar_factory_);
35//
36// The InterfaceFactory must outlive the ApplicationConnection.
37class ApplicationConnection {
38 public:
39  virtual ~ApplicationConnection();
40
41  template <typename Interface>
42  void AddService(InterfaceFactory<Interface>* factory) {
43    AddServiceConnector(
44        new internal::InterfaceFactoryConnector<Interface>(factory));
45  }
46
47  // Connect to the service implementing |Interface|.
48  template <typename Interface>
49  void ConnectToService(InterfacePtr<Interface>* ptr) {
50    MessagePipe pipe;
51    ptr->Bind(pipe.handle0.Pass());
52    GetServiceProvider()->ConnectToService(Interface::Name_,
53                                           pipe.handle1.Pass());
54  }
55
56  // The url identifying the application on the other end of this connection.
57  virtual const std::string& GetRemoteApplicationURL() = 0;
58
59  // Establishes a new connection to an application.
60  // TODO(davemoore): Would it be better to expose the ApplicationImpl?
61  virtual ApplicationConnection* ConnectToApplication(
62      const std::string& url) = 0;
63
64  // Connect to application identified by |application_url| and connect to
65  // the service implementation of the interface identified by |Interface|.
66  template <typename Interface>
67  void ConnectToService(const std::string& application_url,
68                        InterfacePtr<Interface>* ptr) {
69    ConnectToApplication(application_url)->ConnectToService(ptr);
70  }
71
72  // Raw ServiceProvider interface to remote application.
73  virtual ServiceProvider* GetServiceProvider() = 0;
74
75 private:
76  virtual void AddServiceConnector(
77      internal::ServiceConnectorBase* service_connector) = 0;
78};
79
80}  // namespace mojo
81
82#endif  // MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_
83