SourceElementsCollection.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / CompMod / System / Diagnostics / SourceElementsCollection.cs / 1305376 / SourceElementsCollection.cs

                            //------------------------------------------------------------------------------ 
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//----------------------------------------------------------------------------- 
using System.Configuration;
using System.Collections; 
using System.Collections.Specialized; 
using System.Xml;
 
namespace System.Diagnostics {
    [ConfigurationCollection(typeof(SourceElement), AddItemName = "source",
     CollectionType = ConfigurationElementCollectionType.BasicMap)]
    internal class SourceElementsCollection  : ConfigurationElementCollection { 

        new public SourceElement this[string name] { 
            get { 
                return (SourceElement) BaseGet(name);
            } 
        }

        protected override string ElementName {
            get { 
                return "source";
            } 
        } 

        public override ConfigurationElementCollectionType CollectionType { 
            get {
                return ConfigurationElementCollectionType.BasicMap;
            }
        } 

        protected override ConfigurationElement CreateNewElement() { 
            SourceElement se = new SourceElement(); 
            se.Listeners.InitializeDefaultInternal();
            return se; 
        }

        protected override Object GetElementKey(ConfigurationElement element) {
            return ((SourceElement) element).Name; 
        }
    } 
 

    internal class SourceElement : ConfigurationElement { 
        private static readonly ConfigurationPropertyCollection _properties;
        private static readonly ConfigurationProperty _propName = new ConfigurationProperty("name", typeof(string), "", ConfigurationPropertyOptions.IsRequired);
        private static readonly ConfigurationProperty _propSwitchName = new ConfigurationProperty("switchName", typeof(string), null, ConfigurationPropertyOptions.None);
        private static readonly ConfigurationProperty _propSwitchValue = new ConfigurationProperty("switchValue", typeof(string), null, ConfigurationPropertyOptions.None); 
        private static readonly ConfigurationProperty _propSwitchType = new ConfigurationProperty("switchType", typeof(string), null, ConfigurationPropertyOptions.None);
        private static readonly ConfigurationProperty _propListeners = new ConfigurationProperty("listeners", typeof(ListenerElementsCollection), new ListenerElementsCollection(), ConfigurationPropertyOptions.None); 
 
        private Hashtable _attributes;
 
        static SourceElement() {
            _properties = new ConfigurationPropertyCollection();
            _properties.Add(_propName);
            _properties.Add(_propSwitchName); 
            _properties.Add(_propSwitchValue);
            _properties.Add(_propSwitchType); 
            _properties.Add(_propListeners); 
        }
 
        public Hashtable Attributes {
            get {
                if (_attributes == null)
                    _attributes = new Hashtable(StringComparer.OrdinalIgnoreCase); 
                return _attributes;
            } 
        } 

        [ConfigurationProperty("listeners")] 
        public ListenerElementsCollection Listeners {
            get {
                return (ListenerElementsCollection) this[_propListeners];
            } 
        }
 
        [ConfigurationProperty("name", IsRequired=true, DefaultValue="")] 
        public string Name {
            get { 
                return (string) this[_propName];
            }
        }
 
        protected override ConfigurationPropertyCollection Properties {
            get { 
                return _properties; 
            }
        } 

        [ConfigurationProperty("switchName")]
        public string SwitchName {
            get { 
                return (string) this[_propSwitchName];
            } 
        } 

        [ConfigurationProperty("switchValue")] 
        public string SwitchValue {
            get {
                return (string) this[_propSwitchValue];
            } 
        }
 
        [ConfigurationProperty("switchType")] 
        public string SwitchType {
            get { 
                return (string) this[_propSwitchType];
            }
        }
 
        protected override void DeserializeElement(XmlReader reader, bool serializeCollectionKey)
        { 
            base.DeserializeElement(reader, serializeCollectionKey); 

            if (!String.IsNullOrEmpty(SwitchName) && !String.IsNullOrEmpty(SwitchValue)) 
                throw new ConfigurationErrorsException(SR.GetString(SR.Only_specify_one, Name));
        }

        // Our optional attributes implementation is little convoluted as there is 
        // no such firsclass mechanism from the config system. We basically cache
        // any "unrecognized" attribute here and serialize it out later. 
        protected override bool OnDeserializeUnrecognizedAttribute(String name, String value) { 
            Attributes.Add(name, value);
            return true; 
        }

        // We need to serialize optional attributes here, a better place would have
        // been inside SerializeElement but the base class implementation from 
        // ConfigurationElement doesn't take into account for derived class doing
        // extended serialization, it basically writes out child element that 
        // forces the element closing syntax, so any attribute serialization needs 
        // to happen before normal element serialization from ConfigurationElement.
        // This means we would write out custom attributes ahead of normal ones. 
        // The other alternative would be to re-implement the entire routine here
        // which is an overkill and a maintenance issue.
        protected override void PreSerialize(XmlWriter writer) {
            if (_attributes != null) { 
                IDictionaryEnumerator e = _attributes.GetEnumerator();
                while (e.MoveNext()) { 
                    string xmlValue = (string)e.Value; 
                    string xmlName = (string)e.Key;
 
                    if ((xmlValue != null) && (writer != null)) {
                        writer.WriteAttributeString(xmlName, xmlValue);
                    }
                } 
            }
        } 
 
        // Account for optional attributes from custom listeners.
        protected override bool SerializeElement(XmlWriter writer, bool serializeCollectionKey) { 
            bool DataToWrite = base.SerializeElement(writer, serializeCollectionKey);
            DataToWrite = DataToWrite || ((_attributes != null) && (_attributes.Count > 0));
            return DataToWrite;
        } 

        protected override void Unmerge(ConfigurationElement sourceElement, 
                                                ConfigurationElement parentElement, 
                                                ConfigurationSaveMode saveMode) {
            base.Unmerge(sourceElement, parentElement, saveMode); 

            // Unmerge the optional attributes cache as well
            SourceElement le = sourceElement as SourceElement;
            if ((le != null) && (le._attributes != null)) 
                this._attributes = le._attributes;
        } 
 
        internal void ResetProperties()
        { 
            // blow away any UnrecognizedAttributes that we have deserialized earlier
            if (_attributes != null) {
                _attributes.Clear();
                _properties.Clear(); 
                _properties.Add(_propName);
                _properties.Add(_propSwitchName); 
                _properties.Add(_propSwitchValue); 
                _properties.Add(_propSwitchType);
                _properties.Add(_propListeners); 
            }
        }
    }
 
}
 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK