InterfaceControlMessagesHelper.java revision 645501c2ab19a559ce82a1d5a29ced159a4c30fb
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
5package org.chromium.mojo.bindings;
6
7import org.chromium.mojo.bindings.Callbacks.Callback1;
8import org.chromium.mojo.bindings.Interface.Manager;
9import org.chromium.mojo.bindings.Interface.Proxy;
10import org.chromium.mojo.system.Core;
11
12/**
13 * Helper class to handle interface control messages. See
14 * mojo/public/interfaces/bindings/interface_control_messages.mojom.
15 */
16public class InterfaceControlMessagesHelper {
17    /**
18     * MessageReceiver that forwards a message containing a {@link RunResponseMessageParams} to a
19     * callback.
20     */
21    private static class RunResponseForwardToCallback
22            extends SideEffectFreeCloseable implements MessageReceiver {
23        private final Callback1<RunResponseMessageParams> mCallback;
24
25        RunResponseForwardToCallback(Callback1<RunResponseMessageParams> callback) {
26            mCallback = callback;
27        }
28
29        /**
30         * @see MessageReceiver#accept(Message)
31         */
32        @Override
33        public boolean accept(Message message) {
34            RunResponseMessageParams response =
35                    RunResponseMessageParams.deserialize(message.asServiceMessage().getPayload());
36            mCallback.call(response);
37            return true;
38        }
39    }
40
41    /**
42     * Sends the given run message through the receiver, registering the callback.
43     */
44    public static void sendRunMessage(Core core, MessageReceiverWithResponder receiver,
45            RunMessageParams params, Callback1<RunResponseMessageParams> callback) {
46        Message message = params.serializeWithHeader(
47                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
48                        MessageHeader.MESSAGE_EXPECTS_RESPONSE_FLAG, 0));
49        receiver.acceptWithResponder(message, new RunResponseForwardToCallback(callback));
50    }
51
52    /**
53     * Sends the given run or close pipe message through the receiver.
54     */
55    public static void sendRunOrClosePipeMessage(
56            Core core, MessageReceiverWithResponder receiver, RunOrClosePipeMessageParams params) {
57        Message message = params.serializeWithHeader(core,
58                new MessageHeader(InterfaceControlMessagesConstants.RUN_OR_CLOSE_PIPE_MESSAGE_ID));
59        receiver.accept(message);
60    }
61
62    /**
63     * Handles a received run message.
64     */
65    public static <I extends Interface, P extends Proxy> boolean handleRun(
66            Core core, Manager<I, P> manager, ServiceMessage message, MessageReceiver responder) {
67        RunResponseMessageParams response = new RunResponseMessageParams();
68        response.reserved0 = 16;
69        response.reserved1 = 0;
70        response.queryVersionResult = new QueryVersionResult();
71        response.queryVersionResult.version = manager.getVersion();
72
73        return responder.accept(response.serializeWithHeader(
74                core, new MessageHeader(InterfaceControlMessagesConstants.RUN_MESSAGE_ID,
75                        MessageHeader.MESSAGE_IS_RESPONSE_FLAG,
76                        message.getHeader().getRequestId())));
77    }
78
79    /**
80     * Handles a received run or close pipe message. Closing the pipe is handled by returning
81     * |false|.
82     */
83    public static <I extends Interface, P extends Proxy> boolean handleRunOrClosePipe(
84            Manager<I, P> manager, ServiceMessage message) {
85        Message payload = message.getPayload();
86        RunOrClosePipeMessageParams query = RunOrClosePipeMessageParams.deserialize(payload);
87        return query.requireVersion.version <= manager.getVersion();
88    }
89}
90