OLD | NEW |
| (Empty) |
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_SHELL_APPLICATION_H_ | |
6 #define MOJO_PUBLIC_SHELL_APPLICATION_H_ | |
7 | |
8 #include <vector> | |
9 | |
10 #include "mojo/public/cpp/shell/connect.h" | |
11 #include "mojo/public/cpp/shell/lib/service_connector.h" | |
12 #include "mojo/public/cpp/system/core.h" | |
13 #include "mojo/public/interfaces/shell/shell.mojom.h" | |
14 | |
15 namespace mojo { | |
16 | |
17 // Utility class for creating ShellClients that vend service instances. | |
18 // To use define a class that implements your specific server api, e.g. FooImpl | |
19 // to implement a service named Foo. | |
20 // That class must subclass an InterfaceImpl specialization. | |
21 // | |
22 // If there is context that is to be shared amongst all instances, define a | |
23 // constructor with that class as its only argument, otherwise define an empty | |
24 // constructor. | |
25 // | |
26 // class FooImpl : public InterfaceImpl<Foo> { | |
27 // public: | |
28 // FooImpl() {} | |
29 // }; | |
30 // | |
31 // or | |
32 // | |
33 // class BarImpl : public InterfaceImpl<Bar> { | |
34 // public: | |
35 // // context will remain valid for the lifetime of BarImpl. | |
36 // BarImpl(BarContext* context) : context_(context) {} | |
37 // private: | |
38 // BarContext* context; | |
39 // }; | |
40 // | |
41 // Create an Application instance that collects any service implementations. | |
42 // | |
43 // Application app(shell_handle); | |
44 // app.AddService<FooImpl>(); | |
45 // | |
46 // BarContext context; | |
47 // app.AddService<BarImpl>(&context); | |
48 // | |
49 // | |
50 class Application : public internal::ServiceConnectorBase::Owner { | |
51 public: | |
52 explicit Application(ScopedMessagePipeHandle shell_handle); | |
53 explicit Application(MojoHandle shell_handle); | |
54 virtual ~Application(); | |
55 | |
56 template <typename Impl, typename Context> | |
57 void AddService(Context* context) { | |
58 AddServiceConnector(new internal::ServiceConnector<Impl, Context>(context)); | |
59 } | |
60 | |
61 template <typename Impl> | |
62 void AddService() { | |
63 AddServiceConnector(new internal::ServiceConnector<Impl, void>(NULL)); | |
64 } | |
65 | |
66 template <typename Interface> | |
67 void ConnectTo(const std::string& url, InterfacePtr<Interface>* ptr) { | |
68 mojo::ConnectTo(shell(), url, ptr); | |
69 } | |
70 | |
71 protected: | |
72 // ShellClient methods. | |
73 // Override this to dispatch to correct service when there's more than one. | |
74 // TODO(davemoore): Augment this with name registration. | |
75 virtual void AcceptConnection(const mojo::String& url, | |
76 ScopedMessagePipeHandle client_handle) | |
77 MOJO_OVERRIDE; | |
78 | |
79 private: | |
80 // internal::ServiceConnectorBase::Owner methods. | |
81 // Takes ownership of |service_connector|. | |
82 virtual void AddServiceConnector( | |
83 internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE; | |
84 virtual void RemoveServiceConnector( | |
85 internal::ServiceConnectorBase* service_connector) MOJO_OVERRIDE; | |
86 | |
87 typedef std::vector<internal::ServiceConnectorBase*> ServiceConnectorList; | |
88 ServiceConnectorList service_connectors_; | |
89 }; | |
90 | |
91 } // namespace mojo | |
92 | |
93 #endif // MOJO_PUBLIC_SHELL_APPLICATION_H_ | |
OLD | NEW |