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