File: Base\System\Security\RightsManagement\LocalizedNameDescriptionPair.cs
Project: wpf\src\WindowsBase.csproj (WindowsBase)
//-----------------------------------------------------------------------------
//
// <copyright file="LocalizedNameDescriptionPair.cs" company="Microsoft">
//    Copyright (C) Microsoft Corporation.  All rights reserved.
// </copyright>
//
// Description: This class represents an immutable pair of Strings (Name, Description)
// That are generally used to represent name and description of an unsigned publish license 
// (a.k.a. template). Unsigned Publish License has property called LocalizedNameDescriptionDictionary
// which holds a map of a local Id to a Name Description pair, in order to support scenarios of 
// building locale specific template browsing applications.
//
// History:
//  11/14/2005: IgorBel :   Initial Implementation 
//
//-----------------------------------------------------------------------------
 
using System;
using System.Collections;
using System.Diagnostics;
using System.Globalization;
using System.Windows;
using MS.Internal.Security.RightsManagement;
using SecurityHelper=MS.Internal.WindowsBase.SecurityHelper; 
 
// Allow use of presharp warning numbers [6506] and [6518] unknown to the compiler
#pragma warning disable 1634, 1691
 
namespace System.Security.RightsManagement 
{
 
    /// <summary>
    /// LocalizedNameDescriptionPair class represent an immutable (Name, Description) pair of strings. This is 
    /// a basic building block for structures that need to express locale specific information about 
    ///  Unsigned Publish Licenses. 
    /// </summary>
    /// <SecurityNote>
    ///     Critical:    This class exposes access to methods that eventually do one or more of the following
    ///             1. call into unmanaged code 
    ///             2. affects state/data that will eventually cross over unmanaged code boundary
    ///             3. Return some RM related information which is considered private 
    ///
    ///     TreatAsSafe: This attrbiute automatically applied to all public entry points. All the public entry points have
    ///     Demands for RightsManagementPermission at entry to counter the possible attacks that do 
    ///     not lead to the unamanged code directly(which is protected by another Demand there) but rather leave 
    ///     some status/data behind which eventually might cross the unamanaged boundary. 
    /// </SecurityNote>
    [SecurityCritical(SecurityCriticalScope.Everything)]    
    public class LocalizedNameDescriptionPair
    {
        /// <summary>
        /// Constructor for the read only LocalizedNameDescriptionPair class. It takes values for Name and Description as parameters. 
        /// </summary>
        public LocalizedNameDescriptionPair(string name, string description)
        {
            SecurityHelper.DemandRightsManagementPermission();
        
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
 
            if (description == null)
            {
                throw new ArgumentNullException("description");
            }
            
            _name = name;
            _description = description;
        }
 
        /// <summary>
        /// Read only Name property.
        /// </summary>
        public string Name 
        {
            get
            {
                SecurityHelper.DemandRightsManagementPermission();
 
                return _name;
            }
        }
 
        /// <summary>
        /// Read only Description property.
        /// </summary>
        public string Description 
        {
            get
            {
                SecurityHelper.DemandRightsManagementPermission();
            
                return _description;
            }
        }
 
        /// <summary>
        /// Test for equality.
        /// </summary>
        public override bool Equals(object obj)
        {
            SecurityHelper.DemandRightsManagementPermission();
 
            if ((obj == null) || (obj.GetType() != GetType()))
            {
                return false;
            }
 
            LocalizedNameDescriptionPair localizedNameDescr = obj as LocalizedNameDescriptionPair;
            
            //PRESHARP:Parameter to this public method must be validated:  A null-dereference can occur here. 
            //This is a false positive as the checks above can gurantee no null dereference will occur  
#pragma warning disable 6506
            return (String.CompareOrdinal(localizedNameDescr.Name, Name) == 0)
                        &&
                    (String.CompareOrdinal(localizedNameDescr.Description, Description) == 0);
#pragma warning restore 6506
        }        
            
        /// <summary>
        /// Compute hash code.
        /// </summary>
        public override int GetHashCode()
        {
            SecurityHelper.DemandRightsManagementPermission();
        
            return Name.GetHashCode()  ^  Description.GetHashCode();
        }
 
        private string _name;
        private string _description; 
    }
}