File: System\Transactions\DistributedTransactionPermission.cs
Project: ndp\cdf\src\NetFx20\System.Transactions\System.Transactions.csproj (System.Transactions)
using System;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Globalization;
 
namespace System.Transactions
{
    [SerializableAttribute()]
    public sealed class DistributedTransactionPermission : CodeAccessPermission, IUnrestrictedPermission
    {  
        private bool unrestricted;
 
        public DistributedTransactionPermission(PermissionState state)
        {
            if (state == PermissionState.Unrestricted)
            {
                unrestricted = true;
            }
            else
            {
                unrestricted = false;
            }
        }     
 
        public bool IsUnrestricted()
        {
            return unrestricted;
        }
 
        //Define the rest of your custom permission here. You must 
        //implement IsUnrestricted, and override Copy, Intersect, 
        //IsSubsetOf, ToXML, and FromXML.
 
        public override IPermission Copy()
        {
            DistributedTransactionPermission copy = new DistributedTransactionPermission(PermissionState.None);
 
            if (this.IsUnrestricted())
            {
                copy.unrestricted = true;
            }
            else
            {
                copy.unrestricted = false;
            }
            return copy;
        }
 
        public override IPermission Intersect(IPermission target)
        {
            try
            {
                if (null == target)
                {
                    return null;
                }
                DistributedTransactionPermission passedPermission = (DistributedTransactionPermission)target;
 
                if (!passedPermission.IsUnrestricted())
                {
                    return passedPermission;
                }
                return this.Copy();
            }
            catch (InvalidCastException)
            {
                throw new ArgumentException( SR.GetString( SR.ArgumentWrongType ), "target");
            }                
        }
 
        public override IPermission Union(IPermission target)
        {
            try
            {
                if (null == target)
                {
                    return this.Copy();
                }
                DistributedTransactionPermission passedPermission = (DistributedTransactionPermission)target;
 
                if (passedPermission.IsUnrestricted())
                {
                    return passedPermission;
                }
 
                return this.Copy();
            }
            catch (InvalidCastException)
            {
                throw new ArgumentException( SR.GetString( SR.ArgumentWrongType ), "target");
            }                
        }
 
        public override bool IsSubsetOf(IPermission target)
        {  
            if (null == target)
            {
                return !this.unrestricted;
            }
            try
            {        
                DistributedTransactionPermission passedPermission = (DistributedTransactionPermission)target;
                // If the current permission is "none" it will always be a subset of
                // any other DistributedTransactionPermission.
                if ( !this.unrestricted )
                {
                    return true;
                }
 
                // At this point, we know the current permission is unrestricted.  If
                // the passed permission is unrestricted, we have a subset.
                if ( passedPermission.unrestricted )
                {
                    return true;
                }
 
                // If we get here, the current permission is unrestricted, but the passed
                // permission is "none", so the current permission is NOT a subset of
                // the passed permission.
                return false;
            }
            catch (InvalidCastException)
            {
                throw new ArgumentException( SR.GetString( SR.ArgumentWrongType ), "target");
            }                
        }
 
        public override SecurityElement ToXml()
        {
            SecurityElement element = new SecurityElement("IPermission");
            Type type = this.GetType();
            StringBuilder assemblyName = new StringBuilder(type.Assembly.ToString());
            assemblyName.Replace('\"', '\'');
            element.AddAttribute("class", type.FullName + ", " + assemblyName);
            element.AddAttribute("version", "1");
            element.AddAttribute("Unrestricted", unrestricted.ToString());
            return element;
        }
 
        public override void FromXml(SecurityElement securityElement)
        {
            if ( null == securityElement )
            {
                throw new ArgumentNullException( "securityElement" );
            }
 
            if (!securityElement.Tag.Equals ("IPermission"))
            {
                throw new ArgumentException( SR.GetString( SR.ArgumentWrongType ), "securityElement" );
            }
 
            string element = securityElement.Attribute("Unrestricted");
            if (null != element)
            {  
                this.unrestricted = Convert.ToBoolean(element, CultureInfo.InvariantCulture);
            }
            else
            {
                this.unrestricted = false;
            }
        }
 
    }
 
    [AttributeUsageAttribute(AttributeTargets.All, AllowMultiple = true)]
    public sealed class DistributedTransactionPermissionAttribute : CodeAccessSecurityAttribute
    {
        bool unrestricted = false;
 
        public new bool Unrestricted
        {
            get { return unrestricted; }
            set { unrestricted = value; }
        }
 
        public DistributedTransactionPermissionAttribute(SecurityAction action) : base (action)
        {  
        }
        public override IPermission CreatePermission()
        {
            if (Unrestricted)
            {
                return new DistributedTransactionPermission(PermissionState.Unrestricted);
            }
            else
            {
                return new DistributedTransactionPermission(PermissionState.None);
            }
        }
    }
}