示例#1
0
        private void OpenTestProjectMenuItem_Click(object sender, RoutedEventArgs e)
        {
            //TestProjectsViewModel tmp = this.testProjectView.DataContext as TestProjectsViewModel;
            //if (tmp != null)
            //{
            //    tmp.LoadTestProjectsCommand.Execute(null);
            //}

            TestProjectsViewModel tmp = this.testProjectView.DataContext as TestProjectsViewModel;

            if (tmp == null)
            {
                return;
            }

            List <KeyValuePair <string, string> > filters = new List <KeyValuePair <string, string> >();

            filters.Add(new KeyValuePair <string, string>("测试工程", Constants.TestProjectFileTypePattern));
            filters.Add(new KeyValuePair <string, string>("所有文件", "*"));
            IConfigurationManager configurationManager = (App.Current as App).Container.GetService <IConfigurationManager>();
            FileDialogSettings    fileDialogSettings   = new FileDialogSettings()
            {
                Title            = "选择测试工程",
                Multiselect      = false,
                Filters          = filters,
                InitialDirectory = Path.GetFullPath(configurationManager.GetConfigValue(Constants.LastTestProjectsPath))
            };

            IDialogService <object> dialogService = (App.Current as App).Container.GetService <IDialogService <object> >();

            if (dialogService.ShowOpenFileDialog(this, fileDialogSettings, false))
            {
                tmp.LoadTestProjectsCommand.Execute(fileDialogSettings.FileName);
            }
        }
示例#2
0
        private static bool SelectFile(FileDialogSettings fileDialogSettings, bool withMultiSelection, out string[] selectedFiles)
        {
            var openFileDialog = new OpenFileDialog
            {
                Filter = PrepareFilterString(fileDialogSettings.Filter)
            };

            if (fileDialogSettings.InitialSelection != null)
            {
                var fileInfo = new FileInfo(fileDialogSettings.InitialSelection);
                if (fileInfo.Directory?.Exists == true)
                {
                    openFileDialog.InitialDirectory = fileInfo.Directory.FullName;
                }

                openFileDialog.FileName = fileInfo.FullName;
            }

            if (!string.IsNullOrEmpty(fileDialogSettings.DialogTitle))
            {
                openFileDialog.Title = fileDialogSettings.DialogTitle;
            }

            openFileDialog.CheckFileExists = true;
            openFileDialog.Multiselect     = withMultiSelection;

            var result = openFileDialog.ShowDialog(GetActiveWindow()) == true;

            selectedFiles = openFileDialog.FileNames;
            return(result);
        }
示例#3
0
        public void AddPackage(string packagePath = null)
        {
            string[] selection;
            if (string.IsNullOrEmpty(packagePath))
            {
                var interactionResult = this.interactionService.SelectFiles(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.MsixExtension).BuildFilter()), out selection);
                if (!interactionResult || !selection.Any())
                {
                    return;
                }
            }
            else
            {
                selection = new[] { packagePath };
            }

            foreach (var selected in selection)
            {
                if (this.Files.Contains(selected, StringComparer.OrdinalIgnoreCase))
                {
                    continue;
                }

                this.Files.Add(selected);
            }
        }
示例#4
0
        protected override async Task <bool> Save(CancellationToken cancellationToken, IProgress <ProgressData> progress)
        {
            if (!this.IsValid)
            {
                return(false);
            }

            var settings = new FileDialogSettings("Virtual disks|*.vhd", this.OutputPath);

            if (!this.interactionService.SaveFile(settings, out var output))
            {
                return(false);
            }

            this.OutputPath = output;

            var sizeInMegabytes = this.SizeMode.CurrentValue == AppAttachSizeMode.Auto ? 0 : uint.Parse(this.FixedSize.CurrentValue);

            var appAttach = await this.appAttachManagerFactory.GetProxyFor(SelfElevationLevel.AsAdministrator, cancellationToken).ConfigureAwait(false);

            cancellationToken.ThrowIfCancellationRequested();

            await appAttach.CreateVolume(
                this.InputPath.CurrentValue,
                output,
                sizeInMegabytes,
                this.ExtractCertificate.CurrentValue,
                this.GenerateScripts.CurrentValue,
                cancellationToken,
                progress).ConfigureAwait(false);

            return(true);
        }
示例#5
0
        private static bool SelectFile(FileDialogSettings fileDialogSettings, bool withMultiSelection, out string[] selectedFiles)
        {
            var dlg = new OpenFileDialog();

            dlg.Filter = PrepareFilterString(fileDialogSettings.Filter);
            if (fileDialogSettings.InitialSelection != null)
            {
                var fileInfo = new FileInfo(fileDialogSettings.InitialSelection);
                if (fileInfo.Directory != null && fileInfo.Directory.Exists)
                {
                    dlg.InitialDirectory = fileInfo.Directory.FullName;
                }

                dlg.FileName = fileInfo.FullName;
            }

            if (!string.IsNullOrEmpty(fileDialogSettings.DialogTitle))
            {
                dlg.Title = fileDialogSettings.DialogTitle;
            }

            dlg.CheckFileExists = true;
            dlg.Multiselect     = withMultiSelection;

            var result = dlg.ShowDialog() == true;

            selectedFiles = dlg.FileNames;
            return(result);
        }
示例#6
0
        void IDialogAware.OnDialogOpened(IDialogParameters parameters)
        {
            if (parameters.TryGetValue <string>("Path", out var file))
            {
                this.Files.Add(file);
            }
            else
            {
                var interactionResult = this.interactionService.SelectFiles(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.MsixExtension).BuildFilter()), out string[] selection);
                if (!interactionResult || !selection.Any())
                {
                    return;
                }

                foreach (var selected in selection)
                {
                    if (this.Files.Contains(selected, StringComparer.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    this.Files.Add(selected);
                }
            }

            this.Files.Commit();
        }
示例#7
0
        public bool ShowOpenFileDialog(object owner, FileDialogSettings settings, bool isFolderPicker)
        {
            CommonOpenFileDialog dialog = new CommonOpenFileDialog();

            dialog.IsFolderPicker = isFolderPicker;
            foreach (KeyValuePair <string, string> pair in settings.Filters)
            {
                string pairValue = pair.Value;
                if (pairValue.StartsWith("*") && pairValue.Length > 2)
                {
                    pairValue = pairValue.Substring(1);
                }
                if (pairValue.StartsWith("."))
                {
                    pairValue = pairValue.Substring(1);
                }
                dialog.Filters.Add(new NewFilter(pair.Key, pairValue));
            }

            dialog.InitialDirectory = settings.InitialDirectory;
            dialog.Multiselect      = settings.Multiselect;
            dialog.Title            = settings.Title;
            bool result = dialog.ShowDialog() == CommonFileDialogResult.Ok;

            if (result)
            {
                settings.FileName  = dialog.FileName;
                settings.FileNames = dialog.FileNames;
            }

            return(result);
        }
    public bool?ShowOpenFileDialog(FileDialogSettings settings)
    {
        var dialog = new OpenFileDialog();

        // ...

        return(dialog.ShowDialog());
    }
示例#9
0
        public void ShowFileDialog(string filter)
        {
            if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(filter), out var selectedFile))
            {
                return;
            }

            this.OpenFile(new FileInfo(selectedFile));
        }
示例#10
0
        public bool SelectFile(FileDialogSettings settings, out string selectedFile)
        {
            if (!SelectFile(settings, false, out var selection))
            {
                selectedFile = null;
                return(false);
            }

            selectedFile = selection.FirstOrDefault();
            return(true);
        }
        private void OnExport()
        {
            if (this.Results.CurrentValue == null)
            {
                return;
            }

            if (!this.interactionService.SaveFile(FileDialogSettings.FromFilterString("XML files|*.xml"), out var selectedFile))
            {
                return;
            }

            this.Results.CurrentValue.Export(selectedFile);
        }
示例#12
0
        private void OpenTestAssemblyMenuItem_Click(object sender, RoutedEventArgs e)
        {
            List <KeyValuePair <string, string> > filters = new List <KeyValuePair <string, string> >();

            filters.Add(new KeyValuePair <string, string>("测试程序集", Constants.TestAssemblyFileTypeExtension));
            filters.Add(new KeyValuePair <string, string>("所有文件", "*"));
            FileDialogSettings fileDialogSettings = new FileDialogSettings()
            {
                Title       = "选择测试程序集",
                Multiselect = true,
                Filters     = filters
            };

            IDialogService <object> dialogService = (App.Current as App).Container.GetService <IDialogService <object> >();

            if (dialogService.ShowOpenFileDialog(this, fileDialogSettings, false))
            {
                List <string> testAssemblies = new List <string>();
                testAssemblies.AddRange(fileDialogSettings.FileNames);
                if (!string.IsNullOrEmpty(fileDialogSettings.FileName) && !testAssemblies.Contains(fileDialogSettings.FileName))
                {
                    testAssemblies.Add(fileDialogSettings.FileName);
                }

                TestProjectsViewModel tmp             = this.testProjectView.DataContext as TestProjectsViewModel;
                TestProjectInfo       testProjectInfo = sender as TestProjectInfo;
                if (testProjectInfo == null)
                {
                    testProjectInfo = tmp.CurrentTestProject?.TestProjectInfo;
                }

                TestMethodsSelector testMethodsSelectorDialog = new TestMethodsSelector(testAssemblies, testProjectInfo);
                if (testMethodsSelectorDialog.ShowDialog() == true)
                {
                    if (testMethodsSelectorDialog.TestProject.Name == "测试用例仓库")
                    {
                        this.RefreshTestMesthodsList();
                    }
                    else
                    {
                        this.OpenTestProject(tmp.CurrentTestProject?.TestProjectInfo);
                    }
                }
            }
        }
示例#13
0
        private async void OpenExecuted()
        {
            if (this.State.IsSaved)
            {
                this.State.IsSaved = false;
            }

            if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.WingetExtension).BuildFilter()), out var selectedFile))
            {
                return;
            }

            this.yamlPath = selectedFile;
            var task = this.Definition.LoadFromYaml(selectedFile);

            this.GeneralProgress.MonitorProgress(task);
            await task.ConfigureAwait(false);
        }
        private void OpenBrowseDialog(
            string moduleName,
            string navigationPath,
            string fileParameterName = "file",
            string fileFilter        = null)
        {
            if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(fileFilter), out var selected))
            {
                return;
            }

            var parameters = new DialogParameters
            {
                { fileParameterName, selected }
            };

            this.moduleManager.LoadModule(moduleName);
            this.dialogService.ShowDialog(navigationPath, parameters, this.OnDialogClosed);
        }
示例#15
0
        protected override async Task <bool> Save(CancellationToken cancellationToken, IProgress <ProgressData> progress)
        {
            if (!this.IsValid)
            {
                return(false);
            }

            var settings = new FileDialogSettings("Appinstaller files|*.appinstaller|All files|*.*", this.previousPath);

            if (!this.interactionService.SaveFile(settings, out var selected))
            {
                return(false);
            }

            this.previousPath = selected;
            var appInstaller = this.GetCurrentAppInstallerConfig();

            await this.appInstallerBuilder.Create(appInstaller, selected, cancellationToken, progress).ConfigureAwait(false);

            return(true);
        }
示例#16
0
        private async void OnAddTestMethodsFromAssembly()
        {
            List <KeyValuePair <string, string> > filters = new List <KeyValuePair <string, string> >();

            filters.Add(new KeyValuePair <string, string>("测试程序集", Constants.TestAssemblyFileTypeExtension));
            filters.Add(new KeyValuePair <string, string>("所有文件", "*"));
            FileDialogSettings fileDialogSettings = new FileDialogSettings
            {
                Title       = "选择测试程序集",
                Multiselect = true,
                Filters     = filters
            };

            if (this.dialogService.ShowOpenFileDialog(this, fileDialogSettings, false))
            {
                List <string> testAssemblies = new List <string>();
                testAssemblies.AddRange(fileDialogSettings.FileNames);
                if (!string.IsNullOrEmpty(fileDialogSettings.FileName) && !testAssemblies.Contains(fileDialogSettings.FileName))
                {
                    testAssemblies.Add(fileDialogSettings.FileName);
                }

                (AddTestMethodsFromAssemblyCommand as DelegateCommand <TestProjectShip>)?.RaiseCanExecuteChanged();
                List <TestCaseInfo> testMethods = await Task.Run(() => this.executor.DiscoverTestsV1(testAssemblies, string.Empty));

                foreach (var testMethod in testMethods)
                {
                    if (!this.TestProjectInfo.TestMethods.Contains(testMethod))
                    {
                        this.TestProjectInfo.TestMethods.Add(testMethod);
                        this.RaisePropertyChanged("TestAssemblies");
                    }
                }

                canAddTestMethodsFromAssembly = true;
                (AddTestMethodsFromAssemblyCommand as DelegateCommand <TestProjectShip>)?.RaiseCanExecuteChanged();
            }
        }
示例#17
0
        public bool SaveFile(FileDialogSettings settings, out string selectedFile)
        {
            var dlg = new SaveFileDialog
            {
                Filter = PrepareFilterString(settings.Filter)
            };

            if (settings.InitialSelection != null)
            {
                var fileInfo = new FileInfo(settings.InitialSelection);
                if (fileInfo.Directory?.Exists == true)
                {
                    dlg.InitialDirectory = fileInfo.Directory.FullName;
                }

                dlg.FileName = fileInfo.Name;
            }

            dlg.CheckFileExists = false;
            var result = dlg.ShowDialog(GetActiveWindow()) == true;

            selectedFile = dlg.FileName;
            return(result);
        }
示例#18
0
        private void OpenExecuted(string selected)
        {
            if (selected != null)
            {
                if (!File.Exists(selected))
                {
                    selected = null;
                }
                else
                {
                    previousPath = selected;
                }
            }

            if (selected == null)
            {
                if (this.previousPath != null)
                {
                    // ReSharper disable once StringLiteralTypo
                    var settings = new FileDialogSettings(new DialogFilterBuilder("*.appinstaller").BuildFilter(), this.previousPath);
                    if (!this.interactionService.SelectFile(settings, out selected))
                    {
                        return;
                    }
                }
                // ReSharper disable once StringLiteralTypo
                else if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*.appinstaller").BuildFilter()), out selected))
                {
                    return;
                }
            }

            this.previousPath = selected;

            AppInstallerConfig.FromFile(selected).ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    // ReSharper disable once PossibleNullReferenceException
                    this.interactionService.ShowError("The selected file is not a valid .appinstaller.", t.Exception.GetBaseException(), InteractionResult.OK);
                    return;
                }

                if (t.IsCanceled)
                {
                    return;
                }

                if (!t.IsCompleted)
                {
                    return;
                }

                var builder = new AppInstallerBuilder(t.Result);

                this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;
                this.AppInstallerUpdateCheckingMethod.CurrentValue = builder.CheckForUpdates;
                this.AppInstallerUri.CurrentValue = builder.RedirectUri.ToString();
                this.BlockLaunching.CurrentValue  = builder.UpdateBlocksActivation;
                this.Hours.CurrentValue           = builder.HoursBetweenUpdateChecks.ToString();
                this.MainPackageUri.CurrentValue  = builder.MainPackageUri.ToString();
                this.Version.CurrentValue         = builder.Version;
                this.ShowPrompt.CurrentValue      = builder.ShowPrompt;

                this.TabPackage.Name.CurrentValue         = builder.MainPackageName;
                this.TabPackage.Version.CurrentValue      = builder.MainPackageVersion;
                this.TabPackage.Publisher.CurrentValue    = builder.MainPackagePublisher;
                this.TabPackage.PackageType.CurrentValue  = builder.MainPackageType;
                this.TabPackage.Architecture.CurrentValue = builder.MainPackageArchitecture;

                this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;

                this.OnPropertyChanged(nameof(ShowLaunchOptions));
                this.OnPropertyChanged(nameof(CompatibleWindows));
            },
                                                               CancellationToken.None,
                                                               TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.ExecuteSynchronously,
                                                               TaskScheduler.FromCurrentSynchronizationContext());
        }
示例#19
0
        protected override async Task <bool> Save(CancellationToken cancellationToken, IProgress <ProgressData> progress)
        {
            this.WingetVerified = false;

            if (!this.IsValid)
            {
                return(false);
            }

            string selected;

            FileDialogSettings settings;

            if (string.IsNullOrEmpty(this.yamlPath) || !File.Exists(this.yamlPath))
            {
                settings = FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.WingetExtension).BuildFilter());
            }
            else
            {
                settings = new FileDialogSettings(new DialogFilterBuilder("*" + FileConstants.WingetExtension).BuildFilter(), null, this.yamlPath);
            }

            var userSelected = this.interactionService.SaveFile(settings, out selected);

            if (!userSelected)
            {
                return(false);
            }

            this.yamlPath = selected;

            var tempPath = Path.Combine(Path.GetTempPath(), "msixhero-" + Guid.NewGuid().ToString("N").Substring(0, 8) + FileConstants.WingetExtension);

            try
            {
                if (!(await this.Definition.Save(tempPath, cancellationToken, progress).ConfigureAwait(false)))
                {
                    return(false);
                }

                var winGetPath = await this.yamlValidator.GetWingetPath(cancellationToken).ConfigureAwait(false);

                if (winGetPath != null)
                {
                    progress.Report(new ProgressData(100, "Validating with winget CLI..."));

                    var validationDetails = await yamlValidator.ValidateAsync(tempPath, false, cancellationToken).ConfigureAwait(false);

                    await Task.Delay(TimeSpan.FromMilliseconds(400), cancellationToken).ConfigureAwait(false);

                    if (validationDetails != null)
                    {
                        if (1 == this.interactionService.ShowMessage("Winget validation failed. Your package may not be accepted after pushing to the official repo. Press 'See details' to to show detailed warnings.", new[] { "Ignore this warning", "Fix issues" }, "Validation errors", validationDetails))
                        {
                            this.WingetVerified = false;
                            this.OnPropertyChanged(nameof(WingetVerified));
                            return(false);
                        }
                    }
                    else
                    {
                        this.WingetVerified = true;
                        this.OnPropertyChanged(nameof(WingetVerified));
                    }
                }

                File.Move(tempPath, selected, true);
                return(true);
            }
            finally
            {
                if (File.Exists(tempPath))
                {
                    File.Delete(tempPath);
                }
            }
        }
示例#20
0
        private async void OpenExecuted(string selected)
        {
            if (selected != null)
            {
                if (!File.Exists(selected))
                {
                    selected = null;
                }
                else
                {
                    previousPath = selected;
                }
            }

            if (selected == null)
            {
                if (this.previousPath != null)
                {
                    var settings = new FileDialogSettings(new DialogFilterBuilder("*" + FileConstants.AppInstallerExtension).BuildFilter(), this.previousPath);
                    if (!this.interactionService.SelectFile(settings, out selected))
                    {
                        return;
                    }
                }
                else if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.AppInstallerExtension).BuildFilter()), out selected))
                {
                    return;
                }
            }

            this.previousPath = selected;

            AppInstallerConfig file;

            try
            {
                file = await AppInstallerConfig.FromFile(selected).ConfigureAwait(true);
            }
            catch (Exception e)
            {
                // ReSharper disable once PossibleNullReferenceException
                this.interactionService.ShowError("The selected file is not a valid .appinstaller.", e, InteractionResult.OK);
                return;
            }

            var builder = new AppInstallerBuilder(file);

            this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;
            this.AppInstallerUpdateCheckingMethod.CurrentValue = builder.CheckForUpdates;
            this.AppInstallerUri.CurrentValue = builder.RedirectUri.ToString();

            if (builder.ShowPrompt)
            {
                this.PromptMode.CurrentValue = builder.UpdateBlocksActivation ? ViewModel.PromptMode.Force : ViewModel.PromptMode.Inform;
            }
            else
            {
                this.PromptMode.CurrentValue = ViewModel.PromptMode.Background;
            }

            this.Hours.CurrentValue          = builder.HoursBetweenUpdateChecks.ToString();
            this.MainPackageUri.CurrentValue = builder.MainPackageUri.ToString();
            this.Version.CurrentValue        = builder.Version;

            this.TabPackage.Name.CurrentValue         = builder.MainPackageName;
            this.TabPackage.Version.CurrentValue      = builder.MainPackageVersion;
            this.TabPackage.Publisher.CurrentValue    = builder.MainPackagePublisher;
            this.TabPackage.PackageType.CurrentValue  = builder.MainPackageType;
            this.TabPackage.Architecture.CurrentValue = builder.MainPackageArchitecture;
            this.TabOptionalPackages.SetPackages(file.Optional);
            this.TabRelatedPackages.SetPackages(file.Related);

            this.AllowDowngrades.CurrentValue = builder.AllowDowngrades;

            this.OnPropertyChanged(nameof(ShowLaunchOptions));
            this.OnPropertyChanged(nameof(CompatibleWindows));
        }
        private async void OnAddPackage(string packagePath, bool forAllUsers)
        {
            if (packagePath == null)
            {
                if (forAllUsers)
                {
                    if (!this.interactionService.SelectFile(FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.MsixExtension, "*" + FileConstants.AppxExtension).BuildFilter()), out packagePath))
                    {
                        return;
                    }
                }
                else
                {
                    if (!this.interactionService.SelectFile(
                            // ReSharper disable StringLiteralTypo
                            FileDialogSettings.FromFilterString(new DialogFilterBuilder("*" + FileConstants.MsixExtension, "*" + FileConstants.AppxExtension, "*" + FileConstants.AppxBundleExtension, "*" + FileConstants.AppInstallerExtension, FileConstants.AppxManifestFile).BuildFilter()), out packagePath))
                    // ReSharper restore StringLiteralTypo
                    {
                        return;
                    }
                }
            }

            AddAppxPackageOptions options = 0;

            if (forAllUsers)
            {
                options |= AddAppxPackageOptions.AllUsers;
            }

            options |= AddAppxPackageOptions.KillRunningApps;

            var context = this.busyManager.Begin();

            try
            {
                using var wrappedProgress = new WrappedProgress(context);
                var p1 = wrappedProgress.GetChildProgress(90);
                var p2 = wrappedProgress.GetChildProgress(10);

                var manager = await this.packageInstallerProvider.GetProxyFor(forAllUsers?SelfElevationLevel.AsAdministrator : SelfElevationLevel.AsInvoker).ConfigureAwait(false);

                await manager.Add(packagePath, options, progress : p1).ConfigureAwait(false);

                AppxIdentity appxIdentity = null;
                if (!string.Equals(FileConstants.AppInstallerExtension, Path.GetExtension(packagePath), StringComparison.OrdinalIgnoreCase))
                {
                    appxIdentity = await new AppxIdentityReader().GetIdentity(packagePath).ConfigureAwait(false);

#pragma warning disable 4014
                    this.interactionService.ShowToast("App installed", $"{appxIdentity.Name} has been just installed.", InteractionType.None);
#pragma warning restore 4014
                }
                else
                {
#pragma warning disable 4014
                    this.interactionService.ShowToast("App installed", $"A new app has been just installed from {Path.GetFileName(packagePath)}.", InteractionType.None);
#pragma warning restore 4014
                }

                var allPackages = await this.application.CommandExecutor.Invoke <GetPackagesCommand, IList <InstalledPackage> >(this, new GetPackagesCommand(forAllUsers ? PackageFindMode.AllUsers : PackageFindMode.CurrentUser), progress : p2).ConfigureAwait(false);

                if (appxIdentity != null)
                {
                    var selected = allPackages.FirstOrDefault(p => p.Name == appxIdentity.Name);
                    if (selected != null)
                    {
                        //this.application.ApplicationState.Packages.SelectedPackages.Clear();
                        //this.application.ApplicationState.Packages.SelectedPackages.Add(selected);

                        await this.application.CommandExecutor.Invoke(this, new SelectPackagesCommand(selected.ManifestLocation)).ConfigureAwait(false);
                    }
                }
                else
                {
                    await this.application.CommandExecutor.Invoke(this, new SelectPackagesCommand()).ConfigureAwait(false);
                }
            }
            catch (Exception exception)
            {
                Logger.Error(exception);
                this.interactionService.ShowError(exception.Message, exception);
            }
            finally
            {
                this.busyManager.End(context);
            }
        }
示例#22
0
        protected override async Task <bool> Save(CancellationToken cancellationToken, IProgress <ProgressData> progress)
        {
            this.WingetVerified = false;

            if (!this.IsValid)
            {
                return(false);
            }

            string selected;

            FileDialogSettings settings;

            if (string.IsNullOrEmpty(this.yamlPath) || !File.Exists(this.yamlPath))
            {
                settings = FileDialogSettings.FromFilterString(new DialogFilterBuilder("*.yaml").BuildFilter());
            }
            else
            {
                settings = new FileDialogSettings(new DialogFilterBuilder("*.yaml").BuildFilter(), null, this.yamlPath);
            }

            var userSelected = this.interactionService.SaveFile(settings, out selected);

            if (!userSelected)
            {
                return(false);
            }

            this.yamlPath = selected;

            var tempPath = Path.Combine(Path.GetTempPath(), "msixhero-" + Guid.NewGuid().ToString("N").Substring(0, 8) + ".yaml");

            try
            {
                if (!(await this.Definition.Save(tempPath, cancellationToken, progress).ConfigureAwait(false)))
                {
                    return(false);
                }

                var validationDetails = await yamlValidator.ValidateAsync(tempPath, false, cancellationToken).ConfigureAwait(false);

                if (validationDetails != null)
                {
                    progress.Report(new ProgressData(100, "Validating with winget CLI..."));
                    await Task.Delay(TimeSpan.FromMilliseconds(1000), cancellationToken).ConfigureAwait(false);

                    if (validationDetails.IndexOf("Manifest validation succeeded.", StringComparison.OrdinalIgnoreCase) == -1)
                    {
                        var msg = string.Join(Environment.NewLine, validationDetails.Split(Environment.NewLine).Skip(1));
                        if (1 == this.interactionService.ShowMessage("Winget CLI returned validation errors.", new[] { "Ignore these errors", "Continue editing" }, "Validation errors", msg))
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        this.WingetVerified = true;
                        this.OnPropertyChanged(nameof(WingetVerified));
                    }
                }

                File.Move(tempPath, selected, true);
                return(true);
            }
            finally
            {
                if (File.Exists(tempPath))
                {
                    File.Delete(tempPath);
                }
            }
        }
示例#23
0
 public bool SelectFiles(FileDialogSettings settings, out string[] selectedFiles)
 {
     return(SelectFile(settings, true, out selectedFiles));
 }
示例#24
0
        protected override async Task <bool> Save(CancellationToken cancellationToken, IProgress <ProgressData> progress)
        {
            if (!this.IsValid)
            {
                return(false);
            }

            // ReSharper disable once NotAccessedVariable
            string selectedPath;

            switch (this.Create.CurrentValue)
            {
            case ModificationPackageBuilderAction.Manifest:
                if (!this.interactionService.SelectFolder(out selectedPath))
                {
                    return(false);
                }

                selectedPath = Path.Join(selectedPath, "AppxManifest.xml");
                break;

            case ModificationPackageBuilderAction.Msix:
            case ModificationPackageBuilderAction.SignedMsix:
                if (!this.interactionService.SaveFile(FileDialogSettings.FromFilterString("MSIX Modification Packages|*.msix"), out selectedPath))
                {
                    return(false);
                }

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            var modificationPkgCreationRequest = new ModificationPackageConfig
            {
                DisplayName       = this.DisplayName.CurrentValue,
                Name              = this.Name.CurrentValue,
                Publisher         = this.PublisherName.CurrentValue,
                DisplayPublisher  = this.PublisherDisplayName.CurrentValue,
                Version           = this.Version.CurrentValue,
                ParentName        = this.ParentName.CurrentValue,
                ParentPublisher   = this.ParentPublisher.CurrentValue,
                IncludeVfsFolders = this.IncludeVfsFolders.CurrentValue && this.IsIncludeVfsFoldersEnabled,
                IncludeFolder     = this.IncludeFiles.CurrentValue && !string.IsNullOrEmpty(this.SourceFolder.CurrentValue) ? new DirectoryInfo(this.SourceFolder.CurrentValue) : null,
                IncludeRegistry   = this.IncludeRegistry.CurrentValue && !string.IsNullOrEmpty(this.SourceRegistryFile.CurrentValue) ? new FileInfo(this.SourceRegistryFile.CurrentValue) : null,
                ParentPackagePath = this.SourcePath.CurrentValue
            };

            await this.contentBuilder.Create(modificationPkgCreationRequest, selectedPath, this.Create.CurrentValue, cancellationToken, progress).ConfigureAwait(false);

            switch (this.Create.CurrentValue)
            {
            case ModificationPackageBuilderAction.Manifest:
                this.Result = selectedPath;
                break;

            case ModificationPackageBuilderAction.Msix:
                this.Result = selectedPath;
                break;

            case ModificationPackageBuilderAction.SignedMsix:

                var manager = await this.signingManagerFactory.GetProxyFor(SelfElevationLevel.AsInvoker, cancellationToken).ConfigureAwait(false);

                cancellationToken.ThrowIfCancellationRequested();

                switch (this.TabCertificate.Store.CurrentValue)
                {
                case CertificateSource.Pfx:
                    await manager.SignPackageWithPfx(selectedPath, true, this.TabCertificate.PfxPath.CurrentValue, this.TabCertificate.Password.CurrentValue, this.TabCertificate.TimeStamp.CurrentValue, IncreaseVersionMethod.None, cancellationToken, progress).ConfigureAwait(false);

                    break;

                case CertificateSource.Personal:
                    await manager.SignPackageWithInstalled(selectedPath, true, this.TabCertificate.SelectedPersonalCertificate?.CurrentValue?.Model, this.TabCertificate.TimeStamp.CurrentValue, IncreaseVersionMethod.None, cancellationToken, progress).ConfigureAwait(false);

                    break;

                case CertificateSource.DeviceGuard:
                    await manager.SignPackageWithDeviceGuardFromUi(selectedPath, this.TabCertificate.DeviceGuard.CurrentValue, this.TabCertificate.TimeStamp.CurrentValue, IncreaseVersionMethod.None, cancellationToken, progress).ConfigureAwait(false);

                    break;
                }

                this.Result = selectedPath;
                break;
            }

            return(true);
        }