Ejemplo n.º 1
0
        public async Task <int> Open(
            FilePath path,
            IEnumerable <IModListingGetter> loadOrder,
            CancellationToken cancel)
        {
            using var loadOrderFile = _loadOrderProvider.Get(loadOrder);

            return(await _processRunner.Run(
                       _runProcessStartInfoProvider.GetStart("SettingsHost/Synthesis.Bethesda.SettingsHost.exe", directExe: true, new HostSettings()
            {
                PatcherName = _nameProvider.Name,
                PatcherPath = path,
                Left = (int)_windowPlacement.Left,
                Top = (int)_windowPlacement.Top,
                Height = (int)_windowPlacement.Height,
                Width = (int)_windowPlacement.Width,
                LoadOrderFilePath = loadOrderFile.File.Path,
                DataFolderPath = _dataDirectoryProvider.Path,
                GameRelease = _gameReleaseContext.Release,
            }),
                       cancel : cancel).ConfigureAwait(false));
        }
        public PatcherRunnabilityCliState(
            ICompilationProvider compilationProvider,
            IProfileDataFolderVm dataFolder,
            IProfileLoadOrder loadOrder,
            IExecuteRunnabilityCheck checkRunnability,
            ITemporaryLoadOrderProvider temporaryLoadOrderProvider,
            ILogger logger)
        {
            Runnable = Observable.CombineLatest(
                compilationProvider.State,
                dataFolder.WhenAnyValue(x => x.Path),
                loadOrder.LoadOrder.Connect()
                .QueryWhenChanged()
                .StartWith(ListExt.Empty <ReadOnlyModListingVM>()),
                (comp, data, loadOrder) => (comp, data, loadOrder))
                       .Select(i =>
            {
                return(Observable.Create <ConfigurationState <RunnerRepoInfo> >(async(observer, cancel) =>
                {
                    if (i.comp.RunnableState.Failed)
                    {
                        observer.OnNext(i.comp);
                        return;
                    }

                    logger.Information("Checking runnability");
                    // Return early with the values, but mark not complete
                    observer.OnNext(new ConfigurationState <RunnerRepoInfo>(i.comp.Item)
                    {
                        IsHaltingError = false,
                        RunnableState = ErrorResponse.Fail("Checking runnability")
                    });

                    try
                    {
                        using var tmpLoadOrder = temporaryLoadOrderProvider.Get(
                                  i.loadOrder.Select <ReadOnlyModListingVM, IModListingGetter>(lvm => lvm));
                        var runnability = await checkRunnability.Check(
                            path: i.comp.Item.ProjPath,
                            directExe: false,
                            cancel: cancel,
                            buildMetaPath: i.comp.Item.MetaPath,
                            loadOrderPath: tmpLoadOrder.File).ConfigureAwait(false);
                        if (runnability.Failed)
                        {
                            logger.Information($"Checking runnability failed: {runnability.Reason}");
                            observer.OnNext(runnability.BubbleFailure <RunnerRepoInfo>());
                            return;
                        }

                        // Return things again, without error
                        logger.Information("Checking runnability succeeded");
                        observer.OnNext(i.comp);
                    }
                    catch (Exception ex)
                    {
                        var str = $"Error checking runnability on runner repository: {ex}";
                        logger.Error(str);
                        observer.OnNext(ErrorResponse.Fail(str).BubbleFailure <RunnerRepoInfo>());
                    }

                    observer.OnCompleted();
                }));
            })
                       .Switch()
                       .Replay(1)
                       .RefCount();
        }