Files
App-Installer-For-Windows-8…/DataUtils/SysInit.cs

275 lines
9.6 KiB
C#

using System;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
namespace DataUtils
{
public static class VisualElementsStore
{
// Publicly accessible instances for internal use
public static readonly VisualElementManifest Vemanifest;
public static readonly FileResXmlDoc ScaleResources;
static VisualElementsStore ()
{
try
{
string programRoot = GetProgramRootDirectory ();
// manifest path: VisualElementsManifest.xml in program root
string manifestPath = Path.Combine (programRoot, "VisualElementsManifest.xml");
// scale xml candidate: VisualElements\scale.xml
string scaleCandidate = Path.Combine (programRoot, "VisualElements", "scale.xml");
// If scale.xml exists use it, otherwise fall back to VisualElementsManifest.xml
string scalePath = File.Exists (scaleCandidate) ? scaleCandidate : manifestPath;
// Initialize (constructors will attempt to load)
Vemanifest = new VisualElementManifest ();
if (File.Exists (manifestPath))
{
// Use Create to ensure we reflect true load status
Vemanifest.Create (manifestPath);
}
FileResXmlDoc tmp = null;
if (File.Exists (scalePath))
{
tmp = new FileResXmlDoc (scalePath);
}
else
{
// if both missing, try manifest as last resort (ResXmlDoc handles manifest-style layout)
if (File.Exists (manifestPath))
tmp = new FileResXmlDoc (manifestPath);
}
ScaleResources = tmp;
}
catch
{
// swallow exceptions; leave fields null if initialization fails
Vemanifest = new VisualElementManifest ();
ScaleResources = null;
}
}
private static string GetProgramRootDirectory ()
{
try
{
// Prefer the directory of the executing assembly
string codeBase = Assembly.GetExecutingAssembly ().Location;
if (!string.IsNullOrEmpty (codeBase))
{
string dir = Path.GetDirectoryName (codeBase);
if (!string.IsNullOrEmpty (dir)) return dir;
}
}
catch { }
try
{
return AppDomain.CurrentDomain.BaseDirectory ?? Environment.CurrentDirectory;
}
catch { }
return Environment.CurrentDirectory;
}
}
[ComVisible (true)]
[ClassInterface (ClassInterfaceType.AutoDual)]
public class _I_VisualElement
{
private string _appid;
public _I_VisualElement ()
{
_appid = "App";
}
public _I_VisualElement (string appid)
{
_appid = string.IsNullOrEmpty (appid) ? "App" : appid;
}
public string Id
{
get { return _appid; }
set { _appid = string.IsNullOrEmpty (value) ? "App" : value; }
}
public string DisplayName
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.DisplayName (_appid) : string.Empty; }
}
public string Logo
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.Logo (_appid) : string.Empty; }
}
public string SmallLogo
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SmallLogo (_appid) : string.Empty; }
}
public string ForegroundText
{
get
{
if (VisualElementsStore.Vemanifest == null) return "dark";
var t = VisualElementsStore.Vemanifest.ForegroundText (_appid);
return t == ManifestTextColor.Light ? "light" : "dark";
}
}
public string Lnk32x32Logo
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.Lnk32x32Logo (_appid) : string.Empty; }
}
public string ItemDisplayLogo
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.ItemDisplayLogo (_appid) : string.Empty; }
}
public bool ShowNameOnTile
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.ShowNameOnTile (_appid) : false; }
}
public string BackgroundColor
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.BackgroundColor (_appid) : string.Empty; }
}
public string SplashScreenImage
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenImage (_appid) : string.Empty; }
}
public string SplashScreenBackgroundColor
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenBackgroundColor (_appid) : string.Empty; }
}
public string SplashScreenBackgroundColorDarkMode
{
get { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenBackgroundColorDarkMode (_appid) : string.Empty; }
}
// Indexer for script-friendly access: v["displayname"]
public object this [string propertyName]
{
get { return Get (propertyName); }
}
// Generic getter by property name (case-insensitive)
public object Get (string propertyName)
{
if (string.IsNullOrEmpty (propertyName)) return string.Empty;
string key = propertyName.Trim ().ToLowerInvariant ();
switch (key)
{
case "displayname": return DisplayName;
case "logo": return Logo;
case "smalllogo": return SmallLogo;
case "foregroundtext": return ForegroundText;
case "lnk32x32logo": return Lnk32x32Logo;
case "itemdisplaylogo": return ItemDisplayLogo;
case "shownameontile": return ShowNameOnTile;
case "backgroundcolor": return BackgroundColor;
case "splashscreenimage": return SplashScreenImage;
case "splashscreenbackgroundcolor": return SplashScreenBackgroundColor;
case "splashscreenbackgroundcolordarkmode": return SplashScreenBackgroundColorDarkMode;
default: return string.Empty;
}
}
}
[ComVisible (true)]
[ClassInterface (ClassInterfaceType.AutoDual)]
public class _I_VisualElements
{
public string [] GetIds ()
{
try
{
var list = VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.AppIds () : new System.Collections.Generic.List<string> () { "App" };
return list.ToArray ();
}
catch
{
return new string [] { "App" };
}
}
public string GetIdsToJson ()
{
var ids = GetIds ();
// Use Utilities.StringArrayToJson (which uses Newtonsoft.Json if available)
try
{
return Utilities.StringArrayToJson (ids);
}
catch
{
// fallback
return Newtonsoft.Json.JsonConvert.SerializeObject (ids);
}
}
public _I_VisualElement Get (string id)
{
return new _I_VisualElement (id);
}
public _I_VisualElement this [string id]
{
get { return Get (id); }
}
// Attribute-style methods
public string DisplayName (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.DisplayName (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string Logo (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.Logo (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string SmallLogo (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SmallLogo (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string ForegroundText (string appid)
{
if (VisualElementsStore.Vemanifest == null) return "dark";
var t = VisualElementsStore.Vemanifest.ForegroundText (string.IsNullOrEmpty (appid) ? "App" : appid);
return t == ManifestTextColor.Light ? "light" : "dark";
}
public string Lnk32x32Logo (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.Lnk32x32Logo (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string ItemDisplayLogo (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.ItemDisplayLogo (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public bool ShowNameOnTile (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.ShowNameOnTile (string.IsNullOrEmpty (appid) ? "App" : appid) : false; }
public string BackgroundColor (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.BackgroundColor (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string SplashScreenImage (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenImage (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string SplashScreenBackgroundColor (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenBackgroundColor (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
public string SplashScreenBackgroundColorDarkMode (string appid) { return VisualElementsStore.Vemanifest != null ? VisualElementsStore.Vemanifest.SplashScreenBackgroundColorDarkMode (string.IsNullOrEmpty (appid) ? "App" : appid) : string.Empty; }
// Generic getter by attribute name
public object GetValue (string appid, string attributeName)
{
if (string.IsNullOrEmpty (attributeName)) return string.Empty;
string key = attributeName.Trim ().ToLowerInvariant ();
switch (key)
{
case "displayname": return DisplayName (appid);
case "logo": return Logo (appid);
case "smalllogo": return SmallLogo (appid);
case "foregroundtext": return ForegroundText (appid);
case "lnk32x32logo": return Lnk32x32Logo (appid);
case "itemdisplaylogo": return ItemDisplayLogo (appid);
case "shownameontile": return ShowNameOnTile (appid);
case "backgroundcolor": return BackgroundColor (appid);
case "splashscreenimage": return SplashScreenImage (appid);
case "splashscreenbackgroundcolor": return SplashScreenBackgroundColor (appid);
case "splashscreenbackgroundcolordarkmode": return SplashScreenBackgroundColorDarkMode (appid);
default: return string.Empty;
}
}
}
}