// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_ #define MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_ #include #include "mojo/public/cpp/application/lib/service_connector.h" #include "mojo/public/interfaces/application/service_provider.mojom.h" namespace mojo { // An instance of this class is passed to // ApplicationDelegate's ConfigureIncomingConnection() method each time a // connection is made to this app, and to ApplicationDelegate's // ConfigureOutgoingConnection() method when the app connects to // another. // // To use define a class that implements your specific service api, e.g. FooImpl // to implement a service named Foo. // That class must subclass an InterfaceImpl specialization. // // Then implement an InterfaceFactory that binds instances of FooImpl to // InterfaceRequests and register that on the connection. // // connection->AddService(&factory); // // Or if you have multiple factories implemented by the same type, explicitly // specify the interface to register the factory for: // // connection->AddService(&my_foo_and_bar_factory_); // connection->AddService(&my_foo_and_bar_factory_); // // The InterfaceFactory must outlive the ApplicationConnection. class ApplicationConnection { public: virtual ~ApplicationConnection(); template void AddService(InterfaceFactory* factory) { AddServiceConnector( new internal::InterfaceFactoryConnector(factory)); } // Connect to the service implementing |Interface|. template void ConnectToService(InterfacePtr* ptr) { MessagePipe pipe; ptr->Bind(pipe.handle0.Pass()); GetServiceProvider()->ConnectToService(Interface::Name_, pipe.handle1.Pass()); } // The url identifying the application on the other end of this connection. virtual const std::string& GetRemoteApplicationURL() = 0; // Establishes a new connection to an application. // TODO(davemoore): Would it be better to expose the ApplicationImpl? virtual ApplicationConnection* ConnectToApplication( const std::string& url) = 0; // Connect to application identified by |application_url| and connect to // the service implementation of the interface identified by |Interface|. template void ConnectToService(const std::string& application_url, InterfacePtr* ptr) { ConnectToApplication(application_url)->ConnectToService(ptr); } // Raw ServiceProvider interface to remote application. virtual ServiceProvider* GetServiceProvider() = 0; private: virtual void AddServiceConnector( internal::ServiceConnectorBase* service_connector) = 0; }; } // namespace mojo #endif // MOJO_PUBLIC_APPLICATION_APPLICATION_CONNECTION_H_