/// <summary> /// Attempts to update plugin <paramref name="packageId" />. If no /// <paramref name="version" /> is specified, the latest available version will be installed. /// </summary> /// <param name="packageId">The plugin package id to update</param> /// <param name="version">Optional version to install</param> /// <param name="allowPrereleaseVersions">Whether to include pre-release versions</param> /// <param name="cancellationToken"></param> /// <returns>Success of operation</returns> /// <exception cref="ArgumentException"><paramref name="packageId" /> is empty</exception> /// <exception cref="ArgumentException">Plugin <paramref name="packageId" /> is not installed</exception> /// <exception cref="ArgumentNullException"></exception> public async Task <bool> UpdatePluginAsync( string packageId, NuGetVersion version = null, bool allowPrereleaseVersions = false, CancellationToken cancellationToken = default) { var pluginInstance = AllPlugins.FirstOrDefault(pi => pi.Package.Id == packageId); if (await StopPlugin(pluginInstance) == false) { LogAdapter.Warning($"Failed to stop plugin {packageId}, aborting update."); return(false); } using (await PMLock.WriterLockAsync()) { var success = await PackageManager.UpdateAsync( packageId, version, allowPrereleaseVersions, cancellationToken); UISynchronizationContext.Send(() => PackageManager.FindInstalledPluginById(packageId)?.RaiseVersionChanged()); return(success); } }
private void CategorizePlugins(IEnumerable <IPlugin> plugins) { AllPlugins = plugins.ToArray(); HostPlugin = AllPlugins.FirstOrDefault(p => p.PluginType == PluginTypes.HostPlugin); AppPlugins = AllPlugins.Where(p => p.PluginType == PluginTypes.ApplicationPlugin).ToArray(); CorePlugins = AllPlugins.Where(p => p.PluginType == PluginTypes.CorePlugin).ToArray(); LogPlugins(AllPlugins); }
/// <summary>Start plugin <paramref name="packageId" /></summary> /// <param name="packageId">The plugin's package id to start</param> /// <returns>Success of operation</returns> public async Task <bool> StartPlugin(string packageId) { var pluginInstance = AllPlugins.FirstOrDefault(p => p.Package.Id == packageId); if (pluginInstance == null) { return(false); } return(await StartPlugin(pluginInstance).ConfigureAwait(false)); }
/// <summary>Uninstall <paramref name="pluginPackage" />. The plugin will be stopped if it is running.</summary> /// <param name="pluginPackage">The plugin to be uninstalled</param> /// <returns></returns> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="ArgumentException"> /// When <paramref name="pluginPackage" /> is a Development /// plugin /// </exception> public Task <bool> UninstallPluginAsync(LocalPluginPackage <TMeta> pluginPackage) { if (pluginPackage == null) { throw new ArgumentNullException(nameof(pluginPackage)); } if (pluginPackage is LocalDevPluginPackage <TMeta> ) { throw new ArgumentException($"Cannot uninstall a development plugin"); } var pluginInstance = AllPlugins.FirstOrDefault(pi => pi.Package == pluginPackage); if (pluginInstance == null) { throw new InvalidOperationException($"Cannot find a matching PluginInstance for LocalPluginPackage {pluginPackage.Id}"); } return(UninstallPluginAsync(pluginInstance)); }
/// <summary> /// get specified plugin, return null if not found /// </summary> /// <param name="id">id of plugin</param> /// <returns>plugin</returns> public static PluginPair GetPluginForId(string id) { return(AllPlugins.FirstOrDefault(o => o.Metadata.ID == id)); }