93 lines
3.4 KiB
C#
93 lines
3.4 KiB
C#
|
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
|
||
|
}
|