|
using System.Configuration;
using System.Text;
using System.Xml;
namespace System.IdentityModel.Configuration
{
#pragma warning disable 1591
public partial class ConfigurationElementInterceptor : ConfigurationElement
{
private XmlDocument elementXml;
protected override void DeserializeElement( XmlReader reader, bool serializeCollectionKey )
{
elementXml = new XmlDocument();
elementXml.LoadXml( reader.ReadOuterXml() );
// Create a new XmlTextReader so this element can be loaded
// by the framework.
using ( XmlReader newReader = XmlDictionaryReader.CreateTextReader( Encoding.UTF8.GetBytes( elementXml.DocumentElement.OuterXml ), XmlDictionaryReaderQuotas.Max ) )
{
newReader.Read();
base.DeserializeElement( newReader, serializeCollectionKey );
}
}
// There are parts in the configuration where users can specify arbitrary elements and attributes.
// For example, when loading a custom token handler. The interceptor is implemented to
// specifically handle these cases. So return true when the Framework detects a unrecognized element
// or attribute to keep the parser running.
protected override bool OnDeserializeUnrecognizedAttribute( string name, string value )
{
return true;
}
protected override bool OnDeserializeUnrecognizedElement( string elementName, XmlReader reader )
{
return true;
}
//
// The Reset method is called in the nested vdir scenario,
// where the child inherits the parent's config section.
// The sequence of calls is as follows:
// 1. Application accesses the section in the child app
// 2. The config system walks up the inheritance chain and finds that it can instantiate the section at the parent level.
// 3. The config system populates the section with the values from the parent, including setting the custom XML property.
// 4. Now, the config system tries to instantiage the section at the child level. It creates a brand new instance of the section.
// 5. The config system takes the parent section as a template and uses it to initialize the child (by calling this Reset method).
// 6. Then the config system populates the child with values that were overwritten at the child level.
//
protected override void Reset( ConfigurationElement parentElement )
{
base.Reset( parentElement );
Reset( (ConfigurationElementInterceptor)parentElement );
}
public XmlElement ElementAsXml
{
get
{
if ( elementXml != null )
{
return elementXml.DocumentElement;
}
return null;
}
}
public XmlNodeList ChildNodes
{
get
{
if ( ( elementXml != null ) && ( ElementAsXml.ChildNodes.Count != 0 ) )
{
return ElementAsXml.ChildNodes;
}
return null;
}
}
//
// Copy custom properties from parent level.
//
private void Reset( ConfigurationElementInterceptor parentElement )
{
this.elementXml = parentElement.elementXml;
}
}
#pragma warning restore 1591
}
|