private bool AddInstallChunk(VfsFormats.Layout.InstallChunk installChunk) { if (this._InstallChunkInfo.ContainsKey(installChunk.Id) == true) { return(true); } var basePath = Path.Combine(this._DataPath, Helpers.FilterPath(installChunk.InstallBundle)); var catalogPath = Path.Combine(basePath, "cas.cat"); if (File.Exists(catalogPath) == false) { return(false); } var catalog = CatalogFile.Read(catalogPath); var installChunkInfo = new InstallChunkInfo(basePath); foreach (var entry in catalog.ChunkEntries) { var variantInfo = new ChunkVariantInfo(installChunkInfo, entry, null); List <ChunkVariantInfo> chunkVariants; if (this._ChunkInfo.TryGetValue(entry.SHA1.Text, out chunkVariants) == false) { chunkVariants = this._ChunkInfo[entry.SHA1.Text] = new List <ChunkVariantInfo>(); } chunkVariants.Add(variantInfo); } foreach (var entry in catalog.EncryptedChunkEntries) { var variantInfo = new ChunkVariantInfo(installChunkInfo, entry.Chunk, entry.CryptoInfo); List <ChunkVariantInfo> chunkVariants; if (this._ChunkInfo.TryGetValue(entry.Chunk.SHA1.Text, out chunkVariants) == false) { chunkVariants = this._ChunkInfo[entry.Chunk.SHA1.Text] = new List <ChunkVariantInfo>(); } chunkVariants.Add(variantInfo); } this._InstallChunkInfo.Add(installChunk.Id, installChunkInfo); return(true); }
public bool Add(string path) { if (this._CatalogInfo.ContainsKey(path) == true) { return(true); } var basePath = Path.Combine(this._DataPath, Helpers.FilterPath(path)); var catalogPath = Path.Combine(basePath, "cas.cat"); if (File.Exists(catalogPath) == false) { return(false); } var catalog = CatalogFile.Read(catalogPath); if (catalog.Unknown3s.Count > 0) { Console.WriteLine("'{0}' has unknown3s.", catalogPath); } var catalogInfo = new CatalogInfo(basePath); this._CatalogInfo.Add(path, catalogInfo); foreach (var entry in catalog.ChunkEntries) { var info = new EntryInfo(catalogInfo, entry); List <EntryInfo> entryInfos; if (this._EntryInfo.TryGetValue(entry.SHA1.Text, out entryInfos) == false) { entryInfos = this._EntryInfo[entry.SHA1.Text] = new List <EntryInfo>(); } entryInfos.Add(info); } return(true); }
public static ChunkLoader Load(string basePath) { var catalogPath = Path.Combine(basePath, "cas.cat"); if (File.Exists(catalogPath) == false) { return(null); } Logger.Debug("Reading catalog '{0}'", catalogPath); var catalog = CatalogFile.Read(catalogPath); var chunkDataIndices = catalog.NormalEntries.Select(ce => ce.DataIndex); var encryptedChunkDataIndices = catalog.EncryptedEntries.Select(ece => ece.Entry.DataIndex); var files = new Dictionary <byte, MemoryMappedFile>(); foreach (var index in chunkDataIndices.Concat(encryptedChunkDataIndices).Distinct().OrderBy(v => v)) { var dataPath = Path.Combine(basePath, string.Format("cas_{0:D2}.cas", index)); if (File.Exists(dataPath) == false) { foreach (var stream in files.Values) { stream.Dispose(); } return(null); } var temp = File.OpenRead(dataPath); files[index] = MemoryMappedFile.CreateFromFile( temp, null, 0, MemoryMappedFileAccess.Read, null, HandleInheritability.None, false); } var chunkLookup = new Dictionary <SHA1Hash, List <ChunkVariantInfo> >(); for (int i = 0; i < catalog.NormalEntries.Count; i++) { var entry = catalog.NormalEntries[i]; List <ChunkVariantInfo> chunkVariants; if (chunkLookup.TryGetValue(entry.Id, out chunkVariants) == false) { chunkVariants = chunkLookup[entry.Id] = new List <ChunkVariantInfo>(); } chunkVariants.Add(new ChunkVariantInfo(i, ChunkVariantType.Normal)); } for (int i = 0; i < catalog.PatchEntries.Count; i++) { var entry = catalog.PatchEntries[i]; List <ChunkVariantInfo> chunkVariants; if (chunkLookup.TryGetValue(entry.Id, out chunkVariants) == false) { chunkVariants = chunkLookup[entry.Id] = new List <ChunkVariantInfo>(); } chunkVariants.Add(new ChunkVariantInfo(i, ChunkVariantType.Patch)); } for (int i = 0; i < catalog.EncryptedEntries.Count; i++) { var entry = catalog.EncryptedEntries[i]; List <ChunkVariantInfo> chunkVariants; if (chunkLookup.TryGetValue(entry.Entry.Id, out chunkVariants) == false) { chunkVariants = chunkLookup[entry.Entry.Id] = new List <ChunkVariantInfo>(); } chunkVariants.Add(new ChunkVariantInfo(i, ChunkVariantType.Encrypted)); } return(new ChunkLoader(catalog, files, chunkLookup)); }