Files
ZuneShell.dll/UIX/Microsoft/Iris/Markup/MarkupSystem.cs
T

262 lines
10 KiB
C#
Raw Normal View History

// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Markup.MarkupSystem
// Assembly: UIX, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: A56C6C9D-B7F6-46A9-8BDE-B3D9B8D60B11
// Assembly location: C:\Program Files\Zune\UIX.dll
using Microsoft.Iris.CodeModel.Cpp;
using Microsoft.Iris.Data;
using Microsoft.Iris.Debug;
using Microsoft.Iris.Markup.Validation;
using Microsoft.Iris.OS;
using Microsoft.Iris.Session;
using Microsoft.Iris.UI;
using System;
namespace Microsoft.Iris.Markup
{
internal static class MarkupSystem
{
public const string RootTag = "UIX";
public const string SchemaVersion = "http://schemas.microsoft.com/2007/uix";
public const string DataSchemaRootTag = "DataSchema";
public const string DataSchemaVersion = "http://schemas.microsoft.com/2007/uixdata";
public static UIXLoadResult UIXGlobal;
public static RootLoadResult RootGlobal;
public static bool CompileMode;
public static bool TrackAdditionalMetadata;
public static bool MarkupSystemActive;
private static Vector s_factoriesByProtocol;
private static Vector s_factoriesByExtension;
private static Vector<string> s_importRedirectsFrom;
private static Vector<string> s_importRedirectsTo;
private static uint s_rootIslandId;
private static uint s_activeIslands;
public static void Startup(bool compileMode)
{
MarkupSystem.MarkupSystemActive = true;
MarkupSystem.CompileMode = compileMode;
MarkupSystem.s_factoriesByProtocol = new Vector();
MarkupSystem.s_factoriesByExtension = new Vector();
MarkupSystem.s_rootIslandId = MarkupSystem.AllocateIslandId();
MarkupSystem.UIXGlobal = new UIXLoadResult("http://schemas.microsoft.com/2007/uix");
2021-03-31 17:15:06 -05:00
MarkupSystem.UIXGlobal.RegisterUsage(typeof(MarkupSystem));
UIXLoadResult.InitializeStatics();
ValidateContext.InitializeStatics();
ValidateUI.InitializeStatics();
ValidateClass.InitializeStatics();
ValidateStatementForEach.InitializeStatics();
ValidateParameter.InitializeStatics();
TypeRestriction.InitializeStatics();
NativeMarkupDataQuery.InitializeStatics();
NativeMarkupDataType.InitializeStatics();
MarkupSystem.RootGlobal = new RootLoadResult("Root");
2021-03-31 17:15:06 -05:00
MarkupSystem.RootGlobal.RegisterUsage(typeof(MarkupSystem));
AssemblyLoadResult.Startup();
DllLoadResult.Startup();
2021-03-31 17:15:06 -05:00
ResourceManager.Instance.RegisterSource("res", DllResources.Instance);
HttpResources.Startup();
2021-03-31 17:15:06 -05:00
ResourceManager.Instance.RegisterSource("file", FileResources.Instance);
}
public static void Shutdown()
{
MarkupSystem.UnloadAll();
AssemblyLoadResult.Shutdown();
DllLoadResult.Shutdown();
2021-03-31 17:15:06 -05:00
MarkupSystem.RootGlobal.UnregisterUsage(typeof(MarkupSystem));
MarkupSystem.RootGlobal = null;
MarkupSystem.UIXGlobal.UnregisterUsage(typeof(MarkupSystem));
MarkupSystem.UIXGlobal = null;
HttpResources.Shutdown();
if (MarkupSystem.s_factoriesByProtocol != null)
MarkupSystem.s_factoriesByProtocol.Clear();
if (MarkupSystem.s_factoriesByExtension != null)
MarkupSystem.s_factoriesByExtension.Clear();
MarkupSystem.MarkupSystemActive = false;
}
public static void EnableMetadataTracking() => MarkupSystem.TrackAdditionalMetadata = true;
public static LoadResult Load(string uri, uint islandId)
{
2021-03-31 17:15:06 -05:00
ErrorManager.EnterContext(uri);
LoadResult loadResult = MarkupSystem.ResolveLoadResult(uri, islandId);
if (loadResult != null)
{
loadResult.Load(LoadPass.DeclareTypes);
loadResult.Load(LoadPass.PopulatePublicModel);
loadResult.Load(LoadPass.Full);
loadResult.Load(LoadPass.Done);
}
ErrorManager.ExitContext();
return loadResult;
}
public static LoadResult ResolveLoadResult(string uri, uint islandId)
{
2021-03-31 17:15:06 -05:00
ErrorManager.EnterContext(uri);
uri = MarkupSystem.ApplyImportRedirects(uri);
LoadResult loadResult = LoadResultCache.Read(uri);
if (loadResult == null)
{
bool flag = false;
bool cacheResult = true;
foreach (MarkupSystem.Factory factory in MarkupSystem.s_factoriesByProtocol)
{
if (uri.StartsWith(factory.key, StringComparison.Ordinal))
{
loadResult = factory.handler(uri);
flag = true;
break;
}
}
if (!flag)
{
foreach (MarkupSystem.Factory factory in MarkupSystem.s_factoriesByExtension)
{
if (uri.EndsWith(factory.key, StringComparison.Ordinal))
{
loadResult = factory.handler(uri);
flag = true;
break;
}
}
}
if (!flag)
loadResult = MarkupSystem.CreateMarkupLoadResult(uri, ref cacheResult);
if (loadResult == null)
2021-03-31 17:15:06 -05:00
loadResult = new ErrorLoadResult(uri);
if (cacheResult && loadResult.Cachable)
{
LoadResultCache.Write(uri, loadResult);
if (loadResult.UnderlyingUri != null)
LoadResultCache.Write(loadResult.UnderlyingUri, loadResult);
}
}
loadResult?.AddReference(islandId);
ErrorManager.ExitContext();
return loadResult;
}
private static LoadResult CreateMarkupLoadResult(string uri, ref bool cacheResult)
{
Resource resource = ResourceManager.AcquireResource(uri);
if (resource == null)
2021-03-31 17:15:06 -05:00
return null;
ErrorManager.EnterContext(resource.Uri);
LoadResult loadResult = LoadResultCache.Read(resource.Uri);
if (loadResult != null)
{
cacheResult = false;
LoadResultCache.Write(uri, loadResult);
}
else
{
loadResult = MarkupLoadResult.Create(uri, resource);
if (loadResult != null)
2021-03-31 17:15:06 -05:00
resource = null;
}
resource?.Free();
ErrorManager.ExitContext();
return loadResult;
}
public static uint RootIslandId => MarkupSystem.s_rootIslandId;
public static uint AllocateIslandId()
{
int num1 = ~(int)MarkupSystem.s_activeIslands;
uint num2 = (uint)(num1 & -num1);
MarkupSystem.s_activeIslands |= num2;
return num2;
}
public static void FreeIslandId(uint islandId) => MarkupSystem.s_activeIslands &= ~islandId;
public static void UnloadIsland(uint islandId) => LoadResultCache.Remove(islandId);
public static void UnloadAll() => LoadResultCache.Clear();
public static bool RegisterFactoryByProtocol(string protocol, CreateLoadResultHandler handler)
{
if (protocol.EndsWith("://", StringComparison.Ordinal))
protocol = protocol.Substring(0, protocol.Length - 3);
bool flag = !ResourceManager.Instance.IsRegisteredSource(protocol);
protocol += "://";
if (flag)
{
foreach (MarkupSystem.Factory factory in MarkupSystem.s_factoriesByProtocol)
{
if (factory.key == protocol)
flag = false;
}
}
if (flag)
2021-03-31 17:15:06 -05:00
MarkupSystem.s_factoriesByProtocol.Add(new MarkupSystem.Factory()
{
key = protocol,
handler = handler
});
return flag;
}
public static bool RegisterFactoryByExtension(string extension, CreateLoadResultHandler handler)
{
bool flag = true;
if (!extension.StartsWith(".", StringComparison.Ordinal))
extension = "." + extension;
foreach (MarkupSystem.Factory factory in MarkupSystem.s_factoriesByExtension)
{
if (factory.key == extension)
flag = false;
}
if (flag)
2021-03-31 17:15:06 -05:00
MarkupSystem.s_factoriesByExtension.Add(new MarkupSystem.Factory()
{
handler = handler,
key = extension
});
return flag;
}
public static void AddImportRedirect(string fromPrefix, string toPrefix)
{
if (MarkupSystem.s_importRedirectsFrom == null)
{
MarkupSystem.s_importRedirectsFrom = new Vector<string>();
MarkupSystem.s_importRedirectsTo = new Vector<string>();
}
MarkupSystem.s_importRedirectsFrom.Add(fromPrefix);
MarkupSystem.s_importRedirectsTo.Add(toPrefix);
}
private static string ApplyImportRedirects(string uri)
{
if (MarkupSystem.s_importRedirectsFrom != null)
{
for (int index = 0; index < MarkupSystem.s_importRedirectsFrom.Count; ++index)
{
string str = MarkupSystem.s_importRedirectsFrom[index];
if (uri.StartsWith(str, StringComparison.Ordinal))
{
uri = uri.Substring(str.Length);
uri = MarkupSystem.s_importRedirectsTo[index] + uri;
break;
}
}
}
return uri;
}
public static bool IsDebuggingEnabled(byte level) => !MarkupSystem.CompileMode && Trace.IsCategoryEnabled(TraceCategory.MarkupDebug, level);
internal class Factory
{
public CreateLoadResultHandler handler;
public string key;
}
}
}