Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono-addins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLluis Sanchez Gual <lluis@novell.com>2011-04-04 21:31:02 +0400
committerLluis Sanchez Gual <lluis@novell.com>2011-04-04 21:31:02 +0400
commit2c9f3e29df87f4002c6c7be70418ecc7ec566209 (patch)
tree0a7290f2dfb88419ed59e9c2becc4d406514689d /Mono.Addins.Setup
parenta4f3b3c46e5e798b1378941a2f99bcce1492c903 (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.cs15
-rw-r--r--Mono.Addins.Setup/Mono.Addins.Setup/AddinStore.cs10
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);