// Copyright 2017 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. (function() { var internal = mojo.internal; function constructRunOrClosePipeMessage(runOrClosePipeInput) { var runOrClosePipeMessageParams = new mojo.interfaceControl.RunOrClosePipeMessageParams(); runOrClosePipeMessageParams.input = runOrClosePipeInput; var messageName = mojo.interfaceControl.kRunOrClosePipeMessageId; var payloadSize = mojo.interfaceControl.RunOrClosePipeMessageParams.encodedSize; var builder = new internal.MessageV0Builder(messageName, payloadSize); builder.encodeStruct(mojo.interfaceControl.RunOrClosePipeMessageParams, runOrClosePipeMessageParams); var message = builder.finish(); return message; } function validateControlResponse(message) { var messageValidator = new internal.Validator(message); var error = messageValidator.validateMessageIsResponse(); if (error != internal.validationError.NONE) { throw error; } if (message.getName() != mojo.interfaceControl.kRunMessageId) { throw new Error("Control message name is not kRunMessageId"); } // Validate payload. error = mojo.interfaceControl.RunResponseMessageParams.validate( messageValidator, message.getHeaderNumBytes()); if (error != internal.validationError.NONE) { throw error; } } function acceptRunResponse(message) { validateControlResponse(message); var reader = new internal.MessageReader(message); var runResponseMessageParams = reader.decodeStruct( mojo.interfaceControl.RunResponseMessageParams); return Promise.resolve(runResponseMessageParams); } /** * Sends the given run message through the receiver. * Accepts the response message from the receiver and decodes the message * struct to RunResponseMessageParams. * * @param {Router} receiver. * @param {RunMessageParams} runMessageParams to be sent via a message. * @return {Promise} that resolves to a RunResponseMessageParams. */ function sendRunMessage(receiver, runMessageParams) { var messageName = mojo.interfaceControl.kRunMessageId; var payloadSize = mojo.interfaceControl.RunMessageParams.encodedSize; // |requestID| is set to 0, but is later properly set by Router. var builder = new internal.MessageV1Builder(messageName, payloadSize, internal.kMessageExpectsResponse, 0); builder.encodeStruct(mojo.interfaceControl.RunMessageParams, runMessageParams); var message = builder.finish(); return receiver.acceptAndExpectResponse(message).then(acceptRunResponse); } function ControlMessageProxy(receiver) { this.receiver_ = receiver; } ControlMessageProxy.prototype.queryVersion = function() { var runMessageParams = new mojo.interfaceControl.RunMessageParams(); runMessageParams.input = new mojo.interfaceControl.RunInput(); runMessageParams.input.queryVersion = new mojo.interfaceControl.QueryVersion(); return sendRunMessage(this.receiver_, runMessageParams).then(function( runResponseMessageParams) { return runResponseMessageParams.output.queryVersionResult.version; }); }; ControlMessageProxy.prototype.requireVersion = function(version) { var runOrClosePipeInput = new mojo.interfaceControl.RunOrClosePipeInput(); runOrClosePipeInput.requireVersion = new mojo.interfaceControl.RequireVersion({'version': version}); var message = constructRunOrClosePipeMessage(runOrClosePipeInput); this.receiver_.accept(message); }; internal.ControlMessageProxy = ControlMessageProxy; })();