| // 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. |
| |
| part of bindings; |
| |
| // Handles InterfaceControlMessages for a stub. |
| class ControlMessageHandler { |
| static bool isControlMessage(ServiceMessage message) => |
| _isRun(message) || _isRunOrClose(message); |
| |
| static bool _isRun(ServiceMessage message) => |
| (message.header.type == icm.kRunMessageId); |
| |
| static bool _isRunOrClose(ServiceMessage message) => |
| (message.header.type == icm.kRunOrClosePipeMessageId); |
| |
| static Future<Message> handleMessage(Stub stub, |
| int interface_version, |
| ServiceMessage message) { |
| assert(isControlMessage(message)); |
| if (_isRun(message)) { |
| return _handleRun(stub, interface_version, message); |
| } else { |
| assert(_isRunOrClose(message)); |
| return _handleRunOrClose(stub, interface_version, message); |
| } |
| } |
| |
| static Future<Message> _handleRun(Stub stub, |
| int interface_version, |
| ServiceMessage message) { |
| // Construct RunMessage response. |
| var response = new icm.RunResponseMessageParams(); |
| response.reserved0 = 16; |
| response.reserved1 = 0; |
| response.queryVersionResult = new icm.QueryVersionResult(); |
| response.queryVersionResult.version = interface_version; |
| // Return response. |
| return new Future.value( |
| stub.buildResponseWithId(response, |
| icm.kRunMessageId, |
| message.header.requestId, |
| MessageHeader.kMessageIsResponse)); |
| } |
| |
| static Future _handleRunOrClose(Stub stub, |
| int interface_version, |
| ServiceMessage message) { |
| // Deserialize message. |
| var params = icm.RunOrClosePipeMessageParams.deserialize(message.payload); |
| // Grab required version. |
| var requiredVersion = params.requireVersion.version; |
| if (interface_version < requiredVersion) { |
| // Stub does not implement required version. Close the pipe immediately. |
| stub.close(immediate: true); |
| } |
| return null; |
| } |
| } |