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

Unified Diff: services/shell/public/cpp/remote_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 side-by-side diff with in-line comments
Download patch
Index: services/shell/public/cpp/remote_interface_registry.h
diff --git a/services/shell/public/cpp/remote_interface_registry.h b/services/shell/public/cpp/remote_interface_registry.h
new file mode 100644
index 0000000000000000000000000000000000000000..7840cdf81b2d345c26575d77d65bd2fa547f9c0c
--- /dev/null
+++ b/services/shell/public/cpp/remote_interface_registry.h
@@ -0,0 +1,95 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_SHELL_PUBLIC_CPP_REMOTE_INTERFACE_REGISTRY_H_
+#define SERVICES_SHELL_PUBLIC_CPP_REMOTE_INTERFACE_REGISTRY_H_
+
+#include "services/shell/public/interfaces/interface_provider.mojom.h"
+
+namespace shell {
+
+// Encapsulates a mojom::InterfaceProviderPtr implemented in a remote
+// application. Provides two main features:
+// - a typesafe GetInterface() method for binding InterfacePtrs.
+// - a testing API that allows local callbacks to be registered that bind
+// requests for remote interfaces.
+// An instance of this class is used by the GetInterface() methods on
+// Connection.
+class RemoteInterfaceRegistry {
+ public:
+ class TestApi {
+ public:
+ explicit TestApi(RemoteInterfaceRegistry* registry) : registry_(registry) {}
+ ~TestApi() {}
+
+ template <typename Interface>
+ void SetBinderForName(
+ const std::string& name,
+ const base::Callback<void(mojo::InterfaceRequest<Interface>)>& binder) {
+ registry_->SetBinderForName(name, binder);
+ }
+
+ void ClearBinders() {
+ registry_->ClearBinders();
+ }
+
+ private:
+ RemoteInterfaceRegistry* registry_;
+ DISALLOW_COPY_AND_ASSIGN(TestApi);
+ };
+
+ explicit RemoteInterfaceRegistry(
+ mojom::InterfaceProviderPtr remote_interfaces);
+ ~RemoteInterfaceRegistry();
+
+ // Returns a raw pointer to the remote InterfaceProvider.
+ mojom::InterfaceProvider* GetInterfaceProvider();
+
+ // Sets a closure to be run when the remote InterfaceProvider pipe is closed.
+ void SetConnectionLostClosure(const base::Closure& connection_lost_closure);
+
+ // Binds |ptr| to an implementation of Interface in the remote application.
+ // |ptr| can immediately be used to start sending requests to the remote
+ // interface.
+ template <typename Interface>
+ void GetInterface(mojo::InterfacePtr<Interface>* ptr) {
+ mojo::MessagePipe pipe;
+ ptr->Bind(mojo::InterfacePtrInfo<Interface>(std::move(pipe.handle0), 0u));
+
+ // Local binders can be registered via TestApi.
+ auto it = binders_.find(Interface::Name_);
+ if (it != binders_.end()) {
+ it->second.Run(std::move(pipe.handle1));
+ return;
+ }
+ remote_interfaces_->GetInterface(Interface::Name_, std::move(pipe.handle1));
+ }
+ template <typename Interface>
+ void GetInterface(mojo::InterfaceRequest<Interface> request) {
+ GetInterface(Interface::Name_, std::move(request.PassMessagePipe()));
+ }
+ void GetInterface(const std::string& name,
+ mojo::ScopedMessagePipeHandle request_handle);
+
+ private:
+ template <typename Interface>
+ void SetBinderForName(
+ const std::string& name,
+ const base::Callback<void(mojo::InterfaceRequest<Interface>)>& binder) {
+ binders_[name] = binder;
+ }
+ void ClearBinders();
+
+ using BinderMap = std::map<
+ std::string, base::Callback<void(mojo::ScopedMessagePipeHandle)>>;
+ BinderMap binders_;
+
+ mojom::InterfaceProviderPtr remote_interfaces_;
+
+ DISALLOW_COPY_AND_ASSIGN(RemoteInterfaceRegistry);
+};
+
+} // namespace shell
+
+#endif // SERVICES_SHELL_PUBLIC_CPP_REMOTE_INTERFACE_REGISTRY_H_

Powered by Google App Engine
This is Rietveld 408576698