singrdk/base/Windows/AppReader/CMIParser.cs

167 lines
4.7 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 CMIParser : XmlManifestParser
{
Hashtable parentDirectoriesAlreadySeen;
string curRegKey;
public CMIParser() : base()
{
curRegKey = "";
parentDirectoriesAlreadySeen = new Hashtable();
}
public override string Classify(string appName, string file, XmlTextReader xmld, Hashtable wxElementTranslator)
{
string tagname = xmld.Name;
if (tagname.Equals("file"))
{
string filename = xmld.GetAttribute("name");
if (filename == null)
{
// for those in Microsoft who don't seem to know that XML is case-sensitive
filename = xmld.GetAttribute("Name");
if (filename == null)
{
filename = xmld.GetAttribute("sourceName");
}
}
if (filename != null)
{
// now register the fact that we provide this file
string dpath = xmld.GetAttribute("destinationPath");
if (dpath != null)
{
if (dpath.IndexOf("$(runtime.windows)") >= 0)
{
dpath = dpath.Replace("$(runtime.windows)", "\\windows");
}
else if (dpath.IndexOf("$(runtime.drivers)") >= 0)
{
dpath = dpath.Replace("$(runtime.drivers)", "\\windows\\system32\\drivers");
}
else if (dpath.IndexOf("$(runtime.system32)") >= 0)
{
dpath = dpath.Replace("$(runtime.system32)", "\\windows\\system32");
}
// make sure that it has no trailing \ and that it starts with a \
dpath = dpath.TrimEnd(new char[] {'\\'});
dpath = dpath.TrimStart(new char[] {'\\'});
dpath = '\\' + dpath;
}
ManifestParser.addProvidesFile(dpath == null ? "" : dpath, filename, appName);
if (dpath != null && !dpath.Equals("\\"))
{
string[] pathElts = dpath.Split(new char[] {'\\'}, 50);
string curPath = "";
for(int i = 0; i < pathElts.Length; i++)
{
if (pathElts[i].Equals(""))
{
continue;
}
string fullPath = curPath;
if (i != 0)
{
fullPath += "\\";
}
fullPath += pathElts[i];
if (parentDirectoriesAlreadySeen.ContainsKey(fullPath))
{
curPath = fullPath;
continue;
}
ManifestParser.addProvidesFile(curPath, pathElts[i], appName);
curPath = fullPath;
parentDirectoriesAlreadySeen[fullPath] = 1;
}
}
// and parse it to see if it's an interesting file
string[] components = filename.Split(new char[] {'.'}, 10);
string suffix = components[components.Length - 1];
if (isImageSuffix(suffix))
{
return "Data File Display UI";
}
else if (isFontSuffix(suffix))
{
return "Data File Display Fonts";
}
else
{
return "Data File";
}
}
return "";
}
else if (tagname.Equals("fileDependency"))
{
// then register this file dependency
string filename = xmld.GetAttribute("name");
if (filename != null)
{
// now register the fact that we require this file
string dpath = xmld.GetAttribute("destinationPath");
if (dpath != null)
{
if (dpath.Equals("$(runtime.windows)"))
{
dpath = "\\windows\\system32";
}
// make sure that it has no trailing \ and that it starts with a \
dpath = dpath.TrimEnd(new char[] {'\\'});
dpath = dpath.TrimStart(new char[] {'\\'});
dpath = '\\' + dpath;
}
ManifestParser.addRequiresFile(dpath == null ? "" : dpath, filename, appName);
return (string)wxElementTranslator[tagname];
}
return "";
}
else if (tagname.Equals("IPermission"))
{
// ADD: parse the permissions into types
return "Access Authentication";
}
else if (tagname.Equals("registryKey"))
{
// capture this as the current key
curRegKey = xmld.GetAttribute("keyName");
return (string)wxElementTranslator[tagname];
}
else if (tagname.Equals("registryValue"))
{
string tempname = xmld.GetAttribute("name");
string tempval = xmld.GetAttribute("value");
return this.parseRegistry(curRegKey + "\\" + tempname, tempval, appName);
}
else
{
// for now, just look up this element in our translator
// (this may end up returning null)
return (string)wxElementTranslator[tagname];
}
}
}
}