Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
5.7 KiB

using System;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Reflection;
namespace Microsoft.Fusion.ADF
{
// 07/18/02: DON'T DO THE EXTRA WORK THAT INPUT SCHEMA ALREADY DOES FOR YOU
public class MGParamParser
{
private Stream xmlInput;
private XmlDocument paramInput;
private string appName;
private XmlNode assmIDNode = null, descNode = null, appNode = null, subNode = null, platNode = null;
private XmlNode appAssmIDNode, subAssmIDNode;
public MGParamParser(Stream xmlInput)
{
this.xmlInput = xmlInput;
try
{
XmlNodeList temp;
IEnumerator nodeEnum;
// Make document out of stream
// Begin by adding schema
Assembly thisAssm = Assembly.GetExecutingAssembly();
Stream xmlInputSchema = thisAssm.GetManifestResourceStream("inputSchema");
XmlSchemaCollection myXmlSchemaCollection = new XmlSchemaCollection();
myXmlSchemaCollection.Add(null , new XmlTextReader(xmlInputSchema));
// Then validate file (validation fills in defaults)
XmlTextReader myXmlTextReader = new XmlTextReader(xmlInput);
XmlValidatingReader myXmlValidatingReader = new XmlValidatingReader(myXmlTextReader);
myXmlValidatingReader.Schemas.Add(myXmlSchemaCollection);
myXmlValidatingReader.ValidationType = ValidationType.Schema;
this.paramInput = new XmlDocument();
paramInput.Load(myXmlValidatingReader);
// Extract nodes we care about
temp = paramInput.GetElementsByTagName("assemblyIdentity");
if(temp.Count != 1) throw new MGParseErrorException("XML parameters should only have 1 assemblyIdentity element");
else
{
nodeEnum = temp.GetEnumerator();
nodeEnum.MoveNext();
assmIDNode = (XmlNode) nodeEnum.Current;
}
temp = paramInput.GetElementsByTagName("description");
if(temp.Count != 1) throw new MGParseErrorException("XML parameters should only have 1 description element");
else
{
nodeEnum = temp.GetEnumerator();
nodeEnum.MoveNext();
descNode = (XmlNode) nodeEnum.Current;
}
temp = paramInput.GetElementsByTagName("applicationParams");
if(temp.Count != 1) throw new MGParseErrorException("XML parameters should only have 1 applicationParams element");
else
{
nodeEnum = temp.GetEnumerator();
nodeEnum.MoveNext();
appNode = (XmlNode) nodeEnum.Current;
}
temp = paramInput.GetElementsByTagName("subscriptionParams");
if(temp.Count != 1) throw new MGParseErrorException("XML parameters should only have 1 subscriptionParams element");
else
{
nodeEnum = temp.GetEnumerator();
nodeEnum.MoveNext();
subNode = (XmlNode) nodeEnum.Current;
}
temp = paramInput.GetElementsByTagName("platformParams");
if(temp.Count > 1) throw new MGParseErrorException("XML parameters should have at most 1 platformParams element");
else if(temp.Count == 1)
{
nodeEnum = temp.GetEnumerator();
nodeEnum.MoveNext();
platNode = (XmlNode) nodeEnum.Current;
}
// Extract application name
appName = assmIDNode.Attributes["name"].Value;
// Set up specialized assembly ID nodes
appAssmIDNode = assmIDNode.Clone();
subAssmIDNode = assmIDNode.Clone();
XmlAttribute typeAttr1 = paramInput.CreateAttribute("type");
XmlAttribute typeAttr2 = (XmlAttribute) typeAttr1.CloneNode(true);
typeAttr1.Value = "application";
appAssmIDNode.Attributes.Prepend(typeAttr1);
typeAttr2.Value = "subscription";
subAssmIDNode.Attributes.Prepend(typeAttr2);
}
catch (XmlException xmle)
{
throw new MGParseErrorException("XML parameter parsing failed", xmle);
}
catch (XmlSchemaException xmlse)
{
throw new MGParseErrorException("XML parameter validation failed", xmlse);
}
}
public string AppName
{
get
{
return appName;
}
}
// USE WRITE, WRITETO, OUTERXML, OTHER STUFF FROM .NET APIS INSTEAD OF INJECTNODE UTILITY
public void WriteAppParams(XmlTextWriter xtw)
{
try
{
Util.InjectNode(appAssmIDNode, xtw, true, true);
Util.InjectNode(descNode, xtw, true, true);
Util.InjectNode(appNode, xtw, false, false);
}
catch (XmlException xmle)
{
throw new MGParseErrorException("XML parameter parsing failed", xmle);
}
}
public void WriteSubParams(XmlTextWriter xtw)
{
try
{
Util.InjectNode(subAssmIDNode, xtw, true, true);
Util.InjectNode(descNode, xtw, true, true);
xtw.WriteStartElement("dependency");
xtw.WriteStartElement("dependentAssembly");
Util.InjectNode(appAssmIDNode, xtw, true, true);
// The following is to ensure that filenames match everywhere; I may take it out
XmlNodeList temp = subNode.SelectNodes("//install");
IEnumerator tempEnum = temp.GetEnumerator();
tempEnum.MoveNext();
string tempCodebase = ((XmlNode) tempEnum.Current).Attributes["codebase"].Value;
tempCodebase = tempCodebase.Substring(0, tempCodebase.LastIndexOf('/') + 1);
if(!tempCodebase.Equals("")) ((XmlNode) tempEnum.Current).Attributes["codebase"].Value = String.Concat(tempCodebase, appName + ".manifest");
Util.InjectNode(subNode, xtw, false, false);
xtw.WriteEndElement();
xtw.WriteEndElement();
}
catch (XmlException xmle)
{
throw new MGParseErrorException("XML parameter parsing failed", xmle);
}
}
public void WritePlatParams(XmlTextWriter xtw)
{
try
{
if(platNode != null) Util.InjectNode(platNode, xtw, false, false);
else MGPlatformWriter.XmlOutput(xtw); // write defaults
}
catch (XmlException xmle)
{
throw new MGParseErrorException("XML parameter parsing failed", xmle);
}
}
}
}