diff options
author | Lluis Sanchez Gual <lluis@novell.com> | 2011-04-04 21:31:02 +0400 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@novell.com> | 2011-04-04 21:31:02 +0400 |
commit | 2c9f3e29df87f4002c6c7be70418ecc7ec566209 (patch) | |
tree | 0a7290f2dfb88419ed59e9c2becc4d406514689d /Mono.Addins.Setup | |
parent | a4f3b3c46e5e798b1378941a2f99bcce1492c903 (diff) |
Allow 'uninstalling' core add-ins
Core add-ins can't really be uninstalled, so they are disabled.
Diffstat (limited to 'Mono.Addins.Setup')
-rw-r--r-- | Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs | 15 | ||||
-rw-r--r-- | Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs | 10 |
2 files changed, 24 insertions, 1 deletions
diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs index 00fb5b6..d5ccf3f 100644 --- a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs +++ b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs @@ -48,6 +48,7 @@ namespace Mono.Addins.Setup string packFile; string url; string tempFolder; + bool disablingOnUninstall; string configFile; bool installed; Addin iaddin; @@ -226,6 +227,12 @@ namespace Mono.Addins.Setup return; } + // The add-in is a core application add-in. It can't be uninstalled, so it will be disabled. + if (!service.IsUserAddin (iaddin.AddinFile)) { + disablingOnUninstall = true; + return; + } + if (!service.HasWriteAccess (iaddin.AddinFile)) throw new InstallException (AddinStore.GetUninstallErrorNoRoot (info)); @@ -243,12 +250,19 @@ namespace Mono.Addins.Setup internal override void CommitUninstall (IProgressMonitor monitor, AddinStore service) { + if (disablingOnUninstall) { + disablingOnUninstall = false; + service.Registry.DisableAddin (info.Id); + return; + } + if (tempFolder == null) return; monitor.Log.WriteLine ("Uninstalling " + info.Name + " v" + info.Version); AddinDescription conf = iaddin.Description; + string basePath = Path.GetDirectoryName (conf.AddinFile); foreach (string relPath in conf.AllFiles) { @@ -282,6 +296,7 @@ namespace Mono.Addins.Setup internal override void RollbackUninstall (IProgressMonitor monitor, AddinStore service) { + disablingOnUninstall = false; if (tempFolder != null) { AddinDescription conf = iaddin.Description; string configFile = Path.Combine (tempFolder, Path.GetFileName (iaddin.AddinFile)); diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs b/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs index b494117..91d925a 100644 --- a/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs +++ b/Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs @@ -411,7 +411,7 @@ namespace Mono.Addins.Setup AddinPackage ap = p as AddinPackage; if (ap != null) { Addin ia = service.Registry.GetAddin (ap.Addin.Id); - if (File.Exists (ia.AddinFile) && !HasWriteAccess (ia.AddinFile)) { + if (File.Exists (ia.AddinFile) && !HasWriteAccess (ia.AddinFile) && IsUserAddin (ia.AddinFile)) { monitor.ReportError (GetUninstallErrorNoRoot (ap.Addin), null); return false; } @@ -667,6 +667,14 @@ namespace Mono.Addins.Setup return false; } + internal bool IsUserAddin (string addinFile) + { + string installPath = service.InstallDirectory; + if (installPath [installPath.Length - 1] != Path.DirectorySeparatorChar) + installPath += Path.DirectorySeparatorChar; + return Path.GetFullPath (addinFile).StartsWith (installPath); + } + internal static string GetUninstallErrorNoRoot (AddinHeader ainfo) { return string.Format ("The add-in '{0} v{1}' can't be uninstalled with the current user permissions.", ainfo.Name, ainfo.Version); |