• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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