public void LoadEntries(DataFile file, IndexEntry indexEntry) { var list = new List <RootEntry>(); var blteEntry = new BinaryReader(DataFile.LoadBLTEEntry(indexEntry, file.readStream)); while (blteEntry.BaseStream.Position < blteEntry.BaseStream.Length) { var entries = new RootEntry[blteEntry.ReadInt32()]; blteEntry.BaseStream.Position += 4; var locales = (Locales)blteEntry.ReadUInt32(); blteEntry.BaseStream.Position += (entries.Length << 2); for (var i = 0; i < entries.Length; i++) { list.Add(new RootEntry { MD5 = blteEntry.ReadBytes(16), Hash = blteEntry.ReadUInt64(), Locales = locales }); } } Entries = list.ToLookup(re => re.Hash); }
public void LoadEntries(DataFile file, IndexEntry indexEntry) { var blteEntry = new BinaryReader(DataFile.LoadBLTEEntry(indexEntry, file.readStream)); blteEntry.BaseStream.Position = 9; var entries = blteEntry.ReadBEUInt32(); blteEntry.BaseStream.Position += 5; var offsetEntries = blteEntry.ReadBEUInt32(); blteEntry.BaseStream.Position += offsetEntries + (entries << 5); for (var i = 0; i < entries; i++) { var keys = blteEntry.ReadUInt16(); while (keys != 0) { var encodingEntry = new EncodingEntry { Keys = new byte[keys][], Size = blteEntry.ReadBEUInt32() }; var md5 = blteEntry.ReadBytes(16); for (var j = 0; j < keys; j++) { encodingEntry.Keys[j] = blteEntry.ReadBytes(16); } this.entries.Add(md5, encodingEntry); keys = blteEntry.ReadUInt16(); } while (blteEntry.ReadByte() == 0) { ; } blteEntry.BaseStream.Position -= 1; } }
public ConcurrentDictionary <ulong, MemoryStream> ReadFiles(byte[] signature, Locales locales = Locales.enUS) { var files = new ConcurrentDictionary <ulong, MemoryStream>(); foreach (var entry in rootFile.Entries) { var rootEntries = rootFile[entry.Key]; for (var i = 0; i < rootEntries.Length; i++) { if ((rootEntries[i].Locales & locales) == locales) { var encodingEntry = encodingFile[rootEntries[i].MD5]; if (encodingEntry.Size != 0 && encodingEntry.Keys.Length > 0) { for (var j = 0; j < 0x10; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k.Slice(0, 9)]).Size != 0) { var dataFile = dataFiles[idxEntry.Index]; if (dataFile == null) { throw new InvalidOperationException("Invalid data file."); } var sigBuffer = new byte[signature.Length]; var stream = DataFile.LoadBLTEEntry(idxEntry, dataFile.readStream); stream?.Read(sigBuffer, 0, sigBuffer.Length); if (sigBuffer.Compare(signature)) { files.TryAdd(entry.Key, stream); } } } if (idxEntry.Size != 0) { break; } } for (var j = 0x10; j < idxFiles.Count; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k]).Size != 0) { var sigBuffer = new byte[signature.Length]; var stream = DataFile.LoadBLTEEntry(idxEntry, cdnConfig.DownloadFile(indexFiles[idxEntry.Index], idxEntry)); stream?.Read(sigBuffer, 0, sigBuffer.Length); if (sigBuffer.Compare(signature)) { files.TryAdd(entry.Key, stream); } } } if (idxEntry.Size != 0) { break; } } } } } } return(files); }
public IEnumerable <Tuple <ulong, MemoryStream> > ReadFile(Locales locales = Locales.enUS) { foreach (var entry in rootFile.Entries) { var rootEntries = rootFile[entry.Key]; for (var i = 0; i < rootEntries.Length; i++) { if ((rootEntries[i].Locales & locales) == locales) { var encodingEntry = encodingFile[rootEntries[i].MD5]; if (encodingEntry.Size != 0 && encodingEntry.Keys.Length > 0) { MemoryStream blteStream = null; for (var j = 0; j < 0x10; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k.Slice(0, 9)]).Size != 0) { var dataFile = dataFiles[idxEntry.Index]; if (dataFile == null) { throw new InvalidOperationException("Invalid data file."); } yield return(Tuple.Create(entry.Key, blteStream = DataFile.LoadBLTEEntry(idxEntry, dataFile.readStream))); } } if (idxEntry.Size != 0) { break; } } if (blteStream == null) { for (var j = 0x10; j < idxFiles.Count; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k]).Size != 0) { yield return(Tuple.Create(entry.Key, DataFile.LoadBLTEEntry(idxEntry, cdnConfig.DownloadFile(indexFiles[idxEntry.Index], idxEntry)))); } } if (idxEntry.Size != 0) { break; } } } } } } } //return null; }
public MemoryStream ReadFile(RootEntry[] rootEntries, Locales locales = Locales.enUS) { for (var i = 0; i < rootEntries.Length; i++) { if ((rootEntries[i].Locales & locales) == locales) { var encodingEntry = encodingFile[rootEntries[i].MD5]; if (encodingEntry.Size != 0 && encodingEntry.Keys.Length > 0) { for (var j = 0; j < 0x10; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k.Slice(0, 9)]).Size != 0) { var dataFile = dataFiles[idxEntry.Index]; if (dataFile == null) { throw new InvalidOperationException("Invalid data file."); } var ret = DataFile.LoadBLTEEntry(idxEntry, dataFile.readStream); if (ret == null) { break; } return(ret); } } if (idxEntry.Size != 0) { break; } } // CDN indices for (var j = 0x10; j < idxFiles.Count; j++) { IndexEntry idxEntry = default(IndexEntry); foreach (var k in encodingEntry.Keys) { if ((idxEntry = idxFiles[j][k]).Size != 0) { return(DataFile.LoadBLTEEntry(idxEntry, cdnConfig.DownloadFile(indexFiles[idxEntry.Index], idxEntry))); } } if (idxEntry.Size != 0) { break; } } } } } return(null); }