diff --git a/README.md b/README.md new file mode 100644 index 0000000..5cdab67 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +XamlOrHtml +========== + +Quick and dirty utility that dumps out whether installed Windows Store/AppX packages are HTML or XAML. + +Forked from https://github.com/mbrit/XamlOrHtml diff --git a/XamlOrHtml/PackageInfo.cs b/XamlOrHtml/PackageInfo.cs index 7d0475c..c2f550e 100644 --- a/XamlOrHtml/PackageInfo.cs +++ b/XamlOrHtml/PackageInfo.cs @@ -1,101 +1,108 @@ -using Microsoft.Win32; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace XamlOrHtml -{ - internal class PackageInfo - { - internal string PackageId { get; private set; } - internal string DisplayName { get; private set; } - internal string PackageRootFolder { get; private set; } - internal bool FoundStartPage { get; private set; } - internal bool MarkedUp { get; private set; } - - internal List XamlFiles { get; private set; } - internal List JsFiles { get; private set; } - - internal PackageInfo(RegistryKey key) - { - this.PackageId = Path.GetFileName(key.Name); - this.DisplayName = (string)key.GetValue("DisplayName"); - this.PackageRootFolder = (string)key.GetValue("PackageRootFolder"); - - // walk the files... - this.XamlFiles = new List(); - this.JsFiles = new List(); - WalkFiles(new DirectoryInfo(this.PackageRootFolder)); - - // probe for a start page... - var appKey = key.OpenSubKey("Applications"); - if (appKey != null) - { - using (appKey) - { - foreach(var subAppName in appKey.GetSubKeyNames()) - { - using (var subAppKey = appKey.OpenSubKey(subAppName)) - { - var start = (string)subAppKey.GetValue("DefaultStartPage"); - if (!(string.IsNullOrEmpty(start))) - { - FoundStartPage = true; - break; - } - } - } - } - } - } - - private void WalkFiles(DirectoryInfo folder) - { - try - { - foreach (var file in folder.GetFiles()) - { - if (string.Compare(file.Extension, ".xaml", true) == 0 || string.Compare(file.Extension, ".xbf", true) == 0) - this.XamlFiles.Add(file.FullName); - else if (string.Compare(file.Extension, ".js", true) == 0) - this.JsFiles.Add(file.FullName); - else if (string.Compare(file.Name, "MarkedUp.winmd") == 0) - this.MarkedUp = true; - } - - foreach (var child in folder.GetDirectories()) - this.WalkFiles(child); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - } - - internal PackageType Type - { - get - { - if (this.FoundStartPage) - return PackageType.Html; - - if (this.XamlFiles.Any()) - return PackageType.Xaml; - else if (this.JsFiles.Any()) - return PackageType.Html; - else - return PackageType.Unknown; - } - } - - public bool IsMicrosoft - { - get - { - return this.PackageId.Contains("Microsoft"); - } - } - } -} +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace XamlOrHtml +{ + internal class PackageInfo + { + private const string XamlExt = ".xaml"; + private const string XbfExt = ".xbf"; + private const string JsExt = ".js"; + + internal string PackageId { get; private set; } + internal string DisplayName { get; private set; } + internal string PackageRootFolder { get; private set; } + internal bool FoundStartPage { get; private set; } + internal bool MarkedUp { get; private set; } + + internal List XamlFiles { get; private set; } + internal List JsFiles { get; private set; } + + internal PackageInfo(RegistryKey key) + { + PackageId = Path.GetFileName(key.Name); + DisplayName = (string)key.GetValue("DisplayName"); + PackageRootFolder = (string)key.GetValue("PackageRootFolder"); + + // walk the files... + XamlFiles = new List(); + JsFiles = new List(); + WalkFiles(new DirectoryInfo(PackageRootFolder)); + + // probe for a start page... + var appKey = key.OpenSubKey("Applications"); + if (appKey != null) + { + using (appKey) + { + foreach(var subAppName in appKey.GetSubKeyNames()) + { + using (var subAppKey = appKey.OpenSubKey(subAppName)) + { + if (subAppKey != null) + { + var start = (string)subAppKey.GetValue("DefaultStartPage"); + if (!(string.IsNullOrEmpty(start))) + { + FoundStartPage = true; + break; + } + } + } + } + } + } + } + + private void WalkFiles(DirectoryInfo folder) + { + try + { + foreach (var file in folder.GetFiles()) + { + if (String.Compare(file.Extension, XamlExt , StringComparison.OrdinalIgnoreCase) == 0 || String.Compare(file.Extension, XbfExt, StringComparison.OrdinalIgnoreCase) == 0) + XamlFiles.Add(file.FullName); + else if (String.Compare(file.Extension, JsExt, StringComparison.OrdinalIgnoreCase) == 0) + JsFiles.Add(file.FullName); + else if (String.CompareOrdinal(file.Name, "MarkedUp.winmd") == 0) + MarkedUp = true; + } + + foreach (var child in folder.GetDirectories()) + WalkFiles(child); + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + } + } + + internal PackageType Type + { + get + { + if (FoundStartPage) + return PackageType.Html; + + if (XamlFiles.Any()) + return PackageType.Xaml; + + if (JsFiles.Any()) + return PackageType.Html; + + return PackageType.DirectX; + } + } + + public bool IsMicrosoft + { + get + { + return PackageId.Contains("Microsoft"); + } + } + } +} diff --git a/XamlOrHtml/PackageType.cs b/XamlOrHtml/PackageType.cs index 7fdb0e6..d9385d9 100644 --- a/XamlOrHtml/PackageType.cs +++ b/XamlOrHtml/PackageType.cs @@ -1,14 +1,9 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace XamlOrHtml -{ - public enum PackageType - { - Xaml = 0, - Html = 1, - Unknown = 2 - } -} +namespace XamlOrHtml +{ + public enum PackageType + { + Xaml = 0, + Html = 1, + DirectX = 2 + } +} diff --git a/XamlOrHtml/Program.cs b/XamlOrHtml/Program.cs index 4d29f01..f2c8af0 100644 --- a/XamlOrHtml/Program.cs +++ b/XamlOrHtml/Program.cs @@ -1,153 +1,104 @@ -using Microsoft.Win32; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace XamlOrHtml -{ - class Program - { - static void Main(string[] args) - { - try - { - // walk... - string temp = null; - var packages = WalkPackages(ref temp); - - // count... - int msXaml = 0; - int msHtml = 0; - int msUnknown = 0; - int nonMsXaml = 0; - int nonMsHtml = 0; - int nonMsUnknown = 0; - foreach (var package in packages) - { - if (package.IsMicrosoft) - { - if (package.Type == PackageType.Xaml) - msXaml++; - else if (package.Type == PackageType.Html) - msHtml++; - else if (package.Type == PackageType.Unknown) - msUnknown++; - } - else - { - if (package.Type == PackageType.Xaml) - nonMsXaml++; - else if (package.Type == PackageType.Html) - nonMsHtml++; - else if (package.Type == PackageType.Unknown) - nonMsUnknown++; - } - } - - // render... - //StringBuilder builder = new StringBuilder(); - //RenderResult(builder, "Microsoft", msXaml, msHtml, msUnknown); - //builder.Append("\r\n"); - //RenderResult(builder, "Non-Microsoft", nonMsXaml, nonMsHtml, nonMsUnknown); - ////MessageBox.Show(builder.ToString()); - - // show... - Process.Start(temp); - } - catch (Exception ex) - { - Console.WriteLine(ex); - } - finally - { - if (Debugger.IsAttached) - Console.ReadLine(); - } - } - - private static void RenderResult(StringBuilder builder, string name, int xaml, int html, int unknown) - { - decimal total = (decimal)(xaml + html + unknown); - decimal percentageXaml = 0M; - decimal percentageHtml = 0M; - decimal percentageUnknown = 0M; - if(total > 0) - { - percentageXaml = (decimal)xaml / total; - percentageHtml = (decimal)html / total; - percentageUnknown = (decimal)unknown / total; - } - - // ok... - builder.Append(name); - builder.Append(" --> "); - builder.Append("XAML: "); - builder.Append(xaml); - builder.Append(" ("); - builder.Append((percentageXaml * 100).ToString("n0")); - builder.Append("%), "); - builder.Append("HTML: "); - builder.Append(html); - builder.Append(" ("); - builder.Append((percentageHtml * 100).ToString("n0")); - builder.Append("%), "); - builder.Append("Unknown: "); - builder.Append(unknown); - builder.Append(" ("); - builder.Append((percentageUnknown * 100).ToString("n0")); - builder.Append("%)"); - } - - private static List WalkPackages(ref string temp) - { - Console.WriteLine("Walking packages..."); - - // find... - var packages = new List(); - using (var key = Registry.ClassesRoot.OpenSubKey(@"Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages")) - { - foreach (var packageName in key.GetSubKeyNames()) - { - Console.WriteLine("..." + packageName); - - using (var packageKey = key.OpenSubKey(packageName)) - { - var package = new PackageInfo(packageKey); - packages.Add(package); - } - } - } - - // sort... - packages.Sort(new DisplayNameComparer()); - - // csv... - temp = Path.GetTempFileName() + ".csv"; - using(var writer = new StreamWriter(temp)) - { - writer.WriteLine("PackageId,DisplayName,RootFolder,NumXaml,NumJs,FoundStartPage,Type,MarkedUp"); - - foreach (var package in packages) - { - writer.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\"", package.PackageId, package.DisplayName, - package.PackageRootFolder, package.XamlFiles.Count, package.JsFiles.Count, package.FoundStartPage, package.Type, package.MarkedUp); - } - } - - // return... - return packages; - } - - private class DisplayNameComparer : IComparer - { - public int Compare(PackageInfo x, PackageInfo y) - { - return string.Compare(x.DisplayName, y.DisplayName, true); - } - } - } -} +using System.Linq; +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; + +namespace XamlOrHtml +{ + class Program + { + static void Main(string[] args) + { + try + { + // walk... + string temp; + var packages = WalkPackages(out temp); + + // count... + int msXaml = 0; + int msHtml = 0; + int msDirectX = 0; + int nonMsXaml = 0; + int nonMsHtml = 0; + int nonMsDirectX = 0; + + foreach (var package in packages) + { + if (package.IsMicrosoft) + { + if (package.Type == PackageType.Xaml) + msXaml++; + else if (package.Type == PackageType.Html) + msHtml++; + else if (package.Type == PackageType.DirectX) + msDirectX++; + } + else + { + if (package.Type == PackageType.Xaml) + nonMsXaml++; + else if (package.Type == PackageType.Html) + nonMsHtml++; + else if (package.Type == PackageType.DirectX) + nonMsDirectX++; + } + } + + // show... + Process.Start(temp); + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + finally + { + if (Debugger.IsAttached) + Console.ReadLine(); + } + } + + private static IEnumerable WalkPackages(out string temp) + { + Console.WriteLine("Walking packages..."); + + // find... + var packages = new List(); + using (var key = Registry.ClassesRoot.OpenSubKey(@"Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages")) + { + if (key != null) + foreach (var packageName in key.GetSubKeyNames()) + { + Console.WriteLine("..." + packageName); + + using (var packageKey = key.OpenSubKey(packageName)) + { + var package = new PackageInfo(packageKey); + packages.Add(package); + } + } + } + + var pckgs = packages.Where(p => p.PackageRootFolder.Contains("\\WindowsApps\\") & !p.PackageRootFolder.Contains("Microsoft.WinJS") & !p.PackageRootFolder.Contains("Microsoft.VCLibs")).OrderBy(p => p.Type); + + // csv... + temp = Path.GetTempFileName() + ".csv"; + + using(var writer = new StreamWriter(temp)) + { + writer.WriteLine("Software,PackageId,DisplayName,RootFolder,NumXaml,NumJs,FoundStartPage,Type,MarkedUp"); + + foreach (var package in pckgs) + { + writer.WriteLine("\"{8}\",\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\"", package.PackageId, package.DisplayName, package.PackageRootFolder, package.XamlFiles.Count, package.JsFiles.Count, package.FoundStartPage, package.Type, package.MarkedUp, package.PackageId.Substring(0, package.PackageId.IndexOf("_", StringComparison.Ordinal))); + } + } + + // return... + return packages; + } + } +} diff --git a/XamlOrHtml/XamlOrHtml.csproj b/XamlOrHtml/XamlOrHtml.csproj index 52c8b76..d73df66 100644 --- a/XamlOrHtml/XamlOrHtml.csproj +++ b/XamlOrHtml/XamlOrHtml.csproj @@ -1,57 +1,63 @@ - - - - - Debug - AnyCPU - {FC06365C-B02B-48F2-B8A8-50B766F964AF} - Exe - Properties - XamlOrHtml - XamlOrHtml - v3.5 - 512 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - + + + + + Debug + AnyCPU + {FC06365C-B02B-48F2-B8A8-50B766F964AF} + Exe + Properties + XamlOrHtml + XamlOrHtml + v4.5.1 + 512 + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/XamlOrHtml/app.config b/XamlOrHtml/app.config new file mode 100644 index 0000000..d35fbee --- /dev/null +++ b/XamlOrHtml/app.config @@ -0,0 +1,3 @@ + + +