(entry: ZipEntry)
| 43 | } |
| 44 | |
| 45 | public writeEntry(entry: ZipEntry) { |
| 46 | // 4.3.7 local file header |
| 47 | const compressionMode = ZipEntry.CompressionMethodDeflate; |
| 48 | |
| 49 | const compressedData = ByteBuffer.empty(); |
| 50 | const crc32 = this._compress(compressedData, entry.data, compressionMode); |
| 51 | const compressedDataArray = compressedData.toArray(); |
| 52 | const directoryHeader = new ZipCentralDirectoryHeader( |
| 53 | entry, |
| 54 | crc32, |
| 55 | this._data.bytesWritten, |
| 56 | compressionMode, |
| 57 | compressedData.length |
| 58 | ); |
| 59 | this._centralDirectoryHeaders.push(directoryHeader); |
| 60 | |
| 61 | // Signature |
| 62 | IOHelper.writeInt32LE(this._data, ZipEntry.LocalFileHeaderSignature); |
| 63 | // Version |
| 64 | IOHelper.writeUInt16LE(this._data, 10); |
| 65 | // Flags |
| 66 | IOHelper.writeUInt16LE(this._data, 0x0800); |
| 67 | // Compression |
| 68 | IOHelper.writeUInt16LE(this._data, compressionMode); |
| 69 | // last mod file time |
| 70 | IOHelper.writeInt16LE(this._data, 0); |
| 71 | // last mod file date |
| 72 | IOHelper.writeInt16LE(this._data, 0); |
| 73 | // crc-32 |
| 74 | IOHelper.writeInt32LE(this._data, crc32); |
| 75 | // compressed size |
| 76 | IOHelper.writeInt32LE(this._data, compressedDataArray.length); |
| 77 | // uncompressed size |
| 78 | IOHelper.writeInt32LE(this._data, entry.data.length); |
| 79 | // file name length |
| 80 | IOHelper.writeInt16LE(this._data, entry.fullName.length); |
| 81 | // extra field length |
| 82 | IOHelper.writeInt16LE(this._data, 0); |
| 83 | // file name (variable size) |
| 84 | const fileNameBuffer = IOHelper.stringToBytes(entry.fullName); |
| 85 | this._data.write(fileNameBuffer, 0, fileNameBuffer.length); |
| 86 | // extra field (variable size) |
| 87 | // <empty> |
| 88 | |
| 89 | // 4.3.8 File Data |
| 90 | this._data.write(compressedDataArray, 0, compressedDataArray.length); |
| 91 | } |
| 92 | |
| 93 | private _compress(output: IWriteable, data: Uint8Array, compressionMode: number): number { |
| 94 | if (compressionMode !== ZipEntry.CompressionMethodDeflate) { |
no test coverage detected