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_IMPL_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define MOJO_PUBLIC_APPLICATION_APPLICATION_IMPL_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/application_connection.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/lib/service_connector.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/application/lib/service_registry.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/system/core.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/interfaces/application/application.mojom.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/public/interfaces/application/shell.mojom.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo { 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ApplicationDelegate; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Utility class for communicating with the Shell, and providing Services 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// to clients. 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// To use define a class that implements your specific server api, e.g. FooImpl 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// to implement a service named Foo. 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// That class must subclass an InterfaceImpl specialization. 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// If there is context that is to be shared amongst all instances, define a 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// constructor with that class as its only argument, otherwise define an empty 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// constructor. 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// class FooImpl : public InterfaceImpl<Foo> { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// public: 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// FooImpl(ApplicationContext* app_context) {} 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// }; 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// or 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// class BarImpl : public InterfaceImpl<Bar> { 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// public: 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// // contexts will remain valid for the lifetime of BarImpl. 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// BarImpl(ApplicationContext* app_context, BarContext* service_context) 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// : app_context_(app_context), servicecontext_(context) {} 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Create an ApplicationImpl instance that collects any service implementations. 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// ApplicationImpl app(service_provider_handle); 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// app.AddService<FooImpl>(); 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// BarContext context; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// app.AddService<BarImpl>(&context); 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ApplicationImpl : public InterfaceImpl<Application> { 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ApplicationImpl(ApplicationDelegate* delegate, 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScopedMessagePipeHandle shell_handle); 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ApplicationImpl(ApplicationDelegate* delegate, 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MojoHandle shell_handle); 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~ApplicationImpl(); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Shell* shell() const { return shell_.get(); } 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns any initial configuration arguments, passed by the Shell. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Array<String>& args() { return args_; } 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Establishes a new connection to an application. Caller does not own. 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ApplicationConnection* ConnectToApplication(const String& application_url); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Connect to application identified by |application_url| and connect to the 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // service implementation of the interface identified by |Interface|. 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch template <typename Interface> 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void ConnectToService(const std::string& application_url, 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InterfacePtr<Interface>* ptr) { 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ConnectToApplication(application_url)->ConnectToService(ptr); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci class ShellPtrWatcher; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void BindShell(ScopedMessagePipeHandle shell_handle); 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void ClearConnections(); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnShellError() { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ClearConnections(); 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Terminate(); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Quits the main run loop for this application. 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) static void Terminate(); 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Application implementation. 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void Initialize(Array<String> args) MOJO_OVERRIDE; 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void AcceptConnection(const String& requestor_url, 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceProviderPtr provider) MOJO_OVERRIDE; 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch typedef std::vector<internal::ServiceRegistry*> ServiceRegistryList; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool initialized_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceRegistryList incoming_service_registries_; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ServiceRegistryList outgoing_service_registries_; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ApplicationDelegate* delegate_; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ShellPtr shell_; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ShellPtrWatcher* shell_watch_; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Array<String> args_; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MOJO_DISALLOW_COPY_AND_ASSIGN(ApplicationImpl); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace mojo 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // MOJO_PUBLIC_APPLICATION_APPLICATION_IMPL_H_ 111