// // System.Net.DnsPermission.cs // // Author: // Lawrence Pit (loz@cable.a2000.nl) // using System; using System.Collections; using System.Security; using System.Security.Permissions; namespace System.Net { [Serializable] public sealed class DnsPermission : CodeAccessPermission, IUnrestrictedPermission { // Fields bool m_noRestriction; // Constructors public DnsPermission (PermissionState state) : base () { m_noRestriction = (state == PermissionState.Unrestricted); } // Methods public override IPermission Copy () { // this is immutable. return this; } public override IPermission Intersect (IPermission target) { // LAMESPEC: says to throw an exception when null // but at same time it says to return null. We'll // follow MS behaviour. if (target == null) return null; DnsPermission perm = target as DnsPermission; if (perm == null) throw new ArgumentException ("Argument not of type DnsPermission"); if (this.m_noRestriction && perm.m_noRestriction) return this; return this.m_noRestriction ? perm : this; } public override bool IsSubsetOf (IPermission target) { if (target == null) return !m_noRestriction; DnsPermission perm = target as DnsPermission; if (perm == null) throw new ArgumentException ("Argument not of type DnsPermission"); return !this.m_noRestriction || perm.m_noRestriction; } public bool IsUnrestricted () { return this.m_noRestriction; } /* DnsPermission dns1 = new DnsPermission (PermissionState.None); Console.WriteLine (dns1.ToXml ().ToString ()); DnsPermission dns2 = new DnsPermission (PermissionState.Unrestricted); Console.WriteLine (dns2.ToXml ().ToString ()); This is the sample xml output: */ public override SecurityElement ToXml () { SecurityElement root = new SecurityElement ("IPermission"); root.AddAttribute ("class", this.GetType ().AssemblyQualifiedName); root.AddAttribute ("version", "1"); if (m_noRestriction) root.AddAttribute ("Unrestricted", "true"); return root; } public override void FromXml (SecurityElement securityElement) { if (securityElement == null) throw new ArgumentNullException ("securityElement"); // LAMESPEC: it says to throw an ArgumentNullException in this case if (securityElement.Tag != "IPermission") throw new ArgumentException ("securityElement"); string classStr = securityElement.Attribute ("class"); if (classStr == null || !classStr.StartsWith (this.GetType ().FullName + ",")) throw new ArgumentException ("securityElement"); string unrestricted = securityElement.Attribute ("Unrestricted"); if (unrestricted != null) this.m_noRestriction = (String.Compare (unrestricted, "true", true) == 0); } public override IPermission Union (IPermission target) { // LAMESPEC: according to spec we should throw an // exception when target is null. We'll follow the // behaviour of MS.Net instead of the spec. if (target == null) return this; // throw new ArgumentNullException ("target"); DnsPermission perm = target as DnsPermission; if (perm == null) throw new ArgumentException ("Argument not of type DnsPermission"); return this.m_noRestriction ? this : perm; } } }