146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdochpackage org.chromium.mojo.bindings; 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.mojo.system.Core; 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.mojo.system.MessagePipeHandle; 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.mojo.system.MojoException; 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport org.chromium.mojo.system.Pair; 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciimport java.io.Closeable; 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/** 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Base class for mojo generated interfaces. 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccipublic interface Interface extends ConnectionErrorHandler, Closeable { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The close method is called when the connection to the interface is closed. 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @see java.io.Closeable#close() 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void close(); 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * A proxy to a mojo interface. This is base class for all generated proxies. It implements the 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Interface and each time a method is called, the parameters are serialized and sent to the 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * {@link MessageReceiverWithResponder}, along with the response callback if needed. 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public interface Proxy extends Interface { 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Set the {@link ConnectionErrorHandler} that will be notified of errors. 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void setErrorHandler(ConnectionErrorHandler errorHandler); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Base implementation of {@link Proxy}. 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci abstract class AbstractProxy implements Proxy { 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The {@link Core} implementation to use. 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final Core mCore; 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The {@link MessageReceiverWithResponder} that will receive a serialized message for each 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * method call. 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final MessageReceiverWithResponder mMessageReceiver; 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The {@link ConnectionErrorHandler} that will be notified of errors. 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private ConnectionErrorHandler mErrorHandler = null; 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Constructor. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param core the Core implementation used to create pipes and access the async waiter. 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param messageReceiver the message receiver to send message to. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected AbstractProxy(Core core, MessageReceiverWithResponder messageReceiver) { 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this.mCore = core; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this.mMessageReceiver = messageReceiver; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns the message receiver to send message to. 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected MessageReceiverWithResponder getMessageReceiver() { 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mMessageReceiver; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns the Core implementation. 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected Core getCore() { 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mCore; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @see Proxy#setErrorHandler(ConnectionErrorHandler) 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void setErrorHandler(ConnectionErrorHandler errorHandler) { 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this.mErrorHandler = errorHandler; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @see ConnectionErrorHandler#onConnectionError(MojoException) 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void onConnectionError(MojoException e) { 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (mErrorHandler != null) { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mErrorHandler.onConnectionError(e); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @see Closeable#close() 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void close() { 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mMessageReceiver.close(); 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Base implementation of Stub. Stubs are message receivers that deserialize the payload and 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * call the appropriate method in the implementation. If the method returns result, the stub 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * serializes the response and sends it back. 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param <I> the type of the interface to delegate calls to. 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci abstract class Stub<I extends Interface> implements MessageReceiverWithResponder { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The {@link Core} implementation to use. 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final Core mCore; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The implementation to delegate calls to. 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private final I mImpl; 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Constructor. 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param core the {@link Core} implementation to use. 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param impl the implementation to delegate calls to. 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public Stub(Core core, I impl) { 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mCore = core; 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mImpl = impl; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns the Core implementation. 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected Core getCore() { 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mCore; 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns the implementation to delegate calls to. 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected I getImpl() { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return mImpl; 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @see org.chromium.mojo.bindings.MessageReceiver#close() 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci @Override 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void close() { 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mImpl.close(); 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * The |Manager| object enables building of proxies and stubs for a given interface. 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param <I> the type of the interface the manager can handle. 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * @param <P> the type of the proxy the manager can handle. To be noted, P always extends I. 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci abstract class Manager<I extends Interface, P extends Proxy> { 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns the name of the interface. This is an opaque (but human readable) identifier used 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * by the service provider to identify services. 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public abstract String getName(); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Binds the given implementation to the handle. 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public void bind(I impl, MessagePipeHandle handle) { 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The router (and by consequence the handle) is intentionally leaked. It will close 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // itself when the connected handle is closed and the proxy receives the connection 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // error. 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Router router = new RouterImpl(handle); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bind(handle.getCore(), impl, router); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci router.start(); 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Binds the given implementation to the InterfaceRequest. 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final void bind(I impl, InterfaceRequest<I> request) { 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bind(impl, request.passHandle()); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns a Proxy that will send messages to the given |handle|. This implies that the 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * other end of the handle must be binded to an implementation of the interface. 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final P attachProxy(MessagePipeHandle handle) { 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RouterImpl router = new RouterImpl(handle); 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci P proxy = attachProxy(handle.getCore(), router); 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler(); 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handlers.addConnectionErrorHandler(proxy); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci router.setErrorHandler(handlers); 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci router.start(); 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return proxy; 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Constructs a new |InterfaceRequest| for the interface. This method returns a Pair where 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * the first element is a proxy, and the second element is the request. The proxy can be 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * used immediately. 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) { 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci P proxy = attachProxy(handles.first); 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return Pair.create(proxy, new InterfaceRequest<I>(handles.second)); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Binds the implementation to the given |router|. 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final void bind(Core core, I impl, Router router) { 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci router.setErrorHandler(impl); 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci router.setIncomingMessageReceiver(buildStub(core, impl)); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Returns a Proxy that will send messages to the given |router|. 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci final P attachProxy(Core core, Router router) { 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return buildProxy(core, new AutoCloseableRouter(core, router)); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Creates a new array of the given |size|. 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected abstract I[] buildArray(int size); 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Constructs a Stub delegating to the given implementation. 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected abstract Stub<I> buildStub(Core core, I impl); 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /** 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Constructs a Proxy forwarding the calls to the given message receiver. 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected abstract P buildProxy(Core core, MessageReceiverWithResponder messageReceiver); 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 258