UNPKG

@phi-ag/rvt

Version:

Parse Revit file format

52 lines (51 loc) 2.17 kB
import { assertEqual, assertZero } from "./utils.js"; export const maxFatSectorsHeader = 109; export const parseHeader = (chunk) => { const signature = [0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1]; assertEqual(chunk, 0, signature, "signature"); assertEqual(chunk, 24, [0x3e, 0x00], "minor version"); const view = new DataView(chunk.buffer, chunk.byteOffset); const version = view.getUint16(26, true); if (version !== 3 && version !== 4) throw Error(`Unexpected compound file major version (${version})`); assertEqual(chunk, 28, [0xfe, 0xff], "byte order"); const sectorSizeBits = view.getUint16(30, true); const sectorSize = 1 << sectorSizeBits; const maxSectorEntries = 1 << (sectorSizeBits - 2); const miniSectorSizeBits = view.getUint16(32, true); const miniSectorSize = 1 << miniSectorSizeBits; assertZero(chunk, 34, 6, "reserved"); const directorySectorCount = view.getUint32(40, true); if (version === 3 && directorySectorCount !== 0) throw Error(`Unexpected compound file sector count (${directorySectorCount})`); const fatSectorCount = view.getUint32(44, true); const directoryStart = view.getUint32(48, true); assertZero(chunk, 52, 4, "transaction signature"); const miniFatCutoff = view.getUint32(56, true); const miniFatStart = view.getUint32(60, true); const miniFatSectorCount = view.getUint32(64, true); const diFatStart = view.getUint32(68, true); const diFatCount = view.getUint32(72, true); const fatSectors = new Uint32Array(fatSectorCount); const fatSectorsHeaderCount = Math.min(fatSectorCount, maxFatSectorsHeader); for (let i = 0; i < fatSectorsHeaderCount; ++i) { fatSectors[i] = view.getUint32(76 + i * 4, true); } const header = { version, sectorSize, sectorSizeBits, maxSectorEntries, miniSectorSize, miniSectorSizeBits, directorySectorCount, fatSectorCount, directoryStart, miniFatCutoff, miniFatStart, miniFatSectorCount, diFatStart, diFatCount }; return [header, fatSectors]; };