singrdk/base/Windows/AppReader/WiXParser.cs

142 lines
3.6 KiB
C#

///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
///////////////////////////////////////////////////////////////////////////////
namespace ManifestReader
{
using System;
using System.IO;
using System.Collections;
using System.Xml;
using System.Diagnostics;
public class WiXParser : XmlManifestParser
{
string productName = "";
string currentDir = "";
public override string Classify(string appName, string file, XmlTextReader xmld, Hashtable wxElementTranslator)
{
if (xmld.NodeType == XmlNodeType.EndElement)
{
if (xmld.Name.Equals("Directory"))
{
// chop off the most recent addition to the directory string
// and register this "file" with the providesFile table
// We know that there must be some slash here
int lastSlash = currentDir.LastIndexOf("\\");
string providedDir = currentDir.Substring(lastSlash + 1);
currentDir = currentDir.Substring(0, lastSlash);
addProvidesFile(currentDir, providedDir, appName);
}
return "";
}
else
{
if (xmld.Name.Equals("CustomAction"))
{
// add this filename to the custom action count
addCustomAction(appName);
return "";
}
if (xmld.Name.Equals("Product"))
{
// get the product name
productName = xmld.GetAttribute("Name");
setName(file, productName);
return "";
}
else if (xmld.Name.Equals("Directory"))
{
string dirName = xmld.GetAttribute("LongName");
if (dirName == null)
{
dirName = xmld.GetAttribute("Name");
}
if (dirName.Equals("."))
{
dirName = xmld.GetAttribute("LongSource");
if (dirName == null)
{
dirName = xmld.GetAttribute("SourceName");
}
}
if (!xmld.IsEmptyElement)
{
// if this element has any children
// add this string to the directory name
currentDir += "\\" + dirName;
}
else
{
if (dirName != null)
{
// otherwise, register it and move on
addProvidesFile(currentDir, dirName, appName);
}
}
return "";
}
else if (xmld.Name.Equals("File"))
{
string filename = xmld.GetAttribute("LongName");
if (filename == null)
{
filename = xmld.GetAttribute("Name");
}
// add this to the providesFileTable
addProvidesFile(currentDir, filename, appName);
//Console.Error.WriteLine(filename);
string[] components = filename.Split(new char[] {'.'}, 10);
string suffix = components[components.Length - 1];
if (isCodeSuffix(suffix))
{
return getCodeType(suffix);
}
else if (isImageSuffix(suffix))
{
return "Data File Display UI";
}
else if (isFontSuffix(suffix))
{
return "Data File Display Fonts";
}
else
{
return "Data File";
}
}
else if (xmld.Name.Equals("Registry"))
{
// parse the registry prefix
string rootname = xmld.GetAttribute("Root");
string path = xmld.GetAttribute("Key");
string fullpath = rootname + "\\" + path;
string val = xmld.GetAttribute("Value");
string valname = xmld.GetAttribute("Name");
return parseRegistry(fullpath + "\\" + valname, val, appName);
}
else
{
// look up this element in our translator
// (this may end up returning null)
return (string)wxElementTranslator[xmld.Name];
}
}
}
}
}