internal static async Task <StringFileInfo> LoadAsync(Stream stream) { var count = 3 * sizeof(ushort); var len = await stream.ReadUInt16Async().ConfigureAwait(false); var valLen = await stream.ReadUInt16Async().ConfigureAwait(false); var type = await stream.ReadUInt16Async().ConfigureAwait(false); var key = await stream.ReadUnicodeStringAsync().ConfigureAwait(false); count += (key.Length + 1) * sizeof(ushort); count += await VersionResource.AlignWordBoundaryAsync(stream).ConfigureAwait(false); var tables = new List <VersionStringTable>(); var buffer = await stream.ReadBytesAsync(len - count).ConfigureAwait(false); using (var mem = new MemoryStream(buffer)) { while (mem.Position < mem.Length) { var table = await LoadTableAsync(mem).ConfigureAwait(false); tables.Add(table); } } var result = new StringFileInfo(key, tables.ToArray()); return(result); }
internal VersionInfo(VersionResource resource, uint languageId, FixedFileInfo fixedInfo, StringFileInfo stringInfo, VarFileInfo varInfo) { Resource = resource; Language = languageId; Fixed = fixedInfo; Strings = stringInfo; Variables = varInfo; }
public async Task <VersionInfo> GetInfoAsync(ResourceLanguage language) { var buffer = await GetBytesAsync(language).ConfigureAwait(false); using (var mem = new MemoryStream(buffer)) { var count = 3 * sizeof(ushort); await mem.ReadBytesAsync(count).ConfigureAwait(false); var key = await mem.ReadUnicodeStringAsync().ConfigureAwait(false); if (key != "VS_VERSION_INFO") { throw new Exception("Invalid file version information."); } await AlignWordBoundaryAsync(mem).ConfigureAwait(false); var ffiData = await mem.ReadStructAsync <VS_FIXEDFILEINFO>().ConfigureAwait(false); var fixedFileInfo = new FixedFileInfo(ffiData); await AlignWordBoundaryAsync(mem).ConfigureAwait(false); var stringFileInfo = await StringFileInfo.LoadAsync(mem).ConfigureAwait(false); await AlignWordBoundaryAsync(mem).ConfigureAwait(false); var varFileInfo = await VarFileInfo.LoadAsync(mem).ConfigureAwait(false); var info = new VersionInfo(this, language, fixedFileInfo, stringFileInfo, varFileInfo); return(info); } }