application_impl.h revision 116680a4aac90f2aa7413d9095a592090648e557
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef MOJO_PUBLIC_APPLICATION_APPLICATION_IMPL_H_ 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define MOJO_PUBLIC_APPLICATION_APPLICATION_IMPL_H_ 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include <vector> 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/application_connection.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_connector.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/lib/service_registry.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/system/core.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/interfaces/service_provider/service_provider.mojom.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(WIN32) 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(CDECL) 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CDECL __cdecl 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define APPLICATION_EXPORT __declspec(dllexport) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#else 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define CDECL 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#define APPLICATION_EXPORT __attribute__((visibility("default"))) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// DSOs can either implement MojoMain directly or include 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// mojo_main_{standalone|chromium}.cc in their project and implement 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ApplicationImpl::Create(); 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(davemoore): Establish this as part of our SDK for third party mojo 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// application writers. 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)extern "C" APPLICATION_EXPORT MojoResult CDECL MojoMain( 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MojoHandle service_provider_handle); 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ApplicationDelegate; 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Utility class for communicating with the Shell, and providing Services 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// to clients. 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// To use define a class that implements your specific server api, e.g. FooImpl 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// to implement a service named Foo. 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// That class must subclass an InterfaceImpl specialization. 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// If there is context that is to be shared amongst all instances, define a 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// constructor with that class as its only argument, otherwise define an empty 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// constructor. 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// class FooImpl : public InterfaceImpl<Foo> { 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// public: 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// FooImpl(ApplicationContext* app_context) {} 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// }; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// or 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// class BarImpl : public InterfaceImpl<Bar> { 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// public: 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// // contexts will remain valid for the lifetime of BarImpl. 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// BarImpl(ApplicationContext* app_context, BarContext* service_context) 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// : app_context_(app_context), servicecontext_(context) {} 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Create an ApplicationDele instance that collects any service implementations. 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ApplicationImpl app(service_provider_handle); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// app.AddService<FooImpl>(); 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// BarContext context; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// app.AddService<BarImpl>(&context); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class ApplicationImpl : public InterfaceImpl<Application> { 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) explicit ApplicationImpl(ApplicationDelegate* delegate); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ApplicationImpl(ApplicationDelegate* delegate, 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedMessagePipeHandle shell_handle); 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ApplicationImpl(ApplicationDelegate* delegate, 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MojoHandle shell_handle); 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~ApplicationImpl(); 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Establishes a new connection to an application. Caller does not own. 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ApplicationConnection* ConnectToApplication(const String& application_url); 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Connect to application identified by |application_url| and connect to 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // an the service implementation of the interface identified by |Interface|. 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) template <typename Interface> 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void ConnectToService(const std::string& application_url, 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) InterfacePtr<Interface>* ptr) { 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ConnectToApplication(application_url)->ConnectToService(ptr); 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend MojoResult (::MojoMain)(MojoHandle); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 93 void BindShell(ScopedMessagePipeHandle shell_handle); 94 void BindShell(MojoHandle shell_handle); 95 96 // Application implementation. 97 virtual void AcceptConnection(const String& requestor_url, 98 ServiceProviderPtr provider) MOJO_OVERRIDE; 99 100 typedef std::vector<internal::ServiceRegistry*> ServiceRegistryList; 101 ServiceRegistryList incoming_service_registries_; 102 ServiceRegistryList outgoing_service_registries_; 103 ApplicationDelegate* delegate_; 104 ShellPtr shell_; 105 106 MOJO_DISALLOW_COPY_AND_ASSIGN(ApplicationImpl); 107}; 108 109} // namespace mojo 110 111#endif // MOJO_PUBLIC_APPLICATION_APPLICATION_IMPL_H_ 112