/// <summary>
/// This method downloads the package represented by the PackageDownloadHandle,
/// uninstalls its current installation if necessary, and installs the package.
///
/// Note that, if the package is already installed, it must be uninstallable
/// </summary>
internal void DownloadAndInstall(PackageDownloadHandle packageDownloadHandle, string downloadPath)
{
Downloads.Add(packageDownloadHandle);
packageDownloadHandle.DownloadState = PackageDownloadHandle.State.Downloading;
Task.Factory.StartNew(() =>
{
// Attempt to download package
string pathDl;
var res = Model.DownloadPackage(packageDownloadHandle.Header._id, packageDownloadHandle.VersionName, out pathDl);
// if you fail, update download handle and return
if (!res.Success)
{
packageDownloadHandle.Error(res.Error);
return;
}
// if success, proceed to install the package
DynamoViewModel.UIDispatcher.BeginInvoke((Action)(() =>
{
try
{
packageDownloadHandle.Done(pathDl);
Package dynPkg;
var pmExtension = DynamoViewModel.Model.GetPackageManagerExtension();
var firstOrDefault = pmExtension.PackageLoader.LocalPackages.FirstOrDefault(pkg => pkg.Name == packageDownloadHandle.Name);
if (firstOrDefault != null)
{
var dynModel = DynamoViewModel.Model;
try
{
firstOrDefault.UninstallCore(dynModel.CustomNodeManager, pmExtension.PackageLoader, dynModel.PreferenceSettings);
}
catch
{
MessageBox.Show(String.Format(Resources.MessageFailToUninstallPackage,
DynamoViewModel.BrandingResourceProvider.ProductName,
packageDownloadHandle.Name),
Resources.UninstallFailureMessageBoxTitle,
MessageBoxButton.OK, MessageBoxImage.Error);
}
}
if (packageDownloadHandle.Extract(DynamoViewModel.Model, downloadPath, out dynPkg))
{
var p = Package.FromDirectory(dynPkg.RootDirectory, DynamoViewModel.Model.Logger);
pmExtension.PackageLoader.Load(p);
packageDownloadHandle.DownloadState = PackageDownloadHandle.State.Installed;
}
}
catch (Exception e)
{
packageDownloadHandle.Error(e.Message);
}
}));
});
}