You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
2.1 KiB
JavaScript

'use strict';
const Buffer = require("safe-buffer").Buffer;
const createBufferReader = require("../buffer-reader");
const parseBootRecord = require("./descriptors/boot-record");
const parsePrimaryVolumeDescriptor = require("./descriptors/primary-volume");
const parseSupplementaryVolumeDescriptor = require("./descriptors/supplementary-volume");
const parseVolumePartitionDescriptor = require("./descriptors/volume-partition");
const parseVolumeDescriptorSetTerminator = require("./descriptors/descriptor-set-terminator");
let identifierCD001 = Buffer.from("CD001");
function getVolumeDescriptorType(typeNumber) {
if (typeNumber === 0) {
return "boot";
} else if (typeNumber === 1) {
return "primary";
} else if (typeNumber === 2) {
return "supplementary";
} else if (typeNumber === 3) {
return "partition";
} else if (typeNumber >= 4 && typeNumber <= 254) {
return "reserved";
} else if (typeNumber === 255) {
return "terminator";
} else {
throw new Error("Unknown volume descriptor type");
}
}
function parseVolumeDescriptorData(type, dataBuffer) {
if (type === "boot") {
return parseBootRecord(dataBuffer);
} else if (type === "primary") {
return parsePrimaryVolumeDescriptor(dataBuffer);
} else if (type === "supplementary") {
return parseSupplementaryVolumeDescriptor(dataBuffer);
} else if (type === "partition") {
return parseVolumePartitionDescriptor(dataBuffer);
} else if (type === "terminator") {
return parseVolumeDescriptorSetTerminator(dataBuffer);
}
}
module.exports = function parseVolumeDescriptor(data) {
if (!data.slice(1, 6).equals(identifierCD001)) {
throw new Error("Not a valid volume descriptor - CD001 identifier is missing");
}
let buffer = createBufferReader(data);
let descriptorType = getVolumeDescriptorType(buffer.int8(0));
return {
type: descriptorType,
version: buffer.int8(6),
data: parseVolumeDescriptorData(descriptorType, data.slice(7, 2048))
}
};