* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / ilasm / codegen / DeclSecurity.cs
index 274d05e1d15fa98617da1bf97918efda18280ccc..c318a0f71804b84549b521f63f24bf3a02356eed 100644 (file)
@@ -13,16 +13,19 @@ using System.Collections;
 using System.Security;
 using System.Security.Permissions;
 
+using SSPermissionSet = System.Security.PermissionSet;
+using MIPermissionSet = Mono.ILASM.PermissionSet;
+
 namespace Mono.ILASM {
 
         public interface IDeclSecurityTarget {
-                void AddPermission (PEAPI.SecurityAction sec_action, IPermission iper);
-                void AddPermissionSet (PEAPI.SecurityAction sec_action, PermissionSet perm_set);
+                DeclSecurity DeclSecurity { get; }
         }
 
         public class DeclSecurity {
 
                 private Hashtable permissionset_table;
+                private Hashtable permissionset20_table;
 
                 public DeclSecurity ()
                 {
@@ -31,18 +34,18 @@ namespace Mono.ILASM {
 
                 public void AddPermission (PEAPI.SecurityAction sec_action, IPermission perm)
                 {
-                        PermissionSet ps = (PermissionSet) permissionset_table [sec_action];
+                        SSPermissionSet ps = (SSPermissionSet) permissionset_table [sec_action];
                         if (ps == null) {
-                                ps = new PermissionSet (PermissionState.None);        
+                                ps = new SSPermissionSet (PermissionState.None);        
                                 permissionset_table [sec_action] = ps;
                         }
 
                         ps.AddPermission (perm);
                 }
 
-                public void AddPermissionSet (PEAPI.SecurityAction sec_action, PermissionSet perm_set)
+                public void AddPermissionSet (PEAPI.SecurityAction sec_action, SSPermissionSet perm_set)
                 {
-                        PermissionSet ps = (PermissionSet) permissionset_table [sec_action];
+                        SSPermissionSet ps = (SSPermissionSet) permissionset_table [sec_action];
                         if (ps == null) {
                                 permissionset_table [sec_action] = perm_set;
                                 return;
@@ -51,14 +54,50 @@ namespace Mono.ILASM {
                         foreach (IPermission iper in perm_set)
                                 ps.AddPermission (iper);
                 }
-               
+
+                //Not called by parser for profile != NET_2_0
+                public void AddPermissionSet (PEAPI.SecurityAction sec_action, MIPermissionSet perm_set)
+                {
+                        PermissionSet ps = null;
+
+                        if (permissionset20_table == null)
+                                permissionset20_table = new Hashtable ();
+                        else
+                                ps = (MIPermissionSet) permissionset20_table [sec_action];
+
+                        if (ps == null) {
+                                permissionset20_table [sec_action] = perm_set;
+                                return;
+                        }
+
+                        foreach (Permission perm in perm_set.Permissions)
+                                ps.AddPermission (perm);
+                }
+
                 public void AddTo (CodeGen code_gen, PEAPI.MetaDataElement elem)
                 {
                         System.Text.UnicodeEncoding ue = new System.Text.UnicodeEncoding ();
-                        foreach (PEAPI.SecurityAction sec_action in permissionset_table.Keys)
-                                code_gen.PEFile.AddDeclSecurity (sec_action, 
-                                        ue.GetBytes (((PermissionSet) permissionset_table [sec_action]).ToXml ().ToString ()), 
+                        foreach (DictionaryEntry entry in permissionset_table) {
+                                PEAPI.SecurityAction sec_action = (PEAPI.SecurityAction) entry.Key;
+                                SSPermissionSet ps = (SSPermissionSet) entry.Value;
+
+                                code_gen.PEFile.AddDeclSecurity (sec_action,
+                                        ue.GetBytes (ps.ToXml ().ToString ()), 
+                                         elem);
+                        }
+
+                        if (permissionset20_table == null)
+                                return;
+
+                        foreach (DictionaryEntry entry in permissionset20_table) {
+                                PEAPI.SecurityAction sec_action = (PEAPI.SecurityAction) entry.Key;
+                                MIPermissionSet ps = (MIPermissionSet) entry.Value;
+
+                                code_gen.PEFile.AddDeclSecurity (sec_action,
+                                        ps.Resolve (code_gen), 
                                         elem);
+                        }
+
                 }
 
         }