/// <summary>
        /// Download requested Spring version, then call SetEnginePath() after finishes.
        /// Parameter "forSpringPaths" allow you to set a custom SpringPath for which to call SetEnginePath()
        /// on behalf off (is useful for Autohost which run multiple Spring version but is sharing single downloader)
        /// </summary>
        public Download GetAndSwitchEngine(string version, SpringPaths forSpringPaths = null)
        {
            if (forSpringPaths == null)
            {
                forSpringPaths = SpringPaths;
            }
            lock (downloads) {
                downloads.RemoveAll(x => x.IsAborted || x.IsComplete != null); // remove already completed downloads from list}
                var existing = downloads.SingleOrDefault(x => x.Name == version);
                if (existing != null)
                {
                    return(existing);
                }

                if (SpringPaths.HasEngineVersion(version))
                {
                    forSpringPaths.SetEnginePath(SpringPaths.GetEngineFolderByVersion(version));
                    return(null);
                }
                else
                {
                    var down = new EngineDownload(version, forSpringPaths);
                    downloads.Add(down);
                    DownloadAdded.RaiseAsyncEvent(this, new EventArgs <Download>(down));
                    down.Start();
                    return(down);
                }
            }
        }
        public UnitSync(SpringPaths springPaths, string engine)
        {
            lock (unitsyncInitLocker)
            {
                paths = springPaths;
                originalDirectory = Directory.GetCurrentDirectory();

                var unitSyncPath = paths.GetEngineFolderByVersion(engine);
                Trace.TraceInformation("UnitSync: Directory: {0}", unitSyncPath);
                Trace.TraceInformation("UnitSync: ZKL: {0}", originalDirectory);

                originalPathVariable = Environment.GetEnvironmentVariable("PATH");
                if (originalPathVariable?.Contains(unitSyncPath) != true)
                    Environment.SetEnvironmentVariable("PATH",
                        $"{originalPathVariable}{(Environment.OSVersion.Platform == PlatformID.Unix ? ":" : ";")}{unitSyncPath}",
                        EnvironmentVariableTarget.Process);

                //Directory.SetCurrentDirectory(paths.UnitSyncDirectory);
                Environment.CurrentDirectory = unitSyncPath;
                var settingsPath = Path.Combine(unitSyncPath, "springsettings.cfg");
                File.WriteAllText(settingsPath, $"SpringData={paths.GetJoinedDataDirectoriesWithEngine(engine)}\n");
                if (!NativeMethods.Init(false, 666)) throw new UnitSyncException("Unitsync initialization failed. " + NativeMethods.GetNextError());

                Version = NativeMethods.GetSpringVersion();
                UnitsyncWritableFolder = NativeMethods.GetWritableDataDirectory();
                var read = NativeMethods.GetDataDirectories();
                Trace.TraceInformation("UnitSync version: {0}", Version);
                Trace.TraceInformation("UnitSync READ: {0}", string.Join(",", read));
                Trace.TraceInformation("UnitSync WRITE: {0}", UnitsyncWritableFolder);

                TraceErrors();

                Trace.TraceInformation("UnitSync Initialized");
            }
        }
        public Dictionary <string, EngineConfigEntry> GetEngineConfigOptions(SpringPaths paths, string engine)
        {
            Trace.TraceInformation("Extracting configuration from Spring located in {0}", paths.GetEngineFolderByVersion(engine));
            var sb = new StringBuilder();
            var p  = new Process();

            p.StartInfo.CreateNoWindow  = true;
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.Arguments      += string.Format("--list-config-vars");
            p.StartInfo.EnvironmentVariables["SPRING_DATADIR"] = paths.WritableDirectory;
            p.StartInfo.EnvironmentVariables.Remove("SPRING_ISOLATED");
            p.StartInfo.FileName               = paths.GetSpringExecutablePath(engine);
            p.StartInfo.WorkingDirectory       = Path.GetDirectoryName(paths.GetSpringExecutablePath(engine));
            p.StartInfo.RedirectStandardOutput = true;
            p.OutputDataReceived              += (sender, args) => sb.AppendLine(args.Data);
            p.Start();
            p.BeginOutputReadLine();
            p.WaitForExit(3000);
            sb.AppendLine(); //append terminator

            var text         = sb.ToString();
            int whereIsTable = text.IndexOf('{');

            text = text.Substring(whereIsTable); // skip empty line or other info (if exist). Compatibility with Spring 94+
            var data = JsonConvert.DeserializeObject <Dictionary <string, EngineConfigEntry> >(text);

            return(data);
        }
Esempio n. 4
0
        public UnitSync(SpringPaths springPaths) {
            lock (unitsyncInitLocker)
            {
                paths = springPaths;
                //Getting the directory of this application instead of the non-constant currentDirectory. Reference: http://stackoverflow.com/questions/52797/how-do-i-get-the-path-of-the-assembly-the-code-is-in
                originalDirectory = springPaths.WritableDirectory;
                Trace.TraceInformation("UnitSync: Directory: {0}", paths.UnitSyncDirectory);
                Trace.TraceInformation("UnitSync: ZKL: {0}", originalDirectory);

                originalPathVariable = Environment.GetEnvironmentVariable("PATH");
                if (originalPathVariable?.Contains(paths.UnitSyncDirectory) != true) Environment.SetEnvironmentVariable("PATH",
                    $"{originalPathVariable}{(Environment.OSVersion.Platform == PlatformID.Unix ? ":" : ";")}{paths.UnitSyncDirectory}", EnvironmentVariableTarget.Process);

                //Directory.SetCurrentDirectory(paths.UnitSyncDirectory);
                Environment.CurrentDirectory = paths.UnitSyncDirectory;
                var settingsPath = Path.Combine(paths.UnitSyncDirectory, "springsettings.cfg");
                File.WriteAllText(settingsPath, $"SpringData={paths.DataDirectoriesJoined}\n");
                if (!NativeMethods.Init(false, 666)) throw new UnitSyncException("Unitsync initialization failed. " + NativeMethods.GetNextError());

                Version = NativeMethods.GetSpringVersion();
                UnitsyncWritableFolder = NativeMethods.GetWritableDataDirectory();
                var read = NativeMethods.GetDataDirectories();
                Trace.TraceInformation("UnitSync version: {0}", Version);
                Trace.TraceInformation("UnitSync READ: {0}", string.Join(",", read));
                Trace.TraceInformation("UnitSync WRITE: {0}", UnitsyncWritableFolder);

                TraceErrors();
                Trace.TraceInformation("UnitSync Initialized");

            }
        }
Esempio n. 5
0
        public Main(string path)
        {
            RootWorkPath = path;
            LoadConfig();
            Config.RestartCounter++;
            if (Config.RestartCounter > 3)
            {
                Config.RestartCounter = 0;
            }
            SaveConfig();
            paths = new SpringPaths(Path.GetDirectoryName(Config.ExecutableName), writableFolderOverride: Config.DataDir);
            if (!string.IsNullOrEmpty(Config.ExecutableName))
            {
                paths.OverrideDedicatedServer(Config.ExecutableName);
            }
            paths.MakeFolders();

            MetaCache = new MetaDataCache(paths, null);

            timer           = new Timer(30000);
            timer.Elapsed  += timer_Elapsed;
            timer.AutoReset = true;
            timer.Start();

            Downloader = new PlasmaDownloader.PlasmaDownloader(Config, null, paths);
        }
Esempio n. 6
0
 public PlasmaDownloader(IResourcePresenceChecker checker, SpringPaths paths)
 {
     SpringPaths  = paths;
     this.scanner = checker;
     //torrentDownloader = new TorrentDownloader(this);
     packageDownloader = new PackageDownloader(this);
 }
Esempio n. 7
0
        public ZkLobbyServer(string geoIPpath, IPlanetwarsEventCreator creator, ITopPlayerProvider topPlayerProvider)
        {
            RatingSystems.Init();

            TopPlayerProvider      = topPlayerProvider;
            PlanetWarsEventCreator = creator;
            var entry = Assembly.GetExecutingAssembly();

            Version = entry.GetName().Version.ToString();
            Engine  = MiscVar.DefaultEngine;

            SpringPaths = new SpringPaths(GlobalConst.SpringieDataDir, false, false);
            Downloader  = new PlasmaDownloader.PlasmaDownloader(null, SpringPaths);
            Downloader.GetResource(DownloadType.ENGINE, MiscVar.DefaultEngine);
            Downloader.PackageDownloader.DoMasterRefresh();

            Game = Downloader.PackageDownloader.GetByTag(GlobalConst.DefaultZkTag).InternalName;

            LoginChecker = new LoginChecker(this, geoIPpath);
            SteamWebApi  = new SteamWebApi(GlobalConst.SteamAppID, new Secrets().GetSteamWebApiKey());
            chatRelay    = new ChatRelay(this, new List <string>()
            {
                "zkdev", "sy", "moddev", "weblobbydev", "ai", "zk", "zkmap", "springboard", GlobalConst.ModeratorChannel, GlobalConst.CoreChannel
            });
            textCommands         = new ServerTextCommands(this);
            ChannelManager       = new ChannelManager(this);
            MatchMaker           = new MatchMaker(this);
            battleListUpdater    = new BattleListUpdater(this);
            PartyManager         = new PartyManager(this);
            PlanetWarsMatchMaker = new PlanetWarsMatchMaker(this);
        }
            public MemoryStream ReadFile(SpringPaths paths, string namePath)
            {
                var sdpPath   = Path.Combine(paths.WritableDirectory, "packages", $"{Hash}.sdp");
                var sdpZkPath = Path.ChangeExtension(sdpPath, "sdpzk");

                return(ReadFileFromSdp(paths, namePath, sdpPath) ?? ReadFileFromSdp(paths, namePath, sdpZkPath));
            }
Esempio n. 9
0
        static void Main()
        {
            Trace.Listeners.Add(new ConsoleTraceListener());
            Paths   = new SpringPaths(null);
            Scanner = new SpringScanner(Paths);

            Scanner.LocalResourceAdded   += (s, e) => Trace.TraceInformation("New resource found: {0}", e.Item.InternalName);
            Scanner.LocalResourceRemoved += (s, e) => Trace.TraceInformation("Resource removed: {0}", e.Item.InternalName);

            SpringScanner.MapRegistered += (s, e) => Trace.TraceInformation("Map registered: {0}", e.MapName);
            SpringScanner.ModRegistered += (s, e) => Trace.TraceInformation("Mod registered: {0}", e.Data.Name);

            Scanner.Start();
            Downloader = new PlasmaDownloader.PlasmaDownloader(new Config(), Scanner, Paths);
            Downloader.DownloadAdded += (s, e) => Trace.TraceInformation("Download started: {0}", e.Data.Name);
            Downloader.GetAndSwitchEngine(GlobalConst.DefaultEngineOverride); //for ZKL equivalent, see PlasmaShared/GlobalConst.cs
            Downloader.PackagesChanged += Downloader_PackagesChanged;

            while (true)
            {
                Thread.Sleep(10000);
            }

            /*Application.EnableVisualStyles();
             * Application.SetCompatibleTextRenderingDefault(false);
             * Application.Run(new Form1());*/
        }
Esempio n. 10
0
        public static Batch Load(string path, SpringPaths springPaths)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            var batch = JsonConvert.DeserializeObject <Batch>(File.ReadAllText(path));

            batch.PostLoad(springPaths);
            return(batch);
        }
Esempio n. 11
0
 public PlasmaDownloader(IPlasmaDownloaderConfig config, SpringScanner scanner, SpringPaths springPaths)
 {
     SpringPaths  = springPaths;
     Config       = config;
     this.scanner = scanner;
     //torrentDownloader = new TorrentDownloader(this);
     packageDownloader = new PackageDownloader(this);
 }
        public static void DeployAndResetConfigs(SpringPaths paths, PackageDownloader.Version ver)
        {
            if (ver != null)
            {
                var  oldVers  = LoadFromDisk(paths) ?? new ConfigVersions();
                var  newVers  = LoadFromChobby(ver, paths);
                bool hasError = false;

                if (newVers != null)
                {
                    foreach (
                        var versionEntry in newVers.Versions.Where(x => string.IsNullOrEmpty(x.Platform) || x.Platform == paths.Platform.ToString()))
                    {
                        try
                        {
                            var target = Path.Combine(paths.WritableDirectory, versionEntry.TargetPath);

                            if (
                                !oldVers.Versions.Any(
                                    x =>
                                    x.TargetPath == versionEntry.TargetPath && x.VersionNumber >= versionEntry.VersionNumber &&
                                    x.Platform == versionEntry.Platform) || !File.Exists(target))
                            {
                                var dirName = Path.GetDirectoryName(target);
                                if (!Directory.Exists(dirName))
                                {
                                    Directory.CreateDirectory(dirName);
                                }

                                var content = ver.ReadFile(paths, versionEntry.SourcePath);
                                if (content != null)
                                {
                                    var targetBytes = content.ToArray();

                                    if (!File.Exists(target) || !Hash.ByteArrayEquals(File.ReadAllBytes(target), targetBytes))
                                    {
                                        File.WriteAllBytes(target, targetBytes);
                                    }
                                }
                                else
                                {
                                    File.Delete(target);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            hasError = true;
                            Trace.TraceError("Error processing file deployment {0} : {1}", versionEntry.SourcePath, ex);
                        }
                    }
                }
                if (!hasError)
                {
                    (newVers ?? oldVers).SaveToDisk(paths);
                }
            }
        }
Esempio n. 13
0
 public Chobbyla(string rootPath, string chobbyTagOverride, string engineOverride)
 {
     paths      = new SpringPaths(rootPath, false, true);
     chobbyTag  = chobbyTagOverride ?? GlobalConst.DefaultChobbyTag;
     isDev      = (chobbyTag == "dev") || (chobbyTag == "chobby:dev") || (chobbyTag == "zkmenu:dev");
     IsSteam    = File.Exists(Path.Combine(paths.WritableDirectory, "steamfolder.txt"));
     engine     = engineOverride;
     downloader = new PlasmaDownloader.PlasmaDownloader(null, paths);
 }
        private static ConfigVersions LoadFromChobby(PackageDownloader.Version ver, SpringPaths paths)
        {
            var ms = ver?.ReadFile(paths, FilePathInChobby);

            if (ms != null)
            {
                return(TryDeserialize(Encoding.UTF8.GetString(ms.ToArray())));
            }
            return(null);
        }
Esempio n. 15
0
        public PackageDownload(string urlRoot, string displayName, Hash hash, SpringPaths paths)
        {
            this.paths   = paths;
            this.urlRoot = urlRoot;
            pool         = new Pool(paths);

            PackageHash    = hash;
            Name           = displayName;
            fileListWebGet = new WebDownload();
        }
        private static ConfigVersions LoadFromDisk(SpringPaths paths)
        {
            var filePath = Path.Combine(paths.WritableDirectory, FilePathOnDisk);

            if (File.Exists(filePath))
            {
                return(TryDeserialize(File.ReadAllText(filePath)));
            }
            return(null);
        }
 public ServerImagesHandler(SpringPaths springPaths, TasClient tas)
 {
     basePath              = Utils.MakePath(springPaths.WritableDirectory, "LuaUI", "Configs");
     tas.BattleUserJoined += (sender, args) =>
     {
         // preload avatar images on user join battle so that they are available ingame
         User us;
         if (tas.ExistingUsers.TryGetValue(args.UserName, out us))
         {
             GetAvatarImage(us);
             GetClanOrFactionImage(us);
         }
     };
 }
Esempio n. 18
0
        public void ConvertSdp2Sdz(SpringPaths paths, Hash sdpHash, string targetSdz, Action <double> progressIndicator = null)
        {
            var sdpPath = Path.Combine(paths.WritableDirectory, "packages", sdpHash + ".sdp");
            var tempSdz = Path.Combine(paths.WritableDirectory, "temp", sdpHash + ".sdz");

            SdpArchive fileList;

            using (var fs = new FileStream(sdpPath, FileMode.Open)) fileList = new SdpArchive(new System.IO.Compression.GZipStream(fs, System.IO.Compression.CompressionMode.Decompress));

            GenerateSdz(paths, fileList, tempSdz, progressIndicator);

            tempSdz.RenameWithOverwrite(targetSdz);
            sdpPath.RenameWithOverwrite(Path.ChangeExtension(sdpPath, "sdpzk")); // rename sdp -> sdpzk
        }
Esempio n. 19
0
        public MainForm(SpringPaths paths = null, SpringScanner scanner = null, PlasmaDownloader.PlasmaDownloader downloader = null)
        {
            InitializeComponent();
            if (paths != null)
            {
                springPaths = paths;
            }
            else
            {
                springPaths = new SpringPaths(null, writableFolderOverride: null);
            }
            if (scanner != null)
            {
                springScanner = scanner;
            }
            else
            {
                springScanner = new SpringScanner(springPaths);
                springScanner.Start();
            }
            if (downloader != null)
            {
                springDownloader = downloader;
            }
            else
            {
                springDownloader = new PlasmaDownloader.PlasmaDownloader(new PlasmaConfig(), springScanner, springPaths);
            }

            var timer = new Timer();

            timer.Tick += (sender, args) =>
            {
                tbDownloads.Clear();
                foreach (var d in springDownloader.Downloads.Where(x => x.IsComplete == null))
                {
                    tbDownloads.AppendText(string.Format("{1:F0}% {0}  ETA: {2}  {3}\n",
                                                         d.Name,
                                                         d.TotalProgress,
                                                         d.TimeRemaining,
                                                         d.IsComplete));
                }
            };
            timer.Interval = 1000;
            timer.Enabled  = true;



            tbEngine.Text = springPaths.SpringVersion;
        }
Esempio n. 20
0
 public static IEnumerable <Config> GetConfigs(SpringPaths paths, bool refresh = false)
 {
     if (refresh)
     {
         allConfigs = null;
     }
     if (allConfigs != null)
     {
         return(allConfigs);
     }
     allConfigs = new List <Config>();
     allConfigs = Batch.GetBenchmarkFolders(paths, "Configs").SelectMany(x => x.GetDirectories().Select(y => new Config(y.FullName))).ToList();
     return(allConfigs);
 }
Esempio n. 21
0
        internal static void LoadConfig()
        {
            var curConfPath = Path.Combine(StartupPath, Config.ConfigFileName);

            if (File.Exists(curConfPath))
            {
                Conf = Config.Load(curConfPath);
            }
            else
            {
                Conf            = Config.Load(Path.Combine(SpringPaths.GetMySpringDocPath(), Config.ConfigFileName));
                Conf.IsFirstRun = true; // treat import as a first run
            }
        }
Esempio n. 22
0
 public UnitSyncer(SpringPaths npaths, string nengine)
 {
     Paths  = npaths;
     Engine = nengine;
     if (string.IsNullOrEmpty(Engine) || !Paths.HasEngineVersion(Engine))
     {
         Trace.TraceWarning("UnitSyncer: Engine {0} not found, trying backup", Engine);
         Engine = Paths.GetEngineList().FirstOrDefault();
         if (Engine == null)
         {
             throw new Exception("UnitSyncer: No engine found for unitsync");
         }
     }
 }
Esempio n. 23
0
 /// <summary>
 /// Gets all benchamrks and caches them. Looks for folder Benchmarks and traverses paths up until found
 /// </summary>
 public static List <Benchmark> GetBenchmarks(SpringPaths paths, bool refresh = false)
 {
     if (refresh)
     {
         allBenchmarks = null;
     }
     if (allBenchmarks != null)
     {
         return(allBenchmarks);
     }
     allBenchmarks = new List <Benchmark>();
     allBenchmarks = Batch.GetBenchmarkFolders(paths, "games").SelectMany(x => x.GetDirectories("*.sdd").Select(y => new Benchmark(y.FullName))).ToList();
     return(allBenchmarks);
 }
Esempio n. 24
0
 public static IEnumerable <StartScript> GetStartScripts(SpringPaths paths, bool refresh = false)
 {
     if (refresh)
     {
         allStartScripts = null;
     }
     if (allStartScripts != null)
     {
         return(allStartScripts);
     }
     allStartScripts = new List <StartScript>();
     allStartScripts =
         Batch.GetBenchmarkFolders(paths, "Scripts").SelectMany(x => x.GetFiles("*.txt").Select(y => new StartScript(y.FullName))).ToList();
     return(allStartScripts);
 }
            private static MemoryStream ReadFileFromSdp(SpringPaths paths, string namePath, string sdpPath)
            {
                if (File.Exists(sdpPath))
                {
                    SdpArchive sdp;
                    using (var fs = new FileStream(sdpPath, FileMode.Open)) sdp = new SdpArchive(new GZipStream(fs, CompressionMode.Decompress));

                    var entry = sdp.Files.FirstOrDefault(x => x.Name.ToLower() == namePath.Replace('\\', '/').ToLower());
                    if (entry != null)
                    {
                        return(new Pool(paths).ReadFromStorageDecompressed(entry.Hash));
                    }
                }
                return(null);
            }
Esempio n. 26
0
        public ZkLobbyServer(string geoIPpath, IPlanetwarsEventCreator creator)
        {
            RatingSystems.Init();
            MapRatings.Init();


            PlanetWarsEventCreator = creator;
            var entry = Assembly.GetExecutingAssembly();

            Version = entry.GetName().Version.ToString();
            Engine  = MiscVar.DefaultEngine;

            SpringPaths = new SpringPaths(GlobalConst.SpringieDataDir, false, false);
            Downloader  = new PlasmaDownloader.PlasmaDownloader(null, SpringPaths);
            Downloader.GetResource(DownloadType.ENGINE, MiscVar.DefaultEngine);
            Downloader.PackageDownloader.DoMasterRefresh();

            Game = MiscVar.LastRegisteredZkVersion;

            LoginChecker = new LoginChecker(this, geoIPpath);
            SteamWebApi  = new SteamWebApi(GlobalConst.SteamAppID, new Secrets().GetSteamWebApiKey());
            chatRelay    = new ChatRelay(this, new List <string>()
            {
                "zkdev", "sy", "moddev", "weblobbydev", "ai", "zk", "zkmap", "springboard", GlobalConst.ModeratorChannel, GlobalConst.CoreChannel, "off-topic", "support", "modding", "crashreports"
            });
            textCommands         = new ServerTextCommands(this);
            ChannelManager       = new ChannelManager(this);
            MatchMaker           = new MatchMaker(this);
            battleListUpdater    = new BattleListUpdater(this);
            PartyManager         = new PartyManager(this);
            PlanetWarsMatchMaker = new PlanetWarsMatchMaker(this);
            NewsListManager      = new NewsListManager(this);
            LadderListManager    = new LadderListManager(this);
            ForumListManager     = new ForumListManager(this);

            SpawnAutohosts();

            RatingSystems.GetRatingSystems().ForEach(x => x.RatingsUpdated += (sender, data) =>
            {
                var db           = new ZkDataContext();
                var updatedUsers = ConnectedUsers.Select(c => c.Value.User.AccountID).Intersect(data.affectedPlayers).ToHashSet();
                db.Accounts.Where(acc => updatedUsers.Contains(acc.AccountID)).ForEach(p =>
                {
                    PublishAccountUpdate(p);
                    PublishUserProfileUpdate(p);
                });
            });
        }
Esempio n. 27
0
        /// <summary>
        /// Generates sdz archive from pool and file list
        /// </summary>
        private void GenerateSdz(SpringPaths paths, SdpArchive fileList, string tempSdz, Action <double> progressIndicator)
        {
            var pool = new Pool(paths);

            var dir = Path.GetDirectoryName(tempSdz);

            if (!Directory.Exists(dir))
            {
                Directory.CreateDirectory(dir);
            }
            if (File.Exists(tempSdz))
            {
                File.Delete(tempSdz);
            }

            long uncompressedTotalSize = fileList.Files.Sum(x => x.UncompressedSize);
            long uncompressedProgress  = 0;


            using (var fs = new FileStream(tempSdz, FileMode.Create, FileAccess.Write, FileShare.None))
                using (var zip = new ZipOutputStream(fs, false))
                {
                    zip.CompressionLevel         = CompressionLevel.BestSpeed;
                    zip.ParallelDeflateThreshold = 0;
                    foreach (var fl in fileList.Files)
                    {
                        zip.PutNextEntry(fl.Name);

                        // 0 means paralell deflate is used, -1 means it is disabled
                        if (fl.UncompressedSize > paralellZipForFilesAboveSize)
                        {
                            zip.ParallelDeflateThreshold = 0;
                        }
                        else
                        {
                            zip.ParallelDeflateThreshold = -1;
                        }

                        using (var itemStream = pool.ReadFromStorageDecompressed(fl.Hash)) itemStream.CopyTo(zip);

                        uncompressedProgress += fl.UncompressedSize;

                        progressIndicator?.Invoke((double)uncompressedProgress / uncompressedTotalSize);
                    }
                }
        }
Esempio n. 28
0
        void PostLoad(SpringPaths paths)
        {
            Benchmarks =
                Benchmarks.Select(
                    x =>
                    Benchmark.GetBenchmarks(paths).SingleOrDefault(y => y.BenchmarkPath == x.BenchmarkPath) ??
                    Benchmark.GetBenchmarks(paths).First(y => y.Name == x.Name)).ToList();

            foreach (var tr in TestCases)
            {
                tr.Config = Config.GetConfigs(paths).SingleOrDefault(x => x.ConfigPath == tr.Config.ConfigPath) ??
                            Config.GetConfigs(paths).First(x => x.Name == tr.Config.Name);

                tr.StartScript = StartScript.GetStartScripts(paths).SingleOrDefault(x => x.ScriptPath == tr.StartScript.ScriptPath) ??
                                 StartScript.GetStartScripts(paths).First(x => x.Name == tr.StartScript.Name);
            }
        }
Esempio n. 29
0
            public MemoryStream ReadFile(SpringPaths paths, string namePath)
            {
                var sdpPath = Path.Combine(paths.WritableDirectory, "packages", $"{Hash}.sdp");

                if (File.Exists(sdpPath))
                {
                    SdpArchive sdp;
                    using (var fs = new FileStream(sdpPath, FileMode.Open)) sdp = new SdpArchive(new GZipStream(fs, CompressionMode.Decompress));

                    var entry = sdp.Files.FirstOrDefault(x => x.Name.ToLower() == namePath.Replace('\\', '/').ToLower());
                    if (entry != null)
                    {
                        return(new Pool(paths).ReadFromStorageDecompressed(entry.Hash));
                    }
                }
                return(null);
            }
Esempio n. 30
0
        private async Task <bool> LaunchChobby(SpringPaths paths, string internalName, string engineVersion, int loopbackPort, TextWriter writer)
        {
            process = new Process {
                StartInfo = { CreateNoWindow = false, UseShellExecute = false }
            };

            paths.SetDefaultEnvVars(process.StartInfo, engineVersion);
            var widgetFolder = Path.Combine(paths.WritableDirectory); //, "LuaMenu", "Widgets");

            if (!Directory.Exists(widgetFolder))
            {
                Directory.CreateDirectory(widgetFolder);
            }
            File.WriteAllText(Path.Combine(widgetFolder, "chobby_wrapper_port.txt"), loopbackPort.ToString());

            process.StartInfo.FileName         = paths.GetSpringExecutablePath(engineVersion);
            process.StartInfo.WorkingDirectory = Path.GetDirectoryName(paths.GetSpringExecutablePath(engineVersion));
            process.StartInfo.Arguments        = $"--menu \"{internalName}\"";

            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError  = true;

            process.OutputDataReceived += (sender, args) => { writer.WriteLine(args.Data); };
            process.ErrorDataReceived  += (sender, args) => { writer.WriteLine(args.Data); };

            var tcs = new TaskCompletionSource <bool>();

            process.Exited += (sender, args) =>
            {
                var isCrash      = process.ExitCode != 0;
                var isHangKilled = (process.ExitCode == -805306369); // hanged, drawn and quartered
                if (isCrash)
                {
                    Trace.TraceWarning("Spring exit code is: {0}, {1}", process.ExitCode, isHangKilled ? "user-killed during hang" : "assuming crash");
                }
                tcs.TrySetResult(!isCrash || isHangKilled);
            };
            process.EnableRaisingEvents = true;
            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            return(await tcs.Task);
        }
Esempio n. 31
0
        public void RunTests(SpringPaths paths)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
            isAborted = false;
            var  result       = new BatchRunResult();
            bool usingOptirun = !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("OPTIRUN"));

            foreach (var tr in TestCases)
            {
                foreach (var b in Benchmarks)
                {
                    if (isAborted)
                    {
                        return;
                    }
                    b.ModifyModInfo(tr);
                    string log = null;
                    try {
                        run = new SpringRun();
                        log = run.Start(paths, tr, b);
                    } catch (Exception ex) {
                        Trace.TraceError(ex.ToString());
                    } finally {
                        b.RestoreModInfo();
                    }
                    try {
                        if (usingOptirun)  // leave some time for optimus/primus to rest
                        {
                            Thread.Sleep(5000);
                        }
                        result.AddRun(tr, b, log);
                        RunCompleted(tr, b, log);
                    } catch (Exception ex) {
                        Trace.TraceError(ex.ToString());
                    }
                }
            }
            if (isAborted)
            {
                return;
            }
            AllCompleted(result);
        }
Esempio n. 32
0
        public MainForm(SpringPaths paths, IResourcePresenceChecker scanner = null, PlasmaDownloader.PlasmaDownloader downloader = null)
        {
            InitializeComponent();
            springPaths = paths;
            if (scanner != null)
            {
                springScanner = scanner;
            }
            else
            {
                var pl = new PlasmaResourceChecker(springPaths);
                springScanner = pl;
                pl.Start();
            }
            if (downloader != null)
            {
                springDownloader = downloader;
            }
            else
            {
                springDownloader = new PlasmaDownloader.PlasmaDownloader(springScanner, springPaths);
            }

            timer       = new Timer();
            timer.Tick += (sender, args) =>
            {
                tbDownloads.Clear();
                foreach (var d in springDownloader.Downloads.Where(x => x.IsComplete == null))
                {
                    tbDownloads.AppendText(string.Format("{1:F0}% {0}  ETA: {2}  {3}\n",
                                                         d.Name,
                                                         d.TotalProgress,
                                                         d.TimeRemaining,
                                                         d.IsComplete));
                }
            };
            timer.Interval = 1000;
            timer.Enabled  = true;



            tbEngine.Text = GlobalConst.DefaultEngineOverride;
        }