File: System\Xml\XmlDictionaryString.cs
Project: ndp\cdf\src\WCF\Serialization\System.Runtime.Serialization.csproj (System.Runtime.Serialization)
//------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//------------------------------------------------------------
namespace System.Xml
{
    using System;
    using System.Xml;
    using System.Text;
    using System.Diagnostics;
    using System.Runtime.Serialization;
 
    public class XmlDictionaryString
    {
        internal const int MinKey = 0;
        internal const int MaxKey = int.MaxValue / 4;
 
        IXmlDictionary dictionary;
        string value;
        int key;
        byte[] buffer;
        static EmptyStringDictionary emptyStringDictionary = new EmptyStringDictionary();
 
        public XmlDictionaryString(IXmlDictionary dictionary, string value, int key)
        {
            if (dictionary == null)
                throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("dictionary"));
            if (value == null)
                throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("value"));
            if (key < MinKey || key > MaxKey)
                throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentOutOfRangeException("key", SR.GetString(SR.ValueMustBeInRange, MinKey, MaxKey)));
            this.dictionary = dictionary;
            this.value = value;
            this.key = key;
        }
 
        static internal string GetString(XmlDictionaryString s)
        {
            if (s == null)
                return null;
            return s.Value;
        }
 
        static public XmlDictionaryString Empty
        {
            get
            {
                return emptyStringDictionary.EmptyString;
            }
        }
 
        public IXmlDictionary Dictionary
        {
            get
            {
                return dictionary;
            }
        }
 
        public int Key
        {
            get
            {
                return key;
            }
        }
 
        public string Value
        {
            get
            {
                return value;
            }
        }
 
        internal byte[] ToUTF8()
        {
            if (buffer == null)
                buffer = System.Text.Encoding.UTF8.GetBytes(value);
            return buffer;
        }
 
        public override string ToString()
        {
            return value;
        }
 
        class EmptyStringDictionary : IXmlDictionary
        {
            XmlDictionaryString empty;
 
            public EmptyStringDictionary()
            {
                empty = new XmlDictionaryString(this, string.Empty, 0);
            }
 
            public XmlDictionaryString EmptyString
            {
                get
                {
                    return empty;
                }
            }
 
            public bool TryLookup(string value, out XmlDictionaryString result)
            {
                if (value == null)
                    throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperArgumentNull("value");
                if (value.Length == 0)
                {
                    result = empty;
                    return true;
                }
                result = null;
                return false;
            }
 
            public bool TryLookup(int key, out XmlDictionaryString result)
            {
                if (key == 0)
                {
                    result = empty;
                    return true;
                }
                result = null;
                return false;
            }
 
            public bool TryLookup(XmlDictionaryString value, out XmlDictionaryString result)
            {
                if (value == null)
                    throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ArgumentNullException("value"));
                if (value.Dictionary != this)
                {
                    result = null;
                    return false;
                }
                result = value;
                return true;
            }
        }
    }
}