File: Shared\MS\Internal\Permissions\InternalPermissions.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//---------------------------------------------------------------------------
//
// <copyright file=InternalPermissions.cs company=Microsoft>
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
// 
//
// Description: Internal Permissions. 
//                  These are classes for permissions that will be asserted/demanded internally. 
//                  But will be granted in full-trust. 
//                  Only internal avalon code will assert these permissions. 
//
//              Using them allows the following: 
//                  We can have very specific targeted asserts. So for example instead of 
//                  a blanket assert for Unmanaged code instead we can have very granular permissiosn. 
//
//                  They are still available by default in full-trust. 
//                  
//                  Currently the only way to detect User-Initiated actions is for commands.
//                  So by associating a custom permisison with a command we can very tightly scope
//                  the set of operations allowed. 
//
// From MSDN:
//
// When you inherit from CodeAccessPermission, you must also implement the IUnrestrictedPermission interface. 
// The following CodeAccessPermission members must be overridden: Copy, Intersect, IsSubsetOf, ToXml, FromXml, and Union. 
// You must also define a constructor that takes a PermissionState as its only parameter. 
// You must apply the SerializableAttribute attribute to a class that inherits from CodeAccessPermission. 
//
// InternalParameterlessPermissionBase is a base class that requires derived classes to only support one
// PermissionState (Unrestricted) and to have no parameters/properties/state.  As above, derived classes must also be
// [Serializable] and have a public constructor that takes PermissionState.
// 
// History:  
//  02/28/05 : marka - Created
//---------------------------------------------------------------------------
 
using System;
using System.Diagnostics;
using System.Text;
using System.Security;
using System.Security.Permissions;
using System.Windows; 
 
#if WINDOWS_BASE
using MS.Internal.WindowsBase;
#endif
 
namespace MS.Internal.Permissions
{
    //
    // derive all InternalPermissions from this. 
    // Provides default implementations of several overridable methods on CodeAccessPermission
    // 
    [FriendAccessAllowed]
    [Serializable]
    internal abstract class InternalParameterlessPermissionBase : CodeAccessPermission, IUnrestrictedPermission
    {
       //------------------------------------------------------
       //
       //  Constructors
       //
       //------------------------------------------------------
        #region Constructor    
 
        protected InternalParameterlessPermissionBase(PermissionState state) 
        {
            Debug.Assert(GetType().IsSerializable);
 
            switch (state)
            {
            case PermissionState.Unrestricted:
                break;        
            case PermissionState.None:
            default:
                throw new ArgumentException(SR.Get(SRID.InvalidPermissionStateValue, state), "state");
            }
        }
 
        #endregion Constructor 
 
       //------------------------------------------------------
       //
       //  Interface Methods
       //
       //------------------------------------------------------
        #region Interface Methods   
        
        public bool IsUnrestricted()
        {
            return true; 
        }
        
        #endregion Interface Methods        
 
       //------------------------------------------------------
       //
       //  Public Methods
       //
       //------------------------------------------------------
 
        #region Public Methods   
 
        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");
           return element;
        }
 
        public override void FromXml( SecurityElement elem)
        {
            // from XML is easy - there is no state. 
        }
 
        public override IPermission Intersect(IPermission target)
        {
            if(null == target)
            {
                return null;
            }
            
            if ( target.GetType() != this.GetType() ) 
            {
                throw new ArgumentException( SR.Get(SRID.InvalidPermissionType, this.GetType().FullName), "target");
            }
 
            // there is no state. The intersection of 2 permissions of the same type is the same permission.   
            return this.Copy();
        }
 
        public override bool IsSubsetOf(IPermission target)
        {  
            if(null == target)
            {
                return false; 
            }
 
            if ( target.GetType() != this.GetType() ) 
            {
                throw new ArgumentException( SR.Get(SRID.InvalidPermissionType, this.GetType().FullName), "target");
            }
 
            // there is no state. If you are the same type as me - you are a subset of me. 
            return true; 
        }
 
        public override IPermission Union(IPermission target)
        {
            if(null == target)
            {
                return null;
            }
            
            if ( target.GetType() != this.GetType() ) 
            {
                throw new ArgumentException( SR.Get(SRID.InvalidPermissionType, this.GetType().FullName), "target");
            }
 
            // there is no state. The union of 2 permissions of the same type is the same permission.   
            return this.Copy();   
        }
                
        #endregion Public Methods   
    }
}