private PhpConfigurationContext Create(PhpConfigurationContext parent, HttpConfigurationContext context,
XmlNode/*!*/ section)
{
PhpConfigurationContext result;
// determines virtual path to the .config file (null means Machine.config or not applicable):
string virtual_path = (context != null) ? context.VirtualPath : null;
Debug.WriteLine("CONFIG", "Parsing configuration in '{0}'. Parent config is '{1}'",
virtual_path ?? "Machine.config", (parent != null) ? parent.VirtualPath : "null");
// initialization:
if (parent != null)
{
result = new PhpConfigurationContext(applicationContext, virtual_path, parent);
}
else
{
result = new PhpConfigurationContext(applicationContext, virtual_path);
}
GlobalConfiguration global = result.Global;
LocalConfiguration local = result.Local;
// configuration loading is assumed to be synchronized:
ApplicationConfiguration app = Configuration.application;
// same with script libraries - these need to be parsed after <sourceRoot>
XmlNode node_ScriptLibrary = null;
// determine configuration modification time:
result.Global.LastConfigurationModificationTime = ConfigUtils.GetConfigModificationTime(section, result.Global.LastConfigurationModificationTime);
// parses XML tree:
foreach (XmlNode node in section.ChildNodes)
{
if (node.NodeType == XmlNodeType.Element)
{
switch (node.Name)
{
case NodePaths:
// options can be specified only in application root config and above:
result.EnsureApplicationConfig(node);
ConfigUtils.ParseNameValueList(node, result, app.Paths);
break;
case NodeClassLibrary:
// libraries can be loaded only in application root config and above:
result.EnsureApplicationConfig(node);
// parses and loads libraries contained in the list (lazy):
ConfigUtils.ParseLibraryAssemblyList(
node,
result.librariesList,
app.Paths.ExtWrappers,
app.Paths.Libraries);
break;
case NodeScriptLibrary:
// script libraries can be loaded only in application root config and above:
result.EnsureApplicationConfig(node);
node_ScriptLibrary = node;
break;
case NodeCompiler:
// options can be specified only in application root:
result.EnsureApplicationConfig(node);
ConfigUtils.ParseNameValueList(node, result, app.Compiler);
break;
case NodeGlobalization:
// options can be specified only in application root:
result.EnsureApplicationConfig(node);
ConfigUtils.ParseNameValueList(node, result, app.Globalization);
break;
case NodeOutputControl:
ConfigUtils.ParseNameValueList(node, result, local.OutputControl);
break;
case NodeRequestControl:
ConfigUtils.ParseNameValueList(node, result, local.RequestControl);
break;
case NodeErrorControl:
ConfigUtils.ParseNameValueList(node, result, local.ErrorControl);
break;
case NodeSessionControl:
ConfigUtils.ParseNameValueList(node, result, local.Session);
break;
case NodeFileSystem:
ConfigUtils.ParseNameValueList(node, result, local.FileSystem);
break;
case NodeAssertion:
ConfigUtils.ParseNameValueList(node, result, local.Assertion);
break;
case NodeVariables:
ConfigUtils.ParseNameValueList(node, result, local.Variables, global.GlobalVariables);
break;
case NodePostedFiles:
ConfigUtils.ParseNameValueList(node, result, global.PostedFiles);
break;
case NodeSafeMode:
ConfigUtils.ParseNameValueList(node, result, global.SafeMode);
break;
default:
// processes library section:
result.librariesList.AddSection(node);
break;
}
}
}
// and script library after that
if (node_ScriptLibrary != null)
{
ConfigUtils.ParseScriptLibraryAssemblyList(node_ScriptLibrary, applicationContext.ScriptLibraryDatabase);
}
return result;
}
}