void Init()
    {
        Parallel.ForEach(installers, installer =>
        {
            try
            {
                installer.Init();
            }
            catch (Exception ex)
            {
                eventAggregator.PublishOnUIThread(new FailureEvent
                {
                    FailureDescription = $"Failed to get release information for {installer.Name}",
                    FailureText        = ex.Message
                });
            }
        });

        var i = 0;

        Items = installers
                .OrderBy(x => x.ImageName)
                .Select(x => new Item
        {
            Order            = i++,
            Name             = x.Name,
            ImageUrl         = GetImage(x.ImageName),
            Description      = x.Description,
            Status           = x.Status,
            EventAggregator  = eventAggregator,
            Selected         = (x.InstallState != InstallState.Installed) && x.SelectedByDefault,
            CheckBoxVisible  = x.InstallState != InstallState.Installed ? Visibility.Visible : Visibility.Collapsed,
            UninstallVisible = x.InstallState != InstallState.NotInstalled ? Visibility.Visible : Visibility.Hidden,
            UninstallText    = $"Uninstall {x.Name}",
            Installer        = x
        }).ToList();

        IsInstallEnabled = Items.Any(pd => pd.Selected);

        Items.BindActionToPropChanged(() =>
        {
            IsInstallEnabled = Items.Any(p => p.Selected);
        }, "Selected");

        LoadingVisibility = Visibility.Collapsed;

        if (PendingRestartAndResume.ResumedFromRestart)
        {
            var pendingInstalls = PendingRestartAndResume.Installs();
            if (pendingInstalls.Count > 0)
            {
                foreach (var item in Items)
                {
                    if (pendingInstalls.Contains(item.Name) && item.CheckBoxVisible == Visibility.Visible)
                    {
                        item.Selected = true;
                    }
                    else
                    {
                        item.Selected = false;
                    }
                }

                eventAggregator.PublishOnUIThread(new ResumeInstallCommand
                {
                    Installs = pendingInstalls
                });
            }
            PendingRestartAndResume.CleanupResume();
        }
    }
示例#2
0
    public async Task Install(List <string> itemsToInstall)
    {
        errors.Clear();
        eventAggregator.PublishOnUIThread(new InstallStartedEvent());
        installProgress = 0;
        var installationDefinitions = installers
                                      .Where(p => itemsToInstall.Contains(p.Name))
                                      .OrderBy(p => p.Name).ToList();

        if (pendingRestartAndResume.ResumedFromRestart)
        {
            var checkpoint = pendingRestartAndResume.Checkpoint();
            if (installationDefinitions.Any(p => p.Name.Equals(checkpoint)))
            {
                // Fast Forward to the step after the last successful step
                installationDefinitions = installationDefinitions
                                          .SkipWhile(p => !p.Name.Equals(checkpoint))
                                          .Skip(1)
                                          .ToList();
            }
        }
        pendingRestartAndResume.CleanupResume();
        installCount = installationDefinitions
                       .Select(p => p.NestedActionCount)
                       .Sum();

        foreach (var definition in installationDefinitions)
        {
            if (aborting)
            {
                break;
            }

            PublishProgressEvent();
            await definition.Execute(AddOutput, AddError).ConfigureAwait(false);

            if (InstallFailed)
            {
                eventAggregator.PublishOnUIThread(new InstallFailedEvent
                {
                    Reason   = $"Failed to install: {definition.Name}",
                    Failures = errors
                });
                return;
            }
            if (definition.RebootRequired)
            {
                return;
            }
            eventAggregator.PublishOnUIThread(new CheckPointInstallEvent
            {
                Item = definition.Name
            });
        }
        if (!InstallFailed)
        {
            eventAggregator.PublishOnUIThread(new InstallSucceededEvent
            {
                InstalledItems = itemsToInstall
            });
        }
    }