Пример #1
0
        public static CASCConfig LoadLocalStorageConfig(string basePath, string product = null)
        {
            var config = new CASCConfig {
                OnlineMode = false, BasePath = basePath, Product = product
            };

            config.GameType = CASCGame.DetectLocalGame(basePath);

            if (config.GameType == CASCGameType.Agent || config.GameType == CASCGameType.Hearthstone)
            {
                throw new Exception("Local mode not supported for this game!");
            }

            string buildInfoPath = Path.Combine(basePath, ".build.info");

            using (Stream buildInfoStream = new FileStream(buildInfoPath, FileMode.Open))
            {
                config._BuildInfo = VerBarConfig.ReadVerBarConfig(buildInfoStream);
            }

            Dictionary <string, string> bi = config.GetActiveBuild(product);

            if (bi == null)
            {
                throw new Exception("Can't find active BuildInfoEntry");
            }

            string dataFolder = CASCGame.GetDataFolder(config.GameType);

            config.ActiveBuild = 0;

            config._Builds = new List <KeyValueConfig>();

            string buildKey = bi["BuildKey"];
            //string buildKey = "5a05c58e28d0b2c3245954b6f4e2ae66";
            string buildCfgPath = Path.Combine(basePath, dataFolder, "config", buildKey.Substring(0, 2), buildKey.Substring(2, 2), buildKey);

            using (Stream stream = new FileStream(buildCfgPath, FileMode.Open))
            {
                config._Builds.Add(KeyValueConfig.ReadKeyValueConfig(stream));
            }

            string cdnKey = bi["CDNKey"];
            //string cdnKey = "23d301e8633baaa063189ca9442b3088";
            string cdnCfgPath = Path.Combine(basePath, dataFolder, "config", cdnKey.Substring(0, 2), cdnKey.Substring(2, 2), cdnKey);

            using (Stream stream = new FileStream(cdnCfgPath, FileMode.Open))
            {
                config._CDNConfig = KeyValueConfig.ReadKeyValueConfig(stream);
            }

            CDNCache.Init(config);

            return(config);
        }
Пример #2
0
        private void OpenIndexFile(string archive, int i)
        {
            try
            {
                string dataFolder = CASCGame.GetDataFolder(config.GameType);

                string path = Path.Combine(config.BasePath, dataFolder, "indices", archive + ".index");

                using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    ParseIndex(fs, i);
            }
            catch
            {
                throw new Exception("OpenFile failed!");
            }
        }
Пример #3
0
        private Stream GetDataStream(int index)
        {
            if (DataStreams.TryGetValue(index, out Stream stream))
            {
                return(stream);
            }

            string dataFolder = CASCGame.GetDataFolder(Config.GameType);

            string dataFile = Path.Combine(Config.BasePath, dataFolder, "data", string.Format("data.{0:D3}", index));

            stream = new FileStream(dataFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            DataStreams[index] = stream;

            return(stream);
        }
Пример #4
0
        private static List <string> GetIdxFiles(CASCConfig config)
        {
            List <string> latestIdx = new List <string>();

            string dataFolder = CASCGame.GetDataFolder(config.GameType);
            string dataPath   = Path.Combine(dataFolder, "data");

            for (int i = 0; i < 0x10; ++i)
            {
                var files = Directory.EnumerateFiles(Path.Combine(config.BasePath, dataPath), string.Format("{0:X2}*.idx", i));

                if (files.Count() > 0)
                {
                    latestIdx.Add(files.Last());
                }
            }

            return(latestIdx);
        }
        private void OpenIndexFile(string archive, int i)
        {
            try
            {
                string dataFolder = CASCGame.GetDataFolder(config.GameType);

                string path = Path.Combine(config.BasePath, dataFolder, "indices", archive + ".index");

                if (File.Exists(path))
                {
                    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                        ParseIndex(fs, i);
                }
                else
                {
                    DownloadIndexFile(archive, i);
                }
            }
            catch (Exception exc)
            {
                throw new Exception($"OpenFile failed: {archive} - {exc}");
            }
        }
Пример #6
0
        public static CASCConfig LoadLocalStorageConfig(string basePath, string product, ILoggerOptions loggerOptions = null)
        {
            string buildInfoPath = Path.Combine(basePath, ".build.info");

            if (!File.Exists(buildInfoPath))
            {
                throw new Exception("Local mode not supported for this game!");
            }

            Logger.Init(loggerOptions);

            var config = new CASCConfig {
                OnlineMode = false, BasePath = basePath, Product = product
            };

            using (Stream buildInfoStream = new FileStream(buildInfoPath, FileMode.Open))
            {
                config._BuildInfo = VerBarConfig.ReadVerBarConfig(buildInfoStream);
            }

            CASCGameType gameType;

            if (!HasConfigVariable(config._BuildInfo, "Product"))
            {
                var detectedGameType = CASCGame.DetectLocalGame(basePath, product, config.GetBuildInfoVariable("BuildKey"));
                if (detectedGameType.HasValue)
                {
                    gameType = detectedGameType.Value;
                }
                else
                {
                    throw new Exception($"No product {product} found at {basePath}");
                }
            }
            else
            {
                string productUid = config.GetBuildInfoVariable("Product");

                if (productUid == null)
                {
                    throw new Exception($"No product {product} found at {basePath}");
                }

                gameType = CASCGame.DetectGameByUid(product);
            }

            config.GameType = gameType;

            string dataFolder = CASCGame.GetDataFolder(config.GameType);

            config.ActiveBuild = 0;

            config._Builds = new List <KeyValueConfig>();

            if (File.Exists("fakebuildconfig"))
            {
                using (Stream stream = new FileStream("fakebuildconfig", FileMode.Open))
                {
                    var cfg = KeyValueConfig.ReadKeyValueConfig(stream);
                    config._Builds.Add(cfg);
                }
            }
            else
            {
                string buildKey = config.GetBuildInfoVariable("BuildKey");
                //string buildKey = "5a05c58e28d0b2c3245954b6f4e2ae66";
                string buildCfgPath = Path.Combine(basePath, dataFolder, "config", buildKey.Substring(0, 2), buildKey.Substring(2, 2), buildKey);
                using (Stream stream = new FileStream(buildCfgPath, FileMode.Open))
                {
                    config._Builds.Add(KeyValueConfig.ReadKeyValueConfig(stream));
                }
            }

            if (File.Exists("fakecdnconfig"))
            {
                using (Stream stream = new FileStream("fakecdnconfig", FileMode.Open))
                {
                    config._CDNConfig = KeyValueConfig.ReadKeyValueConfig(stream);
                }
            }
            else
            {
                string cdnKey = config.GetBuildInfoVariable("CDNKey");
                //string cdnKey = "23d301e8633baaa063189ca9442b3088";
                string cdnCfgPath = Path.Combine(basePath, dataFolder, "config", cdnKey.Substring(0, 2), cdnKey.Substring(2, 2), cdnKey);
                using (Stream stream = new FileStream(cdnCfgPath, FileMode.Open))
                {
                    config._CDNConfig = KeyValueConfig.ReadKeyValueConfig(stream);
                }
            }

            CDNCache.Init(config);

            return(config);
        }