Exemplo n.º 1
0
        /// <summary>
        ///     Loads data from disk
        /// </summary>
        /// <param name="basePath"></param>
        /// <param name="useKeyring"></param>
        /// <param name="loadMultipleLangs"></param>
        /// <returns></returns>
        public static CASCConfig LoadLocalStorageConfig(string basePath, bool useKeyring, bool loadMultipleLangs)
        {
            CASCConfig config = new CASCConfig {
                OnlineMode = false,
                BasePath   = basePath
            };

            try {
                string productDbPath = Path.Combine(basePath, ".product.db");
                config.InstallData = new ProductDatabase(productDbPath, true).Data.ProductInstalls[0];
            } catch { }

            config.SpeechLanguage = config.InstallData?.Settings?.SelectedSpeechLanguage ?? "enUS";
            config.TextLanguage   = config.InstallData?.Settings?.SelectedTextLanguage ?? "enUS";

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

            using (Stream buildInfoStream = new FileStream(buildInfoPath, FileMode.Open)) {
                config._buildInfo = BarSeparatedConfig.Read(buildInfoStream);
            }

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

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

            string dataFolder = GetDataFolder();

            config.ActiveBuild = 0;

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

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

            try {
                using (Stream stream = new FileStream(buildCfgPath, FileMode.Open)) {
                    config.Builds.Add(KeyValueConfig.Read(stream));
                }
            } catch {
                using (Stream stream = CDNIndexHandler.OpenConfigFileDirect(config, buildKey)) {
                    config.Builds.Add(KeyValueConfig.Read(stream));
                }
            }

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

            try {
                using (Stream stream = new FileStream(cdnCfgPath, FileMode.Open)) {
                    config._cdnConfig = KeyValueConfig.Read(stream);
                }
            } catch {
                using (Stream stream = CDNIndexHandler.OpenConfigFileDirect(config, cdnKey)) {
                    config._cdnConfig = KeyValueConfig.Read(stream);
                }
            }

            if (bi.ContainsKey("Keyring") && bi["Keyring"].Length > 0)
            {
                string keyringKey     = bi["Keyring"];
                string keyringCfgPath = Path.Combine(basePath, dataFolder, "config", keyringKey.Substring(0, 2), keyringKey.Substring(2, 2), keyringKey);
                try {
                    using (Stream stream = new FileStream(keyringCfgPath, FileMode.Open)) {
                        config.KeyRing = KeyValueConfig.Read(stream);
                    }
                } catch {
                    using (Stream stream = CDNIndexHandler.OpenConfigFileDirect(config, keyringKey)) {
                        config.KeyRing = KeyValueConfig.Read(stream);
                    }
                }
                if (useKeyring)
                {
                    config.LoadKeyringKeys(TACTKeyService.Keys, true);
                }
            }

            config.InstalledLanguages        = new HashSet <string>();
            config.LoadAllInstalledLanguages = loadMultipleLangs;
            if (bi.ContainsKey("Tags") && bi["Tags"].Trim().Length > 0)
            {
                string[] tags = bi["Tags"].Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string tag in tags)
                {
                    try {
                        Enum.Parse(typeof(LocaleFlags), tag.Substring(0, 4));
                        config.InstalledLanguages.Add(tag);
                    } catch { }
                }
            }

            // for debugging:
            //var buildInfo = config.Builds[config.ActiveBuild];

            return(config);
        }