[mono/mono-addins] 82460570: Allow embedding .addin files into submodule assemblies
"Lluis Sanchez (
[email protected])" <
[email protected]>
Thu, 21 Nov 2013 17:53:00 +0000
| Newsgroups |
gmane.comp.gnome.mono.patches |
| Message-ID |
<000001427bcb2623-f98deceb-8ec5-4235-bfca-1217aa6933ea-000000@email.amazonses.com> |
Branch: refs/heads/sm-with-config
Home: https://github.com/mono/mono-addins
Compare: https://github.com/mono/mono-addins/commit/82460570998d
Commit: 82460570998db86d5201acd1523fda44c93cd3d3
Author: Lluis Sanchez <[email protected]> (slluis)
Date: 2013-11-21 17:51:45 GMT
URL: https://github.com/mono/mono-addins/commit/82460570998db86d5201acd1523fda44c93cd3d3
Allow embedding .addin files into submodule assemblies
Changed paths:
M Mono.Addins/Mono.Addins.Database/AddinScanner.cs
M Mono.Addins/Mono.Addins.Description/AddinDescription.cs
M Mono.Addins/Mono.Addins.Description/ModuleDescription.cs
Modified: Mono.Addins/Mono.Addins.Database/AddinScanner.cs
===================================================================
@@ -551,22 +551,8 @@ bool ScanAssembly (IProgressStatus monitor, string filePath, AddinScanResult sca
// Get the config file from the resources, if there is one
- foreach (string res in reflector.GetResourceNames (asm)) {
- if (res.EndsWith (".addin") || res.EndsWith (".addin.xml")) {
- using (Stream s = reflector.GetResourceStream (asm, res)) {
- AddinDescription ad = AddinDescription.Read (s, Path.GetDirectoryName (filePath));
- if (config != null) {
- if (!config.IsExtensionModel && !ad.IsExtensionModel) {
- // There is more than one add-in definition
- monitor.ReportError ("Duplicate add-in definition found in assembly: " + filePath, null);
- return false;
- }
- config = AddinDescription.Merge (config, ad);
- } else
- config = ad;
- }
- }
- }
+ if (!ScanEmbeddedDescription (monitor, filePath, reflector, asm, out config))
+ return false;
if (config == null) {
// In this case, only scan the assembly if it has the Addin attribute.
@@ -593,6 +579,29 @@ bool ScanAssembly (IProgressStatus monitor, string filePath, AddinScanResult sca
}
}
+ static bool ScanEmbeddedDescription (IProgressStatus monitor, string filePath, IAssemblyReflector reflector, object asm, out AddinDescription config)
+ {
+ config = null;
+ foreach (string res in reflector.GetResourceNames (asm)) {
+ if (res.EndsWith (".addin") || res.EndsWith (".addin.xml")) {
+ using (Stream s = reflector.GetResourceStream (asm, res)) {
+ AddinDescription ad = AddinDescription.Read (s, Path.GetDirectoryName (filePath));
+ if (config != null) {
+ if (!config.IsExtensionModel && !ad.IsExtensionModel) {
+ // There is more than one add-in definition
+ monitor.ReportError ("Duplicate add-in definition found in assembly: " + filePath, null);
+ return false;
+ }
+ config = AddinDescription.Merge (config, ad);
+ }
+ else
+ config = ad;
+ }
+ }
+ }
+ return true;
+ }
+
bool ScanDescription (IProgressStatus monitor, IAssemblyReflector reflector, AddinDescription config, object rootAssembly, AddinScanResult scanResult)
{
// First of all scan the main module
@@ -666,14 +675,14 @@ bool ScanDescription (IProgressStatus monitor, IAssemblyReflector reflector, Add
if (!config.IsRoot) {
foreach (ModuleDescription mod in config.OptionalModules) {
try {
- assemblies.Clear ();
+ var asmList = new List<Tuple<string,object>> ();
for (int n=0; n<mod.Assemblies.Count; n++) {
string s = mod.Assemblies [n];
if (mod.IgnorePaths.Contains (s))
continue;
string asmFile = Path.Combine (config.BasePath, s);
object asm = reflector.LoadAssembly (asmFile);
- assemblies.Add (asm);
+ asmList.Add (new Tuple<string,object> (asmFile,asm));
scanResult.AddPathToIgnore (Path.GetFullPath (asmFile));
ScanAssemblyImports (reflector, mod, asm);
}
@@ -688,9 +697,9 @@ bool ScanDescription (IProgressStatus monitor, IAssemblyReflector reflector, Add
scanResult.AddPathToIgnore (Path.GetFullPath (path));
}
- foreach (object asm in assemblies)
- ScanAssemblyContents (reflector, config, mod, asm, scanResult);
-
+ foreach (var asm in asmList)
+ ScanSubmodule (monitor, mod, reflector, config, scanResult, asm.Item1, asm.Item2);
+
} catch (Exception ex) {
ReportReflectionException (monitor, ex, config, scanResult);
}
@@ -701,6 +710,37 @@ bool ScanDescription (IProgressStatus monitor, IAssemblyReflector reflector, Add
return true;
}
+ bool ScanSubmodule (IProgressStatus monitor, ModuleDescription mod, IAssemblyReflector reflector, AddinDescription config, AddinScanResult scanResult, string assemblyName, object asm)
+ {
+ AddinDescription mconfig;
+ ScanEmbeddedDescription (monitor, assemblyName, reflector, asm, out mconfig);
+ if (mconfig != null) {
+ if (!mconfig.IsExtensionModel) {
+ monitor.ReportError ("Submodules can't define new add-ins: " + assemblyName, null);
+ return false;
+ }
+ if (mconfig.OptionalModules.Count != 0) {
+ monitor.ReportError ("Submodules can't define nested submodules: " + assemblyName, null);
+ return false;
+ }
+ if (mconfig.ConditionTypes.Count != 0) {
+ monitor.ReportError ("Submodules can't define condition types: " + assemblyName, null);
+ return false;
+ }
+ if (mconfig.ExtensionNodeSets.Count != 0) {
+ monitor.ReportError ("Submodules can't define extension node sets: " + assemblyName, null);
+ return false;
+ }
+ if (mconfig.ExtensionPoints.Count != 0) {
+ monitor.ReportError ("Submodules can't define extension points sets: " + assemblyName, null);
+ return false;
+ }
+ mod.MergeWith (mconfig.MainModule);
+ }
+ ScanAssemblyContents (reflector, config, mod, asm, scanResult);
+ return true;
+ }
+
void ReportReflectionException (IProgressStatus monitor, Exception ex, AddinDescription config, AddinScanResult scanResult)
{
scanResult.AddFileToWithFailure (config.AddinFile);
Modified: Mono.Addins/Mono.Addins.Description/AddinDescription.cs
===================================================================
@@ -1193,8 +1193,7 @@ internal static AddinDescription Merge (AddinDescription desc1, AddinDescription
desc1.MainModule.Assemblies.Add (s);
foreach (string s in desc2.MainModule.DataFiles)
desc1.MainModule.DataFiles.Add (s);
- desc1.MainModule.Dependencies.AddRange (desc2.MainModule.Dependencies);
- desc1.MainModule.Extensions.AddRange (desc2.MainModule.Extensions);
+ desc1.MainModule.MergeWith (desc2.MainModule);
return desc1;
}
Modified: Mono.Addins/Mono.Addins.Description/ModuleDescription.cs
===================================================================
@@ -66,6 +66,12 @@ public ModuleDescription ()
{
}
+ internal void MergeWith (ModuleDescription module)
+ {
+ Dependencies.AddRange (module.Dependencies);
+ Extensions.AddRange (module.Extensions);
+ }
+
/// <summary>
/// Checks if this module depends on the specified add-in.
/// </summary>
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches