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

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
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 65 // Construct with an InterfaceProviderRequest and a Connection (which may be
70 // null, see note above about filtering). 66 // null, see note above about filtering).
71 InterfaceRegistry(mojom::InterfaceProviderPtr remote_interfaces, 67 InterfaceRegistry(mojom::InterfaceProviderRequest local_interfaces_request,
72 mojom::InterfaceProviderRequest local_interfaces_request,
73 Connection* connection); 68 Connection* connection);
74 ~InterfaceRegistry() override; 69 ~InterfaceRegistry() override;
75 70
76 // Takes the client end of the InterfaceProvider pipe created in the 71 // Takes the client end of the InterfaceProvider pipe created in the
77 // constructor. 72 // constructor.
78 mojom::InterfaceProviderPtr TakeClientHandle(); 73 mojom::InterfaceProviderPtr TakeClientHandle();
Ken Rockot(use gerrit already) 2016/06/16 23:48:58 Given that you're adding a Bind method, let's get
79 74
80 // Returns a raw pointer to the remote InterfaceProvider. 75 void Bind(mojom::InterfaceProviderRequest local_interfaces_request);
Ken Rockot(use gerrit already) 2016/06/16 23:48:58 nit: Document this, specifically worth noting that
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 76
87 // Allows |Interface| to be exposed via this registry. Requests to bind will 77 // 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 78 // be handled by |factory|. Returns true if the interface was exposed, false
89 // if Connection policy prevented exposure. 79 // if Connection policy prevented exposure.
90 template <typename Interface> 80 template <typename Interface>
91 bool AddInterface(InterfaceFactory<Interface>* factory) { 81 bool AddInterface(InterfaceFactory<Interface>* factory) {
92 return SetInterfaceBinderForName( 82 return SetInterfaceBinderForName(
93 base::WrapUnique( 83 base::WrapUnique(
94 new internal::InterfaceFactoryBinder<Interface>(factory)), 84 new internal::InterfaceFactoryBinder<Interface>(factory)),
95 Interface::Name_); 85 Interface::Name_);
96 } 86 }
97 87
98 // Like AddInterface above, except supplies a callback to bind the MP instead 88 // Like AddInterface above, except supplies a callback to bind the MP instead
99 // of an InterfaceFactory, and optionally provides a task runner where the 89 // of an InterfaceFactory, and optionally provides a task runner where the
100 // callback will be run. 90 // callback will be run.
101 template <typename Interface> 91 template <typename Interface>
102 bool AddInterface( 92 bool AddInterface(
103 const base::Callback<void(mojo::InterfaceRequest<Interface>)>& callback, 93 const base::Callback<void(mojo::InterfaceRequest<Interface>)>& callback,
104 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner = 94 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner =
105 nullptr) { 95 nullptr) {
106 return SetInterfaceBinderForName( 96 return SetInterfaceBinderForName(
107 base::WrapUnique( 97 base::WrapUnique(
108 new internal::CallbackBinder<Interface>(callback, task_runner)), 98 new internal::CallbackBinder<Interface>(callback, task_runner)),
109 Interface::Name_); 99 Interface::Name_);
110 } 100 }
111 101
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> 102 template <typename Interface>
116 void GetInterface(mojo::InterfacePtr<Interface>* ptr) { 103 void RemoveInterface() {
117 mojo::MessagePipe pipe; 104 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 } 105 }
106 void RemoveInterface(const std::string& name);
129 107
130 private: 108 private:
131 using NameToInterfaceBinderMap = 109 using NameToInterfaceBinderMap =
132 std::map<std::string, std::unique_ptr<InterfaceBinder>>; 110 std::map<std::string, std::unique_ptr<InterfaceBinder>>;
133 111
134 // mojom::InterfaceProvider: 112 // mojom::InterfaceProvider:
135 void GetInterface(const mojo::String& interface_name, 113 void GetInterface(const mojo::String& interface_name,
136 mojo::ScopedMessagePipeHandle handle) override; 114 mojo::ScopedMessagePipeHandle handle) override;
137 115
138 // Returns true if the binder was set, false if it was not set (e.g. by 116 // 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). 117 // some filtering policy preventing this interface from being exposed).
140 bool SetInterfaceBinderForName(std::unique_ptr<InterfaceBinder> binder, 118 bool SetInterfaceBinderForName(std::unique_ptr<InterfaceBinder> binder,
141 const std::string& name); 119 const std::string& name);
142 120
143 void RemoveInterfaceBinderForName(const std::string& interface_name);
144
145 mojom::InterfaceProviderPtr client_handle_; 121 mojom::InterfaceProviderPtr client_handle_;
146 mojo::Binding<mojom::InterfaceProvider> binding_; 122 mojo::Binding<mojom::InterfaceProvider> binding_;
147 Connection* connection_; 123 Connection* connection_;
148 124
149 NameToInterfaceBinderMap name_to_binder_; 125 NameToInterfaceBinderMap name_to_binder_;
150 126
151 mojom::InterfaceProviderPtr remote_interfaces_;
152
153 DISALLOW_COPY_AND_ASSIGN(InterfaceRegistry); 127 DISALLOW_COPY_AND_ASSIGN(InterfaceRegistry);
154 }; 128 };
155 129
156 } // namespace shell 130 } // namespace shell
157 131
158 #endif // SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_ 132 #endif // SERVICES_SHELL_PUBLIC_CPP_INTERFACE_REGISTRY_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698