예제 #1
0
        public void Clear()
        {
            CDNIndexData.Clear();
            CDNIndexData = null;

            CASCConfig = null;
            downloader = null;
        }
예제 #2
0
파일: CASCEngine.cs 프로젝트: Kruithne/W3DT
        private CASCEngine(CASCConfig config)
        {
            Config = config;

            Log.Write("CASC: Loading indexes...");
            CDNIndex = CDNIndexHandler.Initialize(config);

            Log.Write("CASC: Loaded {0} indexes", CDNIndex.Count);

            if (!Program.Settings.UseRemote)
            {
                CDNIndexHandler.Cache.Enabled = false;

                Log.Write("CASC: Loading indexes from local storage...");
                LocalIndex = LocalIndexHandler.Initialize(config);

                Log.Write("CASC: Loaded {0} indexes from local storage", LocalIndex.Count);
            }

            EventManager.Trigger_LoadStepDone();

            Log.Write("CASC: Loading encoding data...");
            using (var stream = OpenEncodingFile(this))
                EncodingHandler = new EncodingHandler(stream);

            Log.Write("CASC: Loaded {0} encoding data entries", EncodingHandler.Count);

            if ((CASCConfig.LoadFlags & LoadFlags.Download) != 0)
            {
                Log.Write("CASC: Loading download data...");

                using (var stream = OpenDownloadFile(EncodingHandler, this))
                    DownloadHandler = new DownloadHandler(stream);

                Log.Write("CASC: Loaded {0} download data entries", EncodingHandler.Count);
            }

            EventManager.Trigger_LoadStepDone();
            Log.Write("CASC: Loading root data...");

            using (var stream = OpenRootFile(EncodingHandler, this))
                RootHandler = new RootHandler(stream);

            Log.Write("CASC: Loaded {0} root data entries", RootHandler.Count);

            if ((CASCConfig.LoadFlags & LoadFlags.Install) != 0)
            {
                Log.Write("CASC: Loading install data...");

                using (var stream = OpenInstallFile(EncodingHandler, this))
                    InstallHandler = new InstallHandler(stream);

                Log.Write("CASC: Loaded {0} install data entries", InstallHandler.Count);
            }
            EventManager.Trigger_LoadStepDone();
        }
예제 #3
0
        public static Stream OpenConfigFileDirect(CASCConfig cfg, string key)
        {
            string file = Program.Settings.RemoteHostPath + "/config/" + key.Substring(0, 2) + "/" + key.Substring(2, 2) + "/" + key;
            string url = string.Format("http://{0}/{1}", Program.Settings.RemoteHost, file);

            Stream stream = Cache.OpenFile(file, url, false);

            if (stream != null)
                return stream;

            return OpenFileDirect(url);
        }
예제 #4
0
        private static List<string> GetIdxFiles(CASCConfig config)
        {
            List<string> latestIdx = new List<string>();
            string dataPath = Path.Combine(Program.Settings.WoWDirectory, @"Data\data");

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

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

            return latestIdx;
        }
예제 #5
0
        public static LocalIndexHandler Initialize(CASCConfig config)
        {
            LocalIndexHandler handler = new LocalIndexHandler();
            List<string> idxFiles = GetIdxFiles(config);

            if (idxFiles.Count == 0)
                throw new FileNotFoundException("idx files missing!");

            foreach (string idx in idxFiles)
                handler.ParseIndex(idx);

            Log.Write("CASC: LocalIndexHandler loaded {0} indexes", handler.Count);

            return handler;
        }
예제 #6
0
        public static CDNIndexHandler Initialize(CASCConfig config)
        {
            CDNIndexHandler handler = new CDNIndexHandler(config);

            for (int i = 0; i < config.Archives.Count; i++)
            {
                string archive = config.Archives[i];

                if (Program.Settings.UseRemote)
                    handler.DownloadIndexFile(archive, i);
                else
                    handler.OpenIndexFile(archive, i);
            }

            return handler;
        }
예제 #7
0
 private CDNIndexHandler(CASCConfig cascConfig)
 {
     CASCConfig = cascConfig;
     downloader = new SyncDownloader();
 }
예제 #8
0
파일: CASCEngine.cs 프로젝트: Kruithne/W3DT
 public static CASCEngine OpenStorage(CASCConfig config) => Open(config);
예제 #9
0
파일: CASCEngine.cs 프로젝트: Kruithne/W3DT
 private static CASCEngine Open(CASCConfig config)
 {
     return new CASCEngine(config);
 }
예제 #10
0
파일: CASCConfig.cs 프로젝트: Kruithne/W3DT
        public static CASCConfig LoadOnlineStorageConfig()
        {
            var config = new CASCConfig();
            string usingRegion = null;

            try
            {
                usingRegion = Constants.CDN_REGIONS[0];

                using (var stream = CDNIndexHandler.OpenFileDirect(string.Format(Constants.CDN_CONFIG_URL, usingRegion)))
                    config.CDNData = VerBarConfig.ReadVerBarConfig(stream);

                using (Stream stream = CDNIndexHandler.OpenFileDirect(string.Format(Constants.CDN_VERSION_URL, usingRegion)))
                    config.VersionsData = VerBarConfig.ReadVerBarConfig(stream);
            }
            catch
            {
                usingRegion = Constants.CDN_REGIONS[1];

                using (var stream = CDNIndexHandler.OpenFileDirect(string.Format(Constants.CDN_CONFIG_URL, usingRegion)))
                    config.CDNData = VerBarConfig.ReadVerBarConfig(stream);

                using (Stream stream = CDNIndexHandler.OpenFileDirect(string.Format(Constants.CDN_VERSION_URL, usingRegion)))
                    config.VersionsData = VerBarConfig.ReadVerBarConfig(stream);
            }

            if (usingRegion == null)
                throw new Exception("Unable to access default CDN servers for config/versioning.");

            for (int i = 0; i < config.VersionsData.Count; i++)
            {
                if (config.VersionsData[i]["Region"] == usingRegion)
                {
                    config.versionIndex = i;
                    break;
                }
            }

            string cdnKey = config.VersionsData[config.versionIndex]["CDNConfig"];
            using (Stream stream = CDNIndexHandler.OpenConfigFileDirect(config, cdnKey))
                config.CDNConfig = KeyValueConfig.ReadKeyValueConfig(stream);

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

            using (Stream stream = CDNIndexHandler.OpenConfigFileDirect(config, config.VersionsData[config.versionIndex]["BuildConfig"]))
            {
                var buildConfig = KeyValueConfig.ReadKeyValueConfig(stream);
                config.Builds.Add(buildConfig);
            }

            return config;
        }
예제 #11
0
파일: CASCConfig.cs 프로젝트: Kruithne/W3DT
        public static CASCConfig LoadLocalStorageConfig()
        {
            var config = new CASCConfig();
            string buildInfoPath = Path.Combine(Program.Settings.WoWDirectory, Constants.WOW_BUILD_FILE);

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

            Dictionary<string, string> buildInfo = config.GetActiveBuild();
            if (buildInfo == null)
                throw new Exception("BuildInfo missing!");

            string configFolder = Path.Combine(Program.Settings.WoWDirectory, @"Data\config");
            config.ActiveBuild = 0;
            config.Builds = new List<KeyValueConfig>();

            string buildKey = buildInfo["BuildKey"];
            string buildCfgPath = Path.Combine(configFolder, 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 = buildInfo["CDNKey"];
            string cdnCfgPath = Path.Combine(configFolder, cdnKey.Substring(0, 2), cdnKey.Substring(2, 2), cdnKey);
            using (Stream stream = new FileStream(cdnCfgPath, FileMode.Open))
                config.CDNConfig = KeyValueConfig.ReadKeyValueConfig(stream);

            return config;
        }