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
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))
|
|
}
|
|
};
|