(file: LHAFileInput)
| 38 | } |
| 39 | |
| 40 | private writeFileHeader(file: LHAFileInput): void { |
| 41 | const timestamp = file.timestamp || new Date(); |
| 42 | const method = "-lh0-"; // Store method (no compression) |
| 43 | const compressedData = file.data; |
| 44 | const originalSize = file.data.length; |
| 45 | const compressedSize = compressedData.length; |
| 46 | const crc = this.calculateCRC16(file.data); |
| 47 | |
| 48 | // Prepare filename (ensure it's not too long) |
| 49 | const filenameBytes = new TextEncoder().encode(file.filename); |
| 50 | const filenameLength = Math.min(filenameBytes.length, 255); |
| 51 | |
| 52 | // Calculate header size (level 0) |
| 53 | // 2 (header size + checksum) + 5 (method) + 4 (comp size) + 4 (orig size) + |
| 54 | // 2 (time) + 2 (date) + 1 (attr) + 1 (level) + 1 (name len) + name + 2 (crc) |
| 55 | const baseHeaderSize = 2 + 5 + 4 + 4 + 2 + 2 + 1 + 1 + 1 + filenameLength + 2; |
| 56 | const headerSize = baseHeaderSize - 2; // Size doesn't include the size byte itself and checksum |
| 57 | |
| 58 | const header = new Uint8Array(baseHeaderSize); |
| 59 | let offset = 0; |
| 60 | |
| 61 | // Header size |
| 62 | header[offset++] = headerSize; |
| 63 | |
| 64 | // Header checksum (calculate later) |
| 65 | const checksumOffset = offset; |
| 66 | header[offset++] = 0; |
| 67 | |
| 68 | // Method |
| 69 | const methodBytes = new TextEncoder().encode(method); |
| 70 | header.set(methodBytes, offset); |
| 71 | offset += 5; |
| 72 | |
| 73 | // Compressed size |
| 74 | this.writeDWord(header, offset, compressedSize); |
| 75 | offset += 4; |
| 76 | |
| 77 | // Original size |
| 78 | this.writeDWord(header, offset, originalSize); |
| 79 | offset += 4; |
| 80 | |
| 81 | // MS-DOS timestamp |
| 82 | const dosTime = this.dateToDosTime(timestamp); |
| 83 | this.writeWord(header, offset, dosTime.time); |
| 84 | offset += 2; |
| 85 | this.writeWord(header, offset, dosTime.date); |
| 86 | offset += 2; |
| 87 | |
| 88 | // Attributes (0x20 = archive bit) |
| 89 | header[offset++] = 0x20; |
| 90 | |
| 91 | // Level (0) |
| 92 | header[offset++] = 0x00; |
| 93 | |
| 94 | // Filename length |
| 95 | header[offset++] = filenameLength; |
| 96 | |
| 97 | // Filename |
no test coverage detected