OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ | 5 #ifndef MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ |
6 #define MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ | 6 #define MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ |
7 | 7 |
8 #include <functional> | |
8 #include <string> | 9 #include <string> |
9 | 10 |
11 #include "mojo/public/cpp/application/application_connection.h" | |
12 #include "mojo/public/cpp/application/connection_context.h" | |
10 #include "mojo/public/cpp/application/lib/interface_factory_connector.h" | 13 #include "mojo/public/cpp/application/lib/interface_factory_connector.h" |
11 #include "mojo/public/cpp/application/lib/service_connector_registry.h" | 14 #include "mojo/public/cpp/application/lib/service_connector_registry.h" |
15 #include "mojo/public/cpp/application/service_connector.h" | |
12 #include "mojo/public/cpp/bindings/binding.h" | 16 #include "mojo/public/cpp/bindings/binding.h" |
13 #include "mojo/public/interfaces/application/service_provider.mojom.h" | 17 #include "mojo/public/interfaces/application/service_provider.mojom.h" |
14 | 18 |
15 namespace mojo { | 19 namespace mojo { |
16 | 20 |
17 // Implements a registry that can be used to expose services to another app. | 21 // An implementation of |ServiceProvider|, which can be customized appropriately |
22 // (to select what services it provides). | |
18 class ServiceProviderImpl : public ServiceProvider { | 23 class ServiceProviderImpl : public ServiceProvider { |
19 public: | 24 public: |
25 // A |RequestHandler<Interface>| is simply a function that handles a request | |
26 // for |Interface|. If it determines (e.g., based on the given | |
27 // |ConnectionContext|) that the request should be "accepted", then it should | |
28 // "connect" ("take ownership of") request. Otherwise, it can simply drop | |
29 // |request| (as implied by the interface). | |
30 template <typename Interface> | |
31 using RequestHandler = | |
vardhan
2016/05/11 23:09:35
nit: more specific typename? (sorry!)
| |
32 std::function<void(const ConnectionContext& connection_context, | |
33 InterfaceRequest<Interface> request)>; | |
34 | |
35 // Constructs this service provider implementation in an unbound state. | |
20 ServiceProviderImpl(); | 36 ServiceProviderImpl(); |
37 | |
38 // Constructs this service provider implementation, binding it to the given | |
39 // interface request. | |
40 // TODO(vtl): This should take a |ConnectionContext|, to provide | |
41 // |RequestHandler<I>|s. | |
21 explicit ServiceProviderImpl(InterfaceRequest<ServiceProvider> request); | 42 explicit ServiceProviderImpl(InterfaceRequest<ServiceProvider> request); |
43 | |
22 ~ServiceProviderImpl() override; | 44 ~ServiceProviderImpl() override; |
23 | 45 |
46 // Binds this service provider implementation to the given interface request. | |
47 // This may only be called if this object is unbound. | |
48 // TODO(vtl): This should take a |ConnectionContext|, to provide | |
49 // |RequestHandler<I>|s. | |
24 void Bind(InterfaceRequest<ServiceProvider> request); | 50 void Bind(InterfaceRequest<ServiceProvider> request); |
25 // Disconnect this service provider and put it in a state where it can be | 51 |
26 // rebound to a new request. | 52 // Disconnect this service provider implementation and put it in a state where |
53 // it can be rebound to a new request (i.e., restores this object to an | |
54 // unbound state). This may be called even if this object is already unbound. | |
27 void Close(); | 55 void Close(); |
28 | 56 |
57 // TODO(vtl): Remove this. | |
29 template <typename Interface> | 58 template <typename Interface> |
30 void AddService(InterfaceFactory<Interface>* factory, | 59 void AddService(InterfaceFactory<Interface>* factory, |
31 const std::string& interface_name = Interface::Name_) { | 60 const std::string& interface_name = Interface::Name_) { |
32 service_connector_registry_.SetServiceConnectorForName( | 61 service_connector_registry_.SetServiceConnectorForName( |
33 std::unique_ptr<ServiceConnector>( | 62 std::unique_ptr<ServiceConnector>( |
34 new internal::InterfaceFactoryConnector<Interface>(factory)), | 63 new internal::InterfaceFactoryConnector<Interface>(factory)), |
35 interface_name); | 64 interface_name); |
36 } | 65 } |
37 | 66 |
38 // ServiceProviderImpl uses the fallback_service_provider_ whenever someone | 67 // Adds a supported service with the given |name|, using the given |
39 // asks a service that doesn't exist in the service_connector_registry_. | 68 // |request_handler| (see above for information about |
40 // | 69 // |RequestHandler<Interface>|). |request_handler| should remain valid for the |
41 // Note: ServiceProviderImpl does not take ownership of |fallback|. The caller | 70 // lifetime of this object. |
42 // must ensure that |fallback| outlives the ServiceProviderImpl. | 71 // TODO(vtl): Remove the AddService() above and rename this to AddService(). |
43 // | 72 template <typename Interface> |
44 void set_fallback_service_provider(ServiceProvider* fallback) { | 73 void AddServiceNew(RequestHandler<Interface> request_handler, |
45 fallback_service_provider_ = fallback; | 74 const std::string& name = Interface::Name_) { |
75 service_connector_registry_.SetServiceConnectorForName( | |
76 std::unique_ptr<ServiceConnector>( | |
77 new ServiceConnectorImpl<Interface>(std::move(request_handler))), | |
78 name); | |
79 } | |
80 | |
81 // This uses the provided |fallback_service_provider| for connection requests | |
82 // for services that are not known (haven't been added). (Set it to null to | |
83 // not have any fallback.) A fallback must outlive this object (or until it is | |
84 // "cleared" or replaced by a different fallback. | |
85 void set_fallback_service_provider( | |
86 ServiceProvider* fallback_service_provider) { | |
87 fallback_service_provider_ = fallback_service_provider; | |
46 } | 88 } |
47 | 89 |
48 private: | 90 private: |
49 // Overridden from ServiceProvider: | 91 // Objects of this class are used to adapt a generic (untyped) connection |
92 // request (i.e., |ServiceConnector::ConnectToService()|) to the type-safe | |
93 // |RequestHandler<Interface>|. | |
94 template <typename Interface> | |
95 class ServiceConnectorImpl : public ServiceConnector { | |
96 public: | |
97 explicit ServiceConnectorImpl(RequestHandler<Interface> request_handler) | |
98 : request_handler_(std::move(request_handler)) {} | |
99 ~ServiceConnectorImpl() override {} | |
100 | |
101 void ConnectToService(ApplicationConnection* application_connection, | |
102 const std::string& interface_name, | |
103 ScopedMessagePipeHandle client_handle) override { | |
104 // TODO(vtl): This should be given a |const ConnectionContext&|, instead | |
105 // of an |ApplicationConnection*| -- which may be null! | |
106 request_handler_(application_connection | |
107 ? application_connection->GetConnectionContext() | |
108 : ConnectionContext(), | |
109 InterfaceRequest<Interface>(client_handle.Pass())); | |
110 } | |
111 | |
112 private: | |
113 const RequestHandler<Interface> request_handler_; | |
114 | |
115 MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceConnectorImpl); | |
116 }; | |
117 | |
118 // Overridden from |ServiceProvider|: | |
50 void ConnectToService(const String& service_name, | 119 void ConnectToService(const String& service_name, |
51 ScopedMessagePipeHandle client_handle) override; | 120 ScopedMessagePipeHandle client_handle) override; |
52 | 121 |
53 Binding<ServiceProvider> binding_; | 122 Binding<ServiceProvider> binding_; |
54 | 123 |
55 internal::ServiceConnectorRegistry service_connector_registry_; | 124 internal::ServiceConnectorRegistry service_connector_registry_; |
56 ServiceProvider* fallback_service_provider_; | 125 ServiceProvider* fallback_service_provider_; |
57 | 126 |
58 MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceProviderImpl); | 127 MOJO_DISALLOW_COPY_AND_ASSIGN(ServiceProviderImpl); |
59 }; | 128 }; |
60 | 129 |
61 } // namespace mojo | 130 } // namespace mojo |
62 | 131 |
63 #endif // MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ | 132 #endif // MOJO_PUBLIC_APPLICATION_SERVICE_PROVIDER_IMPL_H_ |
OLD | NEW |