/// <inheritdoc/> protected override ExitCode ExecuteHelper() { try { var appEntry = GetAppEntry(IntegrationManager, ref InterfaceUri); if (AdditionalArgs.Count == 2) { CreateAlias(appEntry, AdditionalArgs[0], _command); } else if (_command != null) { throw new OptionException(string.Format(Resources.NoAddCommandWithoutAlias, "--command"), "command"); } if (WindowsUtils.IsWindows && !CatalogManager.GetCachedSafe().ContainsFeed(appEntry.InterfaceUri)) { WindowsUtils.BroadcastMessage(AddedNonCatalogAppWindowMessageID); // Notify Zero Install GUIs of changes } return(ExitCode.OK); } #region Error handling catch (InvalidOperationException ex) // WebException is a subclass of InvalidOperationException but we don't want to catch it here when(ex is not WebException) { // Application already in AppList Handler.OutputLow(Resources.DesktopIntegration, ex.Message); return(ExitCode.NoChanges); } #endregion }
/// <inheritdoc/> protected override ExitCode ExecuteHelper(ICategoryIntegrationManager integrationManager, FeedUri interfaceUri) { #region Sanity checks if (integrationManager == null) { throw new ArgumentNullException(nameof(integrationManager)); } if (interfaceUri == null) { throw new ArgumentNullException(nameof(interfaceUri)); } #endregion try { var entry = CreateAppEntry(integrationManager, ref interfaceUri); if (!CatalogManager.GetCachedSafe().ContainsFeed(entry.InterfaceUri)) { WindowsUtils.BroadcastMessage(AddedNonCatalogAppWindowMessageID); // Notify Zero Install GUIs of changes } return(ExitCode.OK); } #region Error handling catch (InvalidOperationException ex) // WebException is a subclass of InvalidOperationException but we don't want to catch it here when(!(ex is WebException)) { // Application already in AppList Handler.OutputLow(Resources.DesktopIntegration, ex.Message); return(ExitCode.NoChanges); } #endregion }
/// <inheritdoc/> protected override void Finish() { Log.Debug("Saving AppList to: " + AppListPath); // Retry to handle race conditions with read-only access to the file ExceptionUtils.Retry <IOException>(delegate { AppList.SaveXml(AppListPath); }); WindowsUtils.NotifyAssocChanged(); // Notify Windows Explorer of changes WindowsUtils.BroadcastMessage(ChangedWindowMessageID); // Notify Zero Install GUIs of changes }
/// <inheritdoc/> protected override void Finish() { try { Log.Debug("Saving AppList to: " + AppListPath); AppList.SaveXml(AppListPath); } catch (IOException) { Log.Info("Race condition encountered while saving AppList. Waiting for a moment and then retrying."); Thread.Sleep(_random.Next(250, 1500)); AppList.SaveXml(AppListPath); } WindowsUtils.NotifyAssocChanged(); // Notify Windows Explorer of changes WindowsUtils.BroadcastMessage(ChangedWindowMessageID); // Notify Zero Install GUIs of changes }
/// <summary> /// Runs the deployment process. /// </summary> /// <exception cref="UnauthorizedAccessException">Access to a resource was denied.</exception> /// <exception cref="IOException">An IO operation failed.</exception> public void Deploy() { if (TargetDir == Locations.InstallBase) { throw new InvalidOperationException(string.Format(Resources.SourceAndTargetSame, TargetDir)); } var newManifest = LoadManifest(Locations.InstallBase); if (newManifest == null) { throw new IOException(Resources.MaintenanceMissingManifest); } var oldManifest = LoadManifest(TargetDir) ?? LegacyManifest; if (WindowsUtils.IsWindows && MachineWide) { ServiceStop(); } try { TargetMutexAquire(); using (var clearDir = new ClearDirectory(TargetDir, oldManifest, Handler)) using (var deployDir = new DeployDirectory(Locations.InstallBase, newManifest, TargetDir, Handler)) { deployDir.Stage(); clearDir.Stage(); if (Portable) { FileUtils.Touch(Path.Combine(TargetDir, Locations.PortableFlagName)); } deployDir.Commit(); clearDir.Commit(); } if (!Portable) { DesktopIntegrationApply(); if (WindowsUtils.IsWindows) { RegistryApply(); WindowsUtils.BroadcastMessage(PerformedWindowMessageID); RemoveOneGetBootstrap(); } } TargetMutexRelease(); if (WindowsUtils.IsWindows && MachineWide) { NgenApply(); ServiceInstall(); ServiceStart(); } } catch { TargetMutexRelease(); throw; } }