You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.7 KiB
109 lines
2.7 KiB
|
|
#include "setup/FileLocationEntry.hpp" |
|
|
|
#include "util/LoadingUtils.hpp" |
|
#include "util/Output.hpp" |
|
#include "util/StoredEnum.hpp" |
|
|
|
void FileLocationEntry::load(std::istream & is, const InnoVersion & version) { |
|
|
|
firstSlice = loadNumber<u32>(is, version.bits); |
|
lastSlice = loadNumber<u32>(is, version.bits); |
|
|
|
chunkOffset = loadNumber<u32>(is); |
|
|
|
if(version >= INNO_VERSION(4, 0, 1)) { |
|
fileOffset = loadNumber<u64>(is); |
|
} else { |
|
fileOffset = 0; |
|
} |
|
|
|
if(version >= INNO_VERSION(4, 0, 0)) { |
|
fileSize = loadNumber<u64>(is); |
|
chunkSize = loadNumber<u64>(is); |
|
} else { |
|
fileSize = loadNumber<u32>(is); |
|
chunkSize = loadNumber<u32>(is); |
|
} |
|
|
|
if(version >= INNO_VERSION(5, 3, 9)) { |
|
is.read(checksum.sha1, sizeof(checksum.sha1)), checksum.type = Checksum::Sha1; |
|
} else if(version >= INNO_VERSION(4, 2, 0)) { |
|
is.read(checksum.md5, sizeof(checksum.md5)), checksum.type = Checksum::MD5; |
|
} else if(version >= INNO_VERSION(4, 0, 1)) { |
|
checksum.crc32 = loadNumber<u32>(is), checksum.type = Checksum::Crc32; |
|
} else { |
|
checksum.adler32 = loadNumber<u32>(is), checksum.type = Checksum::Adler32; |
|
} |
|
|
|
if(version.bits == 16) { |
|
|
|
u32 date = loadNumber<u32>(is); // milliseconds? |
|
|
|
// TODO this seems to be off by a few years: |
|
// expected ~ 2000-04-18, got 1991-07-28 |
|
|
|
timestamp.tv_sec = date; |
|
timestamp.tv_nsec = 0; |
|
|
|
} else { |
|
|
|
s64 filetime = loadNumber<s64>(is); |
|
|
|
static const s64 FILETIME_OFFSET = 0x19DB1DED53E8000l; |
|
if(filetime < FILETIME_OFFSET) { |
|
warning << "unexpected filetime: " << filetime; |
|
} |
|
filetime -= FILETIME_OFFSET; |
|
|
|
timestamp.tv_sec = std::time_t(filetime / 10000000); |
|
timestamp.tv_nsec = long(filetime % 10000000) * 100; |
|
} |
|
|
|
fileVersionMS = loadNumber<u32>(is); |
|
fileVersionLS = loadNumber<u32>(is); |
|
|
|
StoredFlagReader<Options> flags(is); |
|
|
|
flags.add(VersionInfoValid); |
|
flags.add(VersionInfoNotValid); |
|
if(version >= INNO_VERSION(2, 0, 17) && version < INNO_VERSION(4, 0, 1)) { |
|
flags.add(BZipped); |
|
} |
|
if(version >= INNO_VERSION(4, 0, 10)) { |
|
flags.add(TimeStampInUTC); |
|
} |
|
if(version >= INNO_VERSION(4, 1, 0)) { |
|
flags.add(IsUninstallerExe); |
|
} |
|
if(version >= INNO_VERSION(4, 1, 8)) { |
|
flags.add(CallInstructionOptimized); |
|
} |
|
if(version >= INNO_VERSION(4, 2, 0)) { |
|
flags.add(Touch); |
|
} |
|
if(version >= INNO_VERSION(4, 2, 2)) { |
|
flags.add(ChunkEncrypted); |
|
} |
|
if(version >= INNO_VERSION(4, 2, 5)) { |
|
flags.add(ChunkCompressed); |
|
} |
|
if(version >= INNO_VERSION(5, 1, 13)) { |
|
flags.add(SolidBreak); |
|
} |
|
|
|
options = flags.get(); |
|
} |
|
|
|
ENUM_NAMES(FileLocationEntry::Options, "File Location Option", |
|
"version info valid", |
|
"version info not valid", |
|
"timestamp in UTC", |
|
"is uninstaller exe", |
|
"call instruction optimized", |
|
"touch", |
|
"chunk encrypted", |
|
"chunk compressed", |
|
"solid break", |
|
"bzipped", |
|
)
|
|
|