IAutoUpdater IFactory.CreateAutoUpdater(Extensibility.IPluginsManagerInternal pluginsManager) { return(new AutoUpdater( this, mutualExecutionCounter, shutdown, synchronizationContext, telemetry, storage, traceSourceFactory, pluginsManager, changeNotification )); }
static async Task <IReadOnlyList <Extensibility.IPluginInfo> > GetRequiredPlugins( Extensibility.IPluginsManagerInternal pluginsManager, CancellationToken cancellation ) { var allPlugins = await pluginsManager.FetchAllPlugins(cancellation); return(ImmutableArray.CreateRange(allPlugins.Where(plugin => { if (plugin.IndexItem == null) { return false; } if (pluginsManager.InstallationRequests.TryGetValue(plugin.Id, out var requestedState)) { return requestedState; } return plugin.InstalledPluginManifest != null; }))); }
public AutoUpdater( IFactory factory, MultiInstance.IInstancesCounter mutualExecutionCounter, IShutdown shutdown, ISynchronizationContext eventInvoker, Telemetry.ITelemetryCollector telemetry, Persistence.IStorageManager storage, ITraceSourceFactory traceSourceFactory, Extensibility.IPluginsManagerInternal pluginsManager, IChangeNotification changeNotification ) { this.updateDownloader = factory.CreateAppUpdateDownloader(); this.checkRequested = new TaskCompletionSource <int>(); this.factory = factory; this.pluginsManager = pluginsManager; this.trace = traceSourceFactory.CreateTraceSource("AutoUpdater"); var entryAssemblyLocation = Assembly.GetEntryAssembly()?.Location; if (entryAssemblyLocation != null) { this.managedAssembliesPath = Path.GetDirectoryName(entryAssemblyLocation); this.updateInfoFilePath = Path.Combine(managedAssembliesPath, Constants.updateInfoFileName); this.installationDir = Path.GetFullPath( Path.Combine(managedAssembliesPath, Constants.installationPathRootRelativeToManagedAssembliesLocation)); } this.eventInvoker = eventInvoker; this.telemetry = telemetry; this.storage = storage; shutdown.Cleanup += (s, e) => ((IDisposable)this).Dispose(); this.updatesStorageEntry = storage.GetEntry("updates"); bool isFirstInstance = mutualExecutionCounter.IsPrimaryInstance; bool isDownloaderConfigured = updateDownloader.IsDownloaderConfigured; if (entryAssemblyLocation == null) { trace.Info("autoupdater is disabled - no entry assembly"); isActiveAutoUpdaterInstance = false; state = AutoUpdateState.Disabled; } else if (!isDownloaderConfigured) { trace.Info("autoupdater is disabled - update downloader not configured"); isActiveAutoUpdaterInstance = false; state = AutoUpdateState.Disabled; } else if (!isFirstInstance) { trace.Info("autoupdater is deactivated - not a first instance of logjoint"); isActiveAutoUpdaterInstance = false; state = AutoUpdateState.Inactive; } else { trace.Info("autoupdater is enabled"); isActiveAutoUpdaterInstance = true; state = AutoUpdateState.Idle; workerCancellation = new CancellationTokenSource(); workerCancellationToken = workerCancellation.Token; workerCancellationTask = new TaskCompletionSource <int>(); changeListenerSubscription = changeNotification.CreateSubscription(Updaters.Create( () => pluginsManager.InstallationRequests, (_, prev) => { if (prev != null) { checkRequested.TrySetResult(1); } } )); worker = TaskUtils.StartInThreadPoolTaskScheduler(Worker); } }