diff options
author | Lluis Sanchez <lluis@novell.com> | 2007-04-10 20:01:22 +0400 |
---|---|---|
committer | Lluis Sanchez <lluis@novell.com> | 2007-04-10 20:01:22 +0400 |
commit | a30ec5d0ac3bebf93c8f017cb0885070988c0e45 (patch) | |
tree | b7be4b3d6a96a5c22efb0cb87d417f5632bc32e1 /Mono.Addins/Mono.Addins.Description/AddinDescription.cs | |
parent | 1b6638cadd54d86d5793c5fd85dc962471716287 (diff) |
* Mono.Addins.mdp, Makefile.am, Mono.Addins.csproj: Updated.
* Mono.Addins/Addin.cs: Properly resolve absolute add-in ids (starting
with ::).
* Mono.Addins/AddinRegistry.cs: Added method for reading a manifest.
* Mono.Addins.Description/Extension.cs: Added GetExtendedObject()
method. Initialize the owner of all collections.
* Mono.Addins.Description/AddinDependency.cs: Added method for getting
the full ID of the referenced assembly.
* Mono.Addins.Description/AddinDescription.cs: Added OwnerDatabase
property. Initialize the owner of all collections. Properly check
for referenced assemblies in Validate().
* Mono.Addins.Description/ExtensionNodeType.cs: Properly read the
objectType attribute from XML. Initialize the owner of all
collections.
* Mono.Addins.Description/ObjectDescriptionCollection.cs: Added
constructor which takes the collection owner as parameter. When an
element is added, set the parent of the element.
* Mono.Addins.Description/ExtensionPoint.cs,
Mono.Addins.Description/ModuleDescription.cs: Initialize the owner
of all collections.
* Mono.Addins.Description/ExtensionNodeDescription.cs: Added
GetNodeType() method and some helper properties. Initialize the
owner of all collections.
* Mono.Addins.Description/NodeTypeAttributeCollection.cs,
Mono.Addins.Description/ExtensionCollection.cs,
Mono.Addins.Description/DependencyCollection.cs,
Mono.Addins.Description/ExtensionNodeDescriptionCollection.cs,
Mono.Addins.Description/ExtensionPointCollection.cs,
Mono.Addins.Description/ModuleDescriptionCollection.cs,
Mono.Addins.Description/ConditionTypeDescriptionCollection.cs,
Mono.Addins.Description/ExtensionNodeSetCollection.cs: Added
constructor which takes the collection owner as parameter.
* Mono.Addins.Description/ExtensionNodeSet.cs: Added
GetAllowedNodeTypes() method, which returns all allowed nodes,
recursivelly looking at referenced node sets. Initialize the owner
of all collections.
* Mono.Addins.Description/ExtensionNodeTypeCollection.cs: New
collection.
* Mono.Addins.Description/ObjectDescription.cs: Added properties for
getting the parent of an object, and the add-in description where
the object is declared.
* Mono.Addins.Database/AddinDatabase.cs: Properly reuse generated
add-in ids when the add-in file is the same. Added method for
finding a node set defined in the registry. Initialize the
OwnerDatabase property of every loaded AddinDescription.
* Mono.Addins.Database/AddinScanner.cs: When looking for add-in types,
look in the references too. Set HasUserId to false for add-ins with
auto-generated ID.
svn path=/trunk/mono-addins/; revision=75575
Diffstat (limited to 'Mono.Addins/Mono.Addins.Description/AddinDescription.cs')
-rw-r--r-- | Mono.Addins/Mono.Addins.Description/AddinDescription.cs | 95 |
1 files changed, 78 insertions, 17 deletions
diff --git a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs index c18288d..68ded31 100644 --- a/Mono.Addins/Mono.Addins.Description/AddinDescription.cs +++ b/Mono.Addins/Mono.Addins.Description/AddinDescription.cs @@ -44,6 +44,7 @@ namespace Mono.Addins.Description XmlDocument configDoc; string configFile; bool fromBinaryFile; + AddinDatabase ownerDatabase; string id; string name; @@ -85,6 +86,11 @@ namespace Mono.Addins.Description typeMap.RegisterType (typeof(NodeTypeAttribute), "NodeTypeAttribute"); } + internal AddinDatabase OwnerDatabase { + get { return ownerDatabase; } + set { ownerDatabase = value; } + } + public string AddinFile { get { return sourceAddinFile; } set { sourceAddinFile = value; } @@ -96,7 +102,7 @@ namespace Mono.Addins.Description public string LocalId { get { return id != null ? id : string.Empty; } - set { id = value; } + set { id = value; hasUserId = true; } } public string Namespace { @@ -189,6 +195,7 @@ namespace Mono.Addins.Description mainModule = new ModuleDescription (); else mainModule = new ModuleDescription (RootElement); + mainModule.SetParent (this); } return mainModule; } @@ -197,7 +204,7 @@ namespace Mono.Addins.Description public ModuleCollection OptionalModules { get { if (optionalModules == null) { - optionalModules = new ModuleCollection (); + optionalModules = new ModuleCollection (this); if (RootElement != null) { foreach (XmlElement mod in RootElement.SelectNodes ("Module")) optionalModules.Add (new ModuleDescription (mod)); @@ -209,7 +216,7 @@ namespace Mono.Addins.Description public ModuleCollection AllModules { get { - ModuleCollection col = new ModuleCollection (); + ModuleCollection col = new ModuleCollection (this); col.Add (MainModule); foreach (ModuleDescription mod in OptionalModules) col.Add (mod); @@ -220,7 +227,7 @@ namespace Mono.Addins.Description public ExtensionNodeSetCollection ExtensionNodeSets { get { if (nodeSets == null) { - nodeSets = new ExtensionNodeSetCollection (); + nodeSets = new ExtensionNodeSetCollection (this); if (RootElement != null) { foreach (XmlElement elem in RootElement.SelectNodes ("ExtensionNodeSet")) nodeSets.Add (new ExtensionNodeSet (elem)); @@ -233,7 +240,7 @@ namespace Mono.Addins.Description public ExtensionPointCollection ExtensionPoints { get { if (extensionPoints == null) { - extensionPoints = new ExtensionPointCollection (); + extensionPoints = new ExtensionPointCollection (this); if (RootElement != null) { foreach (XmlElement elem in RootElement.SelectNodes ("ExtensionPoint")) extensionPoints.Add (new ExtensionPoint (elem)); @@ -246,7 +253,7 @@ namespace Mono.Addins.Description public ConditionTypeDescriptionCollection ConditionTypes { get { if (conditionTypes == null) { - conditionTypes = new ConditionTypeDescriptionCollection (); + conditionTypes = new ConditionTypeDescriptionCollection (this); if (RootElement != null) { foreach (XmlElement elem in RootElement.SelectNodes ("ConditionType")) conditionTypes.Add (new ConditionTypeDescription (elem)); @@ -264,6 +271,45 @@ namespace Mono.Addins.Description return ep; } + internal ExtensionNodeDescription FindExtensionNode (string path, bool lookInDeps) + { + // Look in the extensions of this add-in + + foreach (Extension ext in MainModule.Extensions) { + if (path.StartsWith (ext.Path + "/")) { + string subp = path.Substring (ext.Path.Length).Trim ('/'); + ExtensionNodeDescriptionCollection nodes = ext.ExtensionNodes; + ExtensionNodeDescription node = null; + foreach (string p in subp.Split ('/')) { + if (p.Length == 0) continue; + node = nodes [p]; + if (node == null) + break; + nodes = node.ChildNodes; + } + if (node != null) + return node; + } + } + + if (!lookInDeps || OwnerDatabase == null) + return null; + + // Look in dependencies + + foreach (Dependency dep in MainModule.Dependencies) { + AddinDependency adep = dep as AddinDependency; + if (adep == null) continue; + Addin ad = OwnerDatabase.GetInstalledAddin (adep.FullAddinId); + if (ad != null && ad.Description != null) { + ExtensionNodeDescription node = ad.Description.FindExtensionNode (path, false); + if (node != null) + return node; + } + } + return null; + } + XmlElement RootElement { get { if (configDoc != null) @@ -291,7 +337,11 @@ namespace Mono.Addins.Description SaveXml (); - configDoc.Save (configFile); + using (StreamWriter sw = new StreamWriter (configFile)) { + XmlTextWriter tw = new XmlTextWriter (sw); + tw.Formatting = Formatting.Indented; + configDoc.Save (tw); + } } public XmlDocument SaveToXml () @@ -392,9 +442,7 @@ namespace Mono.Addins.Description try { config.configDoc = new XmlDocument (); - config.configDoc.PreserveWhitespace = true; config.configDoc.Load (stream); - config.configDoc.PreserveWhitespace = false; } catch (Exception ex) { throw new InvalidOperationException ("The add-in configuration file is invalid.", ex); } @@ -483,10 +531,20 @@ namespace Mono.Addins.Description errors.Add ("Attribute 'id' can't be empty for global node sets."); } - foreach (string file in AllFiles) { - string asmFile = Path.Combine (BasePath, file); - if (!File.Exists (asmFile)) - errors.Add ("The file '" + file + "' referenced in the manifest could not be found."); + string bp = null; + if (BasePath.Length > 0) + bp = BasePath; + else if (sourceAddinFile != null && sourceAddinFile.Length > 0) + bp = Path.GetDirectoryName (AddinFile); + else if (configFile != null && configFile.Length > 0) + bp = Path.GetDirectoryName (configFile); + + if (bp != null) { + foreach (string file in AllFiles) { + string asmFile = Path.Combine (BasePath, file); + if (!File.Exists (asmFile)) + errors.Add ("The file '" + file + "' referenced in the manifest could not be found."); + } } return errors; @@ -567,10 +625,13 @@ namespace Mono.Addins.Description basePath = reader.ReadStringValue ("basePath"); sourceAddinFile = reader.ReadStringValue ("sourceAddinFile"); mainModule = (ModuleDescription) reader.ReadValue ("MainModule"); - optionalModules = (ModuleCollection) reader.ReadValue ("OptionalModules", new ModuleCollection ()); - nodeSets = (ExtensionNodeSetCollection) reader.ReadValue ("NodeSets", new ExtensionNodeSetCollection ()); - extensionPoints = (ExtensionPointCollection) reader.ReadValue ("ExtensionPoints", new ExtensionPointCollection ()); - conditionTypes = (ConditionTypeDescriptionCollection) reader.ReadValue ("ConditionTypes", new ConditionTypeDescriptionCollection ()); + optionalModules = (ModuleCollection) reader.ReadValue ("OptionalModules", new ModuleCollection (this)); + nodeSets = (ExtensionNodeSetCollection) reader.ReadValue ("NodeSets", new ExtensionNodeSetCollection (this)); + extensionPoints = (ExtensionPointCollection) reader.ReadValue ("ExtensionPoints", new ExtensionPointCollection (this)); + conditionTypes = (ConditionTypeDescriptionCollection) reader.ReadValue ("ConditionTypes", new ConditionTypeDescriptionCollection (this)); + + if (mainModule != null) + mainModule.SetParent (this); } } } |