Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            });
        }
Esempio n. 3
0
        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}");
                }
            }
        }
Esempio n. 4
0
        /// <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);
                            }
                        }
                    }
                });
            });
        }