svn path=/branches/mono-1-1-9/mcs/; revision=51206
[mono.git] / mcs / class / corlib / System.Security.Permissions / ZoneIdentityPermission.cs
index 24e6668b05bc7851a865e2eaabaecc9ed45d5cf6..0e6ca4a583d9af375717f19fdca911240a90430b 100644 (file)
@@ -3,12 +3,10 @@
 //
 // Authors:
 //     Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//     Sebastien Pouliot  <sebastien@ximian.com>
 //
 // (C) 2002 Ximian, Inc (http://www.ximian.com)
-//
-
-//
-// Copyright (C) 2004 Novell, Inc (http://www.novell.com)
+// 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
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;
-using System.Security;
+
+using System.Globalization;
+using System.Runtime.InteropServices;
 
 namespace System.Security.Permissions {
 
+#if NET_2_0
+       [ComVisible (true)]
+#endif
        [Serializable]
        public sealed class ZoneIdentityPermission : CodeAccessPermission, IBuiltInPermission {
 
-               SecurityZone zone;
+               private const int version = 1;
+
+               private SecurityZone zone;
 
                public ZoneIdentityPermission (PermissionState state)
                {
-                       if (state == PermissionState.Unrestricted)
-                               throw new ArgumentException ("unrestricted not allowed");
-
-                       if (state != PermissionState.None)
-                               throw new ArgumentException ("invalid state");
-
+                       // false == do not allow Unrestricted for Identity Permissions
+                       CheckPermissionState (state, false);
+                       // default values
                        zone = SecurityZone.NoZone;
                }
 
                public ZoneIdentityPermission (SecurityZone zone)
                {
-                       this.zone = zone;
+                       // also needs the validations
+                       SecurityZone = zone;
                }
 
                public override IPermission Copy ()
@@ -62,42 +64,39 @@ namespace System.Security.Permissions {
 
                public override bool IsSubsetOf (IPermission target)
                {
-                       if (target == null)
-                               return zone == SecurityZone.NoZone;
-
-                       if (!(target is ZoneIdentityPermission))
-                               throw new ArgumentException ();
+                       ZoneIdentityPermission zip = Cast (target);
+                       if (zip == null)
+                               return (zone == SecurityZone.NoZone);
 
-                       return zone != ((ZoneIdentityPermission) target).zone;
+                       return ((zone == SecurityZone.NoZone) || (zone == zip.zone));
                }
 
                public override IPermission Union (IPermission target)
                {
-                       if (target == null)
+                       ZoneIdentityPermission zip = Cast (target);
+                       if (zip == null)
                                return (zone == SecurityZone.NoZone) ? null : Copy ();
 
-                       if (!(target is ZoneIdentityPermission))
-                               throw new ArgumentException ();
-
-                       ZoneIdentityPermission se = (ZoneIdentityPermission) target;
-                       if (zone == se.zone || se.zone == SecurityZone.NoZone)
+                       if (zone == zip.zone || zip.zone == SecurityZone.NoZone)
                                return Copy ();
 
                        if (zone == SecurityZone.NoZone)
-                               return se.Copy ();
-
+                               return zip.Copy ();
+#if NET_2_0
+                       throw new ArgumentException (Locale.GetText (
+                               "Union impossible"));
+#else
                        return null;
+#endif
                }
 
                public override IPermission Intersect (IPermission target)
                {
-                       if (target == null || zone == SecurityZone.NoZone)
+                       ZoneIdentityPermission zip = Cast (target);
+                       if (zip == null || zone == SecurityZone.NoZone)
                                return null;
 
-                       if (!(target is ZoneIdentityPermission))
-                               throw new ArgumentException ();
-
-                       if (zone == ((ZoneIdentityPermission) target).zone)
+                       if (zone == zip.zone)
                                return Copy ();
 
                        return null;
@@ -105,35 +104,33 @@ namespace System.Security.Permissions {
 
                public override void FromXml (SecurityElement esd)
                {
-                       if (esd == null)
-                               throw new ArgumentException ("esd is null");
+                       // General validation in CodeAccessPermission
+                       CheckSecurityElement (esd, "esd", version, version);
+                       // Note: we do not (yet) care about the return value 
+                       // as we only accept version 1 (min/max values)
 
-                       if (esd.Attribute ("version") != "1")
-                               throw new ArgumentException ("version attributte is wrong");
-                               
                        string zoneName = esd.Attribute ("Zone");
-                       zone = (SecurityZone) Enum.Parse (typeof (SecurityZone), zoneName);
+                       if (zoneName == null)
+                               zone = SecurityZone.NoZone;
+                       else
+                               zone = (SecurityZone) Enum.Parse (typeof (SecurityZone), zoneName);
                }
 
                public override SecurityElement ToXml ()
                {
-                       SecurityElement se = new SecurityElement ("IPermission");
-                       se.AddAttribute ("version", "1");
-                       Type t = GetType ();
-                       se.AddAttribute("class", t.FullName + ", " + t.Module.Assembly.FullName);
-
+                       SecurityElement se = Element (version);
+                       if (zone != SecurityZone.NoZone)
+                               se.AddAttribute ("Zone", zone.ToString ());
                        return se;
                }
 
-               public SecurityZone SecurityZone
-               {
-                       get {
-                               return zone;
-                       }
-
+               public SecurityZone SecurityZone {
+                       get { return zone; }
                        set {
-                               if (!Enum.IsDefined (typeof (SecurityZone), value))
-                                       throw new ArgumentException ("invalid zone");
+                               if (!Enum.IsDefined (typeof (SecurityZone), value)) {
+                                       string msg = String.Format (Locale.GetText ("Invalid enum {0}"), value);
+                                       throw new ArgumentException (msg, "SecurityZone");
+                               }
                                zone = value;
                        }
                }
@@ -141,7 +138,22 @@ namespace System.Security.Permissions {
                // IBuiltInPermission
                int IBuiltInPermission.GetTokenIndex ()
                {
-                       return 13;
+                       return (int) BuiltInToken.ZoneIdentity;
+               }
+
+               // helpers
+
+               private ZoneIdentityPermission Cast (IPermission target)
+               {
+                       if (target == null)
+                               return null;
+
+                       ZoneIdentityPermission zip = (target as ZoneIdentityPermission);
+                       if (zip == null) {
+                               ThrowInvalidPermission (target, typeof (ZoneIdentityPermission));
+                       }
+
+                       return zip;
                }
        }
 }