[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