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