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