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.
 
 
 
 
 
 

247 lines
7.0 KiB

using System;
using System.Collections;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Reflection;
namespace Microsoft.Fusion.ADF
{
public class ManifestGenerator
{
private Stream appManStream, subManStream, extraXmlStream;
private Stream appManSchema, subManSchema;
private XmlDocument extraXmlDoc;
private MGParamParser mgPP;
private string sourceDir;
public void CloseStreams()
{
appManStream.Close();
subManStream.Close();
}
public Stream AppManStream
{
get
{
return appManStream;
}
}
public Stream SubManStream
{
get
{
return subManStream;
}
}
private void GenerateManifests()
{
// Read in extra xml; make sure it's valid
if(this.extraXmlStream == null) this.extraXmlDoc = null;
else
{
try
{
this.extraXmlDoc = new XmlDocument();
this.extraXmlDoc.Load(this.extraXmlStream);
}
catch(XmlException xmle)
{
throw new XmlException("Problem with extra input XML", xmle);
}
}
// Start doing work
XmlTextReader manReader = null;
XmlValidatingReader manValidatingReader = null;
XmlSchemaCollection appXmlSchemaCollection = null, subXmlSchemaCollection = null;
// Now scan manifest dependencies
MGDepTracker mgDT = new MGDepTracker();
DirScanner.BeginScan((IFileOperator) mgDT, sourceDir);
try
{
mgDT.VerifyDependencies();
}
catch(MGDependencyException mgde)
{
throw mgde;
}
mgDT.CalculateSizes();
// Write application manifest
XmlTextWriter appGen = new XmlTextWriter(appManStream, null);
//XmlTextWriter appGen = new XmlTextWriter(Console.Out);
appGen.Formatting = Formatting.Indented;
appGen.WriteStartDocument();
appGen.WriteComment("Generated by mg v0.1 (managed)");
appGen.WriteStartElement("assembly");
appGen.WriteAttributeString("xmlns", "asm_namespace_v1", null, "urn:schemas-microsoft-com:asm.v1");
appGen.WriteAttributeString("manifestVersion", "1.0");
//MGTemplateWriter.XmlOutput(appGen, mgPR.AppKeyValPairs, mgPR.DescriptionStr);
mgPP.WriteAppParams(appGen);
mgDT.FileXmlOutput(appGen);
appGen.WriteStartElement("dependency");
mgDT.AssmXmlOutput(appGen);
//MGPlatformWriter.XmlOutput(appGen);
mgPP.WritePlatParams(appGen);
appGen.WriteEndElement(); // dependency
appGen.WriteEndElement(); // assembly
appGen.WriteEndDocument();
appGen.Flush();
appManStream.Position = 0;
// Verify application manifest
appXmlSchemaCollection = new XmlSchemaCollection();
appXmlSchemaCollection.Add(null , new XmlTextReader(appManSchema));
manReader = new XmlTextReader(appManStream);
manValidatingReader = new XmlValidatingReader(manReader);
manValidatingReader.Schemas.Add(appXmlSchemaCollection);
manValidatingReader.ValidationType = ValidationType.Schema;
XmlDocument appManifest = new XmlDocument();
try
{
appManifest.Load(manValidatingReader);
}
catch (XmlSchemaException xmlse)
{
// Validation error
throw new XmlException("Error validating final application manifest; check parameters", xmlse);
}
appManStream.Close();
if(extraXmlDoc != null)
{
XmlNode extraCopy = appManifest.ImportNode(extraXmlDoc.DocumentElement, true);
appManifest.DocumentElement.AppendChild(extraCopy);
}
appManStream = new BufferedStream(new MemoryStream());
appManifest.Save(appManStream);
appManStream.Position = 0;
// Write subscription manifest
XmlTextWriter subGen = new XmlTextWriter(subManStream, null);
subGen.Formatting = Formatting.Indented;
subGen.WriteStartDocument();
subGen.WriteComment("Generated by mg v0.1 (managed)");
subGen.WriteStartElement("assembly");
subGen.WriteAttributeString("xmlns", "asm_namespace_v1", null, "urn:schemas-microsoft-com:asm.v1");
subGen.WriteAttributeString("manifestVersion", "1.0");
//MGSubManifestWriter.XmlOutput(subGen, mgPR.AppKeyValPairs, mgPR.SubKeyValPairs, mgPR.DescriptionStr);
mgPP.WriteSubParams(subGen);
subGen.WriteEndElement();
subGen.WriteEndDocument();
subGen.Flush();
subManStream.Position = 0;
// Verify subscription manifest
subXmlSchemaCollection = new XmlSchemaCollection();
subXmlSchemaCollection.Add(null , new XmlTextReader(subManSchema));
manReader = new XmlTextReader(subManStream);
manValidatingReader = new XmlValidatingReader(manReader);
manValidatingReader.Schemas.Add(subXmlSchemaCollection);
manValidatingReader.ValidationType = ValidationType.Schema;
try
{
while(manValidatingReader.Read());
}
catch (XmlSchemaException xmlse)
{
// Validation error
throw new XmlException("Error validating final subscription manifest; check parameters", xmlse);
}
subManStream.Position = 0;
}
public ManifestGenerator(string sourceDir, Stream paramStream, Stream extraXmlStream)
{
MGParamParser tempMGPP;
// Check for null arguments
if(sourceDir == null) throw new ArgumentNullException("Source directory (arg 1) is null.");
if(paramStream == null) throw new ArgumentNullException("Parameter stream (arg 2) is null.");
// Check that paths and files are valid
if(!Directory.Exists(sourceDir)) throw new ArgumentException("Source directory " + sourceDir + " does not exist.");
this.appManStream = new BufferedStream(new MemoryStream());
this.subManStream = new BufferedStream(new MemoryStream());
// Get the schemas from the assembly as resource streams
Assembly thisAssm = Assembly.GetExecutingAssembly();
this.appManSchema = thisAssm.GetManifestResourceStream("appManSchema");
this.subManSchema = thisAssm.GetManifestResourceStream("subManSchema");
this.sourceDir = sourceDir;
this.extraXmlStream = extraXmlStream;
// Read param stream
try
{
this.mgPP = new MGParamParser(paramStream);
}
catch(MGParseErrorException mgpee)
{
throw mgpee;
}
GenerateManifests();
}
public ManifestGenerator(string sourceDir, MGParamParser mgPP, Stream extraXmlStream)
{
// Check for null arguments
if(sourceDir == null) throw new ArgumentNullException("Source directory (arg 1) is null.");
if(mgPP == null) throw new ArgumentNullException("Parameter object (arg 2) is null.");
// Check that paths and files are valid
if(!Directory.Exists(sourceDir)) throw new ArgumentException("Source directory " + sourceDir + " does not exist.");
this.appManStream = new BufferedStream(new MemoryStream());
this.subManStream = new BufferedStream(new MemoryStream());
// Get the schemas from the assembly as resource streams
Assembly thisAssm = Assembly.GetExecutingAssembly();
this.appManSchema = thisAssm.GetManifestResourceStream("appManSchema");
this.subManSchema = thisAssm.GetManifestResourceStream("subManSchema");
this.sourceDir = sourceDir;
this.extraXmlStream = extraXmlStream;
this.mgPP = mgPP;
GenerateManifests();
}
}
}