public bool RequirePackageProvider(string requestor, string packageProviderName, string minimumVersion, IHostApi hostApi) { // check if the package provider is already installed if (_packageProviders.ContainsKey(packageProviderName)) { var current = _packageProviders[packageProviderName].Version; if (current >= minimumVersion) { return true; } } var currentCallCount = hostApi.CallCount; if (_lastCallCount >= currentCallCount) { // we've already been here this call. // are they asking for the same provider again? if (_providersTriedThisCall.Contains(packageProviderName)) { hostApi.Debug("Skipping RequirePackageProvider -- tried once this call previously."); return false; } // remember this in case we come back again. _providersTriedThisCall.Add(packageProviderName); } else { _lastCallCount = currentCallCount; _providersTriedThisCall = new HashSet<string> { packageProviderName }; } if (!hostApi.IsInteractive) { hostApi.Debug("Skipping RequirePackageProvider due to not interactive"); // interactive indicates that the host can respond to queries -- this doesn't happen // in powershell during tab-completion. return false; } // no? // ask the bootstrap provider if there is a package provider with that name available. if (!_packageProviders.ContainsKey(packageProviderName)){ return false; } var bootstrap = _packageProviders["Bootstrap"]; if (bootstrap == null) { hostApi.Debug("Skipping RequirePackageProvider due to missing bootstrap provider"); return false; } var pkg = bootstrap.FindPackage(packageProviderName, null, minimumVersion, null, hostApi).OrderByDescending(p => p, SoftwareIdentityVersionComparer.Instance).GroupBy(package => package.Name).ToArray(); if (pkg.Length == 1) { // Yeah? Install it. var package = pkg[0].FirstOrDefault(); var metaWithProviderType = package.Meta.FirstOrDefault(each => each.ContainsKey("providerType")); var providerType = metaWithProviderType == null ? "unknown" : metaWithProviderType.GetAttribute("providerType"); var destination = providerType == "assembly" ? (AdminPrivilege.IsElevated ? SystemAssemblyLocation : UserAssemblyLocation) : String.Empty; var link = package.Links.FirstOrDefault(each => each.Relationship == "installationmedia"); var location = String.Empty; if (link != null) { location = link.HRef.ToString(); } // what can't find an installationmedia link? // todo: what should we say here? if (hostApi.ShouldBootstrapProvider(requestor, package.Name, package.Version, providerType, location, destination)) { var newRequest = hostApi.Extend<IHostApi>(new { GetOptionValues = new Func<string, IEnumerable<string>>(key => { if (key == "DestinationPath") { return new[] { destination }; } return new string[0]; }) }); var packagesInstalled = bootstrap.InstallPackage(package, newRequest).LastOrDefault(); if (packagesInstalled == null) { // that's sad. hostApi.Error(Constants.Messages.FailedProviderBootstrap, ErrorCategory.InvalidOperation.ToString(), package.Name, hostApi.FormatMessageString(Constants.Messages.FailedProviderBootstrap, package.Name)); return false; } // so it installed something // we must tell the plugin loader to reload the plugins again. LoadProviders(hostApi); return true; } } return false; }
public bool RequirePackageProvider(string requestor, string packageProviderName, string minimumVersion, IHostApi hostApi) { // check if the package provider is already installed if (_packageProviders.ContainsKey(packageProviderName)) { var current = _packageProviders[packageProviderName].Version; if (current >= minimumVersion) { return(true); } } var currentCallCount = hostApi.CallCount; if (_lastCallCount >= currentCallCount) { // we've already been here this call. // are they asking for the same provider again? if (_providersTriedThisCall.Contains(packageProviderName)) { hostApi.Debug("Skipping RequirePackageProvider -- tried once this call previously."); return(false); } // remember this in case we come back again. _providersTriedThisCall.Add(packageProviderName); } else { _lastCallCount = currentCallCount; _providersTriedThisCall = new HashSet <string> { packageProviderName }; } if (!hostApi.IsInteractive) { hostApi.Debug("Skipping RequirePackageProvider due to not interactive"); // interactive indicates that the host can respond to queries -- this doesn't happen // in powershell during tab-completion. return(false); } // no? // ask the bootstrap provider if there is a package provider with that name available. var bootstrap = _packageProviders["Bootstrap"]; if (bootstrap == null) { hostApi.Debug("Skipping RequirePackageProvider due to missing bootstrap provider"); return(false); } var pkg = bootstrap.FindPackage(packageProviderName, null, minimumVersion, null, hostApi).OrderByDescending(p => p, SoftwareIdentityVersionComparer.Instance).GroupBy(package => package.Name).ToArray(); if (pkg.Length == 1) { // Yeah? Install it. var package = pkg[0].FirstOrDefault(); var metaWithProviderType = package.Meta.FirstOrDefault(each => each.ContainsKey("providerType")); var providerType = metaWithProviderType == null ? "unknown" : metaWithProviderType.GetAttribute("providerType"); var destination = providerType == "assembly" ? (AdminPrivilege.IsElevated ? SystemAssemblyLocation : UserAssemblyLocation) : string.Empty; var link = package.Links.FirstOrDefault(each => each.Relationship == "installationmedia"); var location = string.Empty; if (link != null) { location = link.HRef.ToString(); } // what can't find an installationmedia link? // todo: what should we say here? if (hostApi.ShouldBootstrapProvider(requestor, package.Name, package.Version, providerType, location, destination)) { var newRequest = hostApi.Extend <IHostApi>(new { GetOptionValues = new Func <string, IEnumerable <string> >(key => { if (key == "DestinationPath") { return(new[] { destination }); } return(new string[0]); }) }); var packagesInstalled = bootstrap.InstallPackage(package, newRequest).LastOrDefault(); if (packagesInstalled == null) { // that's sad. hostApi.Error(Constants.Messages.FailedProviderBootstrap, ErrorCategory.InvalidOperation.ToString(), package.Name, hostApi.FormatMessageString(Constants.Messages.FailedProviderBootstrap, package.Name)); return(false); } // so it installed something // we must tell the plugin loader to reload the plugins again. LoadProviders(hostApi); return(true); } } return(false); }