New tests.
[mono.git] / mcs / class / corlib / System.Security.Policy / PolicyStatement.cs
index 95a37d39b56e63b6573c681174e0568d8d0b16c6..111c25e34a13a9eacc2e0ee4594ec260a0191bd2 100644 (file)
 //\r
-// System.Security.Policy.PolicyStatement\r
+// System.Security.Policy.PolicyStatement.cs\r
 //\r
-// Author:\r
-//   Dan Lewis (dihlewis@yahoo.co.uk)\r
+// Authors:\r
+//     Dan Lewis (dihlewis@yahoo.co.uk)\r
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //\r
 // (C) 2002\r
-//\r
+// Copyright (C) 2004-2005 Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+\r
+using System.Runtime.InteropServices;
+using System.Security.Permissions;\r
 \r
 namespace System.Security.Policy {\r
 \r
        [Serializable]\r
-       public sealed class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable {\r
-               public PolicyStatement (PermissionSet perms) :\r
-                       this (perms, PolicyStatementAttribute.Nothing)\r
-               {\r
+       [ComVisible (true)]
+       public sealed class PolicyStatement : ISecurityEncodable, ISecurityPolicyEncodable {
+
+               private PermissionSet perms;\r
+               private PolicyStatementAttribute attrs;\r
+\r
+               public PolicyStatement (PermissionSet permSet) :
+                       this (permSet, PolicyStatementAttribute.Nothing)\r
+               {
                }\r
 \r
-               public PolicyStatement (PermissionSet perms, PolicyStatementAttribute attrs) {\r
-                       this.perms = perms;\r
-                       this.attrs = attrs;\r
+               public PolicyStatement (PermissionSet permSet, PolicyStatementAttribute attributes) 
+               {\r
+                       if (permSet != null) {\r
+                               this.perms = permSet.Copy ();
+                               this.perms.SetReadOnly (true);
+                       }\r
+                       this.attrs = attributes;\r
                }\r
                \r
                public PermissionSet PermissionSet {\r
-                       get { return perms; }\r
+                       get {
+                               if (perms == null) {
+                                       perms = new PermissionSet (PermissionState.None);
+                                       perms.SetReadOnly (true);
+                               }
+                               return perms;
+                       }\r
                        set { perms = value; }\r
                }\r
                \r
                public PolicyStatementAttribute Attributes {\r
                        get { return attrs; }\r
-                       set { attrs = value; }\r
+                       set {
+                               // note: yes it's a flag but all possible values have a corresponding name
+                               switch (value) {
+                               case PolicyStatementAttribute.Nothing:
+                               case PolicyStatementAttribute.Exclusive:
+                               case PolicyStatementAttribute.LevelFinal:
+                               case PolicyStatementAttribute.All:
+                                       attrs = value;
+                                       break;
+                               default:
+                                       string msg = Locale.GetText ("Invalid value for {0}.");
+                                       throw new ArgumentException (String.Format (msg, "PolicyStatementAttribute"));
+                               }
+                       }\r
                }\r
 \r
                public string AttributeString {\r
-                       get { return attrs.ToString ("F"); }\r
+                       get {
+                               switch (attrs) {
+                               case PolicyStatementAttribute.Exclusive:
+                                       return "Exclusive";
+                               case PolicyStatementAttribute.LevelFinal:
+                                       return "LevelFinal";
+                               case PolicyStatementAttribute.All:
+                                       return "Exclusive LevelFinal";
+                               default:
+                                       return String.Empty;
+                               }
+                       }\r
+               }\r
+\r
+               public PolicyStatement Copy ()\r
+               {\r
+                       return new PolicyStatement (perms, attrs);\r
                }\r
 \r
                // ISecurityEncodable\r
 \r
-               [MonoTODO]\r
-               public void FromXml (SecurityElement e) {\r
+               public void FromXml (SecurityElement et)\r
+               {\r
+                       FromXml (et, null);\r
                }\r
 \r
-               [MonoTODO]\r
-               public void FromXml (SecurityElement e, PolicyLevel level) {\r
+               public void FromXml (SecurityElement et, PolicyLevel level)\r
+               {
+                       if (et == null)
+                               throw new ArgumentNullException ("et");
+                       if (et.Tag != "PolicyStatement")
+                               throw new ArgumentException (Locale.GetText ("Invalid tag."));
+\r
+\r
+                       string attributes = et.Attribute ("Attributes");\r
+                       if (attributes != null) {\r
+                               attrs = (PolicyStatementAttribute) Enum.Parse (\r
+                                       typeof (PolicyStatementAttribute), attributes);\r
+                       }
+\r
+                       SecurityElement permissions = et.SearchForChildByTag ("PermissionSet");\r
+                       PermissionSet.FromXml (permissions);\r
                }\r
                \r
-               [MonoTODO]\r
-               public SecurityElement ToXml () {\r
-                       return null;\r
+               public SecurityElement ToXml ()\r
+               {\r
+                       return ToXml (null);\r
                }\r
 \r
-               [MonoTODO]\r
-               public SecurityElement ToXml (PolicyLevel level) {\r
-                       return null;\r
-               }\r
+               public SecurityElement ToXml (PolicyLevel level)\r
+               {\r
+                       SecurityElement element = new SecurityElement ("PolicyStatement");\r
+                       element.AddAttribute ("version", "1");\r
 \r
-               private PermissionSet perms;\r
-               private PolicyStatementAttribute attrs;\r
+                       if (attrs != PolicyStatementAttribute.Nothing)\r
+                               element.AddAttribute ("Attributes", attrs.ToString ());\r
+                       \r
+                       element.AddChild (PermissionSet.ToXml ());\r
+\r
+                       return element;\r
+               }
+
+               [ComVisible (false)]
+               public override bool Equals (object obj)
+               {
+                       if (obj == null)
+                               return false;
+                       PolicyStatement ps = (obj as PolicyStatement);
+                       if (ps == null)
+                               return false;
+
+                       return (PermissionSet.Equals (obj) && (attrs == ps.attrs));
+               }
+
+               [ComVisible (false)]
+               public override int GetHashCode ()
+               {
+                       // return same hash code if two PolicyStatement are equals
+                       return (PermissionSet.GetHashCode () ^ (int) attrs);
+               }
+
+               internal static PolicyStatement Empty ()
+               {
+                       return new PolicyStatement (new PermissionSet (PermissionState.None));
+               }
        }\r
 }\r