static bool rar_restart_solid(ar_archive_rar *rar) { ar_archive *ar = &rar->super; size_t current_offset = ar->entry_offset; log("Restarting decompression for solid entry"); if (!ar_parse_entry_at(ar, 0)) { ar_parse_entry_at(ar, current_offset); return false; } while (ar->entry_offset != current_offset) { size_t size = ar->entry_size_uncompressed; rar->entry.restart_solid = false; while (size > 0) { unsigned char buffer[1024]; if (!ar_entry_uncompress(ar, buffer, min(size, sizeof(buffer)))) { ar_parse_entry_at(ar, current_offset); return false; } size -= min(size, sizeof(buffer)); } if (!ar_parse_entry(ar)) { ar_parse_entry_at(ar, current_offset); return false; } } rar->entry.restart_solid = false; return true; }
static bool rar_restart_solid(ar_archive *ar) { ar_archive_rar *rar = (ar_archive_rar *)ar; off64_t current_offset = ar->entry_offset; log("Restarting decompression for solid entry"); if (!ar_parse_entry_at(ar, ar->entry_offset_first)) { ar_parse_entry_at(ar, current_offset); return false; } while (ar->entry_offset < current_offset) { size_t size = ar->entry_size_uncompressed; rar->solid.restart = false; while (size > 0) { unsigned char buffer[1024]; size_t count = mins(size, sizeof(buffer)); if (!ar_entry_uncompress(ar, buffer, count)) { ar_parse_entry_at(ar, current_offset); return false; } size -= count; } if (!ar_parse_entry(ar)) { ar_parse_entry_at(ar, current_offset); return false; } } rar->solid.restart = false; return true; }
FILETIME ArchFile::GetFileTime(size_t fileindex) { FILETIME ft = { (DWORD)-1, (DWORD)-1 }; if (ar && fileindex < filepos.Count() && ar_parse_entry_at(ar, filepos.At(fileindex))) { time64_t filetime = ar_entry_get_filetime(ar); LocalFileTimeToFileTime((FILETIME *)&filetime, &ft); } return ft; }
char *ArchFile::GetFileDataByIdx(size_t fileindex, size_t *len) { if (fileindex >= filenames.Count()) return nullptr; if (!ar || !ar_parse_entry_at(ar, filepos.At(fileindex))) return GetFileFromFallback(fileindex, len); size_t size = ar_entry_get_size(ar); if (size > SIZE_MAX - 3) return nullptr; ScopedMem<char> data((char *)malloc(size + 3)); if (!data) return nullptr; if (!ar_entry_uncompress(ar, data, size)) return GetFileFromFallback(fileindex, len); // zero-terminate for convenience data[size] = data[size + 1] = data[size + 2] = '\0'; if (len) *len = size; return data.StealData(); }
void jumpBackAtBegining(ARCHIVE * archive) { ar_parse_entry_at(archive->archive, 0); archive->didJustRewind = true; }