emberplus-connection
Version:
Javascript implementation of the Ember+ automation protocol
232 lines • 10.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeMatrix = void 0;
const tslib_1 = require("tslib");
const Ber = tslib_1.__importStar(require("../../../Ber"));
const Matrix_1 = require("../../../model/Matrix");
const Tree_1 = require("./Tree");
const Connection_1 = require("./Connection");
const Label_1 = require("./Label");
const constants_1 = require("../constants");
const Tree_2 = require("../../../model/Tree");
const DecodeResult_1 = require("./DecodeResult");
function decodeMatrix(reader, isQualified = false, options = DecodeResult_1.defaultDecode) {
reader.readSequence(isQualified ? constants_1.QualifiedMatrixBERID : constants_1.MatrixBERID);
let number = null;
let path = null;
let targets = undefined;
let sources = undefined;
let connections = undefined;
let contents = null;
let kids = undefined;
const errors = [];
const endOffset = reader.offset + reader.length;
while (reader.offset < endOffset) {
const tag = reader.readSequence();
switch (tag) {
case Ber.CONTEXT(0):
if (isQualified) {
path = reader.readRelativeOID();
}
else {
number = reader.readInt();
}
break;
case Ber.CONTEXT(1):
contents = (0, DecodeResult_1.appendErrors)(decodeMatrixContents(reader, options), errors);
break;
case Ber.CONTEXT(2):
kids = (0, DecodeResult_1.appendErrors)((0, Tree_1.decodeChildren)(reader, options), errors);
break;
case Ber.CONTEXT(3):
targets = (0, DecodeResult_1.appendErrors)(decodeTargets(reader, options), errors);
break;
case Ber.CONTEXT(4):
sources = (0, DecodeResult_1.appendErrors)(decodeSources(reader, options), errors);
break;
case Ber.CONTEXT(5):
connections = (0, DecodeResult_1.appendErrors)(decodeConnections(reader, options), errors);
break;
case 0:
break; // indefinite length
default:
(0, DecodeResult_1.unknownContext)(errors, 'decode matrix', tag, options);
(0, DecodeResult_1.skipNext)(reader);
break;
}
}
contents = (0, DecodeResult_1.check)(contents, 'decode matrix', 'contents', new Matrix_1.MatrixImpl(''), errors, options);
contents.targets = targets;
contents.sources = sources;
contents.connections = connections;
let el;
if (isQualified) {
path = (0, DecodeResult_1.check)(path, 'decode matrix', 'path', '', errors, options);
el = new Tree_2.QualifiedElementImpl(path, contents, kids);
}
else {
number = (0, DecodeResult_1.check)(number, 'decode matrix', 'number', -1, errors, options);
el = new Tree_2.NumberedTreeNodeImpl(number, contents, kids);
}
if (kids) {
for (const kiddo of Object.values(kids)) {
kiddo.parent = el;
}
}
return (0, DecodeResult_1.makeResult)(el, errors);
}
exports.decodeMatrix = decodeMatrix;
function decodeMatrixContents(reader, options = DecodeResult_1.defaultDecode) {
reader.readSequence(Ber.BERDataTypes.SET);
let plTag;
let identifier = undefined;
let description = undefined;
let matrixType = undefined;
let addressingMode = undefined;
let targetCount = undefined;
let sourceCount = undefined;
let maximumTotalConnects = undefined;
let maximumConnectsPerTarget = undefined;
let parametersLocation = undefined;
let gainParameterNumber = undefined;
let labels = undefined;
let schemaIdentifiers = undefined;
let templateReference = undefined;
let seqOffset;
const errors = [];
const endOffset = reader.offset + reader.length;
while (reader.offset < endOffset) {
const tag = reader.readSequence();
switch (tag) {
case Ber.CONTEXT(0):
identifier = reader.readString(Ber.BERDataTypes.STRING);
break;
case Ber.CONTEXT(1):
description = reader.readString(Ber.BERDataTypes.STRING);
break;
case Ber.CONTEXT(2):
matrixType = (0, DecodeResult_1.appendErrors)(readMatrixType(reader.readInt(), options), errors);
break;
case Ber.CONTEXT(3):
addressingMode = (0, DecodeResult_1.appendErrors)(readAddressingMode(reader.readInt(), options), errors);
break;
case Ber.CONTEXT(4):
targetCount = reader.readInt();
break;
case Ber.CONTEXT(5):
sourceCount = reader.readInt();
break;
case Ber.CONTEXT(6):
maximumTotalConnects = reader.readInt();
break;
case Ber.CONTEXT(7):
maximumConnectsPerTarget = reader.readInt();
break;
case Ber.CONTEXT(8):
plTag = reader.peek();
if (plTag === Ber.BERDataTypes.RELATIVE_OID) {
parametersLocation = reader.readRelativeOID(Ber.BERDataTypes.RELATIVE_OID);
}
else {
parametersLocation = reader.readInt();
}
break;
case Ber.CONTEXT(9):
gainParameterNumber = reader.readInt();
break;
case Ber.CONTEXT(10):
labels = [];
reader.readSequence(Ber.BERDataTypes.SEQUENCE);
seqOffset = reader.offset + reader.length;
while (reader.offset < seqOffset) {
reader.readSequence(Ber.CONTEXT(0));
const lvVal = (0, DecodeResult_1.appendErrors)((0, Label_1.decodeLabel)(reader, options), errors);
labels.push(lvVal);
}
break;
case Ber.CONTEXT(11):
schemaIdentifiers = reader.readString(Ber.BERDataTypes.STRING);
break;
case Ber.CONTEXT(12):
templateReference = reader.readRelativeOID(Ber.BERDataTypes.RELATIVE_OID);
break;
case 0:
break; // indefinite length
default:
(0, DecodeResult_1.unknownContext)(errors, 'decode mattric contents', tag, options);
(0, DecodeResult_1.skipNext)(reader);
break;
}
}
identifier = (0, DecodeResult_1.check)(identifier, 'decode matrix contents', 'identifier', '', errors, options);
return (0, DecodeResult_1.makeResult)(new Matrix_1.MatrixImpl(identifier, undefined, // targets
undefined, // sources
undefined, // connections
description, matrixType, addressingMode, targetCount, sourceCount, maximumTotalConnects, maximumConnectsPerTarget, parametersLocation, gainParameterNumber, labels, schemaIdentifiers, templateReference), errors);
}
function decodeTargets(reader, _options = DecodeResult_1.defaultDecode // eslint-disable-line -eslint/no-unused-vars
) {
const targets = [];
reader.readSequence(Ber.BERDataTypes.SEQUENCE);
const endOffset = reader.offset + reader.length;
while (reader.offset < endOffset) {
reader.readSequence(Ber.CONTEXT(0));
reader.readSequence(constants_1.TargetBERID);
reader.readSequence(Ber.CONTEXT(0));
targets.push(reader.readInt());
}
return (0, DecodeResult_1.makeResult)(targets);
}
function decodeSources(reader, _options = DecodeResult_1.defaultDecode // eslint-disable-line -eslint/no-unused-vars
) {
const sources = [];
reader.readSequence(Ber.BERDataTypes.SEQUENCE);
const endOffset = reader.offset + reader.length;
while (reader.offset < endOffset) {
reader.readSequence(Ber.CONTEXT(0));
reader.readSequence(constants_1.SourceBERID);
reader.readSequence(Ber.CONTEXT(0));
sources.push(reader.readInt());
}
return (0, DecodeResult_1.makeResult)(sources);
}
function decodeConnections(reader, options = DecodeResult_1.defaultDecode) {
const connections = (0, DecodeResult_1.makeResult)({});
reader.readSequence(Ber.BERDataTypes.SEQUENCE);
const endOffset = reader.offset + reader.length;
while (reader.offset < endOffset) {
const tag = reader.readSequence();
if (tag === Ber.CONTEXT(0)) {
const connection = (0, DecodeResult_1.appendErrors)((0, Connection_1.decodeConnection)(reader, options), connections);
connections.value[connection.target] = connection;
}
else {
// unknownContext(errors, 'decode invocation arguments', tag, options)
(0, DecodeResult_1.skipNext)(reader);
}
}
return connections;
}
function readMatrixType(value, options = DecodeResult_1.defaultDecode) {
switch (value) {
case 0:
return (0, DecodeResult_1.makeResult)(Matrix_1.MatrixType.OneToN);
case 1:
return (0, DecodeResult_1.makeResult)(Matrix_1.MatrixType.OneToOne);
case 2:
return (0, DecodeResult_1.makeResult)(Matrix_1.MatrixType.NToN);
default:
return (0, DecodeResult_1.unexpected)([], 'read matrix type', `unexpected matrix type '${value}'`, Matrix_1.MatrixType.NToN, options);
}
}
function readAddressingMode(value, options = DecodeResult_1.defaultDecode) {
switch (value) {
case 0:
return (0, DecodeResult_1.makeResult)(Matrix_1.MatrixAddressingMode.Linear);
case 1:
return (0, DecodeResult_1.makeResult)(Matrix_1.MatrixAddressingMode.NonLinear);
default:
return (0, DecodeResult_1.unexpected)([], 'read addressing mode', `unexpected addressing mode '${value}'`, Matrix_1.MatrixAddressingMode.Linear, options);
}
}
//# sourceMappingURL=Matrix.js.map