blob: 51f543d567eda8288fb140541b865ea9473771fa [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.mojo.bindings;
import org.chromium.mojo.bindings.Callbacks.Callback1;
import org.chromium.mojo.bindings.Interface.Manager;
import org.chromium.mojo.bindings.Interface.Proxy;
import org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants;
import org.chromium.mojo.bindings.interfacecontrol.QueryVersionResult;
import org.chromium.mojo.bindings.interfacecontrol.RunInput;
import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams;
import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput;
import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams;
import org.chromium.mojo.bindings.interfacecontrol.RunOutput;
import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams;
import org.chromium.mojo.system.Core;
/**
* Helper class to handle interface control messages. See
* mojo/public/interfaces/bindings/interface_control_messages.mojom.
*/
public class InterfaceControlMessagesHelper {
/**
* MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a
* callback.
*/
private static class RunResponseForwardToCallback
extends SideEffectFreeCloseable implements MessageReceiver {
private final Callback1<RunResponseMessageParams> mCallback;
RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) {
mCallback = callback;
}
/**
* @see MessageReceiver#accept(Message)
*/
@Override
public boolean accept(Message message) {
RunResponseMessageParams response =
RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload());
mCallback.call(response);
return true;
}
}
/**
* Sends the given run message through the receiver, registering the callback.
*/
public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver,
RunMessageParams params, Callback1<RunResponseMessageParams> callback) {
Message message = params.serializeWithHeader(
core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback));
}
/**
* Sends the given run or close pipe message through the receiver.
*/
public static void sendRunOrClosePipeMessage(
Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) {
Message message = params.serializeWithHeader(core,
new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID));
receiver.accept(message);
}
/**
* Handles a received run message.
*/
public static <I extends Interface, P extends Proxy> boolean handleRun(
Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) {
Message payload = message.getPayload();
RunMessageParams query = RunMessageParams.deserialize(payload);
RunResponseMessageParams response = new RunResponseMessageParams();
response.output = new RunOutput();
if (query.input.which() == RunInput.Tag.QueryVersion) {
response.output.setQueryVersionResult(new QueryVersionResult());
response.output.getQueryVersionResult().version = manager.getVersion();
} else {
response.output = null;
}
return responder.accept(response.serializeWithHeader(
core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
message.getHeader().getRequestId())));
}
/**
* Handles a received run or close pipe message. Closing the pipe is handled by returning
* |false|.
*/
public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe(
Manager<I, P> manager, ServiceMessage message) {
Message payload = message.getPayload();
RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload);
if (query.input.which() == RunOrClosePipeInput.Tag.RequireVersion) {
return query.input.getRequireVersion().version <= manager.getVersion();
}
return false;
}
}