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.
77 lines
3.2 KiB
JavaScript
77 lines
3.2 KiB
JavaScript
'use strict';
|
|
|
|
const Promise = require("bluebird");
|
|
const memoizee = require("memoizee");
|
|
const debug = require("debug")("iso9660:object:directory");
|
|
|
|
const readExtendedAttributeRecord = require("../read/extended-attribute-record");
|
|
const readDirectoryExtent = require("../read/directory-extent");
|
|
|
|
module.exports = function(image) {
|
|
const createFile = require("./file")(image);
|
|
|
|
function getExtendedAttributeRecord(extentLocation, extendedAttributeRecordLength) {
|
|
if (extendedAttributeRecordLength === 0) {
|
|
return {};
|
|
} else {
|
|
return readExtendedAttributeRecord(extentLocation, extendedAttributeRecordLength);
|
|
}
|
|
}
|
|
|
|
return function createDirectory(directoryRecord, parent) {
|
|
debug(`Creating new directory object for ${directoryRecord.identifier.filename}`);
|
|
|
|
return {
|
|
type: "directory",
|
|
filename: directoryRecord.identifier.filename,
|
|
version: directoryRecord.identifier.version,
|
|
parent: parent,
|
|
recordingDate: directoryRecord.recordingDate,
|
|
encoding: directoryRecord.encoding,
|
|
record: directoryRecord,
|
|
|
|
getChildren: memoizee(function getChildren() {
|
|
return Promise.try(() => {
|
|
return readDirectoryExtent(image, directoryRecord.extentLocation, directoryRecord.extentSize, directoryRecord.encoding);
|
|
}).then((directoryRecords) => {
|
|
/* The first two records are . and .. respectively, so we'll strip these off. */
|
|
let realDirectoryRecords = directoryRecords.slice(2);
|
|
|
|
return Promise.map(realDirectoryRecords, (directoryRecord) => {
|
|
if (directoryRecord.fileFlags.directory) {
|
|
debug(`Found directory: ${directoryRecord.identifier.filename}`);
|
|
return createDirectory(directoryRecord, this);
|
|
} else {
|
|
debug(`Found file: ${directoryRecord.identifier.filename}`);
|
|
|
|
return Promise.try(() => {
|
|
return getExtendedAttributeRecord(directoryRecord.extentLocation, directoryRecord.extendedAttributeRecordLength);
|
|
}).then((extendedAttributeRecord) => {
|
|
directoryRecord.extendedAttributeRecord = extendedAttributeRecord;
|
|
return createFile(directoryRecord, this);
|
|
});
|
|
}
|
|
});
|
|
})
|
|
}),
|
|
getTree: function getTree() {
|
|
return Promise.try(() => {
|
|
return this.getChildren();
|
|
}).map((child) => {
|
|
if (child.type === "directory") {
|
|
return Promise.try(() => {
|
|
return child.getTree();
|
|
}).then((tree) => {
|
|
return Object.assign({
|
|
children: tree
|
|
}, child);
|
|
});
|
|
} else {
|
|
return child;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|