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

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

Issue 2075003002: Separate Remote InterfaceProvider again, and add a new client lib type for it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 6 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
« no previous file with comments | « services/shell/public/cpp/connection.h ('k') | services/shell/public/cpp/lib/connection_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 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 SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_ 5 #ifndef SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_
6 #define SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_ 6 #define SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_
7 7
8 #include <memory> 8 #include <memory>
9 9
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 public: 44 public:
45 explicit TestApi(InterfaceRegistry* registry) : registry_(registry) {} 45 explicit TestApi(InterfaceRegistry* registry) : registry_(registry) {}
46 ~TestApi() {} 46 ~TestApi() {}
47 47
48 void SetInterfaceBinderForName(InterfaceBinder* binder, 48 void SetInterfaceBinderForName(InterfaceBinder* binder,
49 const std::string& interface_name) { 49 const std::string& interface_name) {
50 registry_->SetInterfaceBinderForName( 50 registry_->SetInterfaceBinderForName(
51 base::WrapUnique(binder), interface_name); 51 base::WrapUnique(binder), interface_name);
52 } 52 }
53 53
54 void RemoveInterfaceBinderForName(const std::string& interface_name) {
55 registry_->RemoveInterfaceBinderForName(interface_name);
56 }
57
58 private: 54 private:
59 InterfaceRegistry* registry_; 55 InterfaceRegistry* registry_;
60 DISALLOW_COPY_AND_ASSIGN(TestApi); 56 DISALLOW_COPY_AND_ASSIGN(TestApi);
61 }; 57 };
62 58
63 // Construct with a Connection (which may be null), and create an 59 // Construct with a Connection (which may be null), and create an
64 // InterfaceProvider pipe, the client end of which may be obtained by calling 60 // InterfaceProvider pipe, the client end of which may be obtained by calling
65 // TakeClientHandle(). If |connection| is non-null, the Mojo Shell's 61 // TakeClientHandle(). If |connection| is non-null, the Mojo Shell's
66 // rules filtering which interfaces are allowed to be exposed to clients are 62 // rules filtering which interfaces are allowed to be exposed to clients are
67 // imposed on this registry. If null, they are not. 63 // imposed on this registry. If null, they are not.
68 explicit InterfaceRegistry(Connection* connection); 64 explicit InterfaceRegistry(Connection* connection);
69 // Construct with an InterfaceProviderRequest and a Connection (which may be
70 // null, see note above about filtering).
71 InterfaceRegistry(mojom::InterfaceProviderPtr remote_interfaces,
72 mojom::InterfaceProviderRequest local_interfaces_request,
73 Connection* connection);
74 ~InterfaceRegistry() override; 65 ~InterfaceRegistry() override;
75 66
76 // Takes the client end of the InterfaceProvider pipe created in the 67 void Bind(mojom::InterfaceProviderRequest local_interfaces_request);
77 // constructor.
78 mojom::InterfaceProviderPtr TakeClientHandle();
79
80 // Returns a raw pointer to the remote InterfaceProvider.
81 mojom::InterfaceProvider* GetRemoteInterfaces();
82
83 // Sets a closure to be run when the remote InterfaceProvider pipe is closed.
84 void SetRemoteInterfacesConnectionLostClosure(
85 const base::Closure& connection_lost_closure);
86 68
87 // Allows |Interface| to be exposed via this registry. Requests to bind will 69 // Allows |Interface| to be exposed via this registry. Requests to bind will
88 // be handled by |factory|. Returns true if the interface was exposed, false 70 // be handled by |factory|. Returns true if the interface was exposed, false
89 // if Connection policy prevented exposure. 71 // if Connection policy prevented exposure.
90 template <typename Interface> 72 template <typename Interface>
91 bool AddInterface(InterfaceFactory<Interface>* factory) { 73 bool AddInterface(InterfaceFactory<Interface>* factory) {
92 return SetInterfaceBinderForName( 74 return SetInterfaceBinderForName(
93 base::WrapUnique( 75 base::WrapUnique(
94 new internal::InterfaceFactoryBinder<Interface>(factory)), 76 new internal::InterfaceFactoryBinder<Interface>(factory)),
95 Interface::Name_); 77 Interface::Name_);
96 } 78 }
97 79
98 // Like AddInterface above, except supplies a callback to bind the MP instead 80 // Like AddInterface above, except supplies a callback to bind the MP instead
99 // of an InterfaceFactory, and optionally provides a task runner where the 81 // of an InterfaceFactory, and optionally provides a task runner where the
100 // callback will be run. 82 // callback will be run.
101 template <typename Interface> 83 template <typename Interface>
102 bool AddInterface( 84 bool AddInterface(
103 const base::Callback<void(mojo::InterfaceRequest<Interface>)>& callback, 85 const base::Callback<void(mojo::InterfaceRequest<Interface>)>& callback,
104 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner = 86 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner =
105 nullptr) { 87 nullptr) {
106 return SetInterfaceBinderForName( 88 return SetInterfaceBinderForName(
107 base::WrapUnique( 89 base::WrapUnique(
108 new internal::CallbackBinder<Interface>(callback, task_runner)), 90 new internal::CallbackBinder<Interface>(callback, task_runner)),
109 Interface::Name_); 91 Interface::Name_);
110 } 92 }
111 93
112 // Binds |ptr| to an implementation of Interface in the remote application.
113 // |ptr| can immediately be used to start sending requests to the remote
114 // interface.
115 template <typename Interface> 94 template <typename Interface>
116 void GetInterface(mojo::InterfacePtr<Interface>* ptr) { 95 void RemoveInterface() {
117 mojo::MessagePipe pipe; 96 RemoveInterface(Interface::Name_);
118 ptr->Bind(mojo::InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u));
119
120 // Local binders can be registered via TestApi.
121 auto it = name_to_binder_.find(Interface::Name_);
122 if (it != name_to_binder_.end()) {
123 it->second->BindInterface(connection_, Interface::Name_,
124 std::move(pipe.handle1));
125 return;
126 }
127 remote_interfaces_->GetInterface(Interface::Name_, std::move(pipe.handle1));
128 } 97 }
98 void RemoveInterface(const std::string& name);
129 99
130 private: 100 private:
131 using NameToInterfaceBinderMap = 101 using NameToInterfaceBinderMap =
132 std::map<std::string, std::unique_ptr<InterfaceBinder>>; 102 std::map<std::string, std::unique_ptr<InterfaceBinder>>;
133 103
134 // mojom::InterfaceProvider: 104 // mojom::InterfaceProvider:
135 void GetInterface(const mojo::String& interface_name, 105 void GetInterface(const mojo::String& interface_name,
136 mojo::ScopedMessagePipeHandle handle) override; 106 mojo::ScopedMessagePipeHandle handle) override;
137 107
138 // Returns true if the binder was set, false if it was not set (e.g. by 108 // Returns true if the binder was set, false if it was not set (e.g. by
139 // some filtering policy preventing this interface from being exposed). 109 // some filtering policy preventing this interface from being exposed).
140 bool SetInterfaceBinderForName(std::unique_ptr<InterfaceBinder> binder, 110 bool SetInterfaceBinderForName(std::unique_ptr<InterfaceBinder> binder,
141 const std::string& name); 111 const std::string& name);
142 112
143 void RemoveInterfaceBinderForName(const std::string& interface_name);
144
145 mojom::InterfaceProviderPtr client_handle_;
146 mojo::Binding<mojom::InterfaceProvider> binding_; 113 mojo::Binding<mojom::InterfaceProvider> binding_;
147 Connection* connection_; 114 Connection* connection_;
148 115
149 NameToInterfaceBinderMap name_to_binder_; 116 NameToInterfaceBinderMap name_to_binder_;
150 117
151 mojom::InterfaceProviderPtr remote_interfaces_;
152
153 DISALLOW_COPY_AND_ASSIGN(InterfaceRegistry); 118 DISALLOW_COPY_AND_ASSIGN(InterfaceRegistry);
154 }; 119 };
155 120
156 } // namespace shell 121 } // namespace shell
157 122
158 #endif // SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_ 123 #endif // SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_
OLDNEW
« no previous file with comments | « services/shell/public/cpp/connection.h ('k') | services/shell/public/cpp/lib/connection_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698