106 lines
3.7 KiB
JavaScript
106 lines
3.7 KiB
JavaScript
// 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 validateControlRequestWithResponse(message) {
|
|
var messageValidator = new internal.Validator(message);
|
|
var error = messageValidator.validateMessageIsRequestExpectingResponse();
|
|
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.RunMessageParams.validate(messageValidator,
|
|
message.getHeaderNumBytes());
|
|
if (error != internal.validationError.NONE) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
function validateControlRequestWithoutResponse(message) {
|
|
var messageValidator = new internal.Validator(message);
|
|
var error = messageValidator.validateMessageIsRequestWithoutResponse();
|
|
if (error != internal.validationError.NONE) {
|
|
throw error;
|
|
}
|
|
|
|
if (message.getName() != mojo.interfaceControl.kRunOrClosePipeMessageId) {
|
|
throw new Error("Control message name is not kRunOrClosePipeMessageId");
|
|
}
|
|
|
|
// Validate payload.
|
|
error = mojo.interfaceControl.RunOrClosePipeMessageParams.validate(
|
|
messageValidator, message.getHeaderNumBytes());
|
|
if (error != internal.validationError.NONE) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
function runOrClosePipe(message, interfaceVersion) {
|
|
var reader = new internal.MessageReader(message);
|
|
var runOrClosePipeMessageParams = reader.decodeStruct(
|
|
mojo.interfaceControl.RunOrClosePipeMessageParams);
|
|
return interfaceVersion >=
|
|
runOrClosePipeMessageParams.input.requireVersion.version;
|
|
}
|
|
|
|
function run(message, responder, interfaceVersion) {
|
|
var reader = new internal.MessageReader(message);
|
|
var runMessageParams =
|
|
reader.decodeStruct(mojo.interfaceControl.RunMessageParams);
|
|
var runOutput = null;
|
|
|
|
if (runMessageParams.input.queryVersion) {
|
|
runOutput = new mojo.interfaceControl.RunOutput();
|
|
runOutput.queryVersionResult = new
|
|
mojo.interfaceControl.QueryVersionResult(
|
|
{'version': interfaceVersion});
|
|
}
|
|
|
|
var runResponseMessageParams = new
|
|
mojo.interfaceControl.RunResponseMessageParams();
|
|
runResponseMessageParams.output = runOutput;
|
|
|
|
var messageName = mojo.interfaceControl.kRunMessageId;
|
|
var payloadSize =
|
|
mojo.interfaceControl.RunResponseMessageParams.encodedSize;
|
|
var requestID = reader.requestID;
|
|
var builder = new internal.MessageV1Builder(messageName,
|
|
payloadSize, internal.kMessageIsResponse, requestID);
|
|
builder.encodeStruct(mojo.interfaceControl.RunResponseMessageParams,
|
|
runResponseMessageParams);
|
|
responder.accept(builder.finish());
|
|
return true;
|
|
}
|
|
|
|
function isInterfaceControlMessage(message) {
|
|
return message.getName() == mojo.interfaceControl.kRunMessageId ||
|
|
message.getName() == mojo.interfaceControl.kRunOrClosePipeMessageId;
|
|
}
|
|
|
|
function ControlMessageHandler(interfaceVersion) {
|
|
this.interfaceVersion_ = interfaceVersion;
|
|
}
|
|
|
|
ControlMessageHandler.prototype.accept = function(message) {
|
|
validateControlRequestWithoutResponse(message);
|
|
return runOrClosePipe(message, this.interfaceVersion_);
|
|
};
|
|
|
|
ControlMessageHandler.prototype.acceptWithResponder = function(message,
|
|
responder) {
|
|
validateControlRequestWithResponse(message);
|
|
return run(message, responder, this.interfaceVersion_);
|
|
};
|
|
|
|
internal.ControlMessageHandler = ControlMessageHandler;
|
|
internal.isInterfaceControlMessage = isInterfaceControlMessage;
|
|
})();
|