1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpackage org.chromium.mojo.bindings;
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.bindings.Callbacks.Callback1;
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.bindings.Interface.AbstractProxy.HandlerImpl;
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.system.Core;
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.system.MessagePipeHandle;
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.system.MojoException;
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport org.chromium.mojo.system.Pair;
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezimport java.io.Closeable;
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Base class for mojo generated interfaces.
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpublic interface Interface extends ConnectionErrorHandler, Closeable {
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * The close method is called when the connection to the interface is closed.
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @see java.io.Closeable#close()
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    @Override
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public void close();
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * A proxy to a mojo interface. This is base class for all generated proxies. It implements the
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Interface and each time a method is called, the parameters are serialized and sent to the
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * {@link MessageReceiverWithResponder}, along with the response callback if needed.
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    public interface Proxy extends Interface {
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Class allowing to interact with the proxy itself.
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public interface Handler extends Closeable {
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void setErrorHandler(ConnectionErrorHandler errorHandler);
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Unbinds the proxy and passes the handle. Can return null if the proxy is not bound or
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * if the proxy is not over a message pipe.
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public MessagePipeHandle passHandle();
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Returns the version number of the interface that the remote side supports.
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public int getVersion();
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Queries the max version that the remote side supports. On completion, the result will
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * be returned as the input of |callback|. The version number of this interface pointer
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * will also be updated.
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void queryVersion(Callback1<Integer> callback);
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * If the remote side doesn't support the specified version, it will close its end of
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * the message pipe asynchronously. The call does nothing if |version| is no greater
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * than getVersion().
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * <p>
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * If you make a call to requireVersion() with a version number X which is not supported
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * by the remote side, it is guaranteed that all calls to the interface methods after
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * requireVersion(X) will be ignored.
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void requireVersion(int version);
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns the {@link Handler} object allowing to interact with the proxy itself.
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public Handler getProxyHandler();
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Base implementation of {@link Proxy}.
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    abstract class AbstractProxy implements Proxy {
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Implementation of {@link Handler}.
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected static class HandlerImpl implements Proxy.Handler, ConnectionErrorHandler {
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * The {@link Core} implementation to use.
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            private final Core mCore;
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * The {@link MessageReceiverWithResponder} that will receive a serialized message for
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * each method call.
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            private final MessageReceiverWithResponder mMessageReceiver;
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * The {@link ConnectionErrorHandler} that will be notified of errors.
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            private ConnectionErrorHandler mErrorHandler = null;
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * The currently known version of the interface.
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            private int mVersion = 0;
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Constructor.
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             *
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @param core the Core implementation used to create pipes and access the async waiter.
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @param messageReceiver the message receiver to send message to.
114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            protected HandlerImpl(Core core, MessageReceiverWithResponder messageReceiver) {
116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                this.mCore = core;
117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                this.mMessageReceiver = messageReceiver;
118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            void setVersion(int version) {
121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                mVersion = version;
122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Returns the message receiver to send message to.
126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public MessageReceiverWithResponder getMessageReceiver() {
128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                return mMessageReceiver;
129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Returns the Core implementation.
133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public Core getCore() {
135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                return mCore;
136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void setErrorHandler(ConnectionErrorHandler errorHandler) {
143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                this.mErrorHandler = errorHandler;
144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see ConnectionErrorHandler#onConnectionError(MojoException)
148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void onConnectionError(MojoException e) {
151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                if (mErrorHandler != null) {
152645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    mErrorHandler.onConnectionError(e);
153645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                }
154645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
155645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
156645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
157645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see Closeable#close()
158645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
159645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
160645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void close() {
161645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                mMessageReceiver.close();
162645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
163645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
164645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
165645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see Interface.Proxy.Handler#passHandle()
166645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
167645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
168645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public MessagePipeHandle passHandle() {
169645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                @SuppressWarnings("unchecked")
170645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                HandleOwner<MessagePipeHandle> handleOwner =
171645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                        (HandleOwner<MessagePipeHandle>) mMessageReceiver;
172645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                return handleOwner.passHandle();
173645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
174645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
175645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
176645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see Handler#getVersion()
177645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
178645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
179645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public int getVersion() {
180645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                return mVersion;
181645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
182645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
183645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
184645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see Handler#queryVersion(org.chromium.mojo.bindings.Callbacks.Callback1)
185645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
186645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
187645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void queryVersion(final Callback1<Integer> callback) {
188645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                RunMessageParams message = new RunMessageParams();
189645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.reserved0 = 16;
190645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.reserved1 = 0;
191645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.queryVersion = new QueryVersion();
192645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
193645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                InterfaceControlMessagesHelper.sendRunMessage(getCore(), mMessageReceiver, message,
194645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                        new Callback1<RunResponseMessageParams>() {
195645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                            @Override
196645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                            public void call(RunResponseMessageParams response) {
197645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                                mVersion = response.queryVersionResult.version;
198645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                                callback.call(mVersion);
199645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                            }
200645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                        });
201645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
202645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
203645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            /**
204645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             * @see Handler#requireVersion(int)
205645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez             */
206645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            @Override
207645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            public void requireVersion(int version) {
208645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                if (mVersion >= version) {
209645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                    return;
210645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                }
211645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                mVersion = version;
212645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                RunOrClosePipeMessageParams message = new RunOrClosePipeMessageParams();
213645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.reserved0 = 16;
214645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.reserved1 = 0;
215645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.requireVersion = new RequireVersion();
216645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                message.requireVersion.version = version;
217645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                InterfaceControlMessagesHelper.sendRunOrClosePipeMessage(
218645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                        getCore(), mMessageReceiver, message);
219645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            }
220645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
221645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
222645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
223645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * The handler associated with this proxy.
224645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
225645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private final HandlerImpl mHandler;
226645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
227645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected AbstractProxy(Core core, MessageReceiverWithResponder messageReceiver) {
228645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mHandler = new HandlerImpl(core, messageReceiver);
229645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
230645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
231645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
232645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see Interface#close()
233645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
234645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
235645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void close() {
236645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mHandler.close();
237645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
238645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
239645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
240645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see Proxy#getProxyHandler()
241645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
242645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
243645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public HandlerImpl getProxyHandler() {
244645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return mHandler;
245645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
246645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
247645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
248645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see ConnectionErrorHandler#onConnectionError(org.chromium.mojo.system.MojoException)
249645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
250645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
251645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void onConnectionError(MojoException e) {
252645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mHandler.onConnectionError(e);
253645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
254645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
255645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
256645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
257645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * Base implementation of Stub. Stubs are message receivers that deserialize the payload and
258645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * call the appropriate method in the implementation. If the method returns result, the stub
259645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * serializes the response and sends it back.
260645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *
261645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param <I> the type of the interface to delegate calls to.
262645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
263645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    abstract class Stub<I extends Interface> implements MessageReceiverWithResponder {
264645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
265645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
266645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * The {@link Core} implementation to use.
267645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
268645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private final Core mCore;
269645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
270645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
271645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * The implementation to delegate calls to.
272645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
273645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        private final I mImpl;
274645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
275645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
276645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Constructor.
277645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         *
278645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @param core the {@link Core} implementation to use.
279645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @param impl the implementation to delegate calls to.
280645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
281645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public Stub(Core core, I impl) {
282645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mCore = core;
283645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mImpl = impl;
284645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
285645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
286645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
287645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns the Core implementation.
288645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
289645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected Core getCore() {
290645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return mCore;
291645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
292645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
293645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
294645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns the implementation to delegate calls to.
295645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
296645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected I getImpl() {
297645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return mImpl;
298645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
299645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
300645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
301645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * @see org.chromium.mojo.bindings.MessageReceiver#close()
302645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
303645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        @Override
304645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void close() {
305645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            mImpl.close();
306645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
307645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
308645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
309645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
310645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    /**
311645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * The |Manager| object enables building of proxies and stubs for a given interface.
312645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     *
313645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param <I> the type of the interface the manager can handle.
314645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     * @param <P> the type of the proxy the manager can handle. To be noted, P always extends I.
315645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez     */
316645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    abstract class Manager<I extends Interface, P extends Proxy> {
317645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
318645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
319645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns the name of the interface. This is an opaque (but human readable) identifier used
320645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * by the service provider to identify services.
321645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
322645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public abstract String getName();
323645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
324645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
325645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns the version of the managed interface.
326645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
327645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public abstract int getVersion();
328645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
329645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
330645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Binds the given implementation to the handle.
331645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
332645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public void bind(I impl, MessagePipeHandle handle) {
333645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // The router (and by consequence the handle) is intentionally leaked. It will close
334645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // itself when the connected handle is closed and the proxy receives the connection
335645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            // error.
336645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Router router = new RouterImpl(handle);
337645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            bind(handle.getCore(), impl, router);
338645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            router.start();
339645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
340645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
341645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
342645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Binds the given implementation to the InterfaceRequest.
343645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
344645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public final void bind(I impl, InterfaceRequest<I> request) {
345645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            bind(impl, request.passHandle());
346645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
347645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
348645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
349645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns a Proxy that will send messages to the given |handle|. This implies that the
350645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * other end of the handle must be bound to an implementation of the interface.
351645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
352645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public final P attachProxy(MessagePipeHandle handle, int version) {
353645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            RouterImpl router = new RouterImpl(handle);
354645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            P proxy = attachProxy(handle.getCore(), router);
355645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler();
356645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            handlers.addConnectionErrorHandler(proxy);
357645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            router.setErrorHandler(handlers);
358645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            router.start();
359645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            ((HandlerImpl) proxy.getProxyHandler()).setVersion(version);
360645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return proxy;
361645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
362645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
363645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
364645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Constructs a new |InterfaceRequest| for the interface. This method returns a Pair where
365645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * the first element is a proxy, and the second element is the request. The proxy can be
366645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * used immediately.
367645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
368645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) {
369645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
370645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            P proxy = attachProxy(handles.first, 0);
371645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return Pair.create(proxy, new InterfaceRequest<I>(handles.second));
372645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
373645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
374645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        public final InterfaceRequest<I> asInterfaceRequest(MessagePipeHandle handle) {
375645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return new InterfaceRequest<I>(handle);
376645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
377645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
378645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
379645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Binds the implementation to the given |router|.
380645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
381645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        final void bind(Core core, I impl, Router router) {
382645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            router.setErrorHandler(impl);
383645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            router.setIncomingMessageReceiver(buildStub(core, impl));
384645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
385645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
386645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
387645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Returns a Proxy that will send messages to the given |router|.
388645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
389645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        final P attachProxy(Core core, Router router) {
390645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez            return buildProxy(core, new AutoCloseableRouter(core, router));
391645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        }
392645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
393645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
394645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Creates a new array of the given |size|.
395645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
396645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected abstract I[] buildArray(int size);
397645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
398645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
399645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Constructs a Stub delegating to the given implementation.
400645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
401645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected abstract Stub<I> buildStub(Core core, I impl);
402645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
403645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        /**
404645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         * Constructs a Proxy forwarding the calls to the given message receiver.
405645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez         */
406645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez        protected abstract P buildProxy(Core core, MessageReceiverWithResponder messageReceiver);
407645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
408645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    }
409645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}
410