diff options
author | Lluis Sanchez <lluis@novell.com> | 2007-07-25 18:06:00 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2007-07-25 18:06:00 +0400 |
commit | 46c0d73ee640481b3bc07b643855f53d880de5b9 (patch) | |
tree | 83b7882c5716c193a4a75254e2daecf98cec4301 | |
parent | 903494de996e69353ca6e01f2f18b0e83e4425d5 (diff) |
* Mono.Addins/AddinSessionService.cs,
Mono.Addins.Description/AddinDescription.cs,
Mono.Addins.Database/AddinScanner.cs: When loading an add-in root
check if the add-in has changed. If it changed, update the add-in
database to make sure the correct info is loaded.
svn path=/trunk/mono-addins/; revision=82663
-rw-r--r-- | Mono.Addins/ChangeLog | 8 | ||||
-rw-r--r-- | Mono.Addins/Mono.Addins.Database/AddinScanner.cs | 1 | ||||
-rw-r--r-- | Mono.Addins/Mono.Addins.Description/AddinDescription.cs | 71 | ||||
-rw-r--r-- | Mono.Addins/Mono.Addins/AddinSessionService.cs | 12 |
4 files changed, 91 insertions, 1 deletions
diff --git a/Mono.Addins/ChangeLog b/Mono.Addins/ChangeLog index 61b6760..a674a3c 100644 --- a/Mono.Addins/ChangeLog +++ b/Mono.Addins/ChangeLog @@ -1,5 +1,13 @@ 2007-07-25 Lluis Sanchez Gual <lluis@novell.com> + * Mono.Addins/AddinSessionService.cs, + Mono.Addins.Description/AddinDescription.cs, + Mono.Addins.Database/AddinScanner.cs: When loading an add-in root + check if the add-in has changed. If it changed, update the add-in + database to make sure the correct info is loaded. + +2007-07-25 Lluis Sanchez Gual <lluis@novell.com> + * Mono.Addins/RuntimeAddin.cs: New GetResoruce overload. * Mono.Addins/ExtensionNode.cs: Added property for getting the parent of a node. Some more protection against exceptions. diff --git a/Mono.Addins/Mono.Addins.Database/AddinScanner.cs b/Mono.Addins/Mono.Addins.Database/AddinScanner.cs index eac5be2..98b2b4a 100644 --- a/Mono.Addins/Mono.Addins.Database/AddinScanner.cs +++ b/Mono.Addins/Mono.Addins.Database/AddinScanner.cs @@ -562,6 +562,7 @@ namespace Mono.Addins.Database } } + config.StoreFileInfo (); return true; } diff --git a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs index a4e0493..bab72d0 100644 --- a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs +++ b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs @@ -68,6 +68,7 @@ namespace Mono.Addins.Description ExtensionNodeSetCollection nodeSets; ConditionTypeDescriptionCollection conditionTypes; ExtensionPointCollection extensionPoints; + object[] fileInfo; internal static BinaryXmlTypeMap typeMap; @@ -86,6 +87,7 @@ namespace Mono.Addins.Description typeMap.RegisterType (typeof(AddinDependency), "AddinDependency"); typeMap.RegisterType (typeof(AssemblyDependency), "AssemblyDependency"); typeMap.RegisterType (typeof(NodeTypeAttribute), "NodeTypeAttribute"); + typeMap.RegisterType (typeof(AddinFileInfo), "FileInfo"); } internal AddinDatabase OwnerDatabase { @@ -331,6 +333,36 @@ namespace Mono.Addins.Description set { configFile = value; } } + internal void StoreFileInfo () + { + ArrayList list = new ArrayList (); + foreach (string f in AllFiles) { + string file = Path.Combine (this.BasePath, f); + AddinFileInfo fi = new AddinFileInfo (); + fi.FileName = f; + fi.Timestamp = File.GetLastWriteTime (file); + list.Add (fi); + } + fileInfo = list.ToArray (); + } + + internal bool FilesChanged () + { + // Checks if the files of the add-in have changed. + if (fileInfo == null) + return true; + + foreach (AddinFileInfo f in fileInfo) { + string file = Path.Combine (this.BasePath, f.FileName); + if (!File.Exists (file)) + return true; + if (f.Timestamp != File.GetLastWriteTime (file)) + return true; + } + + return false; + } + public void Save (string fileName) { configFile = fileName; @@ -637,6 +669,7 @@ namespace Mono.Addins.Description writer.WriteValue ("NodeSets", ExtensionNodeSets); writer.WriteValue ("ExtensionPoints", ExtensionPoints); writer.WriteValue ("ConditionTypes", ConditionTypes); + writer.WriteValue ("FilesInfo", fileInfo); } void IBinaryXmlElement.Read (BinaryXmlReader reader) @@ -661,9 +694,47 @@ namespace Mono.Addins.Description nodeSets = (ExtensionNodeSetCollection) reader.ReadValue ("NodeSets", new ExtensionNodeSetCollection (this)); extensionPoints = (ExtensionPointCollection) reader.ReadValue ("ExtensionPoints", new ExtensionPointCollection (this)); conditionTypes = (ConditionTypeDescriptionCollection) reader.ReadValue ("ConditionTypes", new ConditionTypeDescriptionCollection (this)); + fileInfo = (object[]) reader.ReadValue ("FilesInfo", null); if (mainModule != null) mainModule.SetParent (this); } } + + class AddinFileInfo: IBinaryXmlElement + { + string fileName; + DateTime timestamp; + + public string FileName { + get { + return fileName; + } + set { + fileName = value; + } + } + + public System.DateTime Timestamp { + get { + return timestamp; + } + set { + timestamp = value; + } + } + + public void Read (BinaryXmlReader reader) + { + fileName = reader.ReadStringValue ("fileName"); + timestamp = reader.ReadDateTimeValue ("timestamp"); + } + + public void Write (BinaryXmlWriter writer) + { + writer.WriteValue ("fileName", fileName); + writer.WriteValue ("timestamp", timestamp); + } + + } } diff --git a/Mono.Addins/Mono.Addins/AddinSessionService.cs b/Mono.Addins/Mono.Addins/AddinSessionService.cs index 300548f..6711537 100644 --- a/Mono.Addins/Mono.Addins/AddinSessionService.cs +++ b/Mono.Addins/Mono.Addins/AddinSessionService.cs @@ -327,8 +327,18 @@ namespace Mono.Addins return; string asmFile = new Uri (asm.CodeBase).LocalPath; Addin ainfo = AddinManager.Registry.GetAddinForHostAssembly (asmFile); - if (ainfo != null && !IsAddinLoaded (ainfo.Id)) + if (ainfo != null && !IsAddinLoaded (ainfo.Id)) { + if (ainfo.Description.FilesChanged ()) { + // If the add-in has changed, update the add-in database. + // We do it here because once loaded, add-in roots can't be + // reloaded like regular add-ins. + AddinManager.Registry.Update (null); + ainfo = AddinManager.Registry.GetAddinForHostAssembly (asmFile); + if (ainfo == null) + return; + } InsertAddin (null, ainfo); + } } } |