예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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));
        }