Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: services/shell/public/cpp/interface_provider.h

Issue 2419723002: Move services/shell to services/service_manager (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 SERVICES_SHELL_PUBLIC_CPP_INTERFACE_PROVIDER_H_
6 #define SERVICES_SHELL_PUBLIC_CPP_INTERFACE_PROVIDER_H_
7
8 #include "base/bind.h"
9 #include "services/shell/public/interfaces/interface_provider.mojom.h"
10
11 namespace shell {
12
13 // Encapsulates a mojom::InterfaceProviderPtr implemented in a remote
14 // application. Provides two main features:
15 // - a typesafe GetInterface() method for binding InterfacePtrs.
16 // - a testing API that allows local callbacks to be registered that bind
17 // requests for remote interfaces.
18 // An instance of this class is used by the GetInterface() methods on
19 // Connection.
20 class InterfaceProvider {
21 public:
22 using ForwardCallback = base::Callback<void(const std::string&,
23 mojo::ScopedMessagePipeHandle)>;
24 class TestApi {
25 public:
26 explicit TestApi(InterfaceProvider* provider) : provider_(provider) {}
27 ~TestApi() {}
28
29 void SetBinderForName(
30 const std::string& name,
31 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& binder) {
32 provider_->SetBinderForName(name, binder);
33 }
34
35 void ClearBinders() {
36 provider_->ClearBinders();
37 }
38
39 private:
40 InterfaceProvider* provider_;
41 DISALLOW_COPY_AND_ASSIGN(TestApi);
42 };
43
44 InterfaceProvider();
45 ~InterfaceProvider();
46
47 // Binds this InterfaceProvider to an actual mojom::InterfaceProvider pipe.
48 // It is an error to call this on a forwarding InterfaceProvider, i.e. this
49 // call is exclusive to Forward().
50 void Bind(mojom::InterfaceProviderPtr interface_provider);
51
52 // Sets this InterfaceProvider to forward all GetInterface() requests to
53 // |callback|. It is an error to call this on a bound InterfaceProvider, i.e.
54 // this call is exclusive to Bind(). In addition, and unlike Bind(), this MUST
55 // be called before any calls to GetInterface() are made.
56 void Forward(const ForwardCallback& callback);
57
58 // Returns a raw pointer to the remote InterfaceProvider.
59 mojom::InterfaceProvider* get() { return interface_provider_.get(); }
60
61 // Sets a closure to be run when the remote InterfaceProvider pipe is closed.
62 void SetConnectionLostClosure(const base::Closure& connection_lost_closure);
63
64 base::WeakPtr<InterfaceProvider> GetWeakPtr();
65
66 // Binds |ptr| to an implementation of Interface in the remote application.
67 // |ptr| can immediately be used to start sending requests to the remote
68 // interface.
69 template <typename Interface>
70 void GetInterface(mojo::InterfacePtr<Interface>* ptr) {
71 mojo::MessagePipe pipe;
72 ptr->Bind(mojo::InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u));
73
74 GetInterface(Interface::Name_, std::move(pipe.handle1));
75 }
76 template <typename Interface>
77 void GetInterface(mojo::InterfaceRequest<Interface> request) {
78 GetInterface(Interface::Name_, std::move(request.PassMessagePipe()));
79 }
80 void GetInterface(const std::string& name,
81 mojo::ScopedMessagePipeHandle request_handle);
82
83 // Returns a callback to GetInterface<Interface>(). This can be passed to
84 // InterfaceRegistry::AddInterface() to forward requests.
85 template <typename Interface>
86 base::Callback<void(mojo::InterfaceRequest<Interface>)>
87 CreateInterfaceFactory() {
88 // InterfaceProvider::GetInterface() is overloaded, so static_cast to select
89 // the overload that takes an mojo::InterfaceRequest<Interface>.
90 return base::Bind(static_cast<void (InterfaceProvider::*)(
91 mojo::InterfaceRequest<Interface>)>(
92 &InterfaceProvider::GetInterface<Interface>),
93 GetWeakPtr());
94 }
95
96 private:
97 void SetBinderForName(
98 const std::string& name,
99 const base::Callback<void(mojo::ScopedMessagePipeHandle)>& binder) {
100 binders_[name] = binder;
101 }
102 void ClearBinders();
103
104 using BinderMap = std::map<
105 std::string, base::Callback<void(mojo::ScopedMessagePipeHandle)>>;
106 BinderMap binders_;
107
108 mojom::InterfaceProviderPtr interface_provider_;
109 mojom::InterfaceProviderRequest pending_request_;
110
111 // A callback to receive all GetInterface() requests in lieu of the
112 // InterfaceProvider pipe.
113 ForwardCallback forward_callback_;
114
115 base::WeakPtrFactory<InterfaceProvider> weak_factory_;
116
117 DISALLOW_COPY_AND_ASSIGN(InterfaceProvider);
118 };
119
120 } // namespace shell
121
122 #endif // SERVICES_SHELL_PUBLIC_CPP_INTERFACE_PROVIDER_H_
OLDNEW
« no previous file with comments | « services/shell/public/cpp/interface_factory_impl.h ('k') | services/shell/public/cpp/interface_registry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698