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#ifndef MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <string>
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/lib/service_connector.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/interfaces/application/service_provider.mojom.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo {
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// An instance of this class is passed to
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ApplicationDelegate's ConfigureIncomingConnection() method each time a
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// connection is made to this app, and to ApplicationDelegate's
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ConfigureOutgoingConnection() method when the app connects to
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// another.
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// To use define a class that implements your specific service api, e.g. FooImpl
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// to implement a service named Foo.
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// That class must subclass an InterfaceImpl specialization.
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Then implement an InterfaceFactory<Foo> that binds instances of FooImpl to
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// InterfaceRequest<Foo>s and register that on the connection.
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// connection->AddService(&factory);
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Or if you have multiple factories implemented by the same type, explicitly
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// specify the interface to register the factory for:
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// connection->AddService<Foo>(&my_foo_and_bar_factory_);
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// connection->AddService<Bar>(&my_foo_and_bar_factory_);
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch//
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The InterfaceFactory must outlive the ApplicationConnection.
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ApplicationConnection {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~ApplicationConnection();
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  template <typename Interface>
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void AddService(InterfaceFactory<Interface>* factory) {
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AddServiceConnector(
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        new internal::InterfaceFactoryConnector<Interface>(factory));
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Connect to the service implementing |Interface|.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <typename Interface>
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ConnectToService(InterfacePtr<Interface>* ptr) {
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MessagePipe pipe;
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ptr->Bind(pipe.handle0.Pass());
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    GetServiceProvider()->ConnectToService(Interface::Name_,
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                           pipe.handle1.Pass());
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The url identifying the application on the other end of this connection.
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual const std::string& GetRemoteApplicationURL() = 0;
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Establishes a new connection to an application.
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(davemoore): Would it be better to expose the ApplicationImpl?
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ApplicationConnection* ConnectToApplication(
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const std::string& url) = 0;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Connect to application identified by |application_url| and connect to
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the service implementation of the interface identified by |Interface|.
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  template <typename Interface>
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ConnectToService(const std::string& application_url,
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        InterfacePtr<Interface>* ptr) {
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ConnectToApplication(application_url)->ConnectToService(ptr);
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Raw ServiceProvider interface to remote application.
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ServiceProvider* GetServiceProvider() = 0;
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void AddServiceConnector(
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      internal::ServiceConnectorBase* service_connector) = 0;
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace mojo
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_
83