/// <summary> /// Parse blueprint file /// </summary> /// <param name="stream">Blueprint stream</param> /// <param name="isScenario">Is scenario file</param> /// <returns></returns> private void ParseBlueprint(Stream istream, string debugFname, bool isScenario = false) { Stream stream = new MemoryStream(); istream.CopyTo(stream); istream.Close(); stream.Seek(0, SeekOrigin.Begin); if (stream.Length > 4) { if (Utils.CheckIsSerz(stream)) { SerzReader sr = new SerzReader(stream, debugFname); if (isScenario) { lock (ScenarioDeps) ScenarioDeps.UnionWith(sr.GetDependencies()); } else { lock (Dependencies) Dependencies.UnionWith(sr.GetDependencies()); } } else { ParseXMLBlueprint(stream, isScenario); } } }
private void ParseAPEntry(ZipFile file, ZipEntry entry, bool isScenario = false) { try { Stream inputStream = file.GetInputStream(entry); if (inputStream.CanRead && inputStream.CanSeek) { string ext = Path.GetExtension(entry.Name).ToLower(); if (ext == ".xml") { ParseBlueprint(inputStream, isScenario); } else if (ext == ".bin") { SerzReader sr = new SerzReader(inputStream); if (isScenario) { lock (ScenarioDeps) ScenarioDeps.UnionWith(sr.GetDependencies()); } else { lock (Dependencies) Dependencies.UnionWith(sr.GetDependencies()); } } ReportProgress(entry.Size); } } catch (Exception e) { if (e.GetType() != typeof(ThreadInterruptedException) && e.GetType() != typeof(ThreadAbortException)) { Trace.Assert(false, $"Error when reading gzip entry of file \"{file.Name}\":\n{e}"); } } }
/// <summary> /// Get scenery depencencies /// </summary> /// <param name="path">Route scenery directory</param> /// <returns></returns> private async Task GetSceneryDependencies(string path) { await Task.Run(() => { // Foreach all Network files foreach (string file in Directory.GetFiles(path, "*.bin")) { SerzReader sr = new SerzReader(file); lock (Dependencies) Dependencies.UnionWith(sr.GetDependencies()); ReportProgress(file); } }); }
/// <summary> /// Get scenarios dependencies /// </summary> /// <param name="scenariosDir">Scenarios dir</param> /// <returns></returns> private async Task GetScenariosDependencies(string scenariosDir) { await Task.Run(() => { string[] dirs = Directory.GetDirectories(scenariosDir); int maxThreads = Math.Min(Environment.ProcessorCount, dirs.Length); Parallel.For(0, maxThreads, workerId => { int max = dirs.Length * (workerId + 1) / maxThreads; for (int i = dirs.Length *workerId / maxThreads; i < max; i++) { // Foreach all scenario files foreach (string file in Directory.GetFiles(dirs[i], "*", SearchOption.AllDirectories)) { string ext = Path.GetExtension(file).ToLower(); if (ext == ".bin") { SerzReader sr = new SerzReader(file); lock (ScenarioDeps) ScenarioDeps.UnionWith(sr.GetDependencies()); ReportProgress(file); } else if (ext == ".xml") { ParseBlueprint(file, true); ReportProgress(file); } } } }); }); }