| 137 | //========================================================================== |
| 138 | |
| 139 | int AppendCentralDirectory(FileWriter *zip_file, const FCompressedBuffer &content, std::pair<uint16_t, uint16_t> &dostime, int position) |
| 140 | { |
| 141 | FZipCentralDirectoryInfo dir; |
| 142 | |
| 143 | int flags = 0; |
| 144 | int method = content.mMethod; |
| 145 | if (method >= FileSys::METHOD_IMPLODE_MIN && method <= FileSys::METHOD_IMPLODE_MAX) |
| 146 | { |
| 147 | flags = method - FileSys::METHOD_IMPLODE_MIN; |
| 148 | method = FileSys::METHOD_IMPLODE; |
| 149 | } |
| 150 | else if (method == FileSys::METHOD_DEFLATE) |
| 151 | { |
| 152 | flags = 2; |
| 153 | } |
| 154 | else if (method >= 1337) |
| 155 | return -1; |
| 156 | |
| 157 | dir.Magic = ZIP_CENTRALFILE; |
| 158 | dir.VersionMadeBy[0] = 20; |
| 159 | dir.VersionMadeBy[1] = 0; |
| 160 | dir.VersionToExtract[0] = 20; |
| 161 | dir.VersionToExtract[1] = 0; |
| 162 | dir.Flags = LittleShort((uint16_t)flags); |
| 163 | dir.Method = LittleShort((uint16_t)method); |
| 164 | dir.ModTime = LittleShort(dostime.first); |
| 165 | dir.ModDate = LittleShort(dostime.second); |
| 166 | dir.CRC32 = content.mCRC32; |
| 167 | dir.CompressedSize32 = LittleLong((unsigned)content.mCompressedSize); |
| 168 | dir.UncompressedSize32 = LittleLong((unsigned)content.mSize); |
| 169 | dir.NameLength = LittleShort((unsigned short)strlen(content.filename)); |
| 170 | dir.ExtraLength = 0; |
| 171 | dir.CommentLength = 0; |
| 172 | dir.StartingDiskNumber = 0; |
| 173 | dir.InternalAttributes = 0; |
| 174 | dir.ExternalAttributes = 0; |
| 175 | dir.LocalHeaderOffset32 = LittleLong((unsigned)position); |
| 176 | |
| 177 | if (zip_file->Write(&dir, sizeof(dir)) != sizeof(dir) || |
| 178 | zip_file->Write(content.filename, strlen(content.filename)) != strlen(content.filename)) |
| 179 | { |
| 180 | return -1; |
| 181 | } |
| 182 | return 0; |
| 183 | } |
| 184 | |
| 185 | bool WriteZip(const char* filename, const FCompressedBuffer* content, size_t contentcount) |
| 186 | { |
no test coverage detected