1 // Copyright 2015 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 package org.chromium.mojo.bindings; 6 7 import org.chromium.mojo.bindings.Callbacks.Callback1; 8 import org.chromium.mojo.bindings.Interface.Manager; 9 import org.chromium.mojo.bindings.Interface.Proxy; 10 import org.chromium.mojo.bindings.interfacecontrol.InterfaceControlMessagesConstants; 11 import org.chromium.mojo.bindings.interfacecontrol.QueryVersionResult; 12 import org.chromium.mojo.bindings.interfacecontrol.RunInput; 13 import org.chromium.mojo.bindings.interfacecontrol.RunMessageParams; 14 import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeInput; 15 import org.chromium.mojo.bindings.interfacecontrol.RunOrClosePipeMessageParams; 16 import org.chromium.mojo.bindings.interfacecontrol.RunOutput; 17 import org.chromium.mojo.bindings.interfacecontrol.RunResponseMessageParams; 18 import org.chromium.mojo.system.Core; 19 20 /** 21 * Helper class to handle interface control messages. See 22 * mojo/public/interfaces/bindings/interface_control_messages.mojom. 23 */ 24 public class InterfaceControlMessagesHelper { 25 /** 26 * MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a 27 * callback. 28 */ 29 private static class RunResponseForwardToCallback 30 extends SideEffectFreeCloseable implements MessageReceiver { 31 private final Callback1<RunResponseMessageParams> mCallback; 32 RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback)33 RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) { 34 mCallback = callback; 35 } 36 37 /** 38 * @see MessageReceiver#accept(Message) 39 */ 40 @Override accept(Message message)41 public boolean accept(Message message) { 42 RunResponseMessageParams response = 43 RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload()); 44 mCallback.call(response); 45 return true; 46 } 47 } 48 49 /** 50 * Sends the given run message through the receiver, registering the callback. 51 */ sendRunMessage(Core core, MessageReceiverWithResponder receiver, RunMessageParams params, Callback1<RunResponseMessageParams> callback)52 public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver, 53 RunMessageParams params, Callback1<RunResponseMessageParams> callback) { 54 Message message = params.serializeWithHeader( 55 core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID, 56 MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0)); 57 receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback)); 58 } 59 60 /** 61 * Sends the given run or close pipe message through the receiver. 62 */ sendRunOrClosePipeMessage( Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params)63 public static void sendRunOrClosePipeMessage( 64 Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) { 65 Message message = params.serializeWithHeader(core, 66 new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID)); 67 receiver.accept(message); 68 } 69 70 /** 71 * Handles a received run message. 72 */ handleRun( Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder)73 public static <I extends Interface, P extends Proxy> boolean handleRun( 74 Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) { 75 Message payload = message.getPayload(); 76 RunMessageParams query = RunMessageParams.deserialize(payload); 77 RunResponseMessageParams response = new RunResponseMessageParams(); 78 response.output = new RunOutput(); 79 if (query.input.which() == RunInput.Tag.QueryVersion) { 80 response.output.setQueryVersionResult(new QueryVersionResult()); 81 response.output.getQueryVersionResult().version = manager.getVersion(); 82 } else { 83 response.output = null; 84 } 85 86 return responder.accept(response.serializeWithHeader( 87 core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID, 88 MessageHeader.MESSAGE_IS_RESPONSE_FLAG, 89 message.getHeader().getRequestId()))); 90 } 91 92 /** 93 * Handles a received run or close pipe message. Closing the pipe is handled by returning 94 * |false|. 95 */ handleRunOrClosePipe( Manager<I, P> manager, ServiceMessage message)96 public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe( 97 Manager<I, P> manager, ServiceMessage message) { 98 Message payload = message.getPayload(); 99 RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload); 100 if (query.input.which() == RunOrClosePipeInput.Tag.RequireVersion) { 101 return query.input.getRequireVersion().version <= manager.getVersion(); 102 } 103 return false; 104 } 105 } 106