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