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
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();
|
|
}
|
|
}
|
|
}
|