Beispiel #1
0
        public async Task <ConnectionControlsUpdateSettings> PrepareConnectionControlsUpdate(Control parentControl, bool installOnNextRestart)
        {
            var metadata     = (await packageSearch.SearchAsync("mscrmtools.xrm.connection", new SearchFilter(AllowConnectionControlPreRelease, SearchFilterType.IsLatestVersion), 0, 1, logger, cancellationToken)).FirstOrDefault();
            var nugetVersion = (await metadata.GetVersionsAsync()).Max(v => v.Version);
            var updates      = new PluginUpdates {
                PreviousProcessId = Process.GetCurrentProcess().Id
            };

            using (MemoryStream packageStream = new MemoryStream())
            {
                if (!await findPackageById.CopyNupkgToStreamAsync(
                        "mscrmtools.xrm.connection",
                        nugetVersion,
                        packageStream,
                        cache,
                        logger,
                        cancellationToken))
                {
                    throw new Exception($"The Nuget package for connection controls ({nugetVersion.Version}) has not been found");
                }

                var packageFolder   = Path.Combine(nugetPluginsFolder, $"mscrmtools.xrm.connection.{nugetVersion.Version}");
                var currentLocation = Assembly.GetExecutingAssembly().Location;
                var folder          = Path.GetDirectoryName(currentLocation);

                if (!Directory.Exists(packageFolder))
                {
                    Directory.CreateDirectory(packageFolder);
                }

                using (PackageArchiveReader packageReader = new PackageArchiveReader(packageStream))
                {
                    packageReader.NuspecReader.GetReleaseNotes();

                    foreach (var packageFile in await packageReader.GetFilesAsync(cancellationToken))
                    {
                        if (packageFile.ToLower().EndsWith("mctools.xrm.connection.dll") ||
                            packageFile.ToLower().EndsWith("mctools.xrm.connection.winforms.dll"))
                        {
                            using (var fileStream = File.OpenWrite(Path.Combine(packageFolder, Path.GetFileName(packageFile))))
                                using (var stream = await packageReader.GetStreamAsync(packageFile, cancellationToken))
                                {
                                    await stream.CopyToAsync(fileStream);
                                }
                        }
                    }
                }

                updates.Plugins.Add(new PluginUpdate
                {
                    Source         = Path.Combine(packageFolder, "McTools.Xrm.Connection.dll"),
                    Destination    = Path.Combine(folder, "McTools.Xrm.Connection.dll"),
                    RequireRestart = true
                });
                updates.Plugins.Add(new PluginUpdate
                {
                    Source         = Path.Combine(packageFolder, "McTools.Xrm.Connection.WinForms.dll"),
                    Destination    = Path.Combine(folder, "McTools.Xrm.Connection.WinForms.dll"),
                    RequireRestart = true
                });
            }

            XmlSerializerHelper.SerializeToFile(updates, Path.Combine(Paths.XrmToolBoxPath, "Update.xml"));

            bool returnedValue = false;

            parentControl.Invoke(new Action(() =>
            {
                if (!installOnNextRestart && DialogResult.Yes == MessageBox.Show(parentControl,
                                                                                 @"This application needs to restart to install new connection controls. Click Yes to restart this application now",
                                                                                 @"Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information))
                {
                    returnedValue = true;
                }
            }));

            return(new ConnectionControlsUpdateSettings
            {
                RestartNow = returnedValue,
                Version = nugetVersion.Version + (!string.IsNullOrEmpty(nugetVersion.Release) ? "-" + nugetVersion.Release : "")
            });
        }