Index: third_party/mojo/src/mojo/public/dart/src/application_connection.dart |
diff --git a/third_party/mojo/src/mojo/public/dart/src/application_connection.dart b/third_party/mojo/src/mojo/public/dart/src/application_connection.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f314686a51bb58796a30c91be753758a08f5d8d |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/dart/src/application_connection.dart |
@@ -0,0 +1,105 @@ |
+// Copyright 2014 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. |
+ |
+part of application; |
+ |
+typedef core.Listener ServiceFactory(core.MojoMessagePipeEndpoint endpoint); |
+typedef void FallbackServiceFactory(String interfaceName, |
+ core.MojoMessagePipeEndpoint endpoint); |
+ |
+ |
+class LocalServiceProvider extends ServiceProvider { |
+ final ApplicationConnection connection; |
+ |
+ LocalServiceProvider(ApplicationConnection this.connection, |
+ ServiceProviderStub stub) |
+ : super.fromStub(stub) { |
+ delegate = this; |
+ } |
+ |
+ void connectToService(String interfaceName, |
+ core.MojoMessagePipeEndpoint pipe) { |
+ if (connection._nameToServiceFactory.containsKey(interfaceName)) { |
+ var listener = connection._nameToServiceFactory[interfaceName](pipe); |
+ if (listener != null) { |
+ listener.listen(); |
+ return; |
+ } |
+ } |
+ if (connection.fallbackServiceFactory != null) { |
+ connection.fallbackServiceFactory(interfaceName, pipe); |
+ return; |
+ } |
+ // The specified interface isn't provided. Close the pipe so the |
+ // remote endpoint sees that we don't support this interface. |
+ pipe.handle.close(); |
+ } |
+} |
+ |
+// Encapsulates a pair of ServiceProviders that enable services (interface |
+// implementations) to be provided to a remote application as well as exposing |
+// services provided by a remote application. ApplicationConnection |
+// objects are returned by the Application ConnectToApplication() method |
+// and they're passed to the Application AcceptConnection() method. |
+// |
+// To request a service from the remote application: |
+// var proxy = applicationConnection.requestService(ViewManagerClient.name); |
+// |
+// To provide a service to the remote application, specify a function that |
+// returns a service. For example: |
+// applicationConnection.provideService(ViewManagerClient.name, (pipe) => |
+// new ViewManagerClientImpl(pipe)); |
+// |
+// To handle requests for any interface, set fallbackServiceFactory to a |
+// function that takes ownership of the incoming message pipe endpoint. If the |
+// fallbackServiceFactory function doesn't bind the pipe, it should close it. |
+// |
+// The fallbackServiceFactory is only used if a service wasn't specified |
+// with provideService(). |
+ |
+class ApplicationConnection { |
+ ServiceProviderProxy remoteServiceProvider; |
+ LocalServiceProvider _localServiceProvider; |
+ final _nameToServiceFactory = new Map<String, ServiceFactory>(); |
+ FallbackServiceFactory fallbackServiceFactory; |
+ |
+ ApplicationConnection(ServiceProviderStub stub, ServiceProviderProxy proxy) |
+ : remoteServiceProvider = proxy { |
+ if (stub != null) _localServiceProvider = |
+ new LocalServiceProvider(this, stub); |
+ } |
+ |
+ bindings.Proxy requestService(bindings.Proxy proxy) { |
+ assert(!proxy.isBound && |
+ (remoteServiceProvider != null) && |
+ remoteServiceProvider.isBound); |
+ var applicationPipe = new core.MojoMessagePipe(); |
+ var proxyEndpoint = applicationPipe.endpoints[0]; |
+ var applicationEndpoint = applicationPipe.endpoints[1]; |
+ proxy.bind(proxyEndpoint); |
+ remoteServiceProvider.connectToService(proxy.name, applicationEndpoint); |
+ return proxy; |
+ } |
+ |
+ void provideService(String interfaceName, ServiceFactory factory) { |
+ assert(_localServiceProvider != null); |
+ _nameToServiceFactory[interfaceName] = factory; |
+ } |
+ |
+ void listen() { |
+ if (_localServiceProvider != null) _localServiceProvider.listen(); |
+ } |
+ |
+ void close({bool nodefer: false}) { |
+ if (remoteServiceProvider != null) { |
+ remoteServiceProvider.close(); |
+ remoteServiceProvider = null; |
+ } |
+ if (_localServiceProvider != null) { |
+ _localServiceProvider.close(nodefer: nodefer); |
+ _localServiceProvider = null; |
+ } |
+ |
+ } |
+} |