| Index: third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
|
| diff --git a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
|
| index 4c828db04c22ed67fc34d513bc494616cb198b2d..93fde9fa4cf5dc774f1e96742e2dbfe1eca6a970 100644
|
| --- a/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
|
| +++ b/third_party/mojo/src/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Interface.java
|
| @@ -4,6 +4,8 @@
|
|
|
| package org.chromium.mojo.bindings;
|
|
|
| +import org.chromium.mojo.bindings.Callbacks.Callback1;
|
| +import org.chromium.mojo.bindings.Interface.AbstractProxy.HandlerImpl;
|
| import org.chromium.mojo.system.Core;
|
| import org.chromium.mojo.system.MessagePipeHandle;
|
| import org.chromium.mojo.system.MojoException;
|
| @@ -38,6 +40,29 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| * Sets the {@link ConnectionErrorHandler} that will be notified of errors.
|
| */
|
| public void setErrorHandler(ConnectionErrorHandler errorHandler);
|
| +
|
| + /**
|
| + * Returns the version number of the interface that the remote side supports.
|
| + */
|
| + public int getVersion();
|
| +
|
| + /**
|
| + * Queries the max version that the remote side supports. On completion, the result will
|
| + * be returned as the input of |callback|. The version number of this interface pointer
|
| + * will also be updated.
|
| + */
|
| + public void queryVersion(Callback1<Integer> callback);
|
| +
|
| + /**
|
| + * If the remote side doesn't support the specified version, it will close its end of
|
| + * the message pipe asynchronously. The call does nothing if |version| is no greater
|
| + * than getVersion().
|
| + * <p>
|
| + * If you make a call to requireVersion() with a version number X which is not supported
|
| + * by the remote side, it is guaranteed that all calls to the interface methods after
|
| + * requireVersion(X) will be ignored.
|
| + */
|
| + public void requireVersion(int version);
|
| }
|
|
|
| /**
|
| @@ -71,6 +96,11 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| private ConnectionErrorHandler mErrorHandler = null;
|
|
|
| /**
|
| + * The currently known version of the interface.
|
| + */
|
| + private int mVersion = 0;
|
| +
|
| + /**
|
| * Constructor.
|
| *
|
| * @param core the Core implementation used to create pipes and access the async waiter.
|
| @@ -81,6 +111,10 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| this.mMessageReceiver = messageReceiver;
|
| }
|
|
|
| + void setVersion(int version) {
|
| + mVersion = version;
|
| + }
|
| +
|
| /**
|
| * Returns the message receiver to send message to.
|
| */
|
| @@ -120,6 +154,52 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| public void close() {
|
| mMessageReceiver.close();
|
| }
|
| +
|
| + /**
|
| + * @see Handler#getVersion()
|
| + */
|
| + @Override
|
| + public int getVersion() {
|
| + return mVersion;
|
| + }
|
| +
|
| + /**
|
| + * @see Handler#queryVersion(org.chromium.mojo.bindings.Callbacks.Callback1)
|
| + */
|
| + @Override
|
| + public void queryVersion(final Callback1<Integer> callback) {
|
| + RunMessageParams message = new RunMessageParams();
|
| + message.reserved0 = 16;
|
| + message.reserved1 = 0;
|
| + message.queryVersion = new QueryVersion();
|
| +
|
| + InterfaceControlMessagesHelper.sendRunMessage(getCore(), getMessageReceiver(),
|
| + message, new Callback1<RunResponseMessageParams>() {
|
| + @Override
|
| + public void call(RunResponseMessageParams response) {
|
| + mVersion = response.queryVersionResult.version;
|
| + callback.call(mVersion);
|
| + }
|
| + });
|
| + }
|
| +
|
| + /**
|
| + * @see Handler#requireVersion(int)
|
| + */
|
| + @Override
|
| + public void requireVersion(int version) {
|
| + if (mVersion >= version) {
|
| + return;
|
| + }
|
| + mVersion = version;
|
| + RunOrClosePipeMessageParams message = new RunOrClosePipeMessageParams();
|
| + message.reserved0 = 16;
|
| + message.reserved1 = 0;
|
| + message.requireVersion = new RequireVersion();
|
| + message.requireVersion.version = version;
|
| + InterfaceControlMessagesHelper.sendRunOrClosePipeMessage(
|
| + getCore(), getMessageReceiver(), message);
|
| + }
|
| }
|
|
|
| /**
|
| @@ -225,6 +305,11 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| public abstract String getName();
|
|
|
| /**
|
| + * Returns the version of the managed interface.
|
| + */
|
| + public abstract int getVersion();
|
| +
|
| + /**
|
| * Binds the given implementation to the handle.
|
| */
|
| public void bind(I impl, MessagePipeHandle handle) {
|
| @@ -245,15 +330,16 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
|
|
| /**
|
| * Returns a Proxy that will send messages to the given |handle|. This implies that the
|
| - * other end of the handle must be binded to an implementation of the interface.
|
| + * other end of the handle must be bound to an implementation of the interface.
|
| */
|
| - public final P attachProxy(MessagePipeHandle handle) {
|
| + public final P attachProxy(MessagePipeHandle handle, int version) {
|
| RouterImpl router = new RouterImpl(handle);
|
| P proxy = attachProxy(handle.getCore(), router);
|
| DelegatingConnectionErrorHandler handlers = new DelegatingConnectionErrorHandler();
|
| handlers.addConnectionErrorHandler(proxy);
|
| router.setErrorHandler(handlers);
|
| router.start();
|
| + ((HandlerImpl) proxy.getProxyHandler()).setVersion(version);
|
| return proxy;
|
| }
|
|
|
| @@ -264,7 +350,7 @@ public interface Interface extends ConnectionErrorHandler, Closeable {
|
| */
|
| public final Pair<P, InterfaceRequest<I>> getInterfaceRequest(Core core) {
|
| Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessagePipe(null);
|
| - P proxy = attachProxy(handles.first);
|
| + P proxy = attachProxy(handles.first, 0);
|
| return Pair.create(proxy, new InterfaceRequest<I>(handles.second));
|
| }
|
|
|
|
|